Linuxディスク関連コマンドまとめ

# ディスク関連コマンド

情報表示：**lsblk**, **blkid**
パーティション作成：**fdisk**, **cfdisk**, gdisk, cgdisk, sgdisk, parted
マウント：**mount**, **umount**
ファイルシステム：**mkfs**, **fsck**
ファイルシステム（ext2/3/4）用： resize2fs, dumpe2fs, tune2fs
スワップ：mkswap, swapon, swapoff
SMART情報表示：smartctl
LVM：lvmdiskscan, pvdisplay, pvscan, lvdisplay, lvscan
不良セクタ対処：badblocks, ddrescue
どのディレクトリが容量を食っているか調べる：ncdu

**太字**のコマンドはutil-linuxに含まれており、整合性が取れていることが期待できる（と思う）。

# ディスク、パーティションの情報を調べる

## fdisk -l でほぼ全ての情報が分かる

MBRかGPTのどちらかは「ディスクラベルのタイプ」を見れば分かる。
どこにマウントされているかは表示されないので`mount`コマンドを使う。

```
# fdisk -l  -o +UUID
ディスク /dev/vda: 20 GiB, 21474836480 バイト, 41943040 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: 301D27AA-0BF9-4B81-9B4A-3138251A4FD7

デバイス   開始位置 最後から セクタ サイズ タイプ                 UUID
/dev/vda1      2048   206847   204800   100M Linux ファイルシステム 56713D43-4900-46EB-92D5-1D09C9449B11
/dev/vda2    206848  4401151  4194304     2G Linux スワップ         D156FFCF-97DE-45EB-A6B0-21A9B876129A
/dev/vda3   4401152 41943006 37541855  17.9G Linux ファイルシステム C7A19722-4C31-4646-8ED4-DD4D86EFBC50
```

※ここで表示されるUUIDはファイルシステムのUUIDで、これとは別にディスクのUUIDというものもある（`/etc/fstab`の第1フィールドで指定するのはディスクUUID）。そちらは`lsblk -O`または`ls -l /dev/disk/by-uuid`でわかる。

## lsblk

`lsblk -O`で全てのカラムを表示できる。

```
NAME   KNAME MAJ:MIN FSTYPE MOUNTPOINT LABEL UUID                                 PARTTYPE                             PARTLABEL           PARTUUID                             PARTFLAGS  RA RO RM HOTPLUG MODEL            SERIAL   SIZE STATE   OWNER GROUP   MODE       ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE TYPE DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO WSAME WWN RAND PKNAME HCTL       TRAN SUBSYSTEMS        REV VENDOR
sr0    sr0    11:0                                                                                                                                                                        128  0  1       1 QEMU DVD-ROM     QM00003 1024M running root  optical brw-rw----         0    512      0     512     512    1 cfq       128 rom         0        0B       0B         0    0B        1        1:0:0:0    ata  block:scsi:pci   2.0. QEMU    
vda    vda   254:0                                                                                                                                                                        128  0  0       0                            20G         root  disk    brw-rw----         0    512      0     512     512    1           128 disk        0        0B       0B         0    0B        0                        block:virtio:pci      0x1af4
├─vda1 vda1  254:1   ext4   /boot      BOOT  8758e4e2-fdf4-4ef2-b364-6774a527dfcb 0fc63daf-8483-4772-8e79-3d69d8477de4 Linux filesystem    56713d43-4900-46eb-92d5-1d09c9449b11           128  0  0       0                           100M         root  disk    brw-rw----         0    512      0     512     512    1           128 part        0        0B       0B         0    0B        0 vda                    block:virtio:pci      
├─vda2 vda2  254:2   swap   [SWAP]           89696d46-105c-437d-ab85-de8cad63608a 0657fd6d-a4ab-43c4-84e5-0933c84b4f4f Linux swap          d156ffcf-97de-45eb-a6b0-21a9b876129a           128  0  0       0                             2G         root  disk    brw-rw----         0    512      0     512     512    1           128 part        0        0B       0B         0    0B        0 vda                    block:virtio:pci      
├─vda3 vda3  254:3   ext4   /          ROOT  b6813928-7d95-4b7d-b822-09f99172e3ce 0fc63daf-8483-4772-8e79-3d69d8477de4 Linux filesystem    c7a19722-4c31-4646-8ed4-dd4d86efbc50           128  0  0       0                          17.9G         root  disk    brw-rw----         0    512      0     512     512    1           128 part        0        0B       0B         0    0B        0 vda                    block:virtio:pci      
└─vda4 vda4  254:4                                                                21686148-6449-6e6f-744e-656564454649 BIOS Boot Partition dffbd921-d583-4cb9-aba3-c759eb237807           128  0  0       0                          1007K         root  disk    brw-rw----         0    512      0     512     512    1           128 part        0        0B       0B         0    0B        0 vda                    block:virtio:pci      
```

