2014年2月8日土曜日

非AFTディスクからAFTディスクへのお引越し

ご無沙汰な投稿にはなりますが割と面倒だったのでメモ。

運用中の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)
移行用のベースマシンはDebian/GNU Linux(wheezy)上で行いました。

1.新HDDをフォーマットする


フォーマットツール的には何を使ってもいいのですが、
パーティションの開始セクタのオフセットを必ず8の倍数にすることです。
かつては63オフセットから第1パーティションを切っていましたが、
同じことをするとセクタまたがりの読み書きをすることになり、
パフォーマンス劣化を招くとのこと。

今回はGPartedを使ってパーティションを設定しました。

自分の場合はこんな感じに切っています。
  • /dev/sda1  ext2  (/boot用パーティション)
  • /dev/sda2  ext4 (/ 用パーティション)
  • /dev/sda3  swap  (スワップパーティション)
sda1とsda3には2GBずつ、sda2には残りを割り当てました。
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ブートしてブートローダー等の設定をする


EeeBox PCを使っているので、外付けDVDドライブを用意した上でUbuntuの
ライブ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)を起動します。(unity使いにくいんだよこの野郎)
なお好みによりますが、表示用・作業用・確認用として
3つ起動したほうがいいです。

この後設定ファイルを新HDD向けに書き換えるわけですが
重要なことはUUIDが変化していることです。
e-Words【Universally Unique IDentifier】
つまりHDD固有の番号が変化したわけで、これがブートやマウントに
影響するわけです。
ddrescueはUUIDごとコピーするので問題ないとのことですが、
今回は普通にフォーマットからのコピーなので齟齬が生じます。

書き換えが必要なのは
  • fstab
  • grub.cfg
  • initramfsのresumeファイル
です。(Ubuntu日本語フォーラム:超感謝!)

新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 Ubuntu

dmesgが素晴らしくうざくなってる状況に気づいたのでモジュールを停止します。

