Файловая система

]]>Disk info]]> / ]]>Загрузка]]> / ]]>Использование дисков]]> / ]]>Открытые файлы]]> / ]]>Монтирование]]> / ]]>Монтирование SMB]]> / ]]>Монтировать образ]]> / ]]>Запись ISO]]> / ]]>Образ из файла]]> / ]]>Диск в памяти]]> / ]]>Производительность дисков]]>

Права доступа к файлам и каталогам

Менять права доступа и владельца файлов и каталогов в Unix подобных операционных системах, можно с помощью команд chmod и chown. Маску для установки прав на создаваемые файлы, можно изменить глобально, в /etc/profile для Linux и в /etc/login.conf для FreeBSD. Обычно, маска по-умолчанию 022. Значение umask вычитается из 777, таким образом права доступа будут иметь значение 755.

exec - разрешено выполнение
read - право на чтение
write - право на запись
SUID bit - атрибут файла, в совокупности с атрибутом исполняемого файла, позволяет запускаемому файлу выполняться с эффективным UID владельца файла, а не того, кто запускает файл
1 --x execute                        # Права 764 = exec/read/write | read/write | read
2 -w- write                          # Для:       |--  Owner  --|   |- Group-|   |Oth|
4 r-- read
ugo=a                              u=user, g=group, o=others, a=everyone
# chmod [OPTION] MODE[,MODE] FILE    # MODE имеет форму: [ugoa]*([-+=]([rwxXst]))
# chmod 640 /var/log/maillog         # Установить права доступа равными -rw-r-----
# chmod u=rw,g=r,o= /var/log/maillog # Как и выше
# chmod -R o-r /home/*               # Рекурсивно изменить права, запретить чтение для Other
# chmod u+s /path/to/prog            # Установить SUID бит на исполняемый файл ( тут осторожней, вы должны понимать, что вы делаете )
# find / -perm -u+s -print           # Найти все программы с установленным SUID битом
# chown user:group /path/to/file     # Установить пользователя и группу как владеющих файлом
# chgrp group /path/to/file          # Изменить группу владеющую файлом
# chmod 640 `find ./ -type f -print` # Изменить права доступа на 640 для всех файлов
# chmod 751 `find ./ -type d -print` # Изменить права доступа на 751 для всех директорий

Информация о дисках

# diskinfo -v /dev/ad2               # Посмотреть информацию о диске (sector/size) FreeBSD
# hdparm -I /dev/sda                 # Информация о IDE/ATA диске (Linux)
# fdisk /dev/ad2                     # Показать изменить разделы диска
# smartctl -a /dev/ad2               # Показать SMARTинформацию диска

Загрузка

FreeBSD

Что-бы загрузить старое ядро, в аварийной ситуации, например после неудачной сборки и установки нового, остановите загрузку, нажав 6 во время обратного отсчета, что-бы попасть в приглашение командной строки.

# unload
# load kernel.old
# boot

Точки монтирования, использование дисков

# mount | column -t                  # Показать смонтированные файловые системы 
# df                                 # Показать кол-во свободного места и смонтированные устройства
# cat /proc/partitions               # Показать все зарегистрированные разделы (Linux)

Информация о директориях

# du -sh *                           # Размеры директорий в виде списка
# du -csh                            # Суммарный объем текущей директории
# du -ks * | sort -n -r              # Список директорий, отсортированный по объему в килобайтах
# ls -lSr                            # Список директорий, обратная сортировка

Кто какие файлы открыл

Иногда необходимо выяснить, какой файл заблокировал раздел, из-за чего команда umount выдает соответствующую ошибку.

# umount /home/
umount: unmount of /home             # Размонтировать раздел невозможно, пока /home заблокирован
failed: Device busy

FreeBSD и большинство Unix подобных систем

# fstat -f /home                     # для точки монтирования
# fstat -p PID                       # для приложения с PID
# fstat -u user                      # для имени пользователя

Найти открытый файл для Xorg:

