Библиотека сайта rus-linux.net
Администрирование систем 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
Предыдущий раздел: | Оглавление | Следующий раздел: |
Глава 7. Монтирование файловых систем | Глава 9. Знакомство с идентификаторами UUID |