Наши партнеры

UnixForum





Библиотека сайта 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