OCI Computeでディスクの空き容量が足りなくなったときの追加方法 Part2

# 前回の続き

前回から続いた内容なので、5から始まる連続した段落番号をつけている。

* [OCI Computeでディスクの空き容量が足りなくなったときの追加方法 Part1](https://qiita.com/yamada-hakase/items/13885b7664afa7383df0)

# 5. ブート・ボリュームを拡張する

前回書いたように、ブート・ボリュームもブロック・ボリュームも基本的な拡張方法は同じである。そのため、違う部分を中心に説明する。

### 5-1. ブート・ボリュームで考えること

ブート・ボリュームとブロック・ボリュームでは用途や制限事項が異なる。そのため以下の違いを理解する必要がある。

* ~~<font color="blue">オンライン拡張できないので、OSを停止する必要がある（ブロック・ボリュームはOS停止不要）</font>~~
* ~~<font color="blue">マニュアルの手順では、拡張操作用に別インスタンスが必要</font>~~
* <font color="blue">エクスポート／インポート可能なカスタム・イメージの最大サイズは400 GB</font>

<font color="red">新機能オンラインリサイズによって制限事項が変わった。</font>従来のオフラインで実施するときは制限がある。


またCompute（IaaS）では、カスタム・イメージの活用は重要なプラクティスの一つだ。ブート・ボリュームのサイズはコンパクトにして、データなどはブロック・ボリュームに配置しよう。

カスタム・イメージの詳細は以下のマニュアルを参照のこと。

* [OCIマニュアル：カスタム・イメージの管理](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Compute/Tasks/managingcustomimages.htm)
* [OCI Manual：Managing Custom Images](https://docs.cloud.oracle.com/en-us/iaas/Content/Compute/Tasks/managingcustomimages.htm)

### 5-2. ブート・ボリュームの拡張方法

ブート・ボリュームの拡張方法は3通りの方法がある。1はマニュアルで紹介されている方法で、2は`oci-growfs`を使う方法だ。ただし2が使用できるのは、Oracle Linux 7以降でxfsファイルシステムのときに限られる。

1. <font color="blue">インスタンスを停止し、別の作業用インスタンスで拡張する</font>
2. <font color="blue">インスタンスを停止／起動したあと、自インスタンス内で拡張する</font>
3. <font color="blue">オンラインで拡張する</font>

3のオンラインの方法は次の記事を見てほしい。

* [ボリュームのオンラインリサイズが可能になったよ](https://qiita.com/yamada-hakase/items/daea963237a70620c4bb)

### 5-2-1. 全体の手順

それぞれの手順の流れは以下のとおり。この手順を見るとoci-growfsを使う方法がとても簡単なことが分かる。次の5-3では「2. ボリュームの拡張」の手順から説明する。

**1. ブート・ボリュームのバックアップ（推奨）**
　1-1. バックアップを取得する

**2. ボリュームの拡張**
　2-1. インスタンスを停止する
　2-2. ブート・ボリュームをデタッチする
　2-3. ブート・ボリュームを拡張する

<font color="blue">**【作業用インスタンスで拡張する方法】**</font>
**3. パーティションとファイルシステムの拡張**
　3-1. 作業用インスタンスでブート・ボリュームをアタッチする
　3-2. パーティションを拡張する
　3-3. ファイルシステムに破損がないことを確認する
　3-4. ブート・ボリュームをマウントする
　3-5. ファイルシステムを拡張する
　3-6. ブート・ボリュームをアンマウントする
　3-7. 作業用インスタンスでブート・ボリュームをデタッチする
　3-8. 元のインスタンスでブート・ボリュームをアタッチする
　3-9. インスタンスを起動する


<font color="blue">**【oci-growfsで拡張する方法】**</font>
**3. パーティションとファイルシステムの拡張**
　3-1. ブート・ボリュームをアタッチする
　3-2. インスタンスを起動する
　3-3. oci-growfsでパーティションとファイルシステムを拡張する


### 5-3. ブート・ボリュームを拡張する

これは共通の手順である。管理コンソールやCLIなどでインスタンスを停止してから、ブート・ボリュームを拡張する。

1. ブート・ボリュームを拡張するインスタンスを停止する。

2. Computeインスタンスの詳細ページで**[Boot Volume（ブート・ボリューム）]**を選択し、ブート・ボリュームをデタッチする。ステータスが「Detached（デタッチ済み）」に変わると完了だ。
3. ブート・ボリュームをクリックして詳細ページを表示する。
4. **[Edit Size or Performance（サイズもしくはパフォーマンスの編集）]**をクリックして、今回は100 GBに変更する。ステータスが「Provisioning（プロビジョニング中）」から「Available（利用可能）」に変わると完了だ。
5. 次は実行したい方法に応じて「5-4. 作業用インスタンスで拡張する方法」もしくは「5-5. oci-growfsで拡張する方法」に進む。<font color="red">オンラインで実行するときはoci-growfsを使用すること。</font>

### 5-4. 作業用インスタンスで拡張する

この方法ではパーティション拡張に、別の作業用インスタンスを使用する。前のステップでボリューム自体は拡張したので、パーティションとファイルシステムを拡張する。

### 5-4-1. パーティションを拡張する

1. 作業用インスタンスの詳細ページから**[Attached Block Volumes（アタッチされたブロック・ボリューム）]**を選択して、拡張するブート・ボリュームをアタッチする。

- **ATTACHMENT TYPE :** paravirtualized
- **Access:** Read/Write
- **BLOCK VOLUME NAME:** 拡張するブート・ボリューム
- **IN-TRANSIT ENCRYPTION:** not check(disable)

2.作業用インスタンスにsshログインしてボリュームを確認する。`lsblk`で確認すると/dev/sdbとして認識されている。

```shell-session
# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0 46.6G  0 disk ★拡張対象のブート・ボリューム
├─sdb2   8:18   0    8G  0 part
├─sdb3   8:19   0 38.4G  0 part ★これから拡張するパーティション
└─sdb1   8:17   0  200M  0 part
sda      8:0    0 46.6G  0 disk
├─sda2   8:2    0    8G  0 part [SWAP]
├─sda3   8:3    0 38.4G  0 part /
└─sda1   8:1    0  200M  0 part /boot/efi
```

3.growpartでパーティションを拡張する。「`growpart デバイス名 パーティション番号`」のように指定する。デバイス名とパーティション番号の間には空白が必要なことに注意する。Oracle Linux 6ではワーニングが出るが無視してよい。

```shell-session
# growpart /dev/sdb 3
CHANGED: disk=/dev/sda partition=3: start=17188864 old: size=80486399,end=97675263 new: size=192526302,end=209715166
```

<font color="red">**重要**
パーティション拡張がサポートされているのは最後のパーティションに限られる。必ずデバイス最後のパーティション番号を指定すること。</font>


4.パーティションサイズを確認すると、sdb3が98.6Gに拡張されている。初回実行するとワーニングが表示されるのでFを入力する。

```shell-session
# parted /dev/sdb print
Model: ORACLE BlockVolume (scsi)
Disk /dev/sdb: 107GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system     Name                  Flags
 1      1049kB  211MB   210MB   fat16           EFI System Partition  boot
 2      211MB   8801MB  8590MB  linux-swap(v1)
 3      8801MB  107GB   98.6GB  xfs ★拡張されたパーティション
```

### 5-4-2. ファイルシステムを拡張する

ファイルシステムを拡張することで、ようやく利用可能な領域が増える。ext4とxfsではコマンドが違うのでそれぞれ説明する。

#### xfsファイルシステムを拡張する

1.ファイルシステムを拡張する前に、破損箇所が無いことを確認する。

```shell-session
# xfs_repair -n /dev/sdb3
Phase 1 - find and verify superblock...
Phase 2 - using internal log
        - zero log...
        - scan filesystem freespace and inode maps...
        - found root inode chunk
★中略★
Phase 6 - check inode connectivity...
        - resetting contents of realtime bitmap and summary inodes
        - traversing filesystem ...
        - traversal finished ...
        - moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done ★正常終了
```

もしエラー表示されたときには次のように`-n`オプションを付けないで実行する。オプションを付けないと実際に修復作業が実行される。

```shell-session
# xfs_repair ＜デバイス名＞
```

2.ボリュームをマウントする。

```shell-session
# mkdir /mnt/tmp
# mount /dev/sdb3 /mnt/tmp
```

3.xfsファイルシステムを拡張する。

```shell-session
# xfs_growfs -d  /mnt/tmp
meta-data=/dev/sdb3              isize=256    agcount=4, agsize=2515200 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=0        finobt=0 spinodes=0 rmapbt=0
         =                       reflink=0
data     =                       bsize=4096   blocks=10060800, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=4912, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 10060800 to 24065787
```

4.ディスクの空きを確認すると90Gに拡張されている。

```shell-session
# df -h /mnt/tmp
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb3        92G  1.9G   90G   2% /mnt/tmp
```

#### ext4ファイルシステムを拡張する

1.ファイルシステムを拡張する前に、破損箇所が無いことを確認する。

```shell-session
# e2fsck -f /dev/sdb3
e2fsck 1.43-WIP (20-Jun-2013)
/dev/sdb1: clean, 12/6553600 files, 715350/26213888 blocks
```

2.ボリュームをマウントする。

```shell-session
# mkdir /mnt/tmp
# mount /dev/sdb3 /mnt/tmp
```

3.ext4ファイルシステムを拡張する。

```shell-session
# resize2fs /dev/sdb3
resize2fs 1.43-WIP (20-Jun-2013)
Filesystem at /dev/sdb1 is mounted on /mnt/vol01; on-line resizing required
old_desc_blocks = 7, new_desc_blocks = 19
The filesystem on /dev/sdb1 is now 78642939 blocks long.
```

4.ディスクの空きを確認すると、90Gに拡張されている。

```shell-session
# df -h /mnt/tmp
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb3        92G  1.9G   90G   2% /mnt/tmp
```

### 5-4-3. ブート・ボリュームを元のインスタンスでアタッチする

1. ボリュームを作業用インスタンスからアンマウントする。次のようにfindmntの結果が1ならばアンマウントされている。

```shell-session
# umount /mnt/tmp
# findmnt /mnt/tmp; echo $?
1
```

2.作業用インスタンスの詳細ページから**[Attached Block Volumes（アタッチされたブロック・ボリューム）]**を選択し、ボリュームをデタッチする。

3.元のインスタンスの詳細ページで**[Boot Volume（ブート・ボリューム）]**を選択し、ブート・ボリュームをアタッチする。

4.ステータスが「Attached（アタッチ済み）」になったら、Computeインスタンスを起動する。

5.次に「5-6. 拡張したボリュームを確認する」に進む。

### 5-5. oci-growfsで拡張する

oci-growfsを使うと、作業用インスタンスが無くてもブート・ボリュームのパーティションやファイルシステムを拡張できる。ただし、使用できるのはOracle Linux 7/8だけで、他のLinux OSやxfs以外のファイルシステムでは利用できない。

実態はシェルスクリプトなので、やる気になれば他のLinux OSでも実行できるのだが...。

### 5-5-1. oci-growfsとは

oci-growfsはOracle Linux 7以降で提供されているコマンドである。次の結果から分かるように、oci-utilsに含まれているシェルスクリプトだ。

```shell-session
$ rpm -qf  /usr/libexec/oci-growfs
oci-utils-0.14.0-4.el8.noarch

$ wc -l /usr/libexec/oci-growfs
14 /usr/libexec/oci-growfs　★14行のシェルスクリプト
```

やっていることは、パーティションの拡張とxfsファイルシステムの拡張である。

### 5-5-2. パーティションとファイルシステムを拡張する

oci-growfsでは他のインスタンスを使わないので、すべて拡張対象のインスタンスで実行する。<font color="red">また、ここまでオンラインで実行しているときにはインスタンスは起動済みなので、3のsshログインに進む。</font>

1. Computeインスタンスの詳細ページで**[Boot Volume（ブート・ボリューム）]**を選択し、ブート・ボリュームをアタッチする。ステータスが「attached（アタッチ済み）」に変わると完了だ。

2. Computeインスタンスを起動する。
3. 該当インスタンスにsshログインする。
4. 現在のディスクを見ると46.6Gから100Gに拡張されているが、パーティションやファイルシステムは以前と同じになっている。

```shell-session
# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0  100G  0 disk　★100Gに拡張されている
├─sda2   8:2    0    8G  0 part [SWAP]
├─sda3   8:3    0 91.8G  0 part /
└─sda1   8:1    0  200M  0 part /boot/efi
```

ファイルシステムのサイズは以前と同じ。

```shell-session
# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        39G  1.9G   37G   5% /　★ルート・ファイルシステムは39G
```

パーティション・サイズも以前と同じ。

```shell-session
# parted /dev/sda print
Model: ORACLE BlockVolume (scsi)
Disk /dev/sda: 107GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system     Name                  Flags
 1      1049kB  211MB   210MB   fat16           EFI System Partition  boot
 2      211MB   8801MB  8590MB  linux-swap(v1)
 3      8801MB  50.0GB  41.2GB  xfs　★
```
5.`/usr/libexec/oci-growfs`コマンドでパーティションとファイルシステムを拡張する。パスが通っていないのでフルパスを入力すること。

```shell-session
# /usr/libexec/oci-growfs
CHANGE: disk=/dev/sda partition=3: start=17188864 old: size=80486399,end=97675263 new: size=192526302,end=209715166
Confirm? [y/n]: y ★yを入力する
CHANGED: disk=/dev/sda partition=3: start=17188864 old: size=80486399,end=97675263 new: size=192526302,end=209715166
meta-data=/dev/sda3              isize=256    agcount=4, agsize=2515200 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=0        finobt=0 spinodes=0 rmapbt=0
         =                       reflink=0
data     =                       bsize=4096   blocks=10060800, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=4912, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 10060800 to 24065787
```

<font color="blue">**ヒント**
oci-growfsは、ルートパーティションとファイルシステムを、現在のボリュームサイズまで拡張するコマンドだ。そのためルートパーティションを拡張する以外の目的では使用できない。
</font>


### 5-6. 拡張したボリュームを確認する

すべての作業が終了したので、ディスクの状況を確認する。するとルート・パーティションは拡張され、サイズは39Gから92GBになっている。これで作業は終了だ。

```shell-session
# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        92G  1.9G   90G   2% /　★92Gに拡張
```


# 6. まとめ

**ブート・ボリューム／ブロック・ボリューム共通**

* クラウドではLVMを使わずに、ボリューム自体を拡張することが多い
* 1つのボリュームのサイズは約50 GBから32 TBまで（Windowsのブート・ボリュームの最小サイズは256 GB）
* ボリュームは拡張できるが、縮小できない
* 拡張できるパーティションは、そのボリュームの最後のパーティションに限られる
* オンラインでボリュームを拡張できる
* 拡張には大きく分けて「ボリュームの拡張」「パーティションの拡張」「ファイルシステムの拡張」という3つのステップが必要
* パーティションの拡張には`growpart`コマンドが便利


**ブート・ボリューム固有**

* ブート・ボリュームはLVMを使わずに構成されている
* `oci-growfs`コマンドを使うと、パーティションとファイルシステムを簡単に拡張できる

# 7. 参考資料

**Oracle Cloud Infrastructureマニュアル（日本語）**

* [ボリュームのサイズ変更](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Block/Tasks/resizingavolume.htm)
* [ブート・ボリュームのパーティションの拡張](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Block/Tasks/extendingbootpartition.htm)
* [カスタム・イメージの管理](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Compute/Tasks/managingcustomimages.htm)


**Oracle Cloud Infrastructureマニュアル（英語）**

* [Resizing a Volume](https://docs.cloud.oracle.com/en-us/iaas/Content/Block/Tasks/resizingavolume.htm)
* [Extending the Partition for a Boot Volume](https://docs.cloud.oracle.com/en-us/iaas/Content/Block/Tasks/extendingbootpartition.htm)
* [Managing Custom Images](https://docs.cloud.oracle.com/en-us/iaas/Content/Compute/Tasks/managingcustomimages.htm)

**その他**

* [RHEL7 Storage Administration Guide: RESIZING A PARTITION WITH FDISK](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/s2-disk-storage-parted-resize-part)