`-O`が使えない場合は`-o +UUID`のように指定（指定可能なカラムは`lsblk -h`で出てくる）。

## blkidというのもある

blkidはUUIDやラベルを表示したり、それらの条件で検索するものらしい。

```
# blkid
/dev/vda1: UUID="8758e4e2-fdf4-4ef2-b364-6774a527dfcb" TYPE="ext4" PARTLABEL="Linux filesystem" PARTUUID="56713d43-4900-46eb-92d5-1d09c9449b11"
/dev/vda2: UUID="89696d46-105c-437d-ab85-de8cad63608a" TYPE="swap" PARTLABEL="Linux swap" PARTUUID="d156ffcf-97de-45eb-a6b0-21a9b876129a"
/dev/vda3: UUID="b6813928-7d95-4b7d-b822-09f99172e3ce" TYPE="ext4" PARTLABEL="Linux filesystem" PARTUUID="c7a19722-4c31-4646-8ed4-dd4d86efbc50"
```

`man blkid`には**blkidよりlsblkを推奨**と書いてある。

>It  is  recommended  to  use  lsblk(8) command to get information about block devices rather than blkid.  lsblk(8) provides more information, better control on output formatting and it does not require root permissions to get actual information.
（blkidよりlsblkを使うことを推奨する。lsblkの方が詳しい情報を出力するし、出力フォーマットも細かく制御できるし、実際の情報を取得するためにroot権限を必要としない）

# パーティションを切る

| コマンド | 説明 |
|--------|--------|
| fdisk | 古来からあるコマンド。対話型。バッチ処理には不向き。util-linuxに含まれている。 |
| cfdisk | cursesベースのfdisk。対話型。日本語表示されるし、使いやすそう。util-linuxに含まれている。|
| gdisk | GPT版fdisk。fdiskとは開発元が別で、util-linuxには含まれていない。|
| cgdisk | cursesベースのgdisk。対話型。作者はgdiskと同じRoderick W. Smith。|
| sgdisk | スクリプトベースのgdisk。非対話型。作者はgdiskと同じRoderick W. Smith。|
| parted | GNU製。|

🐧 parted と gdisk で GPT ディスクのパーティショニング - 😃 mattintosh note 📝
http://mattintosh.hatenablog.com/entry/20140926/1411686000

# ファイルシステム作成（mkfs）

```
# mkfs -t ext4 /dev/デバイス
```

## ファイルシステムを識別するには`file -s`

```
# file -s /dev/vda1
/dev/vda1: Linux rev 1.0 ext4 filesystem data, UUID=8758e4e2-fdf4-4ef2-b364-6774a527dfcb, volume name "BOOT" (needs journal recovery) (extents) (huge files)
```

# マウント

## マウント

```
# mount /dev/デバイス /mnt/マウントポイント

またはUUIDを指定して
# mount UUID=0a5536e8-485c-43b2-XXXXXXXXXX /mnt/マウントポイント

マウントオプションを指定する
# mount /dev/デバイス /mnt/マウントポイント -o rw,relatime
```

* `relatime`は書き込みの時だけアクセス日時（atime）を更新する
* `noatime`は決してアクセス日時（atime）を更新しない
* どちらもパフォーマンスを向上させるが、`noatime`にすると`mutt`など正常に動作しなくなるプログラムがある。
* その他のオプションは`man mount`を参照
* `/etc/fstab`でしか設定できないオプションもある

## 確認

```
# mount
```

## アンマウント

```
# umount /mnt/マウントポイント
```

## 永続化させるには

