気の向くままに辿るIT/ICT
webzoit.netウェブサイトホームページ
Server

ラズパイ用USBメモリ差替時LVMのinactiveでハマった話

ウェブ造ホーム前へ次へ
サイト内検索
カスタム検索
Raspberry Piって?

ラズパイ用USBメモリ差替時LVMのinactiveでハマった話

ラズパイ用USBメモリ差替時LVMのinactiveでハマった話

2016/08/02

 サーバ、NASとして運用中のRaspberry Pi 2 Model B、起動用にmicroSD 4GB(予備は2GB)、大きすぎたら他に使えばよいかとなんとなく思いつつ、システム用にUSBメモリSiliconPower Ultima U02 32GBを買ったものの、容量に余裕を持ちすぎたので早々にコスパ含め8GBのUSBメモリに移行するつもりでいました。

 手持ちのインストーラ・ライブOS・レスキュー用USBメモリ(Lexar JumpDrive S50 Orange)8GBの容量不足を感じていたのでこれと直接入れ替えることも考えたものの、これはこれでラズパイ用の予備にするものとして、もう1つ調達することに。

 結果、選定して買ったのが、Transcend JetFlash 590W 8GB。

 当然のごとく、空っぽのTranscend JetFlash 590W 8GBにシステムを移行すべく、簡単に終えるつもりで作業を始めました。

 ところが、外付けHDDからLVMで切り出し、inactiveとなっているボリュームをActiveにする方法はあるも再起動するとinactiveに戻ってしまい、ラズパイのみ起動後、外付けHDDをONにしたり、更にいくつかの手順を手作業で実行しないといけない状況に。

 結果、Transcend JetFlash 590Wはラズパイには不向きな模様、他のUSBメモリを使うことで通常運用できるに至り、無事移行できたものの、USBメモリによって対処できたり、できなかったりしてハマったよという話。

手元に今USBメモリが3つある

 Raspberry Piのシステムパーティション用に当初、使っていたSiliconPower Ultima U02 32GB。

 ただ、できるだけ最小構成にするつもりでRasbian Lite(展開後1.4GB)、これに今回必要なものを入れてみても2GBちょいという状況から、これは持て余すし、他方、レスキュー用に使っていたLexar JumpDrive S50 8GB Orangeに容量不足を感じていたことから早々に入れ替えようと思っていたものの、時も過ぎた今、ようやく、やってみようという気になりました。

 当初、このLexar JumpDrive S50 8GBとSiliconPower Ultima U02 32GBを相互に入れ替えようと思ったものの、レスキュー用はSiliconPower Ultima U02 32GBに移行する一方、Lexar JumpDrive S50 8GBはラズパイ用の予備としてとっておくことにし、新たに選定、結果、8GBのUSBメモリTranscend JetFlash 590(白なので590W)を購入、これをラズパイのシステム用にしてみようと思うに至りました。(もちろん、これがハマる要因の1つとなるとは知る由もなく。)

rsyncで移行

 方法としては、単に既存のUltima U02 32GBからGPartedでext4でフォーマットしたTranscend JetFlash 590 8GBにrsync -aすることを想定し、あっさりすっきり簡単に終えるはずでした。

移行結果

 結論から言うと細工は必要だったものの、Lexar JumpDrive S50 8GBには移行でき、正常に起動、NASも円滑に機能させることができた一方、Transcend JetFlash 590 8GBでは、惜しくもできませんでした。。。というか、どうにかすれば、できるのかもしれませんが、断念しました。 

 ラズパイ購入当初に使ったSiliconPower Ultima U02 32GBは何の細工もなくあっさりできたのは、たまたまだったのか!?

 それとも最初に使うものには、すんなり馴染むようになっているのか???

 ちなみに全てUSB 2.0、実測はしていないが読み書き速度の差に起因するのか?メーカーの差?製品差?個体差?起動用にできるできないの向き不向きがあるのか?やはり速度差が濃厚か?

 今回、JumpDriveとJetFlashをラズパイのシステム用、バックアップ用とするつもりでいましたが、結果からするとラズパイのシステムバックアップ用USBメモリについては改めて調達しないと。。。

