Linuxディスクドライブのエラー検査

(2014.9)

Linuxの起動時, 毎回次のように, エマージェンシーモードに入ってしまうようになった。

Welcome to emergency mode! After logging in, type "journalctl -xb" to view system logs, "systemctl reboot" to reboot, "systemctl default" to try again to boot into default mode. Give root password for maintenance (or type Control-D to continue):

Control-D で進むと普通に起動できる状態だったが, 何やらまずそうな状況。

ディスク検査 (エラーチェック), パーティション (ディスク区画) 操作の方法を調べてみた。

エラーチェックは, PVの段階, VGの段階, ファイルシステムと進めていく。

LVM2

今の Linux は, カーネル側の device-mapperと, ユーザランド側の LVM2 (Logical Volume Manager 2) というモジュールで, ディスクドライブを管理している。

Linux LVM2 では, PV (Physical Volume) - VG (Volume Group) - LV (Logical Volume) という3段階になっている。

物理ドライブのパーティション (ディスク区画) = PV (Physical Volume). パーティションを LVM の管理下に入れる。

いくつかのパーティション (=PV) を一つにまとめて VG (Volume Group) を作り, さらに VG を複数の論理ボリューム (Logical Volume; LV) に分けて, LV にファイルシステムを載せるようになっている。

LVM としては, 動的に (物理) ディスクドライブを追加したりできるようになっている。例えばディスク容量が不足している場合に, ファイルシステムが対応していれば, ファイルシステムを再フォーマットすることなく, LV を拡張することができる。

ディスクドライブのレイアウトを調べる

まず物理的なディスクドライブがある.

ディスクドライブ (物理ドライブ)
物理的なディスクドライブ. ユーザランドからは /dev/sda, /dev/sdb というパスで見える.
パーティション (ディスク区画)
一つのディスクドライブを, いくつかのパーティション (ディスク区画) に分けることができる. fdiskコマンドや, 最近では parted コマンドで操作する。

同じく, /dev/sda1, /dev/sda2, ... というパスで見える.

はるか昔は, パーティション = ファイルシステムだった。今でも, LVMを使わずに, パーティションにファイルシステムを載せることもできる。

fdiskコマンド / parted

私のLinuxシステムは, 物理ディスクドライブは一つだけ (/dev/sda). fdisk コマンドでパーティションを表示してみる。

# fdisk -l /dev/sda

Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00069fc1

デバイス  ブート     Start 最後から   Blocks  Id System
/dev/sda1 *           2048   1026047   512000  83 Linux
/dev/sda2          1026048  41943039 20458496  8e Linux LVM

/dev/sda1 は stage 2 ブートローダ. /dev/sda2 パーティションが LVM PV (Physical Volume).

fdisk -l と, ドライブを指定しない場合は、すべての物理ドライブと, /dev/mapper/ 以下の LVについても表示される。LV は, 意味のある情報が表示されるわけでもなく, 微妙。

parted コマンドを使ったほうがよさそう。これは別の機械だが, 次のように, 対話式に, すべてのドライブの状況を表示できる。

