lsblk、sgdisk、LVM 系コマンドの使用例

lsblk、sgdisk、LVM 系コマンドの使用例を作りました。
流れとしては、パーティションも何もないまっさらなディスクを用意し、そのディスクに対して

* lsblk コマンドでブロックデバイスの確認
* sgdisk コマンドでパーティションの作成
* LVM 系コマンドで LVM の作成、拡張
* sgdisk、LVM 系コマンドでの削除

をするものとなっています。
なお、あくまでもコマンドの使用例ですので、各パーティションの容量の割り当てなどは実践的なものではありません。
今回、各コマンドを試すまっさらなディスクとして、さくらのクラウドのブランクディスクを用いることとします。

## さくらのクラウドでのブランクディスクの利用手順

以下の画像は2016年12月10日現在のものとなります。

### サーバの作成

最初に、ブランクディスクを接続するサーバを作成します。
今回は CentOS 7.2 で作成したいと思います。
ブランクディスクを接続後にサーバを起動したいので「作成後すぐに起動」のチェックボックスは外しておきます。

<img width="758" alt="add_server.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/6915/0e93b33d-fc12-9513-9572-4dac1414e9f9.jpeg">

### ブランクディスクの作成

次に、ブランクディスクを作成します。
「接続先サーバ」には先ほど作成したサーバを指定します。

<img width="765" alt="add_disk.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/6915/ed344097-55a5-4a42-6fe1-4392bbceae2d.jpeg">

### ブランクディスクを接続したサーバの起動

最後に、ブランクディスクを接続したサーバを「電源操作」から起動します。
なお、下記画像の「接続」のとおり、今回はディスク1、2 ともに virtio での接続ですので、`/dev` ディレクトリには `/dev/vd*` のブロックデバイス、具体的には `/dev/vda` と `/dev/vdb` が存在することとなります。

<img width="648" alt="index_disk.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/6915/7a84d06e-3a87-f6da-9d42-08d933e75e56.jpeg">

サーバを起動しましたら、 ssh や リモートスクリーンからサーバに入り、コマンドを叩いていきましょう。

## lsblk、sgdisk、LVM 系コマンドの使用例

### はじめに

以下、コマンドのオプションは `sgdisk [-p|--print]` のように、ショートオプションとロングオプションを併記します。
登場するコマンドのバージョンは下記のとおりです。

```
[root@test ~]# lsblk --version
lsblk from util-linux 2.23.2

[root@test ~]# sgdisk --version
GPT fdisk (sgdisk) version 0.8.6

[root@test ~]# pvscan --version
  LVM version:     2.02.130(2)-RHEL7 (2016-06-09)
  Library version: 1.02.107-RHEL7 (2016-06-09)
  Driver version:  4.33.0
```

### ブロックデバイスの確認

まずは、いったん lsblk コマンドでブランクディスクのブロックデバイスを確認します。

```
[root@test ~]# lsblk
```

とコマンドを打ちますと、

```
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0      2:0    1    4K  0 disk
sr0     11:0    1 1024M  0 rom
vda    253:0    0   20G  0 disk
├─vda1 253:1    0    1M  0 part
├─vda2 253:2    0    4G  0 part [SWAP]
└─vda3 253:3    0   16G  0 part /
vdb    253:16   0   20G  0 disk
```

上記のとおり、`vda` と `vdb` が存在しますが、ブランクディスクの `vdb` には枝分かれの `part` が存在せず、パーティションが切られていないことがわかります。
`lsblk` コマンドはパーティションの追加後などに逐次打ってみるとよいかと思います。

それでは、`sgdisk [-p|--print]` を打ち、`/dev/vdb` のサマリーデータを確認してみましょう。

```
[root@test ~]# sgdisk --print /dev/vdb
Creating new GPT entries.
Disk /dev/vdb: 41943040 sectors, 20.0 GiB
Logical sector size: 512 bytes
（以下省略）
```

上記のように、`/dev/vdb` のセクター数やセクターのサイズなどがわかります。
ブランクディスクの現状を把握しましたので、実際にパーティションを切る作業に入ります。

### パーティションの作成

ここでは、20GiB の `/dev/vdb` を 2GiB 、9GiB、9GiB とパーティションを切ってみることにします。
`sgdisk [-n|--new]` を使います。

```
[root@test ~]# sgdisk --new 1::+2G /dev/vdb
The operation has completed successfully.

[root@test ~]# sgdisk --new 2::+9G /dev/vdb
The operation has completed successfully.

[root@test ~]# sgdisk --new 3:: /dev/vdb
The operation has completed successfully.
```

`1::+2GB` の部分ですが、`:` で区切られており、左から

* パーティションの番号
* パーティションの始まりのセクター（省略可）
* パーティションの終わりのセクター（省略可）

となります。
パーティション作成後の `/dev/vdb` のサマリーデータを `sgdisk [-p|--print]` で表示しますと、

```
[root@test ~]# sgdisk --print /dev/vdb
（途中省略）
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         4196351   2.0 GiB     8300
   2         4196352        23070719   9.0 GiB     8300
   3        23070720        41943006   9.0 GiB     8300
```