(別に普通に使う分には何の不都合もないJetFlashの使い道も考えたいところ。。。)

(と思ったら、JetFlash 590をUSBブートしたい場合、何に起因するのか不明もPCによって起動するものもあれば、起動しないものもあってPCを選ぶという側面も。。。USBブート可能だけどJetFlashからだとなぜか起動できないPC(BIOS)からは、PLoP Boot Managerの[USB]経由なら、起動する一方、レスキュー・検証用にいろいろ作業してブートローダではなく、複数ある任意のパーティションにddなどで書き込んだりしていると何かの拍子に起動できなかったBIOS(PC)から直接起動できるようになることもあったり。。。これがまた、BIOSから起動できない時は、HDDや他のUSBメモリにPLoP Boot Managerを入れておけば、そこからJetFlashをブートできますが、いざBIOSから起動できる状態になるとPLoPからは起動で着なくなる(これは、ある意味正常なこと?)。。。んー、だとするとラズパイでのJetFlashの症状は。。。BIOSでは認識される一方、その後、起動しようとするとPCによって認識されるのにかかる時間が違って間に合わず、存在しないとみなされるとか??!?)

 が、製品によるとなると実績のあるものが無難。。。ということになりがち。

 ただ、まったく同じものだと判別が。。。別物の方が見分けるのが容易。。。Ultima系か、JumpDrive系、2系統あるからまだいいか。

ハマった経緯

 さてハマった経緯。

 ラズパイのシステム用パーティションとしてext4でフォーマット済みのUSBメモリにrsync -aすれば事足りるはずでしたが、意外にも簡単にはいかず、しかもTranscend JetFlash 590とLexar JumpDrive S50では、同じく、うまくいかないにしても状況が微妙に異なりました。

 尚、ここで出てくる外付けHDDには、いくつかパーティションを切っており、その一部をNAS(ネットワーク越しのファイル共有サーバ)とすべく、LVMでボリュームを切り出しています。

症状

【ケース1】
  1.  /etc/fstabの論理ボリューム(LV)パス当該行を有効にしておく
  2.  ラズパイ+外付けHDDを同時に電源ONする

 Transcend JetFlash 590 8GB(このUSBメモリは平時:点灯、アクセス時:点滅)の場合、システムパーティション呼び出しはし、起動プロセスには入るようでアクセスランプが2〜3回点滅はするが、すぐに点灯となり、ラズパイが起動しないようでssh接続できない。

 Lexar JumpDrive S50 8GB(このUSBメモリは平時:消灯、アクセス時:点滅)の場合、正常時よりは若干短く、ラズパイは起動しないながらもアクセスランプの点滅回数は多い。

【ケース2】

 この時、/etc/fstabの当該行は有効にしたまま、外付けHDDの電源を入れずにラズパイのみ起動すると、それぞれ、相応にアクセスランプの点滅回数は増えるが、ラズパイは起動しないようでssh接続できない。

これは、アクセスランプの点滅数の極端なほどの違いはあれど、Transcend JetFlash 590 8GBもLexar JumpDrive S50 8GBも同様。

【ケース3】

 /etc/fstabの当該行をコメントアウトしておき、外付けHDDの電源を入れずにラズパイのみ起動すれば、sshアクセスも可能となる。