(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


2012年10月3日水曜日

Wineを作る

といってもWineHQで作ってるWin32APIエミュレータですけどね。

 http://wiki.winehq.org/GitWine

ここを読めばすぐできます。

Debian/squeezeのwineは1.0.1なので1.5.10の今だと周回遅れもいいところですね。

 git clone git://source.winehq.org/git/wine.git ~/wine-git


として、いつものconfigure && makeで完成します。
オプションはこんな感じ


./configure --prefix=/usr/local/wine-git --with-x \
            CFLAGS=-msse4 CXXFLAGS=-msse4


ただし、dev環境によってモジュールの作成具合が変化するので
configureした後のメッセージをよく見て適宜追加インストールしましょう。

ちなみにprefixが少し違うのは/usr/localにwineのシンボリックリンクを貼って、
それを/usr/local/binとかに間接参照させているからです。
バージョンの切り替えに重宝するテクニックです。
気にしなーいって方は--prefix=/usr/localでいいと思います。

んで注意点。いつもOSS(v4)無いよ!って言われてるので今回oss4-base類を
いろいろ追加してやってみたら、音が鳴らなくなりました(汗

デバイスも消えてしまったのでどうやらPulseAudioで構築した場合は
OSSはインストールしないほうがよさそう。
自分はoss4-baseをremoveして再起動したら元に戻りました。

2012年5月11日金曜日

gccとmkvtoolnix

スーパー間が空いてしまいましたが書くネタを探しておりました。
Firefoxはもうhgを使って更新するだけなのでもういいかなと思って
公式バイナリを展開してお茶を濁しております。

さて本題の方は本来はmkvtoolnixの方だったりしますが、gcc4.5以降じゃないと
configureで弾かれるのでgccから入れる作業です。


●GCC4.7を入れてみる
基本的にはさかな前線さんの該当記事を参考にしております。ありがたやー

○GMP・MPFR・MPCのインストール
 順番はGMP→MPFR→MPCで、ライブラリ依存してるのでGMPからやりましょう
 インストール先はどこでもいいのですが、gccの処理系を独立させるために
 ホームディレクトリにselflocalを作ってインストールしています。

 ・GMP
    http://gmplib.org/
   
$ ./configure --prefix=${HOME}/selflocal
$ make && make install

・MPFR
   http://www.mpfr.org/

$ ./configure --prefix=${HOME}/selflocal --with-gmp=${HOME}/selflocal
$ make && make install


 ・MPC
http://www.multiprecision.org/

$ ./configure --prefix=${HOME}/selflocal \
 --with-gmp=${HOME}/selflocal --with-mpfr=${HOME}/selflocal
$ make && make install

○GCC4.7のインストール
 やることは変わりませんが、最適化のためにできたバイナリで再度ビルドするという
 ことを3回するようなので時間がかかります。
 そのせいかは分かりませんがライブラリパスが通ってないと
 途中でエラーになるようです。
 コマンドで環境変数を一時設定するのが面倒ならexportで通してください。
 ・GCC
 公式
 http://gcc.gnu.org/
 筑波大学WIDEプロジェクトダウンロードミラー
 http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/
  
$ ./configure --prefix=${HOME}/selflocal --program-suffix=-4.7 \
   --with-gmp=${HOME}/selflocal \
   --with-mpfr=${HOME}/selflocal \
   --with-mpc=${HOME}/selflocal
$
$ LD_LIBRARY_PATH=${HOME}/selflocal/lib:${LD_LIBRARY_PATH} make
$ make install

プログラムサフィックスを設定しているのは作成バイナリ名でバージョンを
区別可能にするためです。
とりあえずこれでコンパイラの準備はできました。

●boost1.49を入れてみる
最新のmkvtoolnixだとboostのバージョンが低くて怒られちゃうので
これも最新のライブラリにしてあげる必要があります。
ただ、これはconfigure&Makefileでなくbootstrap&bjamなので
勝手が違って少し戸惑うかもしれないです。
debianのライブラリ名はシングルスレッド、マルチスレッドで
分離させているようなので分けてビルドします。

$ ./bootstrap 
$ PATH=${HOME}/selflocal/bin:${PATH} \
  LD_LIBRARY_PATH=${HOME}/selflocal/lib:${LD_LIBRARY_PATH} \
  LD_RUN_PATH=${HOME}/selflocal/lib:${LD_RUN_PATH} \
  ./bjam link=shared,static threading=multi \
  install --prefix=${HOME}/selflocal --buildid=mt
 
 $ PATH=${HOME}/selflocal/bin:${PATH} \
  LD_LIBRARY_PATH=${HOME}/selflocal/lib:${LD_LIBRARY_PATH} \ 
  LD_RUN_PATH=${HOME}/selflocal/lib:${LD_RUN_PATH} \ 
  ./bjam link=shared,static threading=single \
   install --prefix=${HOME}/selflocal

●mkvtoolnixのビルド
ここまでやってようやくmkvtoolnixのビルドの準備ができました。
tarボールでもhgでもいいのでソースを取得しましょう。
コンパイラはgcc-4.7を使いますのでパスの設定はしっかりとしましょう。
このバージョンではmakeの代わりにrubyベースのrakeが必要になります。
aptでインストールしておきましょう。
$  PATH=${HOME}selflocal/bin:${PATH} \
   LD_LIBRARY_PATH=${HOME}/selflocal/lib:${LD_LIBRARY_PATH} \
   LD_RUN_LIB=${HOME}/selflocal/lib:${LD_RUN_LIB} \
  ./configure --prefix=${HOME}/selflocal \
   --with-boost-libdir=${HOME}/selflocal/lib \
   CC=gcc-4.7 CPP=cpp-4.7 CXX=g++-4.7 CXXCPP=cpp-4.7 \
   CFLAGS="-I${HOME}/selflocal/include" \
   CXXFLAGS="-I${HOME}/selflocal/include" \
   CPPFLAGS="-I${HOME}/selflocal/include"
$
$ PATH=${HOME}/selflocal/bin:${PATH} \
  LD_LIBRARY_PATH=${HOME}/selflocal/lib:${LD_LIBRARY_PATH} \
  LD_RUN_PATH=${HOME}/selflocal/lib:${LD_RUN_PATH} rake
$ rake install

正直LD_RUN_PATHとかいらない気もしますが、念のため設定してます。
--with-boost-libdirをやらないと環境変数だけではうまくリンクできないようです。

これでインストール先のmmgやmkvmergeなどを実行すれば
mkvファイル操作を可能になります。
mmgのmkvmergeのパス指定以外はスタティックリンクビルドだけあって
ライブラリパス指定せずに実行できるのがスバラシイ!(笑


まあfoobar2000との相性はまだまだのようですが…
時々更新して見守ってみます。

2012年2月8日水曜日

FIrefoxが10になったぞー

でもまあやってることは変わらなかったり。
Firefox自体のhgリポジトリの更新はリビジョン指定しないと
相変わらずビルドに失敗します。

ああそれと日本語ロケールの指定ってja_JPじゃなくて
ja-JPだったんですね(汗
これのせいかは分かりませんが、brandingの指定なしでも
ロゴがFirefox公式のものになってます。
もしかして今までのも…(笑

2011年12月26日月曜日

firefox9.0.1とavidemux

なんかまどマギとかみんゴル5とかやっているうちに年の瀬でしたが、
firefox9がリリースされたついでに更新してみる。

firefox9のビルドは以前とやることは変化なかったです。
hg pullだけだとmergeするときにブランチ指定しろと怒られるので、
-Cオプションでリビジョン指定して反映します。

特に今使っているアドオンやプラグインに非互換のものはないようでした。


まどマギ借りてきてPSP用のH.264/AVCにAvidemuxで変換するとなぜか
音が遅れるんですよねー、Handbrakeで試したところ、こちらは
正常に変換できてる気がします。(ゲインの調整はできませんが…)

トラックの映像特典がインタレ入ってるのが原因かなーうーん。
DGIndexからのaviutlでもちゃんと変換できてるし…

Linuxでちゃんと使えるアプリないかなー?
acidripは音声トラックがPCMだとなぜか音入らないし(汗
Handbrake間に入れると余計な一時ファイル作ってからゲイン調整だから
他のが欲しいんですけどね。
wine+aviutlっていう手もありますが、それならわざわざDebianでやる意味もないし。
ぐぬぬ…

2011年11月18日金曜日

bind9をリビルド

今日うちのキャッシュサーバを更新してみたら
debianのセキュリティアップデートが来ていたので、
更新しました。ただし、debianのパッケージでは
filter-aaaaが無効(defaultだけど)になっているので、
再度有効化したうえで独自パッケージとしてインストールします。

debianのパッケージではconfigure/Makefileの代わりに
debian/rulesを記述してプリプロセス/ポストプロセスも含めた
統合管理できる形で配布しているようです。

今回のように使いたい機能があっても無効になっているなどの
場合は自分で再構築する必要があります。


パッケージ再構築の方法は検索でいくらでもでてきたので
今回のトラブルシュートの覚え書きを。
・必要な依存関係のパッケージ
# apt-get build-dep bind9

作業はapt-get sourceで取得した際に作成されるソースの
トップディレクトリで行う。

・debian/rulesの編集
debianってディレクトリがあるけど、パッケージを作る際に
行ったり来たりが面倒なのでcdせずに編集する。

少しスクロールするとconfigureのオプションがリストに
列挙してあるのでそこに--enable-filter-aaaaを追加する。

※今回のトラブルの大元
rulesファイルは基本的にはMakefileと同等の記述ルールに基づきます。
そのためアクションとして動かすコマンドの行頭にタブが無い場合
エラーになります。(スペースでもダメ)
今回dh_clean以降でエラーになったのはそのため。
missing separatorってなんだよってのはこの行頭タブがないことでした。
追記:
別マシンのi386で確かめたところ、こっちはちゃんとタブに
なってました。armelだけかも。

# dpkg-buildpackage -rfakeroot -uc -b
でパッケージのビルドが開始されます。
玄箱Proだとそれなりに時間がかかります。

作成されるパッケージはソースのトップディレクトリの
さらに上のディレクトリにできます。(apt-get sourceを実行したところ)
気をつけないとぐちゃぐちゃになるので注意。

2011年11月11日金曜日

Firefox8をビルドしてみた

と言ってもhgでソース更新して再ビルドしただけですが。

ただしreleaseリポジトリは別ブランチも混ざってるらしくてtagsをみて
revertしました。

細かいことだけどfaviconないページが四角でタブに追加されるのは
勘弁して(笑)