resize2fsでディスク容量を拡張する
※この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。さくらのクラウドにおけるディスク拡張手順はこちらの記事をご参照ください。
サーバの運用をやっていると、HDDの容量が少なくなってきて、大きなディスクに交換したいなと思うことがあります。しかしクラウドサービスを使っていても、ブロックデバイスをマウントしているケースでは、おいそれとディスク容量を変更することはできません。このような場合、解決方法はいくつかあります。たとえば容量の大きなディスクを2台目、3台目として接続し、マウントして使うことができます。しかし、現在のパーティションを拡張して容量を大きくしたいという場合には、新しいディスクに現在のデータをコピーして使う必要があります。今回はさくらのクラウド上での操作を例に、どうやってディスクのコピーと領域の拡張を行ったらよいのか、手順をご紹介したいと思います。
典型的なさくらのクラウドサーバの場合
さくらのクラウドで作成するサーバの典型的な例として、以下のようなスペックを例とさせていただきます。
- 元のサーバはCentOS 6.4がインストールされた20GBのディスクとし、これを40GBに拡張します
- パーティションは3つに分かれていることとします
- /boot 100MB程度のブート・パーティション
- swap 2GBのスワップ領域
- / 残り全部がルート・パーティションに割り当て
- 最後のルート・パーティションを拡張して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 するとコピー先で不整合が発生する可能性があるため、レスキューモードもしくはシングルユーザーモードで実行ください]