これもTranscend JetFlash 590 8GBもLexar JumpDrive S50 8GBも同様。

 尤もこのケース3では、ケース1・ケース2のエラー条件を回避している恰好となっている為、正常に起動するのは当然と言えば当然か。

 ケース2については、そもそも/etc/fstabに記載したデバイス(ここでは外付けHDD及びパーティション)が存在しないことに起因するエラーと考えてよさそう。

 だからといって、この場合、外付けHDDを同時起動するとケース1のようになる。。。

 同じ構成になっているはずの2つのUSBメモリ間で一方はそこそこ正常、他方が即停止しているとなるとUSBメモリの読み書き速度の違いなのか?ケース1で早い段階で停止するということは、Transcend JetFlash 590 8GBはSiliconPower Ultima U02 32GBと比べ、外付けHDDを認識するより早くLVMのボリュームにアクセスする為にケース1のような状態になるのか?

 そうだとしたら、前者が後者よりも読み書きが高速だからなのか?低速だからなのか?

 それとも読み書き速度とは無縁な原因があるのか?

 USB機器は、システム用USBメモリと外付けHDDだけだが、これらの間で外付けHDDが先に認識されたりする???ようなデバイスずれがあるのか?

デバイス名とUUID

$ sudo blkid /dev/sda1
...
$ sudo blkid /dev/XXX/YYY
...
$

 UUIDにすれば解消するのか?一方はシステムパーティションだから、どっちにしてもズレるわけないよね。。。

 でも、一応やってみる。

 これらの結果、表示されるUUIDを/etc/fstabに書く。

(後者だけだとダメだったが、前者も書くといけるか?と思ったが、それでもダメだった)

inactiveをActiveに

 更に調べを進めていくとlvscanやlvdisplayの結果表示上、inactiveになっている論理ボリュームをActiveにするコマンドとしてボリュームグループを有効にするvgchange -a y、論理ボリュームを有効にするlvchange -a yがあることがわかった(-aは共に--activateと等価)。

 今回の場合、物理ボリュームのある外付けHDDの電源が入った状態で実行すると何れも結果的に既存のLVMボリュームパス/dev/XXX/YYY、/dev/mapper/XXX-YYYも生成されました。

 手作業なら、こうすれば、とりあえず、期待する通りにはなるが。。。

  1. /etc/fstabの当該行をコメントアウト
  2. ラズパイのみ起動
  3. LVMとして割り当てていた外付けHDDの電源ON
  4. lvchange/vgchange -ayによるLVMマウントポイントの有効化
  5. /etc/fstabの当該行のコメントを外してsudo mount -a
    (か、手作業でマウント)

 Transcend JetFlash 590 8GBとLexar JumpDrive S50 8GBは、今のところ何れも外付けHDDを同時起動できないので/dev/sd?*といった物理ボリューム(PV/Phisical Volume)がなく、対応するボリュームグループ(VG/Volume Group)や論理ボリューム(LV/Logical Volume)も生成できない為、そのままだとvgchange -a y/lvchange -a yの実行結果を得ることはできませんでしたが、この状態でもラズパイ起動後は、外付けHDDの電源をONにしても大丈夫なので、そこで電源をONにすれば、実行結果を得ることができました。

 ラズパイと外付けHDDとを同時起動できない。。。ということは、vgchange -a y/lvchange -a yできていないことに起因するのか。。。そうだとすると外付けHDDの認識とこれらコマンドの実行におけるタイミングが合わないということか。。。?

 これと先のケース1を考え合わせるとLexar JumpDrive S50 8GBの場合、確かにLVMとして作成したPV(ここでは外付けHDDのパーティション)の接続の認識とvgchange/lvchange -ay やマウントのタイミングが合わず、エラーになっている可能性が高そう。。。

 しかし一方でTranscend JetFlash 590 8GBの場合は、停止するのが極めて早い段階であることから、シーケンシャル・ランダムの読み書きが超高速なのか?それにしても、そんなことがあり得るのかはわかりませんが、システムパーティションと外付けHDDのデバイス(/dev/以下の)割り当てで衝突・干渉でもしているとか?何らかの状況でカーネルパニックとなり、停止しているような気がしなくもありません。

