カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

既に作成してしまったパーティションのサイズを変更する素敵な方法(デンジャラス編)

OSインストール時に構成考えてパーティションを切ったのに、あとになって、なんでこんないっぱい領域確保してしまったのだろう、どう考えてもこの割り当ておかしいだろと思うことあったりします。


そんなときに、かなり腹を括って、パーティションサイズを変更する方法を。(以下の方法は完全に自己責任で行い、何があっても泣かないでください。)
まず、環境を。

  • OSはCent5.6
  • デバイスは/dev/sdaとして認識されている。
  • LVMなんて素敵なものは存在しない
  • 意地でも、領域確保して、自由に使える領域欲しい
  • 「/」に当ててる領域使いたい
  • その領域は/dev/sda3としてマウントされている模様
  • 当然使用中なので、umountとかでマウント外せるような素敵な構成じゃない
  • フロッピーとかUSBとかCDとか使って、他のOSからパーティション切り直したいのに、KVMとかで言う事きかなくて、涙目

まずはレスキューモードで

では、実践へ。

まず、対象デバイスはマウントされないようにしなければなりません。ただ普通に起動してしまってはマウントされてしまうので、umountで外したいところ。普通にやると、起動後すぐマウントされてしまうので、そうならないよう対処します。


そこで活躍してくれるのが、OSのインストールCDです。インストールCDを使って、CDブートさせると、「boot:」って言ってくれるので、「linux rescue」と打ってみましょう。 そのとき、「linux resque」とか「linux lescu」とか単語レベルで間違えるとOSをインストールしちゃうので、気をつけましょう。
その後、キーボードの種類とか色々聞かれますが、その辺はぐぐってください。


何よりも重要なのは、「続行、読み取りのみ、スキップ」(英語の場合もあり)という画面が出たときに「スキップ」を選ぶことです。これでデバイスはマウントされないようになります。

既存パーティションの構成をいじる

そうやって進んでいくと、普通にコマンド打てる画面になります。「df -h」や「mount」コマンドで見てみると、対象デバイスがマウントされていないことが分かるでしょう。


そしたら、既に作ってしまったパーティションをいじりましょう。
そのときに使うのが「GNU Parted」です。
(Cent5.3とかだと、libparted-1.8.so.0を求められるかな…)

# /sbin/parted
GNU Parted 1.8.1 
/dev/sda を使用 
GNU Partedへようこそ! コマンド一覧を見るには 'help' と入力してください。
 (parted) p    # pまたはprintで詳細表示 

モデル: LSILOGIC Logical Volume (scsi) 
ディスク /dev/sda: 100.0GB 
セクタサイズ (論理/物理): 512B/512B 
パーティションテーブル: msdos 

番号 開始 終了 サイズ タイプ ファイルシステム フラグ 
1 32.3kB 107MB 107MB プライマリ ext3 boot 
2 107MB 6595MB 6488MB プライマリ linux-swap 
3 6595MB 73.0GB 66.4GB プライマリ ext3

この状態で番号2の領域を変更したいとします。
その場合は以下のように指定します。

# resize 番号 開始位置 終了位置 
(parted) resize 2 107MB 6395MB

#またpで確認 

番号 開始 終了 サイズ タイプ ファイルシステム フラグ 
1 32.3kB 107MB 107MB プライマリ ext3 boot 
2 107MB 6395MB 6488MB プライマリ linux-swap 
3 6395MB 6595GB 2GB プライマリ ext3 
4 71GB 73.0GB 64.4GB プライマリ ext3

こんな感じで、縮小&新規作成ができました。
(微妙に記憶で書いてるので、間違ってたら指摘お願いします)

デバイスの順番を戻す

ただ、こやつ「# fdisk /dev/sda」で見ると分かるのですが、番号2などを指定した場合は、途中の領域を拡張したので、/dev/sda4とかが追加されて、デバイス番号の順番がおかしくなってしまいます。
なので、fdiskで修正しましょう。

# fdisk /dev/sda 

コマンド (m でヘルプ): m コマンドの動作
a ブート可能フラグをつける 
b bsd ディスクラベルを編集する 
c dos互換フラグをつける
d 領域を削除する
l 既知の領域タイプをリスト表示する
m このメニューを表示する
n 新たに領域を作成する
o 新たに空の DOS領域テーブルを作成する
p 領域テーブルを表示する
q 変更を保存せずに終了する 
s 空の Sun ディスクラベルを作成する
t 領域のシステム ID を変更する
u 表示/項目ユニットを変更する
v 領域テーブルを照合する
w テーブルをディスクに書き込み、終了する
x 特別な機能 (エキスパート専用)  ←これ使う
コマンド (m でヘルプ): x
上級者コマンド (m でヘルプ):m 
コマンドの動作 
b 領域内のデータの先頭に移動する
c シリンダ数を変更する
d 領域テーブル内の生データを表示する
e 拡張領域をリスト表示する
f 領域の順序を適正化する ←これ使う
g IRIX (SGI) 領域テーブルを作成する
h ヘッド数を変更する
m このメニューを表示する
p 領域テーブルを表示する
q 変更を保存せずに終了する
r メインメニューに戻る
s セクタ数/トラックを変更する
v 領域テーブルを照合する
w テーブルをディスクに書き込み、終了する

上級者コマンド (m でヘルプ):f
上級者コマンド (m でヘルプ):w

これで順番を戻してくれます。 ここまでくれば、あとは簡単です。

# ファイルシステムの作成
# /sbin/mkfs -t ext3 /dev/sda4 ← fdiskで確認できた新たな領域 

# マウントする 
# mkdir /data 
# mount -t ext3 /dev/sda4 /data 

# 確認 
# df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/sda4 2G 0 2G 0% /data

あとは、/etc/fstabに書くなりして、終わりです。
まぁ、基本オススメできる方法ではないので、興味があれば、実験サーバでやってみるとよいかもしれません。とりあえず、こんな方法もあるよということを紹介しました。

また、GNU partedでサイズ変更する部分ですが、resize2fsコマンドでもできたらなーと思いつつ、manでは「resize2fsプログラムは、パーティションのサイズは操作しない。」と言ってるから、無理だろうなと思ったり。何か他にも方法あれば是非教えてください。



最後に

今回の記事のように、レスキューモードで入らないとアンマウントできないような領域は下手に弄らないほうがよいと思います。
やっぱumountできる領域はあったほうが気が楽だよ、という気がしました。

P.S.
2016/07/04追記:
本当は以下の記事のように、LVMとかで、危険回避できるようにしとくべきだと思います!
blog.masudak.net


以下の記事もおすすめです。
インフラエンジニアがアプリエンジニアに転身するにはこの3冊を勉強すれば十分だ - カイワレの大冒険 Third