- シングルユーザモードへ
この手の作業はコンソールで、rootユーザ一人しか利用していない状態で行います。
# telinit 1
- お約束の作業ログ取得開始
# mkdir ~/admin/20020923 ; script ~/admin/20020923/addimg.log
- 1GBの、NULLで埋められたファイルを c:\ ドライブに作成します。
# dd if=/dev/zero bs=1024 count=1048576 of=/mnt/win2k/linux2.img
(c:\ ドライブは linux で /mnt/win2k/ にマウントされています)
- 1GBのファイルを ext2形式でフォーマットします。
# mke2fs /mnt/win2k/linux2.img
(引数がデバイスファイルじゃないよ、強行しますか?と聞かれるので (y)します)
- フォーマットできたかどうか、確認してみます。
# mkdir /mnt/work ; mount -t ext2 -o loop /mnt/win2k/linux2.img /mnt/work
# ls /mnt/work
(フォーマットできてれば、ディレクトリ lost+found が見えるはず。)
- さーて、どこを引越しすればいいんだろ?
1GB以内で、システムの中核(失敗したら起動できなくなるのが怖いので。笑)に近くないものを探しました。
# du /usr | tail -l
1,601,540
# du /var | tail -l
28,256
# du /usr/X11R6 | tail -l
294,676
# du /usr/share | tail -l
560,732
(コマンドの意味は「/usr 以下のサブディレクトリを含む、ファイルの占有サイズ」のうち「合計」だけ表示)
(表示される「サイズ」の単位は KBです)
がんばって探せば 1GB未満で、もっと適切なディレクトリが見つかるかもしれないけど、ここでヤになりました。
というわけで「/usr/shareを引っ越す」ことに(自分の中で)納得し、決定。
- お引越し第1弾(コピー)
rootで cp コマンドを普通に発行してしまうと、コピーでできたファイルはすべて「新規ファイル」扱いになってしまい、
元のファイルパーミッションが反映されません。
そこで、tarコマンドを使ってひとまとめにし、パイプでコピー先に展開します。
# (cd /usr/share && tar cvf - .) | (cd /mnt/work && tar xf -)
こうすると、ファイルパーミッションも元のままだし、シンボリックリンクも破壊しません。
また、一時ファイル(hoge.tar)を作らずに済むので、ディスクフル間近のファイルシステムにも優しいですね。笑
# ls /mnt/work ; df -T
目論見どおりのサイズが /mnt/work に書き込まれたか確認します。(ディレクトリが見えるか、使用済サイズが正しいか)
ファイルシステム 形式 1k-ブロック 使用済 使用可 使用率% マウント場所
/dev/loop1 ext2 2015824 1710836 202588 90% /
/dev/hda1 vfat 28056528 12157008 15899520 44% /mnt/win2k
/initrd/loopfs/linux2.img
ext2 1032088 560744 418916 58% /mnt/work
/dev/hde1 vfat 187460 9748 177712 6% /mnt/flash
よしよし、560MBのコピーはできているようだ。
- 動作確認しよう
いま /mnt/work としてマウントしているイメージを、本来の /usr/share に結び付けてあげます。
ところが、まだ /usr/share には たくさんのファイルが存在します。
mount するときは、基本的に「空っぽ」のディレクトリに接ぎ木しますので /usr/share を空にする必要があります。
(うーん、失敗してたらヤだから、とりあえずリネームしてとっておこう)
# mv /usr/share /usr/share.nouse
# mkdir /usr/share
(別名に替えておいて、新規に空ディレクトリを作った)
じゃ、ここに イメージをマウントしなおそう。
# umount /mnt/work ; mount -t ext2 -o loop /mnt/win2k/linux2.img /usr/share
(特に問題ないようだ)
- お引越し第2弾(マウントルール設定)
手動マウントで問題ないことがわかったんで linuxの起動時に自動マウントされるように設定しておくと便利。
# cp -p /etc/fstab ~/admin/20020923/fstab.pre
# vi /etc/fstab
/initrd/loopfs/linux2.img /usr/share ext2 default,loop 0 0
(↑を 3行目 = /dev/loop の次の行に挿入)
# cp -p /etc/fstab ~/admin/20020932/fstab
念のため、マウントオプションなしで、マウントできることを確認しておこう。
# umount /usr/share ; mount /usr/share
# exit ← script の終了
よしよし、問題ないな。
- お引越し第3弾(削除)
確認のため、リブートしてみましょう。
root でログインしたあと df してみて、目論見どおりであることを確認。
よし、じゃあもう要らなくなった /usr/share.nouse を削除して、ディスクの空きが増えるのを確認しよう。
# script ~/admin/20020923/addimg-after.log
# rm -rf /usr/share.nouse
(間違っても rm -rf /usr/share しないこと。笑)
# df -T
ファイルシステム 形式 1k-ブロック 使用済 使用可 使用率% マウント場所
/dev/loop1 ext2 2015824 1150056 763368 61% /
/initrd/loopfs/linux2.img
ext2 1032088 560744 418916 58% /usr/share
/dev/hda1 vfat 28056528 12157008 15899520 44% /mnt/win2k
/dev/hde1 vfat 187460 9748 177712 6% /mnt/flash
# exit ← script の終了
めでたく / が 700MB空きになった。これでシステム更新できるぞぉ。