2014/05/11 (Sun) 12:10
Windows XPのサポート停止で古いXPマシンをどうしようか悩んでいる方も多いと思いますが、そのなかでも厄介なのはPentium MやCeleron Mマシンです。ネット閲覧程度ならまだ十分使えるのに選択肢が結構狭まってしまっています。
XPからの引っ越し先でLinuxを思い浮かべる方も多いと思いますが、最近のメジャーなLinuxディストリビューションではPentium MやCeleron Mマシンでブートすると以下のようなエラーがでて動かないことが多かったと思います。
(簡単に再現するためVirtualBoxを使っていますが、実機でも同じエラーになるはずです。)
そのため、Puppy LinuxやZolin OSといったいわゆる軽量Linuxを使うのが普通だったのかなと思います。
しかし、最新のlubuntu 14.04(これも軽量Linuxに分類されると思いますがw)ではこの問題への回避策がとられ、Pentium Mマシンでもブートできるようになりました。たぶんCeleron MもOKだと思いますが実機がないので試していません。
Ubuntuも同じかもしれませんが、非力なPentium Mマシンに入れる気はしないので試していません。
とりあえず技術的な話は置いておいて、まずはCDからのブート方法だけを書いておきます。
今回は手持ちのPentium MマシンであるThinkPad T42でためしています。
lubuntuのダウンロード方法やCD-ROMへの焼き方などはここでは触れません。CDからブートした後のメニューでの操作方法についてのみ書きます。
HDDへのインストール手順はメニューに従うだけですしPentium Mマシンだからといって変わることはありませんので割愛します。
CDからのブート時にforcepaeを指定して起動した場合、HDDにインストールするとgrub.cfgにforcepaeの指定がちゃんと反映されるようになっていますので、以降は何もしなくても普通にブートします。
なお、この方法がつかえるのはPentium Mのみです。Celeron Mも可能だと思うのですが試してはいません。
結局このforcepaeは何をやっているのか、というと、物理アドレス拡張(PAE)というCPUの機能が今起動しようとしているCPUにあるかどうかのチェックをバイパスし、PAEが使えるCPUとみなして強引に起動をかけてしまおうというものです。
Linuxカーネルは、起動時にCPUがどんな機能をサポートしているかを確認します。このときPentium MはPAEをサポートしている、という情報を返してきません。そのため、PAEを必要とする方法でビルドされた最近のLinuxカーネルは、Pentium MはPAEが使えないのでだめだ、というエラーを返してきます。
しかし、実はPentium Mは問い合わせにしかとするだけで、実際にはPAEが使えるようなのです。いわば隠し機能というやつです。意図的に隠し機能にしたのか単なるバグでCPU FlagからPAEが抜け落ちているのかはわかりません。
なので、今回の修正ではPentium M(またはCeleron M)の場合だけforcepaeが指定されたならPAEのチェックをバイパスし、PAEが使えるものとみなしてしまう、という機能を追加してPentium Mでも動けるようにしたわけです。
今回の修正ではCPUの種類をチェックしているので、Pentium M/Celeron M以外で本当にPAE機能がないCPUや、VirutalBoxなどの仮想環境でPAEをオフにした場合などはたとえforcepaeを指定しても以前と同様のエラーになります。これらについては上に書いたPuppy LinuxやZolin OSなどのnon PAEカーネルを使っているディストリビューションでないと動きません。
今回のPentium M向け修正でのカーネルパッチの内容は以下の場所で見ることができます。
[PATCH] x86: set Pentium M as PAE capable
このパッチを見れば、forcepaeが有効になるCPUのタイプもわかります。引用するとこんな感じです。
いわゆるFamily6、model9または13のCPUでだけforcepaeが効くようになっています。これはPentium MとCeleron Mに相当しますがPentium MやCeleron Mという名前の付いたCPUがすべてこれに当てはまるかは把握していません。逆に、Family6 model9/13なCPUならみんなPAEを隠し持っているかというとそれも100%断言できるかは定かではありません。上でWARNINGを出していたのはその辺をふまえて「ちょっと無理やりなんだぜ?」と言っているんだと思います。
なお、PAEフラグが立っていない時、という条件がand条件で付いているので、PAEフラグをちゃんと返してくる一部のPentium Mにはこの修正の影響が出ないようになっています。
当初カーネルパラメータはforcepaeと言っていたようですが、もっと新しい記事ではカーネルパラメータの名前がpaeに変わっています。
lubuntuには、forcepaeと言っていた当時のパッチが取り込まれたようですね。
このブログでは主にChromium OSを扱っていますが、このカーネルパッチをChromium OSのカーネルソースに適用してあげると(それだけではだめで別途SSE3対策が必要)一応うちのThinkPad T42でもブートまでは持っていくことができています。
ただ、CPU周りよりも周辺機器を動かすのが大変です。
まだ無線LANが動きません。有線でつなげば一応つかうことはできます。
トラックポイントは認識しますがタッチパッドは認識しません。
他にも起動時のスプラッシュ画面が出なかったり、起動直後は画面がピンク色でいったんターミナルに切り替えて戻すとちゃんと表示されたりします。他にもいろいろ問題がありそうです。
こんな感じでこちらのThinkPad T42は苦戦していますが、今のところ、CPU周りの問題だけはクリアになっていて、ブートだけなら問題なくできます。
ほかのPentium Mマシン向けにビルドする際でもCPU周りのカスタマイズ方法は参考になるかもしれませんので、この辺の話はまた別途書きたいと思います。
15.09.08 追記: ThinkPad T42で動作するChromium OSのカスタムビルドを公開しました。興味がありましたらお試しいただければと思います。
17.04.24 追記: 「本当にPAE機能がないPentiumⅢ以前のCPU」という記載がありましたが誤りであるというご指摘をいただきましたので訂正いたしました。
XPからの引っ越し先でLinuxを思い浮かべる方も多いと思いますが、最近のメジャーなLinuxディストリビューションではPentium MやCeleron Mマシンでブートすると以下のようなエラーがでて動かないことが多かったと思います。
(簡単に再現するためVirtualBoxを使っていますが、実機でも同じエラーになるはずです。)
そのため、Puppy LinuxやZolin OSといったいわゆる軽量Linuxを使うのが普通だったのかなと思います。
しかし、最新のlubuntu 14.04(これも軽量Linuxに分類されると思いますがw)ではこの問題への回避策がとられ、Pentium Mマシンでもブートできるようになりました。たぶんCeleron MもOKだと思いますが実機がないので試していません。
Ubuntuも同じかもしれませんが、非力なPentium Mマシンに入れる気はしないので試していません。
lubuntu14.04 をPentium Mマシンでブートする
とりあえず技術的な話は置いておいて、まずはCDからのブート方法だけを書いておきます。
今回は手持ちのPentium MマシンであるThinkPad T42でためしています。
lubuntuのダウンロード方法やCD-ROMへの焼き方などはここでは触れません。CDからブートした後のメニューでの操作方法についてのみ書きます。
- CDからブートします。
- 言語選択メニューが表示されるので日本語を選びます
- メニュー画面が出ます。
- F6を押すと以下の画面になります。
- ESCをおして選択肢を消します。画面下に起動オプションという欄があります。
- forcepaeと打ち込みます
- RETURNキーを押すとブートが始まります。forcepaeの指定が効いた場合は以下のような表示が出ます。WARNINGと出ていますが、これはforcepae自体がちょっと無理やりな機能だという意味で出ています。基本的に気にしなくて大丈夫ですが、Pentium Mなら100%ブートできるというわけではなく、もしかしたら動かないかもしれません、ということです。この点については後述します。
- しばらくするとおなじみのスプラッシュ画面がでますが、うちのThinkPadでは色がおかしくなってますww
- 無事起動しました。
HDDへのインストール手順はメニューに従うだけですしPentium Mマシンだからといって変わることはありませんので割愛します。
CDからのブート時にforcepaeを指定して起動した場合、HDDにインストールするとgrub.cfgにforcepaeの指定がちゃんと反映されるようになっていますので、以降は何もしなくても普通にブートします。
なお、この方法がつかえるのはPentium Mのみです。Celeron Mも可能だと思うのですが試してはいません。
結局forcepaeって何?
結局このforcepaeは何をやっているのか、というと、物理アドレス拡張(PAE)というCPUの機能が今起動しようとしているCPUにあるかどうかのチェックをバイパスし、PAEが使えるCPUとみなして強引に起動をかけてしまおうというものです。
Linuxカーネルは、起動時にCPUがどんな機能をサポートしているかを確認します。このときPentium MはPAEをサポートしている、という情報を返してきません。そのため、PAEを必要とする方法でビルドされた最近のLinuxカーネルは、Pentium MはPAEが使えないのでだめだ、というエラーを返してきます。
しかし、実はPentium Mは問い合わせにしかとするだけで、実際にはPAEが使えるようなのです。いわば隠し機能というやつです。意図的に隠し機能にしたのか単なるバグでCPU FlagからPAEが抜け落ちているのかはわかりません。
なので、今回の修正ではPentium M(またはCeleron M)の場合だけforcepaeが指定されたならPAEのチェックをバイパスし、PAEが使えるものとみなしてしまう、という機能を追加してPentium Mでも動けるようにしたわけです。
今回の修正ではCPUの種類をチェックしているので、Pentium M/Celeron M以外で本当にPAE機能がないCPUや、VirutalBoxなどの仮想環境でPAEをオフにした場合などはたとえforcepaeを指定しても以前と同様のエラーになります。これらについては上に書いたPuppy LinuxやZolin OSなどのnon PAEカーネルを使っているディストリビューションでないと動きません。
今回のPentium M向け修正でのカーネルパッチの内容は以下の場所で見ることができます。
[PATCH] x86: set Pentium M as PAE capable
このパッチを見れば、forcepaeが有効になるCPUのタイプもわかります。引用するとこんな感じです。
+ } else if (err == 0x01 && + !(err_flags[0] & ~(1 << X86_FEATURE_PAE)) && + is_intel() && cpu.level == 6 && + (cpu.model == 9 || cpu.model == 13)) {
いわゆるFamily6、model9または13のCPUでだけforcepaeが効くようになっています。これはPentium MとCeleron Mに相当しますがPentium MやCeleron Mという名前の付いたCPUがすべてこれに当てはまるかは把握していません。逆に、Family6 model9/13なCPUならみんなPAEを隠し持っているかというとそれも100%断言できるかは定かではありません。上でWARNINGを出していたのはその辺をふまえて「ちょっと無理やりなんだぜ?」と言っているんだと思います。
なお、PAEフラグが立っていない時、という条件がand条件で付いているので、PAEフラグをちゃんと返してくる一部のPentium Mにはこの修正の影響が出ないようになっています。
当初カーネルパラメータはforcepaeと言っていたようですが、もっと新しい記事ではカーネルパラメータの名前がpaeに変わっています。
lubuntuには、forcepaeと言っていた当時のパッチが取り込まれたようですね。
Chromium OSへの応用
このブログでは主にChromium OSを扱っていますが、このカーネルパッチをChromium OSのカーネルソースに適用してあげると(それだけではだめで別途SSE3対策が必要)一応うちのThinkPad T42でもブートまでは持っていくことができています。
ただ、CPU周りよりも周辺機器を動かすのが大変です。
まだ無線LANが動きません。有線でつなげば一応つかうことはできます。
トラックポイントは認識しますがタッチパッドは認識しません。
他にも起動時のスプラッシュ画面が出なかったり、起動直後は画面がピンク色でいったんターミナルに切り替えて戻すとちゃんと表示されたりします。他にもいろいろ問題がありそうです。
こんな感じでこちらのThinkPad T42は苦戦していますが、今のところ、CPU周りの問題だけはクリアになっていて、ブートだけなら問題なくできます。
ほかのPentium Mマシン向けにビルドする際でもCPU周りのカスタマイズ方法は参考になるかもしれませんので、この辺の話はまた別途書きたいと思います。
15.09.08 追記: ThinkPad T42で動作するChromium OSのカスタムビルドを公開しました。興味がありましたらお試しいただければと思います。
17.04.24 追記: 「本当にPAE機能がないPentiumⅢ以前のCPU」という記載がありましたが誤りであるというご指摘をいただきましたので訂正いたしました。
ランキングに参加してみました。クリックしていただければ嬉しいです。
にほんブログ村 |
パソコン ブログランキングへ |
PR
2014/04/06 (Sun) 13:24
数か月前にCentOS6を古いマシン(32bit)から64bit OSが動かせる新しいマシンにリプレースしたのですが、今の今までウィルススキャンソフトを入れていないという恐ろしいことに気づきました。
ということでリプレース前に使っていたClamAVを今のマシンに入れることにしました。
その手順をメモっておきます。作業は全部rootで行いました。
リポジトリにrpmforgeが使えるように設定していればyumで以下のようにインストールできます。
clamdを起動しておきます。
ちなみにchkconfigはデフォルトでonになっているようですのでリブートしても自動で立ち上がるでしょう。
上でデータベースが古いと出ているので更新します。
このfreshclamコマンドを日次で実行するスクリプトが/etc/cron.daily/freshclamという名前で自動でインストールされているので、以降は毎日定期的にアップデートが実行されるはずです。
/etc/cron.dailyに日次スキャンを行うスクリプトを書いておきます。
とりあえず/homeと/raid6という2つのディレクトリをスキャンするように指定しています。-iは問題を検出したファイルだけを出力するオプション、-rはサブディレクトリもチェックするオプションです。-lオプションでログの出力先を指定しています。
あと、一応実行前にclamdとclamavの更新があればインストールするようにしています。
とりあえず作ったスクリプトでスキャンを実行しておきます。
こんなコマンドを実行してログを監視しておきます。10秒ごとにログの末尾30行を定期的に表示してくれます。
何も出なければいいんですが、果たしてどうなることやら。問題がなければこんなログが出ます。
infected filesが0なので平気だったようです。無事に終われば、後は毎日自動で実行されるはずです。
ということでリプレース前に使っていたClamAVを今のマシンに入れることにしました。
その手順をメモっておきます。作業は全部rootで行いました。
ダウンロード・インストール
リポジトリにrpmforgeが使えるように設定していればyumで以下のようにインストールできます。
# yum install --enablerepo=rpmforge clamav clamd
clamdの起動
clamdを起動しておきます。
# /etc/init.d/clamd start Starting Clam AntiVirus Daemon: LibClamAV Warning: ************************************************** LibClamAV Warning: *** The virus database is older than 7 days! *** LibClamAV Warning: *** Please update it as soon as possible. *** LibClamAV Warning: ************************************************** [ OK ]
ちなみにchkconfigはデフォルトでonになっているようですのでリブートしても自動で立ち上がるでしょう。
データベースの更新
上でデータベースが古いと出ているので更新します。
# /usr/bin/freshclam ClamAV update process started at Sun Apr 6 11:54:37 2014 Downloading main-55.cdiff [100%] main.cld updated (version: 55, sigs: 2424225, f-level: 60, builder: neo) WARNING: getfile: daily-15077.cdiff not found on remote server (IP: 219.94.128.99) WARNING: getpatch: Can't download daily-15077.cdiff from db.jp.clamav.net WARNING: getfile: daily-15077.cdiff not found on remote server (IP: 211.10.155.48) WARNING: getpatch: Can't download daily-15077.cdiff from db.jp.clamav.net WARNING: getfile: daily-15077.cdiff not found on remote server (IP: 218.44.253.75) WARNING: getpatch: Can't download daily-15077.cdiff from db.jp.clamav.net WARNING: Incremental update failed, trying to download daily.cvd Downloading daily.cvd [100%] daily.cvd updated (version: 18746, sigs: 871270, f-level: 63, builder: neo) Downloading bytecode.cvd [100%] bytecode.cvd updated (version: 236, sigs: 43, f-level: 63, builder: dgoddard) Database updated (3295538 signatures) from db.jp.clamav.net (IP: 27.96.54.66) Clamd successfully notified about the update.
このfreshclamコマンドを日次で実行するスクリプトが/etc/cron.daily/freshclamという名前で自動でインストールされているので、以降は毎日定期的にアップデートが実行されるはずです。
スキャン実行スクリプトの作成
/etc/cron.dailyに日次スキャンを行うスクリプトを書いておきます。
# cd /etc/cron.daily # vi clamscan #!/bin/bash LOG_FILE="/var/log/clamav/clamscan.log" /usr/bin/yum -y update --enablerepo=rpmforge clamd /usr/bin/yum -y update --enablerepo=rpmforge clamav /usr/bin/clamscan -i -r -l $LOG_FILE /home /usr/bin/clamscan -i -r -l $LOG_FILE /raid6
とりあえず/homeと/raid6という2つのディレクトリをスキャンするように指定しています。-iは問題を検出したファイルだけを出力するオプション、-rはサブディレクトリもチェックするオプションです。-lオプションでログの出力先を指定しています。
あと、一応実行前にclamdとclamavの更新があればインストールするようにしています。
スキャンの実行
とりあえず作ったスクリプトでスキャンを実行しておきます。
# sh ./clamscan
こんなコマンドを実行してログを監視しておきます。10秒ごとにログの末尾30行を定期的に表示してくれます。
# watch -n 10 tail -n 30 /var/log/clamav/clamscan.log
何も出なければいいんですが、果たしてどうなることやら。問題がなければこんなログが出ます。
----------- SCAN SUMMARY ----------- Known viruses: 3290138 Engine version: 0.98.1 Scanned directories: 16114 Scanned files: 77250 Infected files: 0 Data scanned: 7608.61 MB Data read: 1386266.04 MB (ratio 0.01:1) Time: 705.741 sec (11 m 45 s)
infected filesが0なので平気だったようです。無事に終われば、後は毎日自動で実行されるはずです。
ランキングに参加してみました。クリックしていただければ嬉しいです。
にほんブログ村 |
パソコン ブログランキングへ |
2014/04/01 (Tue) 22:34
うちではCentOS6で2TBのディスク7台をRAID6で運用しているのですが、今日そのうちの1台が壊れたらしく、RAIDがデグレード状態になっていました。
ということで予備のディスクを使って復旧を行いました。
まず本当なら壊れたディスクをRAIDから除去するのですが、すっかり忘れてました。
ここからもうすでにいろいろまずかったのですが。
で、マシンをシャットダウンしてディスク交換を行い、再起動しました。
fdiskで交換したディスクにパーティションを作って、パーティションタイプをLinux raid 自動検出に変えます。手順はこんな感じ。
で、このディスクをRAIDに組み込みます。
で、自動的にRAIDのリカバリが始まり、後は待つだけ。。。。
ん?!
なんか変だぞ?
よく見たら/dev/sdfになってるwww
ここは/dev/sdf1でないとダメじゃないですか!
ありゃま、どうしよう、ということでやり直しです。
まず、リカバリ中ですが無視していったんRAIDを止めました。
で、ミスって組み込んだ/dev/sdfをのぞいた6台でRAIDを組みなおします。
間違えて/dev/sdfで組み込んじゃったHDDはパーティションテーブルがおかしくなっているはずなのでいったんクリアしておきます。
で、もう一度fdiskでパーティションを切り直し。手順は上に書いた通りです。
そして、今度こそは/dev/sdf1をRAIDに組み込みます。
これで今度こそちゃんとリカバリが始まりました。
まったく、、我ながらなにやってるんでしょうかねwww
リカバリには丸一日かかるので放置しました。
で、終わったのでいったんリブートしました。するとまたデグレード。
みるとまた/dev/sdfがRAIDに取り込まれている。。。
これを忘れていたのが原因でした。
一度RAIDに取り込んだディスクは、ディスクの末尾にスーパーブロックというRAID専用の情報が書き込まれているので、これを消さないといけませんでした。
あと、よく考えたらAFTのことも忘れていました。AFTというのは物理セクタのサイズを従来の512バイトから4096バイトに拡張したものです。ただしLinux上だと論理セクタは512バイトのままのようです。
普通にfdiskでパーティションを切ると開始位置はシリンダにそろえられますが、これは論理セクタ単位だと63セクタになります。これだとAFTディスクの物理セクタサイズと一致しないので、fdiskを実行したとに以下のようなメッセージが出ます。
<非AFTディスクの場合>
<AFTディスクの場合>
fdiskを-uオプション付きで実行すると表示をセクタ単位にすることができます。それで実行すると以下のようになっています。
開始位置が63になっていて、これが8の倍数(4096/512)になっていないと性能が出ないという話があります。 性能が出ないだけで一応使えますが、とりあえずやり直すならfdiskを-u付きで起動して、ちゃんと物理セクタに合わせてパーティションを切りなおします。
とりあえずこれで再度RAIDに組み込んでリカバリしたらうまくいきました。
RAIDのHDD置換はたまにしかやらないので手順を忘れてしまって一度だとうまくいかないことが多いです。今回はうまくリカバリできたけど、これから失敗しないようにしないと。。。
ということで予備のディスクを使って復旧を行いました。
まず本当なら壊れたディスクをRAIDから除去するのですが、すっかり忘れてました。
ここからもうすでにいろいろまずかったのですが。
で、マシンをシャットダウンしてディスク交換を行い、再起動しました。
fdiskで交換したディスクにパーティションを作って、パーティションタイプをLinux raid 自動検出に変えます。手順はこんな感じ。
# fdisk /dev/sdf (略) コマンド (m でヘルプ): n ←新規パーティション コマンドアクション e 拡張 p 基本領域 (1-4) p ←基本領域 領域番号 (1-4): 1 最初 シリンダ (1-243201, default 1): 1 終点 シリンダ または +サイズ または +サイズM または +サイズK (1-243201, default 243201): +243153 コマンド (m でヘルプ): p Disk /dev/sdf: 2000.3 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = シリンダ数 of 16065 * 512 = 8225280 bytes デバイス Boot Start End Blocks Id System /dev/sdf1 1 243154 1953134473+ 83 Linux ←普通のLinuxパーティションなのでRAIDに変える コマンド (m でヘルプ): t ←パーティションタイプ変更 Selected partition 1 16進数コード (L コマンドでコードリスト表示): fd ←Linux RAIDを指定 領域のシステムタイプを 1 から fd (Linux raid 自動検出) に変更しました コマンド (m でヘルプ): p ←状態確認 Disk /dev/sdf: 2000.3 GB, 2000398934016 bytes 255 heads, 63 sectors/track, 243201 cylinders Units = シリンダ数 of 16065 * 512 = 8225280 bytes デバイス Boot Start End Blocks Id System /dev/sdf1 1 243154 1953134473+ fd Linux raid 自動検出 ←Linux RAIDになった コマンド (m でヘルプ): w ←結果保存 領域テーブルは交換されました! ioctl() を呼び出して領域テーブルを再読込みします。 ディスクを同期させます。 #
で、このディスクをRAIDに組み込みます。
# mdadm --manage /dev/md2 --add /dev/sdf mdadm: added /dev/sdf
で、自動的にRAIDのリカバリが始まり、後は待つだけ。。。。
# cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] md2 : active raid6 sdc1[0] sdf[7] sdi1[6] sdh1[5] sdg1[4] sde1[2] sdd1[1] 9765672000 blocks level 6, 64k chunk, algorithm 2 [7/6] [UUU_UUU] [>....................] recovery = 0.0% (126080/1953134400) finish=1806.9min speed=18011K/sec
ん?!
なんか変だぞ?
よく見たら/dev/sdfになってるwww
ここは/dev/sdf1でないとダメじゃないですか!
ありゃま、どうしよう、ということでやり直しです。
まず、リカバリ中ですが無視していったんRAIDを止めました。
# mdadm --stop /dev/md2 mdadm: stopped /dev/md2
で、ミスって組み込んだ/dev/sdfをのぞいた6台でRAIDを組みなおします。
# mdadm --assemble /dev/md2 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdg1 /dev/sdh1 /dev/sdi1 mdadm: /dev/md2 has been started with 6 drives (out of 7).
間違えて/dev/sdfで組み込んじゃったHDDはパーティションテーブルがおかしくなっているはずなのでいったんクリアしておきます。
# dd if=/dev/zero of=/dev/sdf bs=512 count=64 64+0 records in 64+0 records out 32768 bytes (33 kB) copied, 0.260877 s, 126 kB/s
で、もう一度fdiskでパーティションを切り直し。手順は上に書いた通りです。
そして、今度こそは/dev/sdf1をRAIDに組み込みます。
# mdadm --manage /dev/md2 --add /dev/sdf1 mdadm: added /dev/sdf1
これで今度こそちゃんとリカバリが始まりました。
# cat /proc/mdstat Personalities : [raid1] [raid6] [raid5] [raid4] md2 : active raid6 sdf1[7] sdc1[0] sdi1[6] sdh1[5] sdg1[4] sde1[2] sdd1[1] 9765672000 blocks level 6, 64k chunk, algorithm 2 [7/6] [UUU_UUU] [>....................] recovery = 0.3% (6041092/1953134400) finish=1535.5min speed=21132K/sec
まったく、、我ながらなにやってるんでしょうかねwww
リカバリには丸一日かかるので放置しました。
で、終わったのでいったんリブートしました。するとまたデグレード。
みるとまた/dev/sdfがRAIDに取り込まれている。。。
これを忘れていたのが原因でした。
# mdadm --zero-superblock /dev/sdf
一度RAIDに取り込んだディスクは、ディスクの末尾にスーパーブロックというRAID専用の情報が書き込まれているので、これを消さないといけませんでした。
あと、よく考えたらAFTのことも忘れていました。AFTというのは物理セクタのサイズを従来の512バイトから4096バイトに拡張したものです。ただしLinux上だと論理セクタは512バイトのままのようです。
普通にfdiskでパーティションを切ると開始位置はシリンダにそろえられますが、これは論理セクタ単位だと63セクタになります。これだとAFTディスクの物理セクタサイズと一致しないので、fdiskを実行したとに以下のようなメッセージが出ます。
<非AFTディスクの場合>
ディスク /dev/sdg: 2000.4 GB, 2000398934016 バイト ヘッド 255, セクタ 63, シリンダ 243201 Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト ← 物理セクタ=論理セクタ I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0x0811122f デバイス ブート 始点 終点 ブロック Id システム /dev/sdg1 1 243154 1953134473+ fd Linux raid 自動検出 (ここに何も出ない)
<AFTディスクの場合>
# fdisk -l /dev/sdf ディスク /dev/sdf: 2000.4 GB, 2000398934016 バイト ヘッド 255, セクタ 63, シリンダ 243201 Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト ←ここの物理が4096バイト I/O size (minimum/optimal): 4096 bytes / 4096 bytes ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdf1 1 243154 1953134473+ fd Linux raid 自動検出 Partition 1 does not start on physical sector boundary. ←こんなエラーが出る
fdiskを-uオプション付きで実行すると表示をセクタ単位にすることができます。それで実行すると以下のようになっています。
# fdisk -lu /dev/sdf ディスク /dev/sdf: 2000.4 GB, 2000398934016 バイト ヘッド 255, セクタ 63, シリンダ 243201 Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト I/O size (minimum/optimal): 4096 bytes / 4096 bytes ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdf1 63 3906269009 1953134473+ fd Linux raid 自動検出 Partition 1 does not start on physical sector boundary.
開始位置が63になっていて、これが8の倍数(4096/512)になっていないと性能が出ないという話があります。 性能が出ないだけで一応使えますが、とりあえずやり直すならfdiskを-u付きで起動して、ちゃんと物理セクタに合わせてパーティションを切りなおします。
[root@developper ~]# fdisk -u /dev/sdf 警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを 強く推奨します。. コマンド (m でヘルプ): p ディスク /dev/sdf: 2000.4 GB, 2000398934016 バイト ヘッド 255, セクタ 63, シリンダ 243201, 合計 3907029168 セクタ Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト I/O size (minimum/optimal): 4096 bytes / 4096 bytes ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdf1 63 3906269009 1953134473+ fd Linux raid 自動検出 コマンド (m でヘルプ): d 選択した領域 1 コマンド (m でヘルプ): n コマンドアクション e 拡張 p 基本パーティション (1-4) p パーティション番号 (1-4): 1 最初 セクタ (63-3907029167, 初期値 63): 64 ← ここで64を指定 Last セクタ, +セクタ数 or +size{K,M,G} (64-3907029167, 初期値 3907029167): 初期値 3907029167 を使います ← Lastセクタは1足して8の倍数ならOK コマンド (m でヘルプ): p ディスク /dev/sdf: 2000.4 GB, 2000398934016 バイト ヘッド 255, セクタ 63, シリンダ 243201, 合計 3907029168 セクタ Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト I/O size (minimum/optimal): 4096 bytes / 4096 bytes ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdf1 64 3907029167 1953514552 83 Linux コマンド (m でヘルプ): t 選択した領域 1 16進数コード (L コマンドでコードリスト表示): fd 領域のシステムタイプを 1 から fd (Linux raid 自動検出) に変更しました コマンド (m でヘルプ): p ディスク /dev/sdf: 2000.4 GB, 2000398934016 バイト ヘッド 255, セクタ 63, シリンダ 243201, 合計 3907029168 セクタ Units = シリンダ数 of 16065 * 512 = 8225280 バイト セクタサイズ (論理 / 物理): 512 バイト / 4096 バイト I/O size (minimum/optimal): 4096 bytes / 4096 bytes ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdf1 64 3907029167 1953514552 fd Linux raid 自動検出 (ここにエラーメッセージが出なければOK) コマンド (m でヘルプ): w パーティションテーブルは変更されました! ioctl() を呼び出してパーティションテーブルを再読込みします。 ディスクを同期しています。
とりあえずこれで再度RAIDに組み込んでリカバリしたらうまくいきました。
RAIDのHDD置換はたまにしかやらないので手順を忘れてしまって一度だとうまくいかないことが多いです。今回はうまくリカバリできたけど、これから失敗しないようにしないと。。。
ランキングに参加してみました。クリックしていただければ嬉しいです。
にほんブログ村 |
パソコン ブログランキングへ |
2014/03/09 (Sun) 16:58
使おうとした4GBのUSBメモリが2GBずつ2つのパーティションに分かれていて、1つに戻したかったのでLinux(CentOS6.4)を使って作業しました。
その時のメモです。作業はすべてrootで行います。
この方法で作成したUSBメモリのパーティションに書き込んだubuntuで無事にブートすることができました。
その時のメモです。作業はすべてrootで行います。
- USBメモリをLinuxにつなぐ
- USBメモリのスペシャルファイル名を調べる。
あらかじめUSBメモリのラベル名がわかっているなら、/dev/disk/by-labelにできたシンボリックリンクが指し示す実体を見ればわかります。
linux# cd /dev/disk/by-label linux# ls -l lrwxrwxrwx. 1 root root 10 3\u6708 9 16:04 2014 HDDREG -> ../../sdj1
この例ではUSBメモリにHDDREGというラベルがついていて、それの実体が/dev/sdj1であることがわかります。よってUSBメモリのスペシャルファイル名は/dev/sdjになります。
念のため、fdisk -lを実行してパーティションの状態を確認します。
linux# fdisk -l (略) ディスク /dev/sdj: 4001 MB, 4001366016 バイト ヘッド 64, セクタ 32, シリンダ 3816 Units = シリンダ数 of 2048 * 512 = 1048576 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdj1 * 1 1967 2014192 e W95 FAT16 (LBA)
ファイルシステムがW95 F16なのでUSBメモリと考えて問題なさそうです。これを間違えてしまうと大変なことになるので慎重に調べます。不安なら/dev/disk/by-idや/dev/disk/by-pathでls -lコマンドを実行するのも効果的です。たいてい"usb"という文字列が含まれているシンボリックリンクがあります。今回の例を示すと以下のようになります。
linux# ls -l /dev/disk/by-id (略) lrwxrwxrwx. 1 root root 9 3\u6708 9 16:31 2014 usb-Sony_Storage_Media_9B2001102180001905-0:0 -> ../../sdj lrwxrwxrwx. 1 root root 10 3\u6708 9 16:31 2014 usb-Sony_Storage_Media_9B2001102180001905-0:0-part1 -> ../../sdj1 (略) linux# ls -l /dev/disk/by-path (略) lrwxrwxrwx. 1 root root 9 3\u6708 9 16:31 2014 pci-0000:00:1a.0-usb-0:1.4:1.0-scsi-0:0:0:0 -> ../../sdj lrwxrwxrwx. 1 root root 10 3\u6708 9 16:31 2014 pci-0000:00:1a.0-usb-0:1.4:1.0-scsi-0:0:0:0-part1 -> ../../sdj1 (略)
- 以下のコマンドでUSBの先頭にあるパーティションテーブルを消します。
ofがHDDだと大変なことになるので上に書いたように慎重に確認しておく必要があります。
linux# dd if=/dev/zero of=/dev/sdj bs=512 count=64 64+0 records in 64+0 records out 32768 bytes (33 kB) copied, 0.013923 s, 2.4 MB/s
念のためにsyncしておきます。linux# sync
- あとは普通にfdiskでパーティションを切ります。
linux# fdisk /dev/sdj 警告: DOS互換モードは廃止予定です。このモード (コマンド 'c') を止めることを 強く推奨します。 and change display units to sectors (command 'u'). コマンド (m でヘルプ): d 選択した領域 1 コマンド (m でヘルプ): p ディスク /dev/sdj: 4001 MB, 4001366016 バイト ヘッド 64, セクタ 32, シリンダ 3816 Units = シリンダ数 of 2048 * 512 = 1048576 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム コマンド (m でヘルプ): n コマンドアクション e 拡張 p 基本パーティション (1-4) p パーティション番号 (1-4): 1 最初 シリンダ (1-3816, 初期値 1): 初期値 1 を使います Last シリンダ, +シリンダ数 or +size{K,M,G} (1-3816, 初期値 3816): 初期値 3816 を使います コマンド (m でヘルプ): p ディスク /dev/sdj: 4001 MB, 4001366016 バイト ヘッド 64, セクタ 32, シリンダ 3816 Units = シリンダ数 of 2048 * 512 = 1048576 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdj1 1 3816 3907568 83 Linux コマンド (m でヘルプ): t 選択した領域 1 16進数コード (L コマンドでコードリスト表示): b 領域のシステムタイプを 1 から b (W95 FAT32) に変更しました コマンド (m でヘルプ): p ディスク /dev/sdj: 4001 MB, 4001366016 バイト ヘッド 64, セクタ 32, シリンダ 3816 Units = シリンダ数 of 2048 * 512 = 1048576 バイト セクタサイズ (論理 / 物理): 512 バイト / 512 バイト I/O size (minimum/optimal): 512 bytes / 512 bytes ディスク識別子: 0x00000000 デバイス ブート 始点 終点 ブロック Id システム /dev/sdj1 1 3816 3907568 b W95 FAT32 コマンド (m でヘルプ): w パーティションテーブルは変更されました! ioctl() を呼び出してパーティションテーブルを再読込みします。 警告: DOS 6.x パーティションを作成、または変更してしまった場合は、 fdisk マニュアルの追加情報ページを参照してください。 ディスクを同期しています。 linux#
この方法で作成したUSBメモリのパーティションに書き込んだubuntuで無事にブートすることができました。
ランキングに参加してみました。クリックしていただければ嬉しいです。
にほんブログ村 |
パソコン ブログランキングへ |
プロフィール
HN:
zui
性別:
非公開
カテゴリー
最新記事
(09/28)
(09/03)
(08/26)
(07/23)
(05/24)
PR
忍者カウンター