resize2fsでディスク容量を拡張する

※この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。さくらのクラウドにおけるディスク拡張手順はこちらの記事をご参照ください。

サーバの運用をやっていると、HDDの容量が少なくなってきて、大きなディスクに交換したいなと思うことがあります。しかしクラウドサービスを使っていても、ブロックデバイスをマウントしているケースでは、おいそれとディスク容量を変更することはできません。このような場合、解決方法はいくつかあります。たとえば容量の大きなディスクを2台目、3台目として接続し、マウントして使うことができます。しかし、現在のパーティションを拡張して容量を大きくしたいという場合には、新しいディスクに現在のデータをコピーして使う必要があります。今回はさくらのクラウド上での操作を例に、どうやってディスクのコピーと領域の拡張を行ったらよいのか、手順をご紹介したいと思います。

典型的なさくらのクラウドサーバの場合

さくらのクラウドで作成するサーバの典型的な例として、以下のようなスペックを例とさせていただきます。

  1. 元のサーバはCentOS 6.4がインストールされた20GBのディスクとし、これを40GBに拡張します
  2. パーティションは3つに分かれていることとします
    • /boot  100MB程度のブート・パーティション
    • swap  2GBのスワップ領域
    • /    残り全部がルート・パーティションに割り当て
  3. 最後のルート・パーティションを拡張して40GBいっぱいに使うこととします

ディスク容量は、大きくする場合には何GBであってもかまいません。たとえば100GBを250GBに拡張するときも同じ手順で大丈夫です。

なお以下の手順は、間違えるとデータを破損する恐れがあります。作業の前にはバックアップのために、元のディスクのアーカイブを作成しておくことをお勧めします。

手順

まず最初に、新しい40GBのディスクを用意します。さくらのクラウドの場合は、ストレージ・タブをクリックし作成ボタンを押すと、ディスク作成画面になります。

ディスクが準備できたら、サーバを一旦停止して40GBのディスクを追加接続します。

2台のディスクを接続した状態でサーバを起動し、rootでログインします。ディスクデバイスは、標準ではvda、vdb…のように見えています。

[root@test ~]# ls /dev/vd*
/dev/vda  /dev/vda1  /dev/vda2  /dev/vda3  /dev/vdb

元の20GBのディスクが/dev/vda、新しく追加した40GBのディスクが/dev/vdbです。そこでddコマンドを使って元の20GBのデータをすべてコピーします。

[root@test ~]# dd if=/dev/vda of=/dev/vdb bs=512M

このコピーでは40GBのうち、前半の20GBしか使っていません。そこでパーティション領域を広げる必要があります。まずfdiskを起動します。

[root@test ~]# fdisk /dev/vdb

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): p

Disk /dev/vdb: 42.9 GB, 42949672960 bytes
16 heads, 63 sectors/track, 83220 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0009101a

   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1   *           1         204      102784   83  Linux
/dev/vdb2             205        4366     2097648   82  Linux swap / Solaris
/dev/vdb3            4367       41610    18770976   83  Linux

pコマンドでパーティションの状態を見ると、ブート、スワップ、ルートの各パーティションが見えます。この3番目のパーティションを拡張するため、いったんこれを削除します。

Command (m for help): d
Partition number (1-4): 3

Command (m for help): p

Disk /dev/vdb: 42.9 GB, 42949672960 bytes
16 heads, 63 sectors/track, 83220 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0009101a

   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1   *           1         204      102784   83  Linux
/dev/vdb2             205        4366     2097648   82  Linux swap / Solaris

次にパーティションを再作成します。ディスク容量は40GBに増えていますので、シリンダ番号等は指定しなくても、リータンキーの空押しで大丈夫です。

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (4367-83220, default 4367):
Using default value 4367
Last cylinder, +cylinders or +size{K,M,G} (4367-83220, default 83220):
Using default value 83220

Command (m for help): p

Disk /dev/vdb: 42.9 GB, 42949672960 bytes
16 heads, 63 sectors/track, 83220 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0009101a

   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1   *           1         204      102784   83  Linux
/dev/vdb2             205        4366     2097648   82  Linux swap / Solaris
/dev/vdb3            4367       83220    39742416   83  Linux

wコマンドを使って情報を書き込み、終了します。

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

次に、e2fsckコマンドで整合性のチェックをします。これから拡張するのはvdb3パーティションですので、以下のコマンドを実行します。

[root@test ~]# e2fsck -f /dev/vdb3
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vdb3: 79976/1175040 files (0.1% non-contiguous), 523701/4692744 blocks

整合性がチェックできたら、resize2fsでパーティションを拡張します。

[root@test ~]# resize2fs /dev/vdb3
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/vdb3 to 9935604 (4k) blocks.
The filesystem on /dev/vdb3 is now 9935604 blocks long.

これでコピー作業は完了です。もう一度、サーバをシャットダウンします。

次にコンパネに戻り、20GBのディスクを切り離します。

これですべての手順が完了しました。サーバを再び起動して、ディスク容量を確かめてみると、ルート・パーティションの容量が増えているのが確認できます。

[root@test ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/vda3              38G  1.8G   34G   5% /
tmpfs                 939M     0  939M   0% /dev/shm
/dev/vda1              98M   72M   21M  78% /boot

おわりに

20GBのディスクコピーには、おおよそ6分ほど時間がかかります。そのほかの作業は手順通りに進めていただければ、10分から15分ほどでディスクサイズを大きくしていただけます。

[※編集部追記:本手順の際、ファイルシステムをマウント中のまま dd するとコピー先で不整合が発生する可能性があるため、レスキューモードもしくはシングルユーザーモードで実行ください]

おしらせ