# parted
GNU Parted 3.2
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print list
Model: ATA MB0500EBNCR (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End    Size   Type     File system  Flags
 1      1049kB  525MB  524MB  primary  ext4         boot
 2      525MB   500GB  500GB  primary               lvm


Model: ATA WDC WD20EARX-00P (scsi)
Disk /dev/sdb: 2000GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  2097kB  1049kB                     bios_grub
 2      2097kB  526MB   524MB   ext4         ext4  boot, esp
 3      526MB   2000GB  2000GB                     lvm


Model: ATA WDC WD20EZRX-00D (scsi)
Disk /dev/sdc: 2000GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  525MB   524MB   primary  ext4         boot
 2      525MB   2000GB  2000GB  primary               lvm

Partition table が msdos の場合と gpt の場合とで, フラグなどが違うのも分かる。

quit で抜ける。

lsblkコマンド

lsblk コマンドは, 物理ドライブ, パーティション, LVをツリー表示する。全体と、各LVがどの物理ドライブに載っているかを素早く知れる。

例えば, 次のようになる。この機械では, sda物理ドライブに /boot, / (root) があり, sdb, sdc で /home をミラーリングしている。

# lsblk
NAME                           MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                              8:0    0 465.8G  0 disk 
├─sda1                           8:1    0   500M  0 part /boot
└─sda2                           8:2    0 465.3G  0 part 
  ├─fedora-swap                253:0    0   3.8G  0 lvm  [SWAP]
  ├─fedora-root                253:1    0    50G  0 lvm  /
  └─fedora-home                253:2    0 411.5G  0 lvm  
sdb                              8:16   0   1.8T  0 disk 
├─sdb1                           8:17   0     1M  0 part 
├─sdb2                           8:18   0   500M  0 part 
└─sdb3                           8:19   0   1.8T  0 part 
  ├─vg_orange-lv_swap          253:3    0     2G  0 lvm  
  ├─vg_orange-lv_home_rmeta_0  253:4    0    32M  0 lvm  
  │ └─vg_orange-lv_home        253:8    0   1.8T  0 lvm  /home
  ├─vg_orange-lv_home_rimage_0 253:5    0   1.8T  0 lvm  
  │ └─vg_orange-lv_home        253:8    0   1.8T  0 lvm  /home
  └─vg_orange-lv_root          253:9    0    50G  0 lvm  
sdc                              8:32   0   1.8T  0 disk 
├─sdc1                           8:33   0   500M  0 part 
└─sdc2                           8:34   0   1.8T  0 part 
  ├─vg_orange-lv_home_rmeta_1  253:6    0    32M  0 lvm  
  │ └─vg_orange-lv_home        253:8    0   1.8T  0 lvm  /home
  └─vg_orange-lv_home_rimage_1 253:7    0   1.8T  0 lvm  
    └─vg_orange-lv_home        253:8    0   1.8T  0 lvm  /home

pvscanコマンド

システムの PV (パーティションのうち LVM の管理下に入っているもの) を一覧するには pvscan コマンドを使う。私のシステムでは PVは一つだけ。

# pvscan -v
    Wiping cache of LVM-capable devices
    Wiping internal VG cache
    Walking through all physical volumes
  PV /dev/sda2   VG fedora   lvm2 [19.51 GiB / 0    free]
  Total: 1 [19.51 GiB] / in use: 1 [19.51 GiB] / in no VG: 0 [0   ]

それぞれのPV がどのVGに組み入れられているか, が表示される。

pvscan は表形式での表示。もう少し詳しく表示させるのは, pvdisplayコマンド。引数なしで, すべての PV が表示される。

pvs でも, 表示形式が少し違うが, 表形式で表示される。pvs --all で, すべてのパーティションのうち, どれが PVかも表示できる。

システム全体の VG (Volume Group) を一覧表示するのは vgscan コマンド。下の例では "fedora" がVG名. pvscanコマンドで VGも分かるので、蛇足。

# vgscan -v
    Wiping cache of LVM-capable devices
    Wiping internal VG cache
  Reading all physical volumes.  This may take a while...
    Finding all volume groups
    Finding volume group "fedora"
  Found volume group "fedora" using metadata type lvm2

lvscanコマンド

そして, LV (Logical Volume) を表示するのは lvscan コマンド。lvscanは, LV がフルパス形式で表示される。--all オプションを付けると, ミラーリングしている個別の LV も表示される。

# lvscan --all
  ACTIVE            '/dev/fedora/swap' [2.00 GiB] inherit
  ACTIVE            '/dev/fedora/root' [17.51 GiB] inherit

ミラーリングしている場合は, 次のように表示される。この例では, lv_homeをミラーリングしている。

# lvscan --all
  ACTIVE            '/dev/vg_orange/lv_swap' [1.97 GiB] inherit
  ACTIVE            '/dev/vg_orange/lv_home' [1.77 TiB] inherit
  ACTIVE            '/dev/vg_orange/lv_root' [50.00 GiB] inherit
  ACTIVE            '/dev/vg_orange/lv_home_rmeta_0' [32.00 MiB] inherit
  ACTIVE            '/dev/vg_orange/lv_home_rmeta_1' [32.00 MiB] inherit
  ACTIVE            '/dev/vg_orange/lv_home_rimage_1' [1.77 TiB] inherit
  ACTIVE            '/dev/vg_orange/lv_home_rimage_0' [1.77 TiB] inherit
  ACTIVE            '/dev/fedora/swap' [3.77 GiB] inherit
  ACTIVE            '/dev/fedora/home' [411.50 GiB] inherit
  ACTIVE            '/dev/fedora/root' [50.00 GiB] inherit

こちらも, lvdisplay コマンドで、すべての LV について詳しく表示できる。

lvsコマンドで, 表形式でも違った形の表示もできる。--all オプションも同じ。

/etc/fstab ファイルの設定により, ここで表示されている LV のうちどれを自動マウントするかを決める。/dev/fedora/swap がスワップ領域として使われ, /dev/fedora/root が / にマウントされている。

エラーチェック

状況が確認できたので、エラーチェックしてみる。

マウントされている状態ではエラーチェックはできない。どうするか。

GParted Live CDでブートして, エラーチェックをおこなう。

まずは PV. pvckコマンドは, PVメタデータを検査する。

# pvck -v /dev/sda2

VG. vgckコマンドは, 同じく, VGメタデータを検査する。

# vgck -v fedora

最後にファイルシステム. GParted でブートすると LVがアクティブでないので, アクティブにしてから。

# lvchange --activate y /dev/fedora/root
# e2fsck -pvf /dev/fedora/root
-p 自動修復する。
-v verboseモード。
-f 強制チェック。

関連ページ