xxx@raspberrypi $ pwd
/home/xxx
xxx@raspberrypi $ vi .VG_Activate
#!/bin/bash
# Activate Volumes
echo "Activating Volumes..."
sleep 15
vgchange -ay
mount -a
xxx@raspberrypi $ sudo chmod 755 ~/.VG_Activate
xxx@raspberrypi $ sudo crontab -e
...
@reboot /home/xxx/.VG_Activate &
xxx@raspberrypi $ sudo vi /etc/fstab
...
/dev/XXX/YYY /mnt/... ext4 ...
...
xxx@raspberrypi $

 タイミングが合っていない場合の対処法には、rc.localか、cronとして直接、もしくはスクリプトを書いてcronに登録するのが無難そう。

 当初、Transcend JetFlash 590 8GBでは、/etc/rc.localに書いてもsystemctl daemon-reloadしてもLVM Volumes inactive after rebootを参考にVG_Activateスクリプトをcron実行するのもダメでした。

 ただ、この後もハマりまくったし、/etc/rc.localでも同様に書けばうまくいくだろうとは思うものの、疲れ果てたので全ては検証していないのですが、結果からするとLexar JumpDrive S50 8GBについては、このようにcronに予め書いて実行権限を付与(755)したスクリプトを登録する方法でうまくいきました。

 参考にしたページでは、スクリプト内でvgchangeにsudoを付けたり、バックグラウンド起動(コマンド末尾に&を付与)したり、mount -aがなかったりしましたが、この後、sudoでrootのcronとして登録するのでスクリプト内にはsudoは不要、今回のケースでは?フォアグラウンド起動にしないと、また、mount -aもしておかないと、うまく機能させることができなかったので、このように書いています。

 その後、/etc/fstabでLVMボリュームのマウント行を有効にし、ラズパイをpoweroff、再度電源を入れた後は、正常にsshログインでき、機能するようになりました。

まだまだ更なる深みに。。。ハマってた

 とりあえず、成功例をかきましたが、そこに辿り着くまでには、まだまだ、もっともっとハマっていたのでした。

 Lexar JumpDrive S50 8GBは、外付けHDDやそのLVMボリュームとなるパーティションの認識やLVMとのタイミングの問題だとは思うが、Transcend JetFlash 590 8GBに関しては、vgchangeが間に合わないとか、早いとかいうよりもLVM以前に/dev/sd?*時点の外付けHDDの認識と割り当てに失敗しているようにも感じる。

 ということでTranscend JetFlash 590 8GBでさんざんやってみたことを当初から薄々感じつつ、やらずにいたものの、USBメモリによってはできるのかも?と改めてLexar JumpDrive S50 8GBを初期化、SiliconPower Ultima U02 32GBからrsync -aコピーして一通り試し、同じ数だけ失敗してみただけでも疲れた。。。が、結果これが功を奏すことになる。

 その後、losetup、kpartx、dmsetupコマンドなどの存在に気づき、いろいろやってみたが、少なくとも今回の場合、vgchangeすれば事足りるので、それらを敢えて使う必要はなかった。

 systemdで/dev/XXX/YYY(dev-XXX-YYY.device)が管理されてるじゃないか。。。よし、systemctl start dev-XXX-YYY.device。。。あれれ、enableできないな。。。RaspbianもJessieだからinitdじゃなくてsystemdだよな。。。

 そんなこんなしていた時、あ!スクリプト書くにしてもvgchange -ayだけじゃなくてmount -aもしなきゃダメじゃん!と気づくまでに時間がかかった。

 また、ふと試して時間こそそれほどかからなかったものの、理由は不明ながらスクリプト内のコマンドをフォアグラウンドで実行しないとうまくいかなかった。

 お!!!いけた!!!3日がかりだよ。。。

 なんでJetFlashだとダメなんだろ。。。っていうか、mount -aもすれば、JetFlashでもいけるか?

 やってみよう。。。

 やっぱりダメだ。。。sleepなしにもしてみたけどダメ。

 ここらで力尽きた。

