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


# 1. はじめに
このエントリーを書くきっかけは **TL;DR** を読んでもらうとして、「空き容量不足によるディスク追加」は、運用では極めて一般的なオペレーションである。

ところがクラウドでは、それほど単純な話ではない。なぜならば、ディスクの空き不足による対処方法には多くの選択肢があり、またオンプレミス物理サーバーの常識と違う部分もあるからだ。さらにOCIでは、マニュアルの難解さや不十分さによって難易度を上げている。

そこで今回はLinux OSにおけるディスク追加の方法を説明する。

### 1-1. TL;DR

* ディスクの空きが少なくなったときの対処方法が複数ある
* 複数あるにもかかわらず、それぞれの特徴が整理されていない
* OCIマニュアルには既存のディスクを拡張する方法が記載されているが、コマンドだけを見るとドキドキするような操作になっている
* 手法の全体像を俯瞰（ふかん）し、それぞれの特徴を明らかにする共に実際の操作までを説明したい

### 1-2. 前提条件

* OCI Computeであること
* RHEL系互換ディストリビューション（6系／7系／8系／9系）
* 仮想マシンのシェイプであること

### 1-3. 用語について

紛らわしい用語があるので、本題に入る前に整理する。

OSがインストールされているボリュームを **「ブート・ボリューム」** と呼び、それ以外の2番目以降のボリュームを **「ブロック・ボリューム」** と呼ぶ。両者を区別しないときには **「ボリューム」** もしくは **「ブート・ボリュームとブロック・ボリューム」** と呼ぶことにする。

また **LVM（論理ボリュームマネージャー）** にも「物理ボリューム」「ボリュームグループ」「論理ボリューム」という用語がある。紛らわしいので、原則として **「LVM物理ボリューム」** のようにLVMを付けて表記する。

# 2. ディスクの追加方法を考える

ディスクの空き領域が少なくなったときの追加方法について整理する。

### 2-1. オンプレミスでの手法
伝統的な手法としては以下のものがある。

* <font color="blue">1) マウントポイントを分けてデータ移動</font>
* <font color="blue">2) LVM（論理ボリュームマネージャー）で既存の領域を拡張</font>

1はLVMがなかった、もしくはあまり使われていなかった時代の手法だ。クライアントならまだしも、サーバーでは2のほうが便利だろう。

また仮想サーバーでは以下の方法も可能だ。

* <font color="blue">3) VMDKやqcow2、VDIといった仮想ディスクのサイズを拡張</font>


また、これまで紹介したアプローチとは異なるが、ストレージ装置やハイパーバイザーのシンプロビジョニング機能を利用する方法もある。実ディスク容量を無視し、はじめから多めに見積もったディスクを割り当てれば、OSレイヤでの追加を不要にできる（HWレベルでの追加は必要）。

Oracleデータベースに限定されてしまう方法だが、ASM（Automatic Storage Management）を利用すると簡単にディスクを追加できる。

### 2-2. Oracle Cloud Infrastructure Computeでの手法

本題のOCI Computeにおける追加方法を検討する。なおOCI Database（VM）におけるストレージの拡張は「スケールアップ機能」として提供されているので、今回紹介する方法は利用できない。

### 2-2-1. 空き容量の追加方法

