Перевод сборника команд Unix ToolBox. Часть 5 Файловая система

628

И снова вернемся к основе основ Linux, как впрочем и любой другой Unix-подобной системы. Это файлы. Именно файловой системе, а точнее командам для мониторинга и управления файлами и правами доступа к ним расскажет пятая часть перевода сборника команд Unix ToolBox.

Особое внимание советую обратить на команды предназначенные для смены прав доступа, и изменения файлов. Не редко это бывает очень нужным. Причем не обязательно для десктопных пользователей Linux. Например, при установке того же WordPress на удаленный хостинг, на определенном этапе нужно сменить право доступа на файл конфигов, чтобы обезопасить себя от несанкционированного доступа к вашему ресурсу. Это чаще всего выполняется в консоли либо путем смены числового значения отвечающего за права файла. И чтобы Хеллоуин не превратился для вашего сайта, а значит и для вас, в настоящий ужас, советую внимательно изучить приведенные ниже команды и надежно защитить свою файловую систему.

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

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

Менять права доступа и владельца файлов и каталогов, можно с помощью команд 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