# ps ax | grep Xorg | awk '{print $1}'
1252
# fstat -p 1252
USER     CMD          PID   FD MOUNT      INUM MODE         SZ|DV R/W
root     Xorg        1252 root /             2 drwxr-xr-x     512  r
root     Xorg        1252 text /usr     216016 -rws--x--x  1679848 r
root     Xorg        1252    0 /var     212042 -rw-r--r--   56987  w

Найти файл с inum 212042 в директории /var можно так:

# find -x /var -inum 212042
/var/log/Xorg.0.log

Linux

Найти открытый файл в директории с помощью fuser или lsof:

# fuser -m /home                     # Список процессов имеющих доступ к /home
# lsof /home
COMMAND   PID    USER   FD   TYPE DEVICE    SIZE     NODE NAME
tcsh    29029 eedcoba  cwd    DIR   0,18   12288  1048587 /home/eedcoba (guam:/home)
lsof    29140 eedcoba  cwd    DIR   0,18   12288  1048587 /home/eedcoba (guam:/home)

Найти по PID приложения:

ps ax | grep Xorg | awk '{print $1}'
3324
# lsof -p 3324
COMMAND   PID    USER   FD   TYPE DEVICE    SIZE    NODE NAME
Xorg    3324 root    0w   REG        8,6   56296      12492 /var/log/Xorg.0.log

По имени файла:

# lsof /var/log/Xorg.0.log
COMMAND  PID USER   FD   TYPE DEVICE  SIZE  NODE NAME
Xorg    3324 root    0w   REG    8,6 56296 12492 /var/log/Xorg.0.log

Монтирование/перемонтирование файловых систем

Например cdrom, прописанный в /etc/fstab:

# mount /cdrom

Или можно найти устройство в /dev или в выводе dmesg

FreeBSD

# mount -v -t cd9660 /dev/cd0c /mnt  # Монтирование диска Cdrom (способ первый)
# mount_cd9660 /dev/wcd0c /cdrom     # Монтирование диска Cdrom (способ второй)
# mount -v -t msdos /dev/fd0c /mnt   # Дискета

Запись в /etc/fstab:

# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/acd0               /cdrom          cd9660  ro,noauto       0       0

Разрешить пользователям монтирование дисков:

# sysctl vfs.usermount=1  # Или впишите строку "vfs.usermount=1" in /etc/sysctl.conf

Linux

# mount -t auto /dev/cdrom /mnt/cdrom   # Типичная команда монтирования диска cdrom
# mount /dev/hdc -t iso9660 -r /cdrom   # Монтирование диска IDE
# mount /dev/scd0 -t iso9660 -r /cdrom  # Монтирование диска SCSI cdrom
# mount /dev/sdc0 -t ntfs-3g /windows   # Монтирование диска SCSI

Запись в /etc/fstab:

/dev/cdrom   /media/cdrom  subfs noauto,fs=cdfss,ro,procuid,nosuid,nodev,exec 0 0

Монтирование FreeBSD раздела с Linux

Посмотрите номер раздела в fdisk, обычно это корнеыой раздел, но может быть и на другом BSD слайсе. Если на разделе FreeBSD много слайсов, их не будет видно через fdisk, но их можно найти в dev/sda* или /dev/hda*.

# fdisk /dev/sda                     # Найти FreeBSD раздел
/dev/sda3   *        5357        7905    20474842+  a5  FreeBSD
# mount -t ufs -o ufstype=ufs2,ro /dev/sda3 /mnt
/dev/sda10 = /tmp; /dev/sda11 /usr   # Другой слайс

Перемонтирование

Перемонтировать устройство без предварительного размонтирования, например для fsck

# mount -o remount,ro /              # Linux
# mount -o ro /                      # FreeBSD

Копировать поток данных с CDROM'а в файл ISO образа.

# dd if=/dev/cd0c of=file.iso

Создание swap раздела на лету

Предположим вам нужно увеличить swap раздел, скажем до 2 гигабайт, /swap2gb (для Linux)

# dd if=/dev/zero of=/swap2gb bs=1024k count=2000
# mkswap /swap2gb                    # Создать swap
# swapon /swap2gb                    # Включить swap, теперь его можно использовать
# swapoff /swap2gb                   # Отключить swap
# rm /swap2gb

Монтирование SMB раздела

CIFS - Common Internet File System
SMB - server message block

