fs壊れたVM、どーしようもなくなって、 xfs_repair しようとしたんだけどbackupしないと怖くね?って状態だったのでbackupの勉強した話
酔って書いてるよりも、もとの知識がアレなので非常にアレな記事です。
最初にconsole見たときは emergency modeになってた。/sysrootがmountできないというエラーで、ls /sysrootは空っぽでした。天才の同僚がrebootしたらrescue modeで起動できたと。
今回初めて知ったこと。centos 7 には grub 選ぶとこでe押したあとの systemd.unit=rescue.target ってのがあるらしい。
後で調べたらこれは(自分にとっては)ただのsingle user modeだった。rescue modeって名前には聞いてたんだけど、なんだ、ただのシングルユーザモードのことだったのか。
rescue mode is equivalent to single user mode
RHEL 10.3. WORKING WITH SYSTEMD TARGETS
それならMac OS 10.1の頃にadmin password忘れて通った道だよ。cmd+sで起動するやつでしょ?
昔話はさておき、ここは想像なんだけど rescue という名前・・・しかし所詮 /dev/sda とかで起動してるからこれってルートパーティションを xfs_repair できないよね?(誰か教えて)
DVDとかpxeで起動する rescue と全然違くない? それ同じ言葉でいいの? 違う言葉あるの?
関係ないけど resque.target と打ってたせいでしばらく全然rescueできなかった。反省typo。
学んだこと
簡単に言うとemergency modeが root partitionをmountできないときにイケるやつ(たぶん /boot とか initramfs だけでなんとか起動するやつ)で、rescue.target は /def/sda で無理やり起動するやつ。だから /etc/fstab で root partition がやばい系だと rescue.target は行けないんじゃないかと思う。/dev/sdb がマウントできないとかならいけそう。(誰か合ってるか間違ってるか教えて)
いや待てよ、initramfsてdiskから読んでるんじゃないのか。あいつどこにいるんだっけ、、。
いい加減記事の本題に入る。
最初にやってコケた話
手元のvirtual boxにあるvmが30GBもdiskあった
とりあえず練習でこれcopyしてみっか、と思ってやったのは・・
どうせ0で埋めるだけだし8GBでよくね?という性格なもので、適当にvirtual boxデフォルト=8GBなdiskをVMに追加して、/dev/sdbにする。パーティション必要だよね、と思ってpartedで/dev/sdb1を作る。やっぱxfs?という、ここらへんはもう手癖でmkfs.xfsする。
ddコマンド叩くとこで、あれ?どこcopyするんだっけ? os起動してるとこ? /dev/sda1と/dev/sda2があって、sda2の下に大事そうなルートパーティション、 /dev/mapper/centos-root でいいの?あれ?
これ絶対違うわー、根本から間違ったわー、でもこれも経験と思いながらとりあえず
dd if=/dev/mapper/centos-root of=/dev/sdb1 したら、macがめっちゃ重くなってしばらくしたら突然rebootしたw
うまく行った話
素直に copyしやすい 8GB のdiskで、centos7をinstall。素直。
8GBの別diskをatouchしてrescue.target起動。/dev/sdbに見えることを確認。で、この単純明快コマンド。
dd if=/dev/sda of=/dev/sdb
パーティションの準備とかいらないんです。物理ディスク領域?をまんまいくんです。copyは順調に終わり、いったんshutdown。もとのdiskをVMからdetouch。追加diskだけの状態にして起動。普通にos使える。複数パーティションまとめて全部完璧に複製されたってことです。すげー。これがddですか。すげー。最初の失敗から、何もぐぐらず想像でいけた自分に感謝。
いやー勉強になった。dd めっちゃ便利だな!!
ddの進捗を見る方法
とりあえずまだがんばってるかはiotopで見れる。
yum install -y iotop strace
# -o で稼働中のものだけを表示
iotop -o
straceだと書き込んでる内容が見える。ただ100GBだと100GB以上の文字列が流れるのでNW越しだとなかなかつらい。tail繋げるといいというのを見かけたが、自分の環境では蕩かなかった
ps aux | grep dd # pidを取得
strace -p 4458 # pidを引数に
strace -p $PID | tail -n 5 # last 5行だけ表示(自分はうまくいかず)