Ultima U02 32GBとJetFlash 590 8GB

 気力が回復したら、先日、渋々ながらADSLから光にしたもののダウンロード・アップロード速度はかなり速くなったことだし、最新のディスクイメージを落としてUltima U02 32GBをレスキュー用に仕立てよう。

 と思いつつ、よく考えてみるとレスキュー用途で保存領域を作るにしても32GBって大きすぎる気もするが、まぁいいか。。。

 それよりも今回の想定にはそぐわず、結果的に要らなくなったJetFlash 590 8GBは何に使うか。。。とりあえず、Ultima U02に仕込む前にISOブートできてないインストーラやレスキューライブのディストロ検証に使おう。。。

ラズパイって起動後ほっとくとログインできなくなるっけ?ならないよね?

 Ultima U02 32GBは、まだ、そのままにしてあるものの、まだ試していませんが、ラズパイのシステム用をLexar JumpDrive S50 8GBに差し替えた後、気づいたのが、ラズパイを起動して忘れていたりで、しばらくログインしないで放置しておいたらsshログインできなくなること。(再起動して放置せずにログインすれば大丈夫。)

 ネットワークはつながっているのですが、これってラズパイとか外付けHDD(WD Elements Desktop 2TB)がスリープモードとかになってる?(後者は関係ないか。。。)それともそういうもの?

 そもそも忘れなければいいだけの話ですけど。

 と思ったら、元のSiliconPower Ultima U02 32GBでは、いくら時間をおいてもsshログインできました。。。

 なんでだ???sshログインするまでの間、時間をおいた場合、実は切断・接続を繰り返してて???Lexar JumpDrive 8GBは、最初だけcronでタイミング合わせただけだから???(何の根拠もない妄想)

 あれ?Lexar JumpDrive 8GBも最初の一度sshログインしてしまえば、あとは何度exitしても、exit後、いくら時間をおいてもsshログインできる。。。しかも当該マシンでも他のマシンでも。

 ということは、初回だけタイミングを合わせられず、cronでvgchange -ay、すぐにsshログインする分には正常に機能する一方、sshログインせずに一定時間経過するとタイミングが合わなくなる。。。定期的にvgchange -ayのcronを実行すればタイミングが合う?。。。と毎分実行するようcron登録してみても、やっぱりダメ。。。

 んーーー、USB???、奥が深い。。。のか???

 まぁ、どっちにしろ、忘れなければいいって話ですが。

[追記:2016/08/19]

 ここにきて1度めのラズパイ起動時は、sshアクセスに必ず失敗、電源を落とし、再度電源を入れると(2度めは)sshアクセスできるという状況に。

 先のスクリプトでsleep時間を変更してみたりしてsystemctl restart cronなどとしてみていますが、変わらず。。。

 あれからUltima U02 32GBも、もう既にインストーラ/アップデータ、一部CLIライブ版・レスキュー用(NetBSD/OpenBSD/FreeBSD、FreeDOS、Debian、SystemrescueCd、Clonezilla、GParted、PLoP Boot Manager...ちなみにFreeBSD以外はISOブート)として仕込んでしまった。。。

 常時起動しているわけではないからなんだけど、それでも起動し直さないといけないとなると、いろいろな面で好ましくないか。。。

 やっぱり、Ultima系の、サイズとしては4GBでも十分もコスパ的に8GBを買ってrsync -aするか。。。というか、系でもいいのか?U02じゃないとダメなのか。。。?相性の良かったUltima U02は、Type1らしく、これを含むSiliconPower Ultima U系は、既にType2が流通している模様、今後、Type 1がなくなる可能性を考えるとType 2か、その違いさえも同じ挙動とは限らないか?それならいっそ全く別のUSBメモリでもトライしてみるか。。。?

[追記:2016/09/15]

SiliconPower Ultima U02 16GB買って交換

