Перевод сборника команд Unix ToolBox. Раздел 3. File System (Файловая система)
3.1 Права доступа к файлам и каталогам
Менять права доступа и владельца файлов и каталогов в 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 для всех директорий
3.2 Информация о дисках
# diskinfo -v /dev/ad2 # Посмотреть информацию о диске (sector/size) FreeBSD # hdparm -I /dev/sda # Информация о IDE/ATA диске (Linux) # fdisk /dev/ad2 # Показать изменить разделы диска # smartctl -a /dev/ad2 # Показать SMARTинформацию диска
3.3 Загрузка
FreeBSD
Что-бы загрузить старое ядро, в аварийной ситуации, например после неудачной сборки и установки нового, остановите загрузку, нажав 6 во время обратного отсчета, что-бы попасть в приглашение командной строки.
# unload # load kernel.old # boot
3.4 Точки монтирования, использование дисков
# mount | column -t # Показать смонтированные файловые системы # df # Показать кол-во свободного места и смонтированные устройства # cat /proc/partitions # Показать все зарегистрированные разделы (Linux)
Информация о использовании диска
# du -sh * # Размеры директорий в виде списка # du -csh # Суммарный объем текущей директории # du -ks * | sort -n -r # Список директорий, отсортированный по объему в килобайтах # ls -lSr # Список директорий, обратная сортировка
3.5 Кто какие файлы открыл
Иногда необходимо выяснить, какой файл заблокировал раздел, из-за чего команда 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
3.6 Монтирование/перемонтирование файловых систем
Например 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
3.7 Создание 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
3.8 Монтирование 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
3.9 Монтировать образ
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 # Очистить псевдоустройство
3.10 Создание и запись образа 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
3.11 Создание образа на основе файла
Например, раздел размером 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
3.12 Создание файловой системы в памяти
Файловая система в памяти очень быстрая, имеет смысл использовать ее для приложений с высоким дисковым 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
3.13 Производительность дисков
Чтение и запись 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