```text:/etc/fstab
/dev/デバイス    /mnt/マウントポイント    ext4    defaults        0   0

またはUUIDを指定して
UUID=0a5536e8-485c-43b2-XXXXXXXXXX /mnt/マウントポイント    ext4    defaults        0   0
```

- 5番目のフィールドは`dump`コマンドの対象とするか
- 6番目のフィールドは起動時に`fsck`をかける順番。0：非対象、1：ルートファイルシステム、2：その他

# LVM関連

PV（Physical Volume）＝物理的なディスク（またはパーティション）のこと
VG（Volume Group）＝PVをまとめたもの
LV（Logical Volume）＝PVの中に作った論理ディスク。LVをmountしたりmkfsしたりできる。

情報表示コマンドは`lvmdiskscan`, `lvscan`, `lvdisplay`など。

Linux Hacks：LVMで楽々ディスク管理 (1/3) - ITmedia エンタープライズ
http://www.itmedia.co.jp/enterprise/articles/0709/05/news008.html


# ext2/ext3/ext4用のコマンド
## ext2/3/4ファイルシステムをリサイズ（resize2fs）

パーティションのサイズが変わった場合にファイルシステムをリサイズする。
Amazon Linuxの場合は起動時に自動的にresize2fsが実行されるので、手動実行しなくてもいいらしい。

## ext2/3/4ファイルシステムに関する情報を表示（dumpe2fs）

ext2/3/4の場合は`dumpe2fs /dev/デバイス`で

* 最後にマウントしたディレクトリ

をはじめ、詳細な情報が取得できる。
ただしここで表示される使用済みinode数などはリアルタイムなデータではなく、アンマウントしている状態でしか正しくない。それを知るには`df -i`を使う方がよい。

`df`で全ての情報を取得するには:

```
# df --output=source,fstype,itotal,iused,iavail,ipcent,size,used,avail,pcent,file,target
ファイルシス   タイプ   Iノード  I使用  I残り I使用% 1K-ブロック     使用    残り 使用% File マウント位置
dev            devtmpfs   62541    314  62227     1%      250164        0  250164    0% -    /dev
run            tmpfs      63215    367  62848     1%      252860      380  252480    1% -    /run
/dev/vda3      ext4     1175040 377317 797723    33%    18344808 10084412 7305468   58% -    /
tmpfs          tmpfs      63215      1  63214     1%      252860        0  252860    0% -    /dev/shm
tmpfs          tmpfs      63215     11  63204     1%      252860        0  252860    0% -    /sys/fs/cgroup
tmpfs          tmpfs      63215     19  63196     1%      252860       12  252848    1% -    /tmp
/dev/vda1      ext4       25688    367  25321     2%       95054    48031   39855   55% -    /boot
tmpfs          tmpfs      63215      5  63210     1%       50572        0   50572    0% -    /run/user/0
tmpfs          tmpfs      63215      1  63214     1%       30720        0   30720    0% -    /mnt/tmpfs
```

## 予備領域のサイズを減らして空き容量を絞りだす（tune2fs）

万一のときのための予備領域（デフォルトでは5%らしいがAmazon Linuxでは違うようだ）

まず現状を確認

```
# tune2fs -l /dev/xvda1 | grep Reserved
Reserved block count:     94351
```

予備領域を 1% に設定する。

```
# tune2fs -m 1 /dev/xvda1
tune2fs 1.42.12 (29-Aug-2014)
Setting reserved blocks percentage to 1% (23587 blocks)
```

# スワップ

スワップファイル作成。`dd`より`fallocate`を使う方が速い。

```
512MBのスワップファイルを作成する
# fallocate -l 512M /swapfile
```

スワップ領域作成

```
デバイスをスワップ領域にする場合：
# mkswap /dev/デバイス
スワップファイルを使う場合：
# mkswap /swapfile
```

スワップセット（--verboseは省略可）

```
# swapon --verbose /dev/デバイス
```

スワップ確認

```
# swapon -s
```

スワップ解除（--verboseは省略可）

```
# swapoff --verbose /dev/デバイス
```

# ディスク丸ごとコピー

## ddrescue

dd は破損ブロックの処理がうまくない。破損ブロックがなければいいが、あるときは ddrescue を使った方がよい。

https://ja.wikipedia.org/wiki/Ddrescue