Silicon Power Ultima U02 16GB SP016GBUF2U02V1K

 USBメモリだけ買うのも。。。と思いつつ、ようやくいろいろ出てきたため、図らずもラズパイと相性が良かったSilicon Power Ultima U02の16GBを予備含め、2個買ってみました。(昨日昼頃、通常配送で買ったら、またまた翌日の今日届いた。)

 ちょっと前まで8GBもあったのに当該製品自体の新製品もあり、USB 3.0/3.1製品がメインストリームとなりつつあってUSB 2.0のUltimaは、在庫処分中かつ、値崩れ真っ只中にあるのか、購入時点でAmazonには、既にUltima U02 8GBがなくなっており、16GBが800円弱(700円台)。。。ちょっとの間ラズパイに使っていたJumpDrive S50 Orange 8GB購入当時も確か800円程度だったから、安くなったもんだ。。。

 勘違いしてGPTにするならNetBSDのgptコマンドでやろっと。。。ext4フォーマットはできないから再起動してDebianで。。。途中、あ、ラズパイ別にGPTじゃなくてもよかったんだ。。。と気づくも、そのまま続行、JumpDrive S50 8GBとUltima U02 16GBをマウント、rsync -avでコピーしてラズパイのUSBポートに挿し、起動してみたところ、(USBメモリだからHDDのようにBIOSかUEFIを意識することもないのでFATを先頭に作ることなく、パーティションはext4を1つだけで)GPTでも、あっさり、ラズパイにssh接続できました。

 やっぱり、相性バッチリだな。。。Ultima U02。。。U02以外でも大丈夫なのかな?Series Ⅱでもいけるのかな?ラズパイが2.0だから無駄にオーバースペックで要らないけどUSB 3.0/3.1でもいけるのかな?なんて試してみる気は今のところないけど。。。

 予備に買ったU02は動作確認していないものの、大丈夫だとして、その予備すらダメになる頃には、既にUltima U02はないだろうから、その時、選定に悩むことになりそう。。。ただ、この状況が逆で最初に使ったUSBメモリでssh接続できたり、できなかったりしていたとしたらラズパイ自体、そんなもんかと思っていた可能性もあるので、そうなることもなく、良い勉強になって良かったです。

 ともあれ、これで当初の通り、なんの手間もなく、円滑にラズパイを運用することができるようになりました。

 ちなみにお役御免になったJumpDrive S50、外していたスライドカバーを付ける以前にUltima U02 16GBのカバーを付けてみたら、当たり前といえば当たり前もピッタリ。。。Orangeだかなんだかわからなくはなるものの、これでもいいか。

[追記:2017/01/15]

SiliconPower Ultima U02のRead/Writeの遅さが幸いした可能性が高い

 当初、ラズパイ用に購入し、相性ぴったりだったが容量が多すぎた32GBのSiliconPower Ultima U02や、ここで検証に使ったLexar JumpDrive S50は、現在、共にレスキューLive USBとして使っています。

 最近になって内蔵ディスク上のOS同様に使えるUSB用イメージを入れたUSBメモリ上のとあるOSでアプリのインストールなどを行なったところ、Lexar JumpDrive S50に比し、SiliconPower Ultima U02の方が、何をするにも、かなり遅く感じました(実際遅いはず、レスキューで使うことが多いISOイメージは、方法はどうあれメモリに読み込まれる為、基本USBメモリの読み書き速度は気にならず、気づかなかった)。

 しかし、かえって、それが幸いしているようで、ここで記したラズパイ及び外付けHDDの起動、LVMにおけるアクティベートの関係においては、読み書きの遅いUltima U02が合っていたということのようです。

 たぶんの域なので断定はできませんが、仮にそうだとすると、予備は買ってあり、当面は困らないものの、USB 2.0の製品間でもこれだから、USB 3.0/3.1...がこなれた上に2.0がレアになって入手できなくなったら。。。高速過ぎて、この使い方はできなくなる。。。良くてもログインが100発100中ではなくなり、すんなりスムースにはいかなくなるってこと。。。かも???