Предположим вам нужно получить доступ на расшаренному SMB разделу myshare на сервере smbserver, адрес набираемый на Windows машине будет \\smbserver\myshare\. Монтировать будем на /mnt/smbshare. Не забывайте, для cifs требуется IP адрес или доменное имя.

Linux

# smbclient -U user -I 192.168.16.229 -L //smbshare/    # List the shares
# mount -t smbfs -o username=winuser //smbserver/myshare /mnt/smbshare
# mount -t cifs -o username=winuser,password=winpwd //192.168.16.229/myshare /mnt/share

Кроме того пакет mount.cifs позволяет хранить привилегии в файле, например /home/user/.smb:

username=winuser
password=winpwd

И теперь монтируем:

# mount -t cifs -o credentials=/home/user/.smb //192.168.16.229/myshare /mnt/smbshare

FreeBSD

Используйте ключ -I, что-бы задать IP адрес (или DNS); smbserver, это Windows имя.

# smbutil view -I 192.168.16.229 //winuser@smbserver    # Список расшаренных ресурсов
# mount_smbfs -I 192.168.16.229 //winuser@smbserver/myshare /mnt/smbshare

Монтировать образ

Linux loop-back

# mount -t iso9660 -o loop file.iso /mnt                # Монтировать образ CD
# mount -t ext3 -o loop file.img /mnt                   # Монтировать образ с файловой системой ext3

FreeBSD

Используя md - устройство памяти (если нужно, сделайте kldload md.ko):

# mdconfig -a -t vnode -f file.iso -u 0
# mount -t cd9660 /dev/md0 /mnt
# umount /mnt; mdconfig -d -u 0                         # Очистить устройство памяти

Или используя псевдоустройство(VN, Virtual node):

# vnconfig /dev/vn0c file.iso; mount -t cd9660 /dev/vn0c /mnt
# umount /mnt; vnconfig -u /dev/vn0c                    # Очистить псевдоустройство

Создание и запись образа ISO

Будем копировать cd или dvd сектор за сектором.

# dd if=/dev/hdc of=/tmp/mycd.iso bs=2048 conv=notrunc

Используйте mkisofs что-бы создать образ из файла в директории. Для преодоления ограничений имен файлов используйте опцию -r, включающую расширение RockRidge, основное для UNIX систем, -J включает Joliet, используемое Microsoft, -L разрешает ISO9660 имена, начинающиеся точкой.

# mkisofs -J -L -r -V TITLE -o imagefile.iso /path/to/dir

Во FreeBSD, mkisofs можно установить из портов /usr/ports/sysutils/cdrtools.

Запись CD/DVD ISO образов

FreeBSD

FreeBSD не устанавливает DMA на ATAPI устройства, это можно сделать через переменную sysctl или в файле /boot/loader.conf, следующими записями.

hw.ata.ata_dma="1"
hw.ata.atapi_dma="1"

Используйте burncd для ATAPI устройств (burncd, стандартная программа, часть базовой системы) и cdrecord (из /usr/ports/sysutils/cdrtools) для SCSI устройств.

# burncd -f /dev/acd0 data imagefile.iso fixate    # Для ATAPI устройств
# cdrecord -scanbus                                # Найти рекордер
# cdrecord dev=1,0,0 imagefile.iso

Linux

Так-же используйе cdrecord, как описано выше. Кроме того можно использовать родной ATAPI интерфейс:

# cdrecord dev=ATAPI -scanbus

Записывайте, как было описано выше.

dvd+rw-tools

Пакет ]]>dvd+rw-tools]]> (FreeBSD: ports/sysutils/dvd+rw-tools) имеет весь функционал необходимый для работы с DVD, плюс growisofs, для записи CD или DVD. Документацию с примерами можно найти в ]]>FreeBSD handbook Глава 18.7]]>

                           
# -dvd-compat закрывает диск
# growisofs -dvd-compat -Z /dev/dvd=imagefile.iso     # Записать существующий iso образ
# growisofs -dvd-compat -Z /dev/dvd -J -R /p/to/data  # Записать напрямую

Конвертировать образ из Nero .nrg файла в файл .iso

