運用中のUbuntuマシンのHDDが逝きかけてたので新しいHDDにしました。
せっかくなので500GB→1TBにする予定でしたがショップで聞いたところ
AFTなるフォーマットのHDDになっているとか。
旧仕様の500GBは在庫にあるみたいですが、復旧ついでに容量を
増加させたかったのでAFTの1TBを購入しました。
まずAFTってなんじゃいって話ですね。
e-Words AFT【Advanced Format Technology】
パソコン初心者講座 AFT ハードディスクとアライメント調整
要するにセクタあたりの物理記録量が多くなった規格みたいですね。
おおざっぱすぎるかもしれませんが。
これのせいで乗せ替えを行う際にレスキューツールがのきなみ
使えない状況のようです。
今回の参考サイトは結構多いのでポイントだけ随時にして他は下に
まとめてリンクだけで。
ここから本題。
状況としては最初にapt-getしようとしたらやたらと進捗が
遅いことに気づいて、dmesgでログを参照したところ、
HDDのI/Oエラーが大量に出ていました。
[12192.071080] sd 5:0:0:0: [sdg] Unhandled sense code
[12192.071085] sd 5:0:0:0: [sdg] Result: hostbyte=DID_ERROR driverbyte=DRIVER_SENSE
[12192.071091] sd 5:0:0:0: [sdg] Sense Key : Hardware Error [current]
[12192.071097] sd 5:0:0:0: [sdg] Add. Sense: No additional sense information
[12192.071104] sd 5:0:0:0: [sdg] CDB: Read(10): 28 00 1d 15 f8 09 00 00 f0 00
[12192.071116] end_request: I/O error, dev sdg, sector 487979017
12192.071154] Buffer I/O error on device sdg2, logical block 243403142
[12192.071158] Buffer I/O error on device sdg2, logical block 243403143
[12192.071162] Buffer I/O error on device sdg2, logical block 243403144
ごった煮状態ですが別マシンでUSBにつなげたときのdmesgです。
最初はHDDを取り外し、別のPCでfsckして直ったかなーと思ったのですが、
再度発生してしまいました。
こらアカンと思って空いている別のHDDにバックアップをとって
落ち着いたところ、セクタ修復こそfsckで発生したものの全ファイルの
コピーは成功したのでおや?となりました。
そのあといろいろ調べたところどうもHDDのキャッシュが壊れてるっぽい
という結論になりました。
特徴としては読み出しはほぼ正常なのですが書き込みにやたら
時間がかかることです。
心当たりはまあ電源をバチっと切られたことがあるのですが・・・
それが契機のようですね。
今回はデータそのものへの復旧作業は簡単なケースになりました。
対象のUbuntuマシンは
- ASUS EeeBox B202(Intel Atom 270N)
- Ubuntu 12.04.4 LTS (precise)
1.新HDDをフォーマットする
フォーマットツール的には何を使ってもいいのですが、
パーティションの開始セクタのオフセットを必ず8の倍数にすることです。
かつては63オフセットから第1パーティションを切っていましたが、
同じことをするとセクタまたがりの読み書きをすることになり、
パフォーマンス劣化を招くとのこと。
今回はGPartedを使ってパーティションを設定しました。
自分の場合はこんな感じに切っています。
- /dev/sda1 ext2 (/boot用パーティション)
- /dev/sda2 ext4 (/ 用パーティション)
- /dev/sda3 swap (スワップパーティション)
sda1にはブートフラグとブートラベルを設定します。
開始オフセットを必ず確認します。
こうしてできたディスクの状態はこんな感じ。
fdisk -l ですがこの結果は最終的なものなので申し訳ないところ。
Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
ヘッド 255, セクタ 63, シリンダ 121601, 合計 1953525168 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
ディスク識別子:
デバイス ブート 始点 終点 ブロック Id システム
/dev/sda1 * 2048 4095999 2046976 83 Linux
/dev/sda2 4096000 1949427711 972665856 83 Linux
/dev/sda3 1949427712 1953523711 2048000 82 Linux スワップ / Solaris
物理セクタサイズが4096バイトになっているのがわかります。I/Oサイズも4096になってるので高速になるのかしらん?
開始オフセットが8の倍数になってるのか?はbashの機能を
使ってもいいですし、インタプリタ系のシェルを使ってもいいと思います。
自分はpythonを使いましたが参考までにbashで計算すると
> echo $(( 2048 % 8 )) ;\
> echo $(( 4096000 % 8 )) ;\
> echo $(( 1949427712 % 8 ))
0
0
0
こんな感じになります。剰余でゼロになっていれば8の倍数です。2.ディスクへの転送
ディスクへの転送は、今回は読み出しが生きているのでrsyncを使います。
通常はddrescueなどのレスキューツールで丸ごとコピーするのが
常道だと思われますが、非AFT/AFT間でのセクタをコピーするやり方では
物理セクタサイズの違いが障壁になります。
実際にやってみましたが、200GB程度の元ディスク使用量ですが、
ddrescueで新HDDに転送すると使用率が80%近くになりました。
元が512バイトのセクタサイズなので新HDDのセクタサイズに元のセクタを
適用するとおおよそ1/8程度になってしまい、無駄が生じるのだと思います。
ゆえに、もっと読み書きが困難なくらいに壊れた場合には、非AFT/AFTを
揃えた上でddrescueなどを使ったり、プロプライエタリのソフトウェアを
使うべきだと思います。
移行も考えている場合は壊れる前に行ったほうが無難です。
そんなわけで今回は普通にコピーです。
旧HDDがsdb、新HDDがsdcであるという前提とします。
(実際には新HDDがデスクトップ内蔵を使ってsdb、旧HDDがUSB変換アダプタ経由でsdgだったりしましたが)
(ディスクI/Oエラーでinodeとセクタの
アンマッチが発生しているので先にチェックディスク)
# fsck -y /dev/sdb1
・・・
# fsck -y /dev/sdb2
・・・
(新旧HDDのマウントポイントの作成とマウント)
# cd /
# mkdir boot_old boot_new root_old root_new
# mount /dev/sdb1 boot_old
# mount /dev/sdc1 boot_new
# mount /dev/sdb2 root_old
# mount /dev/sdc2 root_new
(rsyncでコピー 旧HDDのパスの最後に/を入れないと悲劇が起きる)
# rsync -av boot_old/ boot_new/
# rsync -av root_old/ root_new/
・・・
(アンマウントして後片付け)
# umount boot_old boot_new root_old root_new
# rmdir boot_old boot_new root_old root_new
(新HDDのチェック)
# fsck -y /dev/sdc1
# fsck -y /dev/sdc2
このあとHDDを換装します。この段階でgrubとかの設定もできなくはないでしょうけど、ベース機が
いろいろと取り付けられているので今回は手順を分割して実行しました。
実際にうまくいくかは試行錯誤でしたし。
3.DVDブートしてブートローダー等の設定をする
ライブDVDからライブ起動しました。
Ubuntu Japanese Team
今回はUbuntu 13.10を使いました。
え?12.04じゃないのかって?
バージョン違いでもうまくいくか試したかったんですよ^^
EeeBoxのHDDを新HDDにしたあと、 USBキーボードとDVDドライブを
取り付けてから電源を入れ、BIOSを起動します。
特に先にDVDドライブを取り付けてないとブートの優先順位表にも
でてこないので注意。
クイックブートをdisableに、boot device priorityを取り付けたDVDを
1stになるように設定します。
マウスも取り付けてSave&Exitします。
再起動後、しばらくライブ起動を待ちます。
自分の環境のせいか、スピンアップしてないとうまく起動しませんでした。
起動後、端末(Terminal)を起動します。
なお好みによりますが、表示用・作業用・確認用として
3つ起動したほうがいいです。
この後設定ファイルを新HDD向けに書き換えるわけですが
重要なことはUUIDが変化していることです。
e-Words【Universally Unique IDentifier】
つまりHDD固有の番号が変化したわけで、これがブートやマウントに
影響するわけです。
ddrescueはUUIDごとコピーするので問題ないとのことですが、
今回は普通にフォーマットからのコピーなので齟齬が生じます。
書き換えが必要なのは
- fstab
- grub.cfg
- initramfsのresumeファイル
新HDDのUUIDの表示は、他にHDDを取り付けていないという前提なら
sda1、sda2、sda3だけ表示されるはずです。
(混乱のタネになるのでDVDブートさせた理由のひとつ)
以下のコマンドをどうぞ。
$ ls -l /dev/disk/by-uuid/
・・・ -> ../../sda2
・・・ -> ../../sda1
・・・ -> ../../sda3
などと表示されたはずです。UUIDはユニークIDなのでここでは記載してません。あしからず。
なおblkidとか使っても表示できます。
以下作業内容、ファイルの編集は自分はviを使いましたが
geditなどでもいいと思います。
各ファイルに記述されているUUIDの項目を新HDDのUUIDに対応するように
書き換えます。
重要なのできちんと見比べて、元の記述は残すようにしたほうが
いいと思います。viではyypで一行コピーできるので便利です。
今回のファイルはすべて#でコメントアウトできます。
ルートパーティションとbootをマウントします。
$ sudo mount /dev/sda2 /mnt
$ sudo mount /dev/sda1 /mnt/boot
DVDブートしている現状と一致させるために
デバイスファイルを新HDDのdevに書き込む。
$ sudo mount --bind /dev/ /mnt/dev
fstabを編集する。
$ sudo vi /mnt/etc/fstab
grub.cfgを編集する、該当箇所は多い傾向
$ sudo vi /mnt/boot/grub/grub.cfg
resumeファイルを編集する。swapパーティションのUUIDを記述する。
$ sudo vi /mnt/etc/initramfs-tools/conf.d/resume
fstabなども参照するため、最後に行う。
自動で/bootを認識してもらうためchrootして実行する
$ sudo chroot /mnt
$ sudo grub-install --recheck --no-floppy --root-directory=/ /dev/sda
$ exit
作業完了後、一度シャットダウンしてDVDドライブを取り外して
再度起動します。
自分はこれで起動完了してお引越しできました。
デバイスファイルを一度書き換えてたためか少し起動に時間が
かかったみたいですが、正常運転しているみたいです。
(二回目以降は早くなった気がします)
念のためtouch /forcefsckして再起動し、dmesgの内容を確認して
おしまいです。
☆おまけ☆
[11690.011238] sd 6:0:0:0: [sdb] Asking for cache data failed
[11690.011248] sd 6:0:0:0: [sdb] Assuming drive cache: write through
[11741.720851] sd 6:0:0:0: [sdb] Test WP failed, assume Write Enabled
[11741.722965] sd 6:0:0:0: [sdb] Asking for cache data failed
[11741.722975] sd 6:0:0:0: [sdb] Assuming drive cache: write through
[11793.433011] sd 6:0:0:0: [sdb] Test WP failed, assume Write Enabled
[11793.435347] sd 6:0:0:0: [sdb] Asking for cache data failed
・・・
(Ask Ubuntuから転記してます)
Ask Ubuntudmesgが素晴らしくうざくなってる状況に気づいたのでモジュールを停止します。
(reaktekのモジュールがロードされているか確認)
$ dmesg | grep realtek
[ 4.716068] usbcore: registered new interface driver ums-realtek
$ lsmod | grep realtek
ums_realtek 17920 0
(モジュールをアンロードし、起動時に読み込まない設定にします)
$ sudo rmmod ums_realtek
$ echo "ums-realtek ss_en=0" |sudo tee -a /etc/modules
必要になった場合にはmodprobe ums_realtekすればいいでしょう。dmesgがスッキリしました。
参考サイト
・Ubuntu kledgeb
・Lansenの現実逃避日記
・Man Page of FSCK
・ITmedia エンタープライズ【1】【2】
・Yahoo知恵袋-インストール済みUbuntu12.04のクローンHDDを作成する。
・きょうはなに色?
・maruko2 Note.
・にわタコのblog
・
0 件のコメント:
コメントを投稿