となっており、Size の項から、意図したとおり 2GiB、9GiB、9GiB のパーティションが切られていることがわかります。

### パーティションのコードの一覧の表示とコードの変更方法

ところで、上記の `sgdisk --print /dev/vdb` にはパーティションのコードとして 8300 が記載されていました。
他にどのようなコードが存在するのか確認してみましょう。
`sgdisk [-L|--list-types]` を打ってみます。

```
[root@test ~]# sgdisk --list-types
0700 Microsoft basic data  0c01 Microsoft reserved    2700 Windows RE
4200 Windows LDM data      4201 Windows LDM metadata  7501 IBM GPFS
7f00 ChromeOS kernel       7f01 ChromeOS root         7f02 ChromeOS reserved
8200 Linux swap            8300 Linux filesystem      8301 Linux reserved
8e00 Linux LVM             a500 FreeBSD disklabel     a501 FreeBSD boot
a502 FreeBSD swap          a503 FreeBSD UFS           a504 FreeBSD ZFS
a505 FreeBSD Vinum/RAID    a580 Midnight BSD data     a581 Midnight BSD boot
a582 Midnight BSD swap     a583 Midnight BSD UFS      a584 Midnight BSD ZFS
a585 Midnight BSD Vinum    a800 Apple UFS             a901 NetBSD swap
a902 NetBSD FFS            a903 NetBSD LFS            a904 NetBSD concatenated
a905 NetBSD encrypted      a906 NetBSD RAID           ab00 Apple boot
af00 Apple HFS/HFS+        af01 Apple RAID            af02 Apple RAID offline
af03 Apple label           af04 AppleTV recovery      af05 Apple Core Storage
be00 Solaris boot          bf00 Solaris root          bf01 Solaris /usr & Mac Z
bf02 Solaris swap          bf03 Solaris backup        bf04 Solaris /var
bf05 Solaris /home         bf06 Solaris alternate se  bf07 Solaris Reserved 1
bf08 Solaris Reserved 2    bf09 Solaris Reserved 3    bf0a Solaris Reserved 4
bf0b Solaris Reserved 5    c001 HP-UX data            c002 HP-UX service
ed00 Sony system partitio  ef00 EFI System            ef01 MBR partition scheme
ef02 BIOS boot partition   fb00 VMWare VMFS           fb01 VMWare reserved
fc00 VMWare kcore crash p  fd00 Linux RAID
```

便利なリストが表示されました。
8300 は「Linux filesystem」と記載されています。
2番目と3番目のパーティションを 8e00 の「Linux LVM」に変更してみましょう。
`sgdisk [-t|--typecode]` を使います。

```
[root@test ~]# sgdisk --typecode 2:8e00 /dev/vdb
The operation has completed successfully.

[root@test ~]# sgdisk --typecode 3:8e00 /dev/vdb
The operation has completed successfully.
```

変更した結果を `sgdisk --print /dev/vdb` で確認します。

```
[root@test ~]# sgdisk --print /dev/vdb
（途中省略）
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         4196351   2.0 GiB     8300
   2         4196352        23070719   9.0 GiB     8E00
   3        23070720        41943006   9.0 GiB     8E00
```

2番目、3番目のコードが 8E00 に変更されました。


### パーティションの名前の変更

パーティションに名前をつけてみましょう。
`sgdisk [-c|--change-name]` を使います。

```
[root@test ~]# sgdisk --change-name 1:"NOT LVM" /dev/vdb
The operation has completed successfully.

[root@test ~]# sgdisk --change-name 2:"LVM1" /dev/vdb
The operation has completed successfully.

[root@test ~]# sgdisk --change-name 3:"LVM2" /dev/vdb
The operation has completed successfully.
```

名前を付けた結果を、`sgdisk --print /dev/vdb` で確認します。

```
[root@test ~]# sgdisk --print /dev/vdb
（途中省略）
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         4196351   2.0 GiB     8300  NOT LVM
   2         4196352        23070719   9.0 GiB     8E00  LVM1
   3        23070720        41943006   9.0 GiB     8E00  LVM2
```

Name の項にパーティションの名前が表示されるようになりました。
次に、パーティションの2番目と3番目を利用して LVM を作成したいと思います。

### lvm2 のインストール

最初に LVM 系のコマンドをインストールしておきます。

```
[root@test ~]# yum install lvm2
```

### 物理ボリュームの作成

下記の `pvcreate` コマンドで物理ボリュームを作成します。

```
[root@test ~]# pvcreate /dev/vdb2
  Physical volume "/dev/vdb2" successfully created

[root@test ~]# pvcreate /dev/vdb3
  Physical volume "/dev/vdb3" successfully created
```

物理ボリュームの `/dev/vdb2` と `/dev/vdb3` の作成が成功したようです。
作成結果を `pvscan` コマンドで確認します。

```
[root@test ~]# pvscan
  PV /dev/vdb3         lvm2 [9.00 GiB]
  PV /dev/vdb2         lvm2 [9.00 GiB]
  Total: 2 [18.00 GiB] / in use: 0 [0   ] / in no VG: 2 [18.00 GiB]
```

