パーティションの再構築
玄箱はNASなのでシステムまわりはHDDの2GB程度に押し込んで他の容量はストレージとして使っています。
これではもったいないので、HDDをもっと活用することにします。
今後おそらく開発環境をいれると/usr/localがいくらあっても足りなくなってくると思うので、それに備えての意味もあります。
ここに書いてあることは玄箱以外にも使える技もあるので、Linux使いはどんどん活用しましょう。
1.パーティションの構成
Linuxに限らず、多くのUNIX互換OSでは/usrや/etcなどある程度決まった名前が付いたディレクトリが用意されています。
おおざっぱに分類すると。
/bin シングルユーザーモードで使うユーザーランドの実行ファイルが格納されている /sbin シングルユーザーモードで実行可能なシステムまわりの実行ファイル /etc 設定ファイルや起動時のスクリプトファイルなど /usr あとで追加したバイナリなどが追加される /var ログなど書き換え頻度が高いデータを保管 /home ユーザのホームディレクトリ、BSD系では/usr/homeになっている
他にもOSによっては/tmpや/optなどが追加されるでしょう。
一般的に、boot時に参照されるディレクトリはrootディレクトリ("/")から動かしてはいけません。
なので、"/usr","/var","/home"をHDDに持っていくことにします。
2.パーティションサイズ
HDDはたまたまそのへんに20GBのMaxtorが落ちていたので、これを使うことにします。
ストレージとしては小さいけど、まだ実験段階なので。
それぞれ、次のようにスライスを切ることにしました。
"/"はしょうがないとして、アクセス頻度が高いところはシークタイムを稼げてしかもヘッドの移動距離が少なくハードウェアへの負担が減るのでなるべくディスクの先頭に置くのがいいそうです。
なので、swapと/varはあたまの方にマウントします。
マウントポイント デバイス サイズ 基本領域 / /dev/hda1 2000MB swap /dev/hda2 256MB /var /dev/hda3 5000MB 拡張領域 extended /dev/hda4 12000MB /usr /dev/hda5 10000MB /home /dev/hda6 5000MB
3.準備
これからパーティションの再構築を行いますが、マウントしているハードディスクに対してはfdiskなどのユーティリティが使えません。
通常そういうときはシングルユーザーモードで起動し、ルートをリードオンリーでマウントして作業したりするのですが、シングルユーザーモードはシリアルコンソールがないと難しい状況です。
玄箱で作業するのをあきらめて、Linuxが動いているマシンにHDDをつなげてスライスを切り直してもいいのですが、幸いなことに玄箱にはRAMモードというのがあります。
/dev/fl3に制御コードを書いて再起動してあげることでRAMモード(でいいのかな?)に移行します。
# echo "NGNGNGNG" > /dev/fl3
# shutdown -r -y now
そうすると、RAMモードで立ちあがってきました。
ネットワークも使えます。DHCPを使っていないので192.168.11.150になっていますが。
もちろんtelnetでログインすることもできます。
RAMモードのシェルはbashじゃなくashなんですね。
RAMモードではHDDモードで使えたいくつかのコマンドが使えなくなっています。
なんとfdiskがなくなっていました。
代替コマンドが用意されているような気もしますが、使い勝手のよいfdiskを使いたいのでHDDからコピーします。
HDDを仮マウントしてコピーです。
念のためリードオンリーでマウントしてます。
fstabが書かれていないので"-t"でタイプの指定も忘れずに。
# mount -t ext3 -o ro /dev/hda1 /mnt
# cp /mnt/sbin/fdisk /sbin
# umount /mnt
/binや/sbinに入っているコマンドは共有ライブラリを必要としていないので、そのままコピーしてきて使えるというのがうれしいです。
あと、害はないと思いますが、気持ち悪いのでfdiskは作業が終わったら削除して置いた方がいいかもしれません。
4.パーティション設定
fdiskコマンドでパーティションを切り直します。
# fdisk /dev/hda
対話型のメニューが出てきます。
'm'をタイプするとヘルプが出てきます。
次の機能くらいしか使わないと思います。
コマンド 動作 m ヘルプを表示 p 現在のパーティションの状態を表示 d パーティションを削除 n 新しいパーティションを作成 w パーティションの設定を書き込む
手順は次の通りです。
- /dev/hda3を削除
- /varに割り当てる/dev/hda3を5000MBで基本領域に作成
- 残りの容量を全部/dev/hda4を拡張領域に割り当てる
- /usr用の領域を/dev/hda5として拡張領域から10000MB分割り当てる
- 残りの拡張領域を/dev/hda6として/home用に確保する
- "w"で設定を書き込む(忘れやすいので注意!)
20GBのHDDを使うとデフォルト値はこんなんになっています。
/dev/hda3を削除するときちょっぴり緊張しますが、どうせ空っぽ同然なので気にせずさっくりやってしまいましょう。
Device Boot Start End Blocks Id System
/dev/hda1 1 261 2096451 83 Linux
/dev/hda2 262 293 257040 82 Linux swap
/dev/hda3 294 931 17583142+ 83 Linux
Command (m for help):d
Partition number (1-4): 3
新しいパーティションを作成するとき、ディスク容量を設定するときにシリンダで聞かれます。
まず、開始シリンダを聞かれ、次は終了シリンダを聞かれます。
開始シリンダはデフォルトで空きシリンダの頭を設定してくれます。
終了シリンダはシリンダ以外にも、サイズで設定することもできます。"+5000M"のように設定しましょう。
以下は一連の作業です。
手順で言うと2以降の作業になります。
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (294-2482, default 294): ↓(改行)
Using default value 294
Last cylinder or +size or +sizeM or +sizeK (294-2482, default 2482): +5000M
Command (m for help): n
Command action
e extended
p primary partition (1-4)
e
Partition number (1-4): 4
First cylinder (932-2482, default 932): ↓(改行)
Using default value 932
Last cylinder or +size or +sizeM or +sizeK (932-2482, default 2482): ↓(改行)
Using default value 2482
Command (m for help): n
First cylinder (932-2482, default 932): ↓(改行)
Using default value 932
Last cylinder or +size or +sizeM or +sizeK (932-2482, default 2482): +10000M
Command (m for help): n
First cylinder (2207-2482, default 2207): ↓(改行)
Using default value 2207
Last cylinder or +size or +sizeM or +sizeK (2207-2482, default 2482): ↓(改行)
Using default value 2482
Command (m for help): p
Disk /dev/hda: 255 heads, 63 sectors, 2482 cylinders
Units = cylinders of 16065 * 512 bytes
Device Boot Start End Blocks Id System
/dev/hda1 1 261 2096451 83 Linux
/dev/hda2 262 293 257040 82 Linux swap
/dev/hda3 294 931 5124735 83 Linux
/dev/hda4 932 2482 12458407+ 5 Extended
/dev/hda5 932 2206 10241406 83 Linux
/dev/hda6 2207 2482 2216938+ 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.
5.フォーマット
パーティションの準備ができたのでフォーマットします。
mkfsコマンドを使います。
# mkfs /dev/hda3
mke2fs 1.22, 22-Jun-2001 for EXT2 FS 0.5b, 95/08/09
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
641280 inodes, 1281183 blocks
64059 blocks (5.00%) reserved for the super user
First data block=0
40 block groups
32768 blocks per group, 32768 fragments per group
16032 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
# mkfs /dev/hda5
# mkfs /dev/hda6
この調子で/dev/hda5と/dev/hda6もフォーマットします。
/dev/hda4は拡張領域のシンボルなのでフォーマットしません。
本当はジャーナリングができるようにext3にしたかったのですが、玄箱に入っているmkfsコマンドはext3を選択できないようです。
そのかわりtune2fsでジャーナルを作れましたので、これをやっておきます。
# tune2fs -j /dev/hda3
tune2fs 1.22, 22-Jun-2001 for EXT2 FS 0.5b, 95/08/09
Creating journal inode: done
This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
# tune2fs -j /dev/hda5
# tune2fs -j /dev/hda6
6.fstabの変更
一度再起動してもいいのですが、安全を考えてこのままRAMモードで作業を続けます。
/dev/hda1を再度マウントします。
今度は書き込みをするのでRead/Writeでのマウントです。
ほんとはここでchrootをしておくといいのですが、RAMにもHDDにもコマンドが用意されていないようでした。
chrootってセキュリティとかも考えると用意して置いた方がいいと思うんですけどね。
# mount -t ext3 -o rw /dev/hda1 /mnt
# cd /mnt/etc
fstabの編集です。
こんな感じです。
# vi fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/hda1 / ext3 defaults,noatime,errors=remount-ro
proc /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=20 0 0
/dev/hda2 swap swap defaults 0 0
/dev/hda3 /var ext3 defaults,noatime 0 0
/dev/hda5 /usr ext3 defaults,noatime 0 0
/dev/hda6 /home ext3 defaults,noatime 0 0
7.仮マウント
続いて、すでにデータが入っている/varや/usrのデータを移動します。
やり方はいろいろありますが、まずは先に現在の/usrと/varをリネームしてしまいます。オリジナルということで".orig"をプレフィクスしておきました。
リネームしてしまうとマウントポイントまでなくなってしまうので新たにマウントポイントを作成する事も忘れないようにします。
# cd /mnt
# mv usr usr.orig
# mv var var.orig
# mkdir usr
# mkdir var
/usrと/varを仮マウントします。
ちなみに/homeは空っぽだったのでなにもしません。
# cd /mnt
# mount -t ext3 /dev/hda3 /mnt/var
# mount -t ext3 /dev/hda5 /mnt/usr
8.コピーの実行
ではさっそくコピーします。
/mnt/usr.origと/mnt/var.origの中身をそっくり/mnt/usrと/mnt/varに移します。
コピーコマンドは再帰的にコピーを繰り返す"-R"オプションとタイムスタンプを変更せずにコピーする"-p"オプションを付けます。
"-v"オプションも付けると幸せかもしれません。
# cp -pRv /mnt/usr.orig/* /mnt/usr/
# cp -pRv /mnt/var.orig/* /mnt/var/
9.後かたづけ
以上で完了しました。
マウントを解除して、fdiskを念のため削除します。
# cd /
# umount /mnt/usr
# umount /mnt/var
# umount /mnt
# rm -f /sbin/fdisk
ハードディスクからbootするために/dev/fl3を書き換えておきます。
# echo "OKOKOKOK" > /dev/fl3
あとは再起動。
# shutdown -r -y now
10.確認
再起動後、telnetで入ってからdfしてみましょう。
私は昔からのクセで"df -k"なのですが、わかりやすいように"-h"でやってみました。
# df -h Filesystem Size Used Avail Use% Mounted on /dev/hda1 2.0G 94M 1.7G 5% / /dev/hda3 4.8G 33M 4.5G 1% /var /dev/hda5 9.6G 77M 9.0G 1% /usr /dev/hda6 2.1G 33M 1.9G 2% /home
どうやら成功したようです。
11.その後
ダイアログランプが3回点滅して止まらなくなってしまいました。
ひょっとしてマウントポイントがなくなってsambaがギャーギャーいっているのかもしれません。
動いているので放っておきましょう。