Администрирование систем Linux. Инструменты для диагностики файловых систем
Оригинал: Troubleshooting tools
Автор: Paul Cobbaut
Дата публикации: 12 марта 2015 г.
Перевод: A. Панин
Дата перевода: 29 марта 2015 г.
Глава 8. Инструменты для диагностики файловых систем
В данной главе описываются некоторые инструменты, которые могут использоваться для диагностики файловых систем помимо команд df -h и du -h. Эти инструменты позволят вам выявить множество проблем, связанных с файловыми системами и устройствами для хранения данных.
8.1. Утилита lsof
С помощью утилиты lsof вы можете получить список открытых файлов.
При использовании утилиты lsof без параметров будет выводиться список, содержащий все открытые файлы. В данном списке вы можете обнаружить строку команды (в данном случае это команда init), идентификатор созданного процесса в столбце PID (1), а также имя пользователя (root), с привилегиями которого была открыта корневая директория и файл /sbin/init. Данные из столбца FD (содержащего информацию о дескрипторе файла) говорят о том, что директория / являлась как корневой директорией (rtd), так и текущей рабочей директорией (cwd) при исполнении команды /sbin/init. В столбце FD может содержаться строка rtd, указывающая на то, что директория является корневой директорией, строка cwd, указывающая на то, что директория является текущей рабочей директорией и строка txt, указывающая не то, что открыт файл (включая файлы с данными и кодом).
root@debian7:~# lsof | head -4
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 254,0 4096 2 /
init 1 root rtd DIR 254,0 4096 2 /
init 1 root txt REG 254,0 36992 130856 /sbin/init
В остальных случаях в столбце FD приводятся числовые значения дескрипторов с символами, соответствующими режимам открытия файлов, причем символ w соответствует режиму записи данных, r - режиму чтения данных, а u - режиму чтения и записи данных. Вы можете вывести список файлов, открытых в рамках процесса с определенным идентификатором PID, воспользовавшись командой lsof -p PID. Для процесса init данная команда будет выглядеть следующим образом:
lsof -p 1
В приведенном ниже примере показана простая методика использования утилиты lsof для доказательства того, что текстовый редактор vi хранит файл с расширением .swp в открытом состоянии (даже в том случае, если исполнение соответствующего процесса приостанавливается в фоновом режиме) при работе с нашей недавно смонтированной файловой системой.
[root@RHEL65 ~]# df -h | grep sdb
/dev/sdb1 541M 17M 497M 4% /srv/project33
[root@RHEL65 ~]# vi /srv/project33/busyfile.txt
[1]+ Stopped vi /srv/project33/busyfile.txt
[root@RHEL65 ~]# lsof /srv/*
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vi 3243 root 3u REG 8,17 4096 12 /srv/project33/.busyfile.txt.swp
А здесь мы видим, что демон rsyslog открывает несколько файлов журналов для записи (как указано в строке FD).
root@debian7:~# lsof /var/log/*
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 2013 root 1w REG 254,0 454297 1308187 /var/log/syslog
rsyslogd 2013 root 2w REG 254,0 419328 1308189 /var/log/kern.log
rsyslogd 2013 root 5w REG 254,0 116725 1308200 /var/log/debug
rsyslogd 2013 root 6w REG 254,0 309847 1308201 /var/log/messages
rsyslogd 2013 root 7w REG 254,0 17591 1308188 /var/log/daemon.log
rsyslogd 2013 root 8w REG 254,0 101768 1308186 /var/log/auth.log
Вы можете указать имя интересующего вас пользователя в рамках команды lsof -u. В данном примере выводится информация о текущих рабочих директориях нескольких программ с интерфейсом командной строки, запущенных от лица пользователя paul.
[paul@RHEL65 ~]$ lsof -u paul | grep home
bash 3302 paul cwd DIR 253,0 4096 788024 /home/paul
lsof 3329 paul cwd DIR 253,0 4096 788024 /home/paul
grep 3330 paul cwd DIR 253,0 4096 788024 /home/paul
lsof 3331 paul cwd DIR 253,0 4096 788024 /home/paul
Совместно с параметром -u утилиты lsof также может быть использовать символ ^, соответствующий логической операции 'не'. Исходя из этого, команда для получения информации обо всех открытых файлах, за исключением тех файлов, которые открыты пользователем root, будет выглядеть следующим образом:
lsof -u^root
8.2. Утилита fuser
С помощью утилиты fuser вы можете получить информацию о процессах, которые работают с указанной файловой системой.
В следующем примере мы приостанавливаем исполнение процесса текстового редактора vi в фоновом режиме и используем утилиту fuser для вывода идентификатора процесса, который работает с указанной файловой системой.
[root@RHEL65 ~]# jobs
[1]+ Stopped vi /srv/project33/busyfile.txt
[root@RHEL65 ~]# fuser -m /srv/project33/
/srv/project33/: 3243
В случае добавления параметра -u утилита также будет выводить имя пользователя, от лица которого был запущен процесс.
[root@RHEL65 ~]# fuser -m -u /srv/project33/
/srv/project33/: 3243(root)
Вы можете быстро уничтожить все процессы, которые работают с определенным файлом (или директорией), воспользовавшись параметром -k.
[root@RHEL65 ~]# fuser -m -k -u /srv/project33/
/srv/project33/: 3243(root)
[1]+ Killed vi /srv/project33/busyfile.txt
[root@RHEL65 ~]# fuser -m -u /srv/project33/
[root@RHEL65 ~]#
В данном примере выводится информация обо всех процессах, которые используют текущую директорию (в данном случае этими процессами являются bash и vi).
root@debian7:~/test42# vi file42
[1]+ Stopped vi file42
root@debian7:~/test42# fuser -v .
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/root/test42: root 2909 ..c.. bash
root 3113 ..c.. vi
А в данном примере показано, что при использовании команды vi осуществляется доступ к файлу /usr/bin/vim.basic, как к исполняемому файлу.
root@debian7:~/test42# fuser -v $(which vi)
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/usr/bin/vim.basic: root 3113 ...e. vi
В последнем примере показана методика поиска процесса, который осуществляет доступ к определенному файлу.
[root@RHEL65 ~]# vi /srv/project33/busyfile.txt
[1]+ Stopped vi /srv/project33/busyfile.txt
[root@RHEL65 ~]# fuser -v -m /srv/project33/busyfile.txt
ПОЛЬЗ-ЛЬ PID ДОСТУП КОМАНДА
/srv/project33/busyfile.txt:
root 13938 F.... vi
[root@RHEL65 ~]# ps -fp 13938
UID PID PPID C STIME TTY TIME CMD
root 13938 3110 0 15:47 pts/0 00:00:00 vi /srv/project33/busyfile.txt
8.3. Утилита chroot
Утилита chroot позволяет открыть командную оболочку с измененной корневой директорией. Все файлы, находящиеся вне этой директории, скрываются от пользователя.
В примере ниже мы будем предполагать, что наша система не может загрузиться (например, из-за проблемы с файлом /etc/fstab или невозможности монтирования корневой файловой системы).
Мы будем использовать live-систему (загруженную с накопителя CD/DVD/USB) для диагностики нашего сервера. Live-система не будет использовать наш основной жесткий диск в качестве устройства с корневой директорией.
root@livecd:~# df -h | grep root
rootfs 186M 11M 175M 6% /
/dev/loop0 807M 807M 0 100% /lib/live/mount/rootfs/filesystem.squashfs
root@livecd:~# mount | grep root
/dev/loop0 on /lib/live/mount/rootfs/filesystem.squashfs type squashfs (ro)
Для последующей проверки мы можем создать тестовый файл и директорию в нашей текущей корневой файловой системе.
root@livecd:~# touch /file42
root@livecd:~# mkdir /dir42
root@livecd:~# ls /
bin dir42 home lib64 opt run srv usr
boot etc initrd.img media proc sbin sys var
dev file42 lib mnt root selinux tmp vmlinuz
В первую очередь мы должны смонтировать корневую файловую систему с нашего диска (который является частью массива lvm, поэтому мы будем использовать файл устройства /dev/mapper вместо /dev/sda5).
root@livecd:~# mount /dev/mapper/packer--debian--7-root /mnt
Теперь мы готовы к использованию утилиты chroot для замены корневой файловой системы на файловую систему с нашего диска, смонтированную в директорию.
root@livecd:~# cd /mnt
root@livecd:/mnt# chroot /mnt
root@livecd:/# ls /
bin dev initrd.img lost+found opt run srv usr vmlinuz
boot etc lib media proc sbin sys vagrant
data home lib64 mnt root selinux tmp var
Наши тестовые файл и директория (file42 и dir42) не отображаются из-за того, что они находятся вне установленной с помощью утилиты chroot корневой директории.
Обратите внимание на то, что имя узла chroot-окружения идентично существующему имени узла.
Для завершения работы chroot-окружением следует использовать команду exit:
root@livecd:/# exit
exit
root@livecd:~# ls /
bin dir42 home lib64 opt run srv usr
boot etc initrd.img media proc sbin sys var
dev file42 lib mnt root selinux tmp vmlinuz
8.4. Утилита iostat
Утилита iostat периодически по прошествии заданного промежутка времени выводит статистические данные, связанные с использованием операций ввода-вывода. Также в вывод утилиты включены некоторые обобщенные показатели загрузки центрального процессора системы. В данном примере утилита iostat через каждые 10 секунд выводит статистические данные, на основе которых можно сделать вывод о том, что на диски, представленные файлами устройств /dev/sdc и /dev/sde, осуществляется интенсивная запись данных.
[root@RHEL65 ~]# iostat 10 3
Linux 2.6.32-431.el6.x86_64 (RHEL65) 06/16/2014 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
5.81 0.00 3.15 0.18 0.00 90.85
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 42.08 1204.10 1634.88 1743708 2367530
sdb 1.20 7.69 45.78 11134 66292
sdc 0.92 5.30 45.82 7672 66348
sdd 0.91 5.29 45.78 7656 66292
sde 1.04 6.28 91.49 9100 132496
sdf 0.70 3.40 91.46 4918 132440
sdg 0.69 3.40 91.46 4918 132440
dm-0 191.68 1045.78 1362.30 1514434 1972808
dm-1 49.26 150.54 243.55 218000 352696
avg-cpu: %user %nice %system %iowait %steal %idle
56.11 0.00 16.83 0.10 0.00 26.95
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 257.01 10185.97 76.95 101656 768
sdb 0.00 0.00 0.00 0 0
sdc 3.81 1.60 2953.11 16 29472
sdd 0.00 0.00 0.00 0 0
sde 4.91 1.60 4813.63 16 48040
sdf 0.00 0.00 0.00 0 0
sdg 0.00 0.00 0.00 0 0
dm-0 283.77 10185.97 76.95 101656 768
dm-1 0.00 0.00 0.00 0 0
avg-cpu: %user %nice %system %iowait %steal %idle
67.65 0.00 31.11 0.11 0.00 1.13
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 466.86 26961.09 178.28 238336 1576
sdb 0.00 0.00 0.00 0 0
sdc 31.45 0.90 24997.29 8 220976
sdd 0.00 0.00 0.00 0 0
sde 0.34 0.00 5.43 0 48
sdf 0.00 0.00 0.00 0 0
sdg 0.00 0.00 0.00 0 0
dm-0 503.62 26938.46 178.28 238136 1576
dm-1 2.83 22.62 0.00 200 0
[root@RHEL65 ~]#
Дополнительные параметры позволяют указывать имена файлов устройств дисков для мониторинга операций ввода-вывода(в данном случае с временным интервалом в 5 секунд):
iostat sdd sde sdf 5
Или выводить статистику для разделов жестких дисков:
iostat -p sde -p sdf 5
8.5. Утилита iotop
Утилита iotop работает аналогично утилите top, но упорядочивает процессы в зависимости от интенсивности операций ввода-вывода, а не от нагрузки на центральный процессор.
По умолчанию утилита iotop будет выводить информацию обо всех процессах. В данном примере используется параметр iotop -o для вывода информации исключительно о тех процессах, которые осуществляют операции ввода-вывода.
[root@RHEL65 ~]# iotop -o
Total DISK READ: 8.63 M/s | Total DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
15000 be/4 root 2.43 M/s 0.00 B/s 0.00 % 14.60 % tar cjf /srv/di...
25000 be/4 root 6.20 M/s 0.00 B/s 0.00 % 6.15 % tar czf /srv/di...
24988 be/4 root 0.00 B/s 7.21 M/s 0.00 % 0.00 % gzip
25003 be/4 root 0.00 B/s 1591.19 K/s 0.00 % 0.00 % gzip
25004 be/4 root 0.00 B/s 193.51 K/s 0.00 % 0.00 % bzip2
Используйте параметр -b для задействования режима вывода данных утилиты iotop в форме журнала (вместо стандартного интерактивного режима вывода данных).
[root@RHEL65 ~]# iotop -bod 10
Total DISK READ: 12.82 M/s | Total DISK WRITE: 5.69 M/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
25153 be/4 root 2.05 M/s 0.00 B/s 0.00 % 7.81 % tar cjf /srv/di...
25152 be/4 root 10.77 M/s 0.00 B/s 0.00 % 2.94 % tar czf /srv/di...
25144 be/4 root 408.54 B/s 0.00 B/s 0.00 % 0.05 % python /usr/sbi...
12516 be/3 root 0.00 B/s 1491.33 K/s 0.00 % 0.04 % [jbd2/sdc1-8]
12522 be/3 root 0.00 B/s 45.48 K/s 0.00 % 0.01 % [jbd2/sde1-8]
25158 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [flush-8:64]
25155 be/4 root 0.00 B/s 493.12 K/s 0.00 % 0.00 % bzip2
25156 be/4 root 0.00 B/s 2.81 M/s 0.00 % 0.00 % gzip
25159 be/4 root 0.00 B/s 528.63 K/s 0.00 % 0.00 % [flush-8:32]
А это пример использования утилиты iotop для отслеживания операций дискового ввода-вывода, осуществляемых в течение каждых десяти секунд от лица пользователя с именем vagrant (средствами единственного процесса, запущенного данным пользователем, но данное обстоятельство не принципиально и может не рассматриваться). Параметр -a позволяет накапливать статистические данные об операциях ввода-вывода.
[root@RHEL65 ~]# iotop -q -a -u vagrant -b -p 5216 -d 10 -n 10
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
5216 be/4 vagrant 0.00 B 0.00 B 0.00 % 0.00 % gzip
Total DISK READ: 818.22 B/s | Total DISK WRITE: 20.78 M/s
5216 be/4 vagrant 0.00 B 213.89 M 0.00 % 0.00 % gzip
Total DISK READ: 2045.95 B/s | Total DISK WRITE: 23.16 M/s
5216 be/4 vagrant 0.00 B 430.70 M 0.00 % 0.00 % gzip
Total DISK READ: 1227.50 B/s | Total DISK WRITE: 22.37 M/s
5216 be/4 vagrant 0.00 B 642.02 M 0.00 % 0.00 % gzip
Total DISK READ: 818.35 B/s | Total DISK WRITE: 16.44 M/s
5216 be/4 vagrant 0.00 B 834.09 M 0.00 % 0.00 % gzip
Total DISK READ: 6.95 M/s | Total DISK WRITE: 8.74 M/s
5216 be/4 vagrant 0.00 B 920.69 M 0.00 % 0.00 % gzip
Total DISK READ: 21.71 M/s | Total DISK WRITE: 11.99 M/s
8.6. Утилита vmstat
Хотя утилита vmstat и является инструментом, применяемым главным образом для мониторинга работы оперативной памяти, она заслуживает упоминания в данной главе ввиду того, что она также выводит информацию о суммарном объеме передаваемых благодаря операциям ввода-вывода данных для блочных устройств и пространства подкачки.
В данном примере показан вывод описанной утилиты, содержащий количественные показатели дисковой активности (в столбцах под заголовком -----io----) без учета пространства подкачки.
[root@RHEL65 ~]# vmstat 5 10
procs ----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 5420 9092 14020 340876 7 12 235 252 77 100 2 1 98 0 0
2 0 5420 6104 13840 338176 0 0 7401 7812 747 1887 38 12 50 0 0
2 0 5420 10136 13696 336012 0 0 11334 14 1725 4036 76 24 0 0 0
0 0 5420 14160 13404 341552 0 0 10161 9914 1174 1924 67 15 18 0 0
0 0 5420 14300 13420 341564 0 0 0 16 28 18 0 0 100 0 0
0 0 5420 14300 13420 341564 0 0 0 0 22 16 0 0 100 0 0
...
[root@RHEL65 ~]#
Вы можете воспользоваться полезной возможностью утилиты vmstat, заключающейся в поддержке вывода значений объемов памяти в килобайтах, мегабайтах или даже в кибибайтах и мибибайтах благодаря наличию параметра -S (после которого должен следовать идентификатор единиц измерения k, K, m или M).
[root@RHEL65 ~]# vmstat -SM 5 10
procs ----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 5 14 11 334 0 0 259 255 79 107 2 1 97 0 0
0 0 5 14 11 334 0 0 0 2 21 18 0 0 100 0 0
0 0 5 15 11 334 0 0 6 0 35 31 0 0 100 0 0
2 0 5 6 11 336 0 0 17100 7814 1378 2945 48 21 31 0 0
2 0 5 6 11 336 0 0 13193 14 1662 3343 78 22 0 0 0
2 0 5 13 11 330 0 0 11656 9781 1419 2642 82 18 0 0 0
2 0 5 9 11 334 0 0 10705 2716 1504 2657 81 19 0 0 0
1 0 5 14 11 336 0 0 6467 3788 765 1384 43 9 48 0 0
0 0 5 14 11 336 0 0 0 13 28 24 0 0 100 0 0
0 0 5 14 11 336 0 0 0 0 20 15 0 0 100 0 0
[root@RHEL65 ~]#
Утилита vmstat будет обсуждаться и в других главах.
8.7. Практическое задание: инструменты для диагностики файловых систем
-
0. Очень важно научиться работать с описанными в главе инструментами перед тем, как возникнут реальные проблемы с файловыми системами. Данное практическое задание поспособствует ознакомлению с описанными инструментами, а также позволит составить представление о параметрах корректно функционирующих систем.
-
-
1. Прочитайте раздел, посвященный утилите fuser, а также страницу руководства данной утилиты. Используйте эту утилиту для получения информации об открытых вами файлах.
-
-
2. Прочитайте раздел, посвященный утилите lsof, а также страницу руководства данной утилиты. Используйте эту утилиту для получения информации об открытых вами файлах.
-
-
3. Загрузите live-систему на компьютере (виртуальном или реальном) и смените корневую директорию с помощью утилиты chroot.
-
-
4. Запустите одну или несколько задач, интенсивно использующих диск, после чего попробуйте отследить эти задачи с помощью утилит iostat и iotop (сравните вывод этих утилит с выводом утилиты vmstat).
-
8.8. Корректная процедура выполнения практического задания: инструменты для диагностики файловых систем
-
0. Очень важно научиться работать с описанными в главе инструментами перед тем, как возникнут реальные проблемы с файловыми системами. Данное практическое задание поспособствует ознакомлению с описанными инструментами, а также позволит составить представление о параметрах корректно функционирующих систем.
-
-
1. Прочитайте раздел, посвященный утилите fuser, а также страницу руководства данной утилиты. Используйте эту утилиту для получения информации об открытых вами файлах.
-
fuser -vm /home
-
2. Прочитайте раздел, посвященный утилите lsof, а также страницу руководства данной утилиты. Используйте эту утилиту для получения информации об открытых вами файлах.
-
lsof -u `whoami`
-
3. Загрузите live-систему на компьютере (виртуальном или реальном) и смените корневую директорию с помощью утилиты chroot.
-
mkdir /mnt/rootfs
mount /dev/sda6 /mnt/rootfs
chroot /mnt/rootfs
-
4. Запустите одну или несколько задач, интенсивно использующих диск, после чего попробуйте отследить эти задачи с помощью утилит iostat и iotop (сравните вывод этих утилит с выводом утилиты vmstat).
-
iostat
iotop
vmstat
http://rus-linux.net/MyLDP/BOOKS/LSA/ch08.html
|