あわせて `pvdisplay` コマンドで確認するのもよいでしょう。

### ボリュームグループの作成

まずは `vgcreate` コマンドを使い `/dev/vdb2` だけで `lvm_sample` というボリュームグループを作成してみます。

```
[root@test ~]# vgcreate lvm_sample /dev/vdb2
  Volume group "lvm_sample" successfully created
```

作成が成功したようです。
`vgscan` コマンドで作成したボリュームグループを確認します。

```
[root@test ~]# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "lvm_sample" using metadata type lvm2
```

ここで `vgdisplay [-v|--verbose]` コマンドを打ちますと、ボリュームグループの物理ボリュームが表示されます。

```
[root@test ~]# vgdisplay --verbose lvm_sample
（途中省略）
  --- Physical volumes ---
  PV Name               /dev/vdb2
（以下省略）
```

### 論理ボリュームの作成

`lvcreate` コマンドで論理ボリュームの作成が可能です。

```
[root@test ~]# lvcreate --extents 100%FREE -n data lvm_sample
  Logical volume "data" created.
```

ここでは、上記のとおり、`[-l|--extents] 100%FREE` として、すべてのフリーなスペースを割り当てました。
また、 `[-n|--name]` オプションで、data という名前の論理ボリュームにしています。
実際、`lvscan` コマンドや `lvdisplay` コマンドで確認しますと、

```
[root@test ~]# lvscan
  ACTIVE            '/dev/lvm_sample/data' [9.00 GiB] inherit
```

と、`/dev/lvm_sample/data` の論理ボリュームが 9.00 GiB になっていることがわかります。

### 論理ボリュームの拡張

論理ボリュームを拡張する場合、最初に `vgextend` コマンドでボリュームグループに物理ボリュームを追加しておきましょう。

```
[root@test ~]# vgextend lvm_sample /dev/vdb3
  Volume group "lvm_sample" successfully extended
```

上記コマンドを打った後、前述の `vgdisplay [-v|--verbose]` コマンドでボリュームグループを確認しますと、物理ボリュームとして `/dev/vdb3` が追加されていることがわかります。
それでは、`lvextend` コマンドで論理ボリュームを拡張してみます。

```
[root@test ~]# lvextend --extents +100%FREE /dev/lvm_sample/data
  Size of logical volume lvm_sample/data changed from 9.00 GiB (2303 extents) to 17.99 GiB (4606 extents).
  Logical volume data successfully resized.
```

リサイズに成功したようです。
論理ボリュームの作成のところで使用した `lvscan` コマンドや `lvdisplay` コマンドを叩いても拡張されていることがわかります。

以上で作成、拡張系の手順は終了です。
当然ですが、現時点ではファイルシステムを出力する `lsblk [-f|--fs]` で確認しましても、`/dev/vdb` にはファイルシステムが存在していませんので、この後には利用したいファイルシステムを `mkfs` コマンドなどで作成する作業が待っています。

以下、参考として、LVM とパーティションの削除について記載します。

### LVM の削除について

論理ボリュームの削除は `lvremove` コマンドです。
論理ボリュームが active なときに `lvremove`コマンドを利用しますと `Do you really want to remove active logical volume data? [y/n]` と確認されます。
本例では、いったん `lvchange -an` で deactivate してから削除することとします。

```
[root@test ~]# lvchange -an /dev/lvm_sample/data

[root@test ~]# lvremove /dev/lvm_sample/data
  Logical volume "data" successfully removed
```

ボリュームグループの削除は `vgremove` コマンドです。

```
[root@test ~]# vgremove lvm_sample
  Volume group "lvm_sample" successfully removed
```

物理ボリュームの削除は `pvremove` コマンドです。

```
[root@test ~]# pvremove /dev/vdb3
  Labels on physical volume "/dev/vdb3" successfully wiped

[root@test ~]# pvremove /dev/vdb2
  Labels on physical volume "/dev/vdb2" successfully wiped
```

### パーティションの削除について

個別にパーティションを削除する場合は `sgdisk [-d|--delete]` です。

```
[root@test ~]# sgdisk --delete 3 /dev/vdb
The operation has completed successfully.
```

すべてのパーティションの削除は `sgdisk [-Z|--zap-all]` です。

```
[root@test ~]# sgdisk --zap-all /dev/vdb
GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.
```

なお、パーティションが削除されるだけですので、もしデータまで削除したい場合には `dd` コマンドなどを利用してデータを削除することになります。
クラウドで作成したディスクの場合であれば、`dd` コマンドなどで削除せず、いったんディスクを削除して再度ディスクを作成した方が早い場合が多いかと思われます。

## まとめ

lsblk、sgdisk、LVM 系コマンドの基本的な使用例がわかりました。あとは状況に応じて `man` で他のオプションを確認しながらスクリプトを作成することなどができると思います。個人的には、ショートオプションよりは長くなりますが、わかりやすいロングオプションの方を好んで利用しています。