追加方法としては以下の方法が考えられる。OCIマニュアル「[ボリュームのサイズ変更](https://docs.oracle.com/ja-jp/iaas/Content/Block/Tasks/resizingavolume.htm)（ [英語](https://docs.oracle.com/en-us/iaas/Content/Block/Tasks/resizingavolume.htm)）」では「1.既存のボリュームを利用」の方法が紹介されている。


**1. 既存のボリュームを利用**

* 1-1. 既存のボリュームをオフラインにして拡張する
* 1-2. ボリュームのバックアップを、より大きなサイズのボリュームにリストアする
* 1-3. 既存のボリュームを、より大きなサイズのボリュームにクローンする
* 1-4. 既存のボリュームをオンラインのまま拡張する（<font color="red">New</font>）

**2. 新規ボリュームを追加**

* 2-1. ブロック・ボリュームを追加する（LVM使用）
* 2-2. ブロック・ボリュームを追加する（LVM不使用）

**3. その他**

* ローディング用のデータを置きたいなど、一時的に利用したいときは、NFSサービスのFile Storage Serviceを利用する方法もある

### 2-2-2. 追加方法ごとの特徴

それぞれの特徴は以下のとおり。大きな違いは「ブート・ボリューム対応」だ。

**1. 既存のボリュームを利用**

* ブート・ボリュームとブロック・ボリュームの両方に対応
* <font color="red">作業はオンラインもしくはオフラインで実施可能。ただし手順が異なる</font>
* ブート・ボリュームの場合、1-2と1-3はインスタンスの再作成になる

**2. 新規ボリュームを追加**

* ブロック・ボリュームに対応。<font color="red">ブート・ボリュームには非対応</font>
* 複数のブロック・ボリュームで、一つのLVMボリュームグループを構成した場合、一貫性のあるバックアップを取るには、OCIボリュームグループを利用する必要がある
* 32TB以上のストレージサイズに対応できる

<font color="blue">**ヒント**
~~2019年7月現在、AWSのEBSはオンライン拡張をサポートしているが、OCIのブロック・ボリュームはオンライン拡張をサポートしていない。~~
→2020年6月からオンライン拡張が可能になった。</font>

### 2-2-3. 今回紹介する方法

紹介した方法の中から、今回は **「1-1. オフラインにした既存のボリュームを拡張する」** における、ブロック・ボリュームとブート・ボリュームの、それぞれについて説明する。

「2-1. ブロック・ボリュームを追加する(LVM使用)」も説明したいところだが、オンプレミスと操作が同じなので、今回は説明しない。

オンラインで変更する **「1-4. 既存のボリュームをオンラインのまま拡張する」** は、以下の記事で紹介している。ただし基本的な考え方や後半の手順は同じなので、本記事も参考にしてほしい。

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

# 3. ブロック・ボリュームを拡張する

すでに仮想マシンとブロック・ボリュームが以下のように作成／マウントしているとして話を進める。また説明が長くなるため、iSCSIモードではなく、Paravirtualizedモードでマウントしているものとする。
![add_blockvolue01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/8088bfbf-3794-b9c1-769d-0c8916b7e4b9.png)

- **ATTACHMENT TYPE :** paravirtualized
- **BLOCK VOLUME NAME:** ol7srv_data01_bv
- **DEVICE PATH:** /dev/oracleoci/oraclevdb
- **IN-TRANSIT ENCRYPTION:** not check(disable)
- **Access:** Read/Write
- **Size:** 100 GB

初回のブロック・ボリュームのマウント方法は、以下のページを参考にすること。

* [OCI Computeでブロックボリュームをマウントする（LVM不使用編）](https://qiita.com/yamada-hakase/items/2e051720950470728230)

### 3-1. ボリューム拡張の基本

ボリュームの空き容量を増やす手順は以下のとおり。

1. <font color="blue">ボリュームの拡張</font>
2. <font color="blue">パーティションの拡張</font>
3. <font color="blue">ファイルシステムの拡張</font>

ブロック・ボリュームでもブート・ボリュームでも基本的な手順は同じだ。両者の特性の違いから、少し操作が異なるだけである。また2のパーティションの拡張方法は、複数の方法があるので、それぞれ説明する。


<font color="red">**注意：ボリュームのリサイズ前後で注意すること**</font>
「ボリュームのリサイズ」や「ボリュームの追加」などを実行したあとにOSをリブートするとデバイス・パスが代わる可能性がある。またiSCSI接続では、ボリュームのIPアドレスが変わる可能性がある。うまくマウントできないときは、そのあたりを調査すること。</font>

### 3-2. 変更前のボリュームの状態を確認する

現在のボリュームの状態を確認する。`/boot/efi`があることから`/dev/sda`がブート・ボリュームで、`/dev/sdb`が追加したブロック・ボリュームになっていることがわかる。

```shell-session
# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  200G  0 disk ★ブロック・ボリューム
└─sdb1   8:17   0  100G  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
```

/dev/sdXなどのデバイス名は、ボリューム追加後のOSリブートなどで変わる可能性がある。それに対処する仕組みがコンシステンス・デバイス・パスやUUIDである。

コンシステンス・デバイス・パスを確認すると、`/dev/oracleoci/oraclevdb`が`/dev/sdb`を指している。

```shell-session
# ls -l /dev/oracleoci/oraclevd*
lrwxrwxrwx. 1 root root 6 Jul 24 11:24 /dev/oracleoci/oraclevda -> ../sda
lrwxrwxrwx. 1 root root 7 Jul 24 11:24 /dev/oracleoci/oraclevda1 -> ../sda1
lrwxrwxrwx. 1 root root 7 Jul 24 11:24 /dev/oracleoci/oraclevda2 -> ../sda2
lrwxrwxrwx. 1 root root 7 Jul 24 11:24 /dev/oracleoci/oraclevda3 -> ../sda3
lrwxrwxrwx. 1 root root 6 Jul 24 11:34 /dev/oracleoci/oraclevdb -> ../sdb ★これ
lrwxrwxrwx. 1 root root 7 Jul 24 11:34 /dev/oracleoci/oraclevdb1 -> ../sdb1
```

ボリューム拡張の前後でデータ消失が起きないことを確認するため、100MBytesのダミーデータを作成する。

```shell-session
# dd if=/dev/zero of=/mnt/vol01/dummy.data bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0610943 s, 1.7 GB/s

# ls -lh /mnt/vol01/
total 100M
-rw-r--r--. 1 root root 100M Jul 22 20:49 dummy.data
```

### 3-3. ボリュームをバックアップする

<font color="red">具体的な手順は紹介しないが、ボリュームを拡張するときは事前にバックアップを取得すること。</font>万が一、パーティションやファイルシスシステムの拡張に失敗してデータが破損しても、リカバリーできる準備を整えておこう。

* [ボリュームのバックアップ](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Block/Tasks/backingupavolume.htm)
* [Backing Up a Volume](https://docs.cloud.oracle.com/en-us/iaas/Content/Block/Tasks/backingupavolume.htm)


### 3-4. ボリュームを拡張する

1. ボリュームの拡張はオフラインで実行する必要がある。そのため先にボリュームをアンマウントする。またボリュームを使っているプロセスがあるとアンマウントできないので、先に`lsof`で確認する。

```shell-session
# lsof /mnt/vol01 ←マウントポイントのディレクトリを指定
★何も表示されなければOK

# umount /mnt/vol01
```

2.ボリュームをデタッチする。Computeインスタンスの詳細ページから **[Attached Block Volumes（アタッチされたブロック・ボリューム）]** を選択し、該当のボリュームをデタッチする。ボリュームが一覧に表示されなくなれば、デタッチ作業は完了である。

3.ここで`lsblk`コマンドを実行すると、ブロック・ボリュームが接続されていないことがわかる。

```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 [SWAP]
├─sdb3   8:19   0 38.4G  0 part /
└─sdb1   8:17   0  200M  0 part /boot/efi
```

4.Block Storageページから該当のボリュームを選択し、 **[Edit Size or Performance（サイズもしくはパフォーマンスの編集）]** をクリックする。今回は200 GBytesに変更する。

5.現在のサイズより大きな値を入力する。ステータスが「PROVISIONING（オレンジ）」から「AVAILABLE（グリーン）」に変われば拡張は終了している。

6.ボリュームをアタッチする。Computeインスタンスの詳細ページから **[Attached Block Volumes（アタッチされたブロック・ボリューム）]** を選択し、該当のボリュームをアタッチする。元と同じパラメータを指定すること。

- **ATTACHMENT TYPE :** paravirtualized
- **BLOCK VOLUME NAME:** ol7srv_data01_bv
- **DEVICE PATH:** /dev/oracleoci/oraclevdb
- **IN-TRANSIT ENCRYPTION:** not check(disable)
- **Access:** Read/Write

7.再び`lsblk`コマンドで確認すると、ディスクサイズが200Gに増加している。

```shell-session
# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  200G  0 disk ★ディスクサイズが200Gになっている
└─sdb1   8:17   0  100G  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-5. パーティションを拡張する

既存のパーティションを拡張するには以下の二つの方法がある。マニュアルではpartedを使う方法が紹介されている。それぞれを説明すると共に一部踏み込んでみる。<font color="blue">なお、個人的な推奨は手順が簡単なgrowpartである。</font>

* partedを使う
* growpartを使う


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

マニュアルの記述どおり、partedでパーティションを拡張する。

1. OCIマニュアル「[ブロック・ボリュームのパーティションの拡張](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Block/Tasks/extendingblockpartition.htm)（[英語](https://docs.cloud.oracle.com/en-us/iaas/Content/Block/Tasks/extendingblockpartition.htm)）」では以下の手順が紹介されている。

```
# アタッチされているブロック・ボリュームを確認
lsblk

# 該当のディスクパーティションをpartedで操作
parted <volume_id>

# ここからはpartedの対話モード
(parted) unit s
(parted) print

# 既存のパーティション削除
(parted) rm <partition_number>

# パーティション作成
(parted) mkpart
(parted) quit

# パーティションが拡張されているか確認
lsblk
```

この手順を見て、どう思うだろうか？　
<font color="red">**「これってファイルシステムが破壊されるんじゃね？」**</font>
と思っても不思議はない。

2.実際に実行したのが次の結果だ。ワーニングは出るし、めちゃくちゃ不安になること請け合いである。

```shell-session
# parted /dev/sdb ★/dev/oracleoci/oraclevdbでもOK
GNU Parted 3.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s  ★表示単位を変更
(parted) print   ★パーティション情報を表示
Error: The backup GPT table is not at the end of the disk, as it should be.  This might mean that
another operating system believes the disk is smaller.  Fix, by moving the backup to the end (and
removing the old backup)?
Fix/Ignore/Cancel? F ★FかIを入力
Warning: Not all of the space available to /dev/sda appears to be used, you can fix the GPT to use
all of the space (an extra 209715200 blocks) or continue with the current setting?
Fix/Ignore? F  ★FかIを入力
Model: ORACLE BlockVolume (scsi)
Disk /dev/sda: 419430400s
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:


Number  Start  End         Size        File system  Name     Flags
 1      2048s  209713151s  209711104s  xfs          primary

(parted) rm 1   ★Number1のパーティションを削除
(parted) mkpart ★パーティション作成
Partition name?  []?            ★何も入力しないでリターン
File system type?  [ext2]? xfs  ★ファイルシステム名を入力
Start? 2048 ★削除前のStartと同じ値を入力
End? 100%　 ★100%を入力して全部を割り当て
(parted) quit
Information: You may need to update /etc/fstab.
```

3.パーティションサイズを確認すると、sdb1も200Gに拡張されている。

```shell-session
# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  200G  0 disk
└─sdb1   8:17   0  200G  0 part ★パーティションも200Gに拡張されている
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
```

4.マウントしてディスクの空きを見ると、100Gのままで変わっていない。

```shell-session
# mount -a
# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        7.2G     0  7.2G   0% /dev
tmpfs           7.3G     0  7.3G   0% /dev/shm
tmpfs           7.3G   17M  7.2G   1% /run
tmpfs           7.3G     0  7.3G   0% /sys/fs/cgroup
/dev/sda3        39G  2.7G   36G   7% /
/dev/sda1       200M  9.7M  191M   5% /boot/efi
tmpfs           1.5G     0  1.5G   0% /run/user/1000
/dev/sdb1       100G  133M  100G   1% /mnt/vol01 ★ファイルシステムのサイズは100Gのまま
```

5.確認用に作成したダミーデータを確認すると、変わらずに存在している。つまり、`parted`による操作は、パーティション・テーブルのメタデータを書き換えただけで、パーティション初期化のような動作は行われていないことがわかる。

```shell-session
# ls -lh /mnt/vol01/dummy.data
-rw-r--r--. 1 root root 100M Jul 25 13:22 /mnt/vol01/dummy.data
```

<font color="blue">**重要**
partedによるパーティションの拡張は、パーティション・テーブルを書き換えるだけで、パーティションに格納されているデータは初期化されない。</font>

6.次の作業に備えてボリュームをアンマウントする。

```shell-session
# umount /mnt/vol01
```

あとは`resize2fs`や`xfs_growfs`でファイルシステムを拡張すれば、実際の空き容量を増せる。しかし不安なことも事実なので、`parted`について少し調べることにする。

#### 3-5-2. partedによるパーティションのリサイズを考える

RHEL7の[ストレージ管理者ガイド](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/s2-disk-storage-parted-resize-part)には以下の記述がある。
> **Important**
> 
> The partition you are resizing must be the last partition on a particular disk.
> Red Hat only supports extending and resizing LVM partitions.

サイズ変更が可能なのは最後のパーティションだけで、Red Hat社がサポートしているのはLVMパーティションだけ、と書いてある。

また6系Linux OSのparted 2.1ではresizeコマンドがサポートされていた。しかし7系Linux OSのparted 3.1ではresizeコマンド自体がなくなっている。次はpartedコマンドを対話モードで実行したときのhelp情報だ。

**Oracle Linux 6で実行**

```shell-session
# "help resize"と入力するとヘルプが表示される
(parted) help resize
  resize NUMBER START END                  resize partition NUMBER and its file
        system
```

**Oracle Linux 7/8/9で実行**

```shell-session
# "help resize"と入力するとremovedと表示される
(parted) help resize

        The resize command was removed in parted 3.0
```

resizeコマンドが削除された理由は不明だが、操作ミスでパーティションを破壊するユーザーがいたのか、バグがあったのか。いずれにせよ、操作が複雑なのは間違いない。そこで便利なgrowpartコマンドを次に紹介する。

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

growpartは、AWSなどでも一般的に利用されるパーティション拡張コマンドだ。RPMを確認すると、cloud-utils-growpartパッケージに含まれている。

```shell-session
# rpm -qf `which growpart`
cloud-utils-growpart-0.29-2.el7.noarch
```

ここでは`growpart`でパーティションを拡張する。

1. ブロック・ボリュームをアタッチしていることを確認する。事前にブロック・ボリュームを拡張しているので、sdbとsdb1のサイズが異なる。

```shell-session
# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  300G  0 disk ★ブロック・ボリュームをアタッチしている
└─sdb1   8:17   0  200G  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
```

2.ブロック・ボリュームをマウントしていないことを確認する。次のように1が返ってくれば、マウントしていない。もしマウントしているときはアンマウントすること。<font color="red">ここまでオンラインで実行しているときにはアンマウントする必要はない。</font>

ただし予防的措置としてxfs_repair/fsckの実行を否定するわけではないので、オフラインが許容できるならばアンマウントを検討してよい。

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

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

```shell-session
# growpart /dev/sdb 1
CHANGED: disk=/dev/sdb partition=1: start=2048 old: size=419426303,end=419428351 new: size=629143518,end=629145566
```

4.パーティションサイズを確認すると、sdb1が300Gに拡張されている。

```shell-session
# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  300G  0 disk
└─sdb1   8:17   0  300G  0 part /mnt/vol01 ★300Gに拡張されている
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-6. ファイルシステムを拡張する

ファイルシステムを拡張することで、ようやく利用可能な領域が増える。ext4とxfsではコマンドが違うのでそれぞれ説明する。またxfs_repairやfsckはオンラインでは実行できないので、アンマウント時に実行する。

#### 3-6-1. xfsファイルシステムを拡張する

1. ボリュームをマウントしていないことを確認する。次のように1が返ってくれば、マウントしていない。マウントしているときはアンマウントすること。<font color="red">ここまでオンラインで実行しているときにはアンマウントする必要はない。4のファイルシステム拡張に進む。</font>

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

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

```shell-session
# xfs_repair -n /dev/sdb1
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 /dev/sdb1
```

3.ブロック・ボリュームをマウントする。

```shell-session
# mount /dev/oracleoci/oraclevdb1 /mnt/vol01
```

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

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

5.ディスクの空きを確認すると、利用可能な領域が300Gに拡張されている。

```shell-session
# df -h /mnt/vol01
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1       300G  133M  300G   1% /mnt/vol01
```

#### 3-6-2. ext4ファイルシステムを拡張する

1. ボリュームをマウントしていないことを確認する。次のように1が返ってくれば、マウントしていない。マウントしているときはアンマウントすること。<font color="red">ここまでオンラインで実行しているときにはアンマウントする必要はない。4のファイルシステム拡張に進む。</font>

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

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

```shell-session
# e2fsck -f /dev/sdb1
e2fsck 1.43-WIP (20-Jun-2013)
/dev/sdb1: clean, 12/6553600 files, 715350/26213888 blocks
```
3.ブロック・ボリュームをマウントする。

```shell-session
# mount /dev/oracleoci/oraclevdb1 /mnt/vol01
```

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

```shell-session
# resize2fs /dev/sdb1
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.
```

5.ext4の予約領域は、データ用途のボリュームでは不要なのでゼロに変更する。

```shell-session
# tune2fs -m0 /dev/sdb1
```

6.ディスクの空きを確認すると、利用可能な領域が295Gに拡張されている。

```shell-session
# df -lh /mnt/vol01
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1       296G  163M  295G   1% /mnt/vol01
```

# 4. ブロック・ボリュームの拡張（まとめ）

### 4-1. 全体の手順
これまでは調べながらコマンドを実行したため、全体の流れが見えづらくなったかもしれない。そこで必要最低限の操作をまとめたのが以下の手順だ。ボリュームをオフラインにするのは1-1から4-2までの間である。

オンラインで拡張するときは一部の手順を省略できる。詳しくは「[ボリュームのオンラインリサイズが可能になったよ](https://qiita.com/yamada-hakase/items/daea963237a70620c4bb)」を参照のこと。

**1. ボリュームのバックアップ（推奨）**
　1-1. ボリュームをアンマウントする（必須ではないが推奨）
　1-2. バックアップを取得する

**2. ボリュームの拡張**
　2-1. ボリュームをアンマウントする
　2-2. ボリュームをデタッチする
　2-3. ボリュームを拡張する
　2-4. ボリュームをアタッチする

**3. パーティションの拡張**
　3-1. パーティションを拡張する

**4. ファイルシステムの拡張**
　4-1. ファイルシステムに破損がないことを確認する
　4-2. ボリュームをマウントする
　4-3. ファイルシステムを拡張する

### 4-2. コピペ用まとめバージョン（xfs）

```
# 0. 状況確認
# 0-1. マウントポイントの使用状況
lsof <MOUNT_POINT>
findmnt <MOUNT_POINT>; echo $?

# 0-2. ディスク／ボリューム情報収集
df -h
lsblk -o +UUID
ls -l /dev/oracleoci/oraclevd

# 1. ボリュームのバックアップ（推奨）
#　1-1. ボリュームをアンマウントする（必須ではないが推奨）
#　1-2. バックアップを取得する

# 2. ボリュームの拡張
#　2-1. ボリュームをアンマウントする
umount /dev/sdb1

#　2-2. ボリュームをデタッチする
#　2-3. ボリュームを拡張する
#　2-4. ボリュームをアタッチする

# 2-2から2-4は、管理コンソールやCLIで実行する

# 3. パーティションの拡張
#　3-1. パーティションを拡張する
growpart /dev/sdb 1

# 4. ファイルシステムの拡張
#　4-1. ファイルシステムに破損がないことを確認する
xfs_repair /dev/sdb1

#　4-2. ボリュームをマウントする
mount /dev/oracleoci/oraclevdb1 <MOUNT_POINT>

#　4-3. ファイルシステムを拡張する
xfs_growfs -d  <MOUNT_POINT>
```


# 次は

[次回](https://qiita.com/yamada-hakase/items/3f2fb3d0e67b2753ab0e)はブート・ボリュームの拡張方法について説明する。

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