Nero добавляет к образу заголовок в 300кб, его можно обрезать с помощью dd.

# dd bs=1k if=imagefile.nrg of=imagefile.iso skip=300

Конвертировать образ bin/cue в .iso

Это можно сделать с помощью небольшой программы, ]]>bchunk]]>. Во FreeBSD ее можно найти в портах /usr/ports/sysutils/bchunk.

# bchunk imagefile.bin imagefile.cue imagefile.iso

Создание образа на основе файла

Например, раздел размером 1Гб использует файл /usr/vdisk.img. В данном случае мы используем ключ -u 0, но номер может быть любым.

FreeBSD

# dd if=/dev/random of=/usr/vdisk.img bs=1K count=1M
# mdconfig -a -t vnode -f /usr/vdisk.img -u 0         # Создаем устройство /dev/md1
# bsdlabel -w /dev/md0
# newfs /dev/md0c
# mount /dev/md0c /mnt
# umount /mnt; mdconfig -d -u 0; rm /usr/vdisk.img    # Очистить md

Образ созданный из файла может быть смонтирован в процессе загрузки системы, путем записи строки в /etc/rc.conf и /etc/fstab.
Проверить правильность ваших настроек можно с помощью команды /etc/rc.d/mdconfig start (предварительно удалив устройство md0 с помощью команды # mdconfig -d -u 0).
Имейте в виду, что автоматическая монтирование образа будет работать, только если файл образа, лежит НЕ в корневом разделе, в силу того что скрипт /etc/rc.d/mdconfig выполняется на ранней стадии загрузки, когда корневой раздел еще не доступен на запись. Образы расположенные вне корневого раздела будут смонтированы позже, скриптом /etc/rc.d/mdconfig2.

/boot/loader.conf:
md_load="YES"

/etc/rc.conf:
mdconfig_md0="-t vnode -f /usr/vdisk.img" # /usr не в корневом разделе

/etc/fstab: (0 0 в конце, очень важны, это укажет fsck игнорировать проверку устройства, так как оно еще не существует)
/dev/md0 /usr/vdisk ufs rw 0 0

Кроме того, в последствии можно увеличить размер образа, скажем на 300 мб.

# umount /mnt; mdconfig -d -u 0
# dd if=/dev/zero bs=1m count=300 >> /usr/vdisk.img
# mdconfig -a -t vnode -f /usr/vdisk.img -u 0
# growfs /dev/md0
# mount /dev/md0c /mnt                                # Теперь файловый раздел на 300 мб больше

Linux

# dd if=/dev/zero of=/usr/vdisk.img bs=1024k count=1024
# mkfs.ext3 /usr/vdisk.img
# mount -o loop /usr/vdisk.img /mnt
# umount /mnt; rm /usr/vdisk.img                      # Очистить

Linux и losetup

/dev/zero намного быстрей, чем urandom, но менее защищенн для шифрования.

# dd if=/dev/urandom of=/usr/vdisk.img bs=1024k count=1024
# losetup /dev/loop0 /usr/vdisk.img                   # Создать /dev/loop0
# mkfs.ext3 /dev/loop0
# mount /dev/loop0 /mnt
# losetup -a                                          # Проверить
# umount /mnt
# losetup -d /dev/loop0                               # Отсоединить
# rm /usr/vdisk.img

Создание файловой системы в памяти

Файловая система в памяти очень быстрая, имеет смысл использовать ее для приложений с высоким дисковым IO. Создадим раздел размером 64 мб и смонтируем его в /memdisk:

FreeBSD

# mount_mfs -o rw -s 64M md /memdisk
# umount /memdisk; mdconfig -d -u 0                   # Очистить md устройство
md     /memdisk     mfs     rw,-s64M    0   0         # запись в /etc/fstab

Linux

# mount -t tmpfs -osize=64m tmpfs /memdisk

Производительность дисков

Чтение и запись 1гб файла в разделе ad4s3c (/home)

# time dd if=/dev/ad4s3c of=/dev/null bs=1024k count=1000
# time dd if=/dev/zero bs=1024k count=1000 of=/home/1Gb.file
# hdparm -tT /dev/hda                                    # Только Linux