ラベル 構築ノウハウ の投稿を表示しています。 すべての投稿を表示
ラベル 構築ノウハウ の投稿を表示しています。 すべての投稿を表示

2026年5月19日火曜日

古い Proxmove VE 環境からVMをリカバリする

 古くなったSATA SSDが時々リブートで見えなくなったり、ついには稼働中にI/Oエラーを起こしたりするようになったので交換することにしました。


新しいSSDにProxmox VEをクリーンインストールした後、ダメモトで旧ドライブをUSBマスストレージコントローラ経由で接続したところ、認識成功。見えているうちにデータを復元することにします。

仮想マシンの定義ファイルは /etc/pve/ 以下にあるのだが

Proxmox VE の仮想マシン定義ファイルは /etc/pve/nodes/{hostname}/qemu-server/ 以下にテキストの定義ファイルとして置かれています。これをバックアップするため以下のコマンドを実行しました。

cd /mnt/oldroot
tar cvzf ~/old.etc.pve.tar.gz ./etc/pve
cd ~
tar xvzf old.etc.pve.tar.gz

そうするとあら不思議... 空のディレクトリが。/etc/pve は普通のディレクトリではなく、pmxcfs による分散設定ファイルシステムになっています。実体は /var/lib/pve-cluster/config.db に保存されていました。

ドライブが読めなくなる前にDBファイルを保存します。

cd /mnt/oldroot
tar cvzf ~/old.var.lib.pve-cluster.tar.gz ./var/lib/pve-cluster
cd ~
tar xvzf old.var.lib.pve-cluster.tar.gz

sqlite3で覗いてみます。

% sqlite3 config.db
SQLite version 3.51.0 2025-06-12 13:14:41
Enter ".help" for usage hints.
sqlite> select * from tree;
0|0|46624809|0|1777877202|8|__version__|

6|0|7|0|1682337809|8|datacenter.cfg|keyboard: en-us

8|0|8|0|1682337874|4|virtual-guest|
9|0|9|0|1682337875|4|priv|
11|0|11|0|1682337875|4|nodes|
12|11|12|0|1682337875|4|pve|
13|12|13|0|1682337875|4|lxc|
14|12|14|0|1682337875|4|qemu-server|
15|12|15|0|1682337875|4|openvz|
16|12|16|0|1682337875|4|priv|
17|9|17|0|1682337875|4|lock|
24|0|25|0|1682337875|8|pve-www.key|-----BEGIN RSA PRIVATE KEY-----
...

なるほど、6つ目のフィールドがファイル名で、7つ目のフィールドにファイルコンテンツがあるだけの模様。ただ手作業でファイルをひとつひとつリカバリするのも面倒です。


opencode + Local LLM で DB 構造を解析させリカバリプログラムを書かせる

もう、やることが決まってしまった作業は退屈なだけです。

これぐらいのタスクなら軽量の Local LLM でも十分こなせます。外部のAPIサービスに投げない理由は、DBのなかにシークレットなどの情報が混ざっているかもしれないので、手許で推論します。

Mac に先の sqlite3 データベースをコピー、また適当に python venv を用意して、opencode を起動。プロンプトしました。推論にはローカル LM Studio で動く Qwen 3.6 35B-A3B を使用しました。

you will find config.db file which is in sqlite3 format. inspect its "tree" table and build a python script that recover files in the database. use venv/bin/python


呼吸していたら、動く recover.py が出てきました。(大したものでもないですが gist においておきます

このスクリプトを実行したら確かに DB 内のファイルが recovered/ サブディレクトリに階層構造つきで書き出されました。

% find recovered 
recovered
recovered/mapping
recovered/mapping/directory.cfg
recovered/authkey.pub
recovered/pve-www.key
recovered/sdn
recovered/nodes
recovered/nodes/pve
recovered/nodes/pve/pve-ssl.pem
recovered/nodes/pve/ssh_known_hosts
recovered/nodes/pve/openvz
recovered/nodes/pve/pve-ssl.key
recovered/nodes/pve/lxc
recovered/nodes/pve/qemu-server
recovered/nodes/pve/qemu-server/237.conf
recovered/nodes/pve/qemu-server/104.conf
recovered/nodes/pve/qemu-server/105.conf
recovered/nodes/pve/qemu-server/200.conf
recovered/nodes/pve/qemu-server/102.conf
recovered/nodes/pve/qemu-server/231.conf
recovered/nodes/pve/qemu-server/103.conf
recovered/nodes/pve/qemu-server/100.conf
recovered/nodes/pve/qemu-server/249.conf
recovered/nodes/pve/qemu-server/232.conf
recovered/nodes/pve/qemu-server/245.conf
recovered/nodes/pve/qemu-server/101.conf
recovered/nodes/pve/qemu-server/235.conf
...


VM定義ファイルを新環境に展開

経験上、これで qemu-server/XXX.conf ファイルを書き込んであげればVMが出てくるのを知っています。

% cd recovered/nodes/pve/qemu-server/
% scp * "root@{PVE}:/etc/pve/nodes/pve/qemu-server/"
root@{PVE}'s password: 100.conf 100% 537 113.0KB/s 00:00 101.conf 100% 421 110.6KB/s 00:00 102.conf 100% 575 129.4KB/s 00:00 103.conf 100% 417 84.1KB/s 00:00 104.conf 100% 462 102.1KB/s 00:00 105.conf 100% 462 99.0KB/s 00:00 106.conf 100% 485 103.6KB/s 00:00 200.conf 100% 253 54.6KB/s 00:00 ... 

qemu-server/XXX.conf が復元できれば、Proxmox VE は VM を再認識します。

Proxmox VE のコンソールを確認したところ、仮想マシンがホスト上に表示されるようになりました。


NVMeドライブ上のLVMプールを新環境に追加

仮想マシンのディスク本体は起動ドライブとは別の NVMe ドライブにあるので無事です。ただし、VM定義だけではディスク実体にアクセスできないため、NVMe上のLVM Volume Groupを新しい PVE 環境へ再登録します。

root@pve:~# pvesm add lvm NVMe1_ZP4000GM30023_SERIAL123 --vgname NVMe1_ZP4000GM30023_SERIAL123 \ --content images


ネットワーク設定も単純だったこともあり、過去のドライブ上のISOメディアやUSBデバイスの接続など、イレギュラーな設定が入っているものをのぞけば、これでVMが起動できるところまで復元できました。


古いドライブからVMを救出する場合

古いドライブの LVM に VM がある場合は、VMイメージもリカバリしたくなるかもしれません。Proxmox VE は qm コマンドで VM をオンラインでマイグレーションさせられるので、以下の手順でできそうです。
  • 古いドライブを pvesm add lvm コマンドにて新しい名前で登録
    (デフォルトの LVM 名がコンフリクトする)
  • sed などで VM定義のなかのディスクイメージのプール名を編集
  • qm move_disk で新しいドライブへマイグレーションさせる

今回はこのニーズがないため、この記事では扱いません。


まとめ

Proxmox VE の仮想マシンデータのリカバリを、面倒くさい部分は生成AIで自動化して済ませました。仮想ディスク本体が別ストレージに残っている場合、VM定義ファイルを DB から抜き出してしまえば優勝です。

手間のかかる部分をスクリプト生成・実行で済ませたので何も困ることはありませんでしたが、復元作業よりも、このエントリを書くことのほうに時間がかかりました。

次の投稿ネタまでに、作業記録の記事化をどう自動化するかを考えたほうがいいのかもしれません。

2026年4月29日水曜日

Proxmox VEを7.xから9.xへアップデート

 インストール後に割と放置していた Proxmox をアップデートしました。


作業ログをとらずにまとめてやってしまったので具体的なコマンドラインや出力は記載しませんが、おおよその手順としては、下記の手順になります。

  • Proxmove VE 7.x を最新バージョンまでアップデート
    • apt update
    • apt dist-upgrade
  • PVE 7 -> 8 のアップデート検証、アップデート
    • pve7to8 コマンドを実行しアップデート事前検証
      • すでに zfs destroy したプールが見つからない警告が出たので、ここで削除しておく
      • DKMS でインストール済みだった iomemory-vsl について警告が出ていたので、 DKMS を外しておく
      • 推奨に従い VM を停止
    • sed -i 's/bullseye/bookworm/g' /etc/apt/sources.list
    • apt update
    • apt dist-upgrade
    • 新しい kernel もあるため一度再起動、 VMが起動することまで確認しておく
  • PVE 8->9 のアップデート検証
    • pve8to9 コマンドを実行しアップデート事前検証
      • ブートディスク容量不足の警告が出たため ISO イメージを整理
      • 推奨に従い VM を停止
    • sed -i 's/bookworm/trixie/g' /etc/apt/sources.list
    • apt update
    • apt dist-upgrade
    • 再起動、 VMが起動することまで確認

その他考慮したポイントなど
  •  PVE 9.x へのアップデートにあたり多少 grub.cfg が変化しているようで。iommu 関連で GRUB の設定を書き換えていましたが、メンテナ版を受け入れ、個別の修正は改めて適用。
  • smb.conf は現行バージョンを採用。
  • AMD 向けマイクロコードのパッケージなどが表示された案内通りにはインストールできていないが、とりあえずそのままで。
  • GRUB の際インストールを促されたが、案内通りにはうまく進まなかったので、とりあえずそのままで。 boot してるから、まあいいでしょう
  • 当初はクリーンインストールになるのかなと思いながら、手順どおり /etc 以下や /var/lib/ の下などをバックアップしてまわろうと思い作業してましたが、 apt dist-upgrade の手順が出てきた段階で「まあなんとかなるだろう」と思い始めて、そのまま上書きしてしまいました。 Proxmox VE のブートドライブ (SATA 128GB), メインの仮想マシンプール(NVMe 4TB), ストレージアレイ(10TB x5) が別れていたので、失敗してもなんとかなるだろうと思ったのもあります。痛い目に遭いたくなければ、バックアップぐらいは取っておきましょう 

参考にしたURL

  • https://pve.proxmox.com/wiki/Upgrade_from_7_to_8
  • https://pve.proxmox.com/wiki/Upgrade_from_8_to_9


2016年6月15日水曜日

ルータがPPPoEで取得しているIPアドレスが変わったらRoute 53のレコードを更新するスクリプト

リモートから自宅のネットワークに接続できるようにしている方も多いと思いますが、ウチも出先からリモートアクセスしたりしています。

これまで外部の Dynamic DNS サービスに頼っていたのですが、利用していたサービスに変更があったのをきっかけに自前の仕組みに置き換えました。今回は、その仕組みについて紹介します。

私の自宅では RTX1100 が上流ネットワークとの PPPoE 接続を行っており、 pp 1 インターフェイスが外側のアドレスを持っています。このインターフェイスのアドレスを、自分が Amazon Web Services の Route 53 上で管理するゾーンのAレコードとして登録します。

ちょっと面倒だったのが RTX1100 の外側 IP アドレスの取得をどうするか、です。最初は 「SNMP クライアントでつっつけば出てくるじゃろ?」と適当に snmpwalk してみたのですが、よくわからなかったので、結局 telnet で調べるローテクで実装しています。

使っているコードのうち自宅依存部分を取り除いたものを https://github.com/hasegaw/route53update に Push してあります。


この中には3つのファイルが含まれています。

  • rtx1x00_show_status_pp_1.exp …… RTX1100 と telnet して IP アドレスを取得する
  • route53update.py …… 取得したアドレスを R53 に反映する
  • run.sh …… 実行方法

rtx1x00_show_status_pp_1.exp

RTX1100 に telnet して IP アドレスを取得します。このスクリプトは実際には RTX1100 と通信して、その内容を標準出力に書き出すまでです。実行には expect が必要です。引数としてホスト名とパスワードをとります。



route53update.py

上記 Except スクリプトを実行し、ルータからの出力を実際にパースし、 Route 53 のレコード内容と比較してみて、必要なら反映するのがこちらのスクリプトです。ファイル内にいくつか設定項目があります。(レコード名、 ゾーン名、ルータのホスト名とパスワードなど)
おまけで Slack にも対応しています。


 run.sh

route53update.py を実行する方法の例です。 AWS の API キーを設定しスクリプトを叩いています。手元ではこのスクリプトを cron に仕掛けています。


定期的にこのしくみが実行されることにより、Route 53 上の A レコードが常に自宅のルータに向くようになります。また、 Slack に新しい IP アドレスが通知されるため、ネットワークの不調に気づきやすかったり、などのメリットがあるかもしれません。

2015年12月10日木曜日

おうちハックで戦った話

この記事は おうちハック Advent Calendar の 10 日目の記事です。

前日の記事: Extreme Home Hackレポート
翌日の記事:メインブレーカーが落ちる前にドライヤーを止める

なんか面白そうなので参戦してしまいました。私は玄関ドアにネットワークカメラを設置したことがあるので、そのときの話を紹介したいと思います。


すべてのはじまり



隣人から、わたしの在宅、不在に関わらず「私の騒音がうるさい」というクレームがくるようになったのです。このクレームの一週間後、私は当時の勤務先の本社があるソルトレイクシティに出張する予定でした。このため、私が海外出張中でも物音がするのかを確認するため、急遽 Web カメラでインターホンの動体検出・録画を仕掛けました。


玄関カメラ1号


玄関のインターホンはカメラ付きで、誰かがインターホンを押せば、その瞬間に液晶画面に玄関前の映像が映ります。このため、インターホン設備の前にWebカメラを置き、MacBookに接続して、動体を検出したら自動的に録画するソフトウェアを見つけてきて仕込みました。

 
帰宅した自分自身も記録されています。

ここで使用したソフトウェアは、 YYYYMMDD_HHMMSS形式でJPEGファイルとして動体のフレームを保存します。このため、ファイルが保存されれば、いつ、誰が自宅のインターホンを押したかが記録できるわけです。

このソフトウェアの画像ファイル保存先を Dropbox に設定することで、私がアメリカ(現地時間の日中は、クレームがくる可能性がある夜間や朝)に滞在しているとき、手元の Dropbox ディレクトリ内に新しい画像ファイルが同期されてきて、リアルタイムに気づけることになります。

ついに隣人が私の家のインターホンを押しました。私は Snowbird というゲレンデで同僚とスノーボードを楽しんでいるのに、です。



これで私の無実は証明できました。しかし。しかしです。

3月3日 午前6時37分。当たり前ながら(?)私は寝ていました。そうすると突然インターホンが鳴り、いったい誰がきたのかと思ったら、例の隣人が「出てこい!」と切れています。何かが玄関ドアに対して当たる音がしました。きっとドアを殴ったか、蹴ったかのどちらかでしょう。びっくりしていると私の家の前から消えてしまったのですが、追いかけて事情をきくと、昨夜 23時〜0時にかけて物音がした事についてのクレームでした。

3月17日 午後10時30分。また下の階の住民が訪ねてきて、騒音がうるさい!とのクレーム。そのときは、まだ発売されたばかりの「シムシティ」を楽しくプレイしていた最中で、ゲームからショベルカーで建物をスクラップしたときのドーン音ぐらいしか発生させていませんが、それが下の階に届くことは考えづらいですし、自分自身はソファに座ってキーボードやマウスを操作しているのですから、騒音のたちようがありません。

どうにもならないので大家、不動産会社経由で管理会社に「隣人が騒音に苦しんでいるので助けてあげてほしい」と連絡をしました。これまでの経緯もあわせて、です。海外出張中の深夜に隣人が訪ねてきた記録が残っていることも話しました。


玄関カメラ1号、破れる


すると隣人のクレームがエスカレートしてきました。

 

3月23日 21時54分、インターホンのカメラ部分に手を当てて自分の姿を隠しながらドアを喚いたりドアを蹴ったりしています。どうやら記録の件が管理会社経由で伝わって気分を害したようです。仕方ないのでまた管理会社に連絡です。

管理会社に対応をお願いしつつ、私はインターホンのカメラシステムをアップグレードする必要性を感じていました。理由は:
  • 就寝中(午前2時〜4時)の訪問を繰り返されて、インターホンが鳴ったかどうかも正常に判断できなくなっており、客観的な記録はとり続ける必要があった
  • 先述の理由でインターホンのモニタ前にカメラを仕掛けても目的の画像が記録できなくなっていた
  • 在宅、不在にかかわらず隣人が自区画に近づいたかはログしておきたかった(訪問のほか、嫌がらせなどがあった場合の記録は残しておきたい)

玄関カメラ2号、爆誕


そんな時、秋葉原で在庫放出品と思われるネットワークカメラ PLANEX CS-W05NM があったので、買いました。


こちらは無線 LAN モデルになっており、 Web ブラウザからカメラのリアルタイムモニタリングをしたり、動体検出 SD カードや SMB/FTP によるリモートへの録画などが可能です。

早速、玄関ドアの覗き穴部分に取り付けました。築40年越えの分譲マンションのドアですが、ホームセンターで購入した玄関用覗き穴パーツ、木の板、ボルトなどをつかってマウントを自作します。賃貸契約ですし、オリジナルの部品は退去時に原状復帰できるようにすべてそのまま保管してありました。


しかし、新たな問題が発生しました。覗き穴経由の像は有効画素数の一部にしか映っておらず、結果としてネットワークカメラがもつ動体検出機能が動作しませんでした。動体検出の閾値は調整できそうにありません。


玄関カメラ2号のソフトウェア開発


仕方なく何か手段がないか探っていると、 設定次第では、ネットワークカメラに HTTP リクエストを送ると、Motion JPEG 形式でストリーミングが受けられることに気づきました。 Motion JPEG はいわば JPEG 画像のパラパラまんがですので、これをプログラムでバッファに書き出せば画像をリアルタイムで受信できるわけです。ネットを探検していたらサンプルコードを見つけたので Python で実装しなおし、二枚の画像を Numpy で引き算し差分を求めれば、画像の変化がわかるので、ニーズにあわせた動体検出&録画プログラムを書くことにします。

と、いうわけで。 Python と OpenCV を Hello world する日がきました。 Motion JPEG ストリームから JPEG データを抜き出し、 OpenCV を使って画像データ(Numpy)の配列に変換します。

あとは、すこし時間差がある画像2枚の差の絶対値をとれば、画像のなかで変化が大きいところが浮かびあがってきます。

この考え方をベースに、
  • Python で Motion JPEG のストリームを受信
  • 過去何十フレーム程度の履歴を常に保持
  • 過去のフレームと最新のフレームの差(=画像の変化)を調べる
  • 画像に変化がしばらく続いた場合に、バッファに残っているフレームから、画像の変化がなくなってしばらくするまでをひとつのMJPEGファイルとして保存
  • 検出開始した場合は Growl で手元の端末に通知
実際には蛍光灯のフリッカー、きまった時間に点灯/消灯する階段照明、カメラ自体のオートコントラスト/ゲイン機能などによる一時的な画面変化などを無視する処理もしています。

このソフトウェアが生成したビデオファイルの例を示します。

この仕組みにより、自宅の玄関に隣人が迫ってくる段階から記録を残すことができるようになりました。


玄関カメラ2号の運用結果


この仕組みでは、玄関の前を通った人たちも記録されてしまいます。見られていると思ったら周りの人々も気持ち悪いでしょうし、私自身も興味ない上に見ていてあまり気分のよいものではないので、目的の人物でなければ見なかったことにして忘れてファイルも消去です。そのほかにカメラを映りこんだ人を見てみると、
  • 表札をチェックしていく謎の男性 (地図屋?そのほかの調査?)
  • なぜか不在中に来訪した女性(たぶん宗教の勧誘とか)
  • 宅配便のスタッフ(チャイムを鳴らしながら電気メーターのまわり具合をみて在宅かどうかを見極めようとする人が多い)
などが見えてきて、いろいろと参考になりました。そして、ゴールデンウイーク。問題の隣人が夜に訪ねてきたビデオがついに記録されました。
問題の隣人が夜に訪ねてきたタイミング、および日中に手紙を玄関ポストへ投入する姿が覗き穴から確認できました。もちろんドアに近づくどころか階段を昇ってくる瞬間から動画として記録していますので、仮面ライダーのコスプレでもしていなければ誰であるかもよく判ります。

幸い、このタイミングで管理会社に改めて連絡をしてからは、隣人からクレームがくることはなくなりました。その後もしばらくこのシステムを稼働していましたが、さらに半年した時点でシステムを停止しました。今年にはいってからマンションの大規模修繕があり、玄関ドアごと付け替えになったので、先のネットワークカメラも今はありません。


関連するハック


このカメラですが、連続稼働していると突然通信できなくなることがあり、そのためにワッチドッグタイマーでリセットすることを考えて Eject-io というデバイスを開発していました。 Eject-io は カーネル/VM探検隊の Advent Calendar 2013 で紹介しましたので、そちらをご確認ください。
実際には Eject-io を使わずにタイマーを使って6時間ごとにネットワークカメラを起動しなおす運用を続け、それで目的が達成できてしまったので、 Eject-io は使いませんでした。


また、のちにスプラトゥーンの画面解析ツール IkaLog を作る際にはこの時の Python + OpenCV の経験が役に立ちました。

おわりに

ちょっとした手段で記録を残しても、いわゆるキ○ガイが静かになるかどうかは別の話だなあ、と思いました。

今回、私のケースは半年程度でに落ち着いたので(たぶん)よいのですが、火のついたマッチを玄関ドアの郵便受けに突っ込まれたり、その前に灯油がガソリンなどまかれたりしたら恐ろしいことになりますし、上の階に住んでいる子供達が心配です。

そういう自体を想定して火災アラームの増設などは行っていましたが、そもそも午前2時〜4時に度々チャイムを鳴らされて起こされていると、寝ている途中でふと「チャイムが鳴った気がして目が覚めたり、でも鳴っていなかったり、鳴ったのか鳴っていないのか判らなかったりしてきて、認識に異常をきたします。正直なところ、そもそも、そんな心配がないところに移ったほうがいい、と思っています。

おうちハック自体ではキ○ガイは居なくなりません。皆さん、お気を付けください。

おうちハック Advent Calendar の 10 日目
前日の記事: Extreme Home Hackレポート
翌日の記事:メインブレーカーが落ちる前にドライヤーを止める


2015年8月24日月曜日

FreeNX で新規セッション生成時の不具合を解消する

いまごろ FreeNX 使っているところはそう多くないだろうし、完全に手元のメモだけど。


nx ユーザとしての localhost SSH 接続時にホスト鍵が一致しない場合の問題


FreeNX の認証方法にもよるが SSH 認証を使う場合、一度 NX ユーザとしてログインし、その NX ユーザから実際のユーザ権限で目的のサーバ(localhostかもしれない)に対して SSH ログインする仕組みになっている。

OS のイメージをコピーしたりする際、 ~nx/.ssh/known_hosts に localhost の鍵が含まれている。このため、 同ファイル中の「localhostの鍵」と/etc/ssh/の下にあるホスト鍵が一致しなくなると認証エラーとなりログインできない。うっかり設定をコピー展開したりSSH鍵を作り直したり、イメージを作成して展開した場合に嵌まる。

 対策としては ~nx/.ssh/known_hosts を消す。(と現行の鍵が勝手に書き直される)

 X ディスプレイのロックファイルが蒸発した場合に、新規セッションのディスプレイIDが既存セッションと衝突する


該当箇所は /usr/bin/nxserver のココ


FreeNX や X Window System の何かが /tmp/ 以下にロックファイルを作っている。 FreeNX の新規セッション作成時は、これらのファイルからディスプレイ番号の利用状況を判断して新しいディスプレイIDを割り当てる。

たとえば nxserver --list コマンドで下記のセッションがあるとして

127.0.0.1    1005    hasegaw    192.168.x.x    23BC130AD583AD79F715814CE73972B5

以下のロックファイルがひとつも見つからないと、NX Clientから接続された FreeNX は、重複したディスプレイ番号をセッションに割り当てようとして突然死し、ユーザから見ると何もわからない状況になる。
  • /tmp/.X1000-lock
  • /tmp/.nX1000-lock
  • /tmp/X11-unix/X1000
対策として、下記のワンライナーで、 nxserver --list の結果から、足りないロックファイルを生成するシェルスクリプトを生成させてシェルに流し込む。ひどいけど動いてる。


本当は nxserver を直さないとダメかと思ったけど、RPMから導入してるものをいじらずに対策できてよかった。っていうか自分でディスプレイ番号わかってるのに重複割り当てするとか情けない。。。。

おもうこと


Linux 向けのリモートデスクトップ環境として FreeNX(や X2GO)は割と快適なんだけど、いろいろ罠があってつらい。もっと鉄板なソリューションはないものか。。。

2014年3月27日木曜日

xlogdump を PostgreSQL 9.2 RPM に対してコンパイル

PostgreSQL本家がリリースしている CentOS6 向け PostgreSQL 9.2 向けに xlogdump をビルドしようと思ったけど libpgport が無い、と言われてしまった。 LIBRARY_PATH を追加で設定して回避。




お libpgport は postgresql92-devel パッケージ内に含まれていた。 Google で過去ケースを調べた感じ、 Linux ディストリビューションによっては
libpgport をビルドしていないケースがあるようだが、さすがに PostgreSQL 本家の RPM には入ってたね。

2014年3月25日火曜日

Gfarm 2.5.8.5 メタデータサーバ with PostgreSQL 9.3

CentOS 6 上に Gfarm 2.5.8.5 のメタデータサーバを構築しようとした際、 PostgreSQL 本家のPostgreSQL 9.3 RPM 群を組み合わせたらいくつかハマりどころがあった。


  • Gfarm2 の configure 時に --with-postgresql=/usr/pgsql-9.3/ を指定しないと PostgreSQL ベースのバックエンドがビルドされない


  • Gfarm2 の config-gfarm が生成する postgresql.conf を PostgreSQL 9.3 でロードできない。unix_socket_directory が unix_socket_directories にリネームされたため。(テロ!)


後者の問題はインストール済みの Gfarm2 の構成ファイルを書き換えて対処した。


wget http://jaist.dl.sourceforge.net/project/gfarm/gfarm_v2/2.5.8.5/gfarm-2.5.8.5.tar.gz
yum install "Development Tools"
yum install postgresql93-server postgresql93-contrib
rpm -ivh http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-centos93-9.3-1.noarch.rpm
yum install postgresql93-server postgresql93-contrib
yum install openssl-devel
yum install postgresql93-devel.x86_64
yum install gcc
useradd -c "Gfarm gfsd" -m _gfarmfs
./configure --with-postgresql=/usr/pgsql-9.3/
make clean ; make; make install
sed -i  's/unix_socket_directory/unix_socket_directories/g' /var/gfarm-pgsql/postgresql.conf
config-gfarm -A admin -h vm152


2013年12月24日火曜日

次世代I/Oインターフェイス「Eject-io」



おーい、ておくれのみんな、聞こえてるか?
最近IT業界は元気ないって?

単価がヤスイ、仕事がオワラナイ、

イマイチなニュースばかりだもんな!

でもクヨクヨしててもしょうがないだろ?


いまはローレイヤー弄って遊ぶのさ!

カーネル/VM探検隊から、みんなのテンションアガりまくる

最高にホットなAdvent Calendarエントリだ!

「次世代GPIOインターフェイスの製作」

ておくれろ、エンジニアよ

ておくれ狂っちまえよ!


今年もカーネル/VM Advent Calendarの時期がやってきました。というわけで、この記事は2013年のカーネル/VM Advent Calendar の12/24の記事でーす。恥ずかしながら最近はそれほどローレイヤいじってないので、記事のネタ用に下記の真新しい何かを製作しました。

■ 次世代I/Oインターフェイスの検討経緯

ところで皆さん Ejectコマンドユーザー会ってご存じですかね。OSからejectコマンド一発でCD-ROMドライブのアクチュエータ動かして動物に餌やったり ボタンを操作したり 鐘をついたりするアレです。




最近は「シンプルに動く物を作れる新たな取り組み(でもあたまおかしい)」とRaspberry Pi本家で何度も取り上げられるほどに盛り上がりが続いているテクノロジーで、今年は Advent Calendar も走っています。

Ejectのよいところは、 た ぶ ん 利用するOS上で特定のドライバやインターフェイスに依存せず、今時ならUSBなどでカジュアルにデバイスを接続でき、さらに制御コマンドがOSに最初からついている点にあります。 Raspberry Pi でも Linux で USB スタックが動いているし GPIO があるじゃないと言っても、GPIO がついてないような Windows/Linux/MacOS X マシンなどへも簡単に移植できてしまうという CD-ROM ならではのスゴさがあります。

ただ Eject コマンドを実装したヘルメットはけっこう重いらしく頭おかしく見えてしまうという欠点もあります。CD-ROMドライブは12V電源供給が必要なため単三電池を大量に積んでおり、それだけでも相当な重さに見えます。



ごくごく一般的な Eject おじさん(写真はヘルメット実装前)
RPi blog より拾ってきました


そこで、Ejectの流れに一石を投じてこの @Akkiesoft モテモテな状況を打破するべく、 (☝ ՞ਊ ՞)☝ウイーン に代わる次世代のI/Oインターフェイスを検討/製作することにしました。

3年前に一度USB HIDクラスのデバイスはPIC18F2550で実装したことがあるので、それを久々に引っ張りだしてきました。PIC向けのUSBスタックは Microchip Libraries for Applications に様々な材料があるので、この中のUSBデバイスサンプルをベースに USB 経由にて GPIO ライクな操作が可能なデバイスを製作することにします。

■ day 1 - December 21, Saturday

PICマイコンの選定

MSL の USB Device - Mass Storage - Intl Flash ライブラリ(PIC内のフラッシュメモリを使ったUSB Mass Storageデバイスのサンプル)をコンパイルしてみたところ、メモリ消費量が2000バイトと余裕で超えることに気づきました。残念ながら引っ張り出してきたPIC18F2550のメモリサイズに収まらないようなので、あきらめて上位モデルのPICを購入することにします。

探してみた結果、PIC18F25J50なら問題なさそうで、秋月電子でカジュアルに手に入りそうだという結論に到りました。メモリ量が倍増しているのでUSB Mass Storageサンプルの苦労せずに載りそうですし、USB 2.0も喋れるようです。PIC18F2550の時はUSBを利用する際に外部からクロックを供給する必要がありましたが、PIC18F25J50はMPU内の内蔵クロックだけでUSBも利用できるそうで大変お手軽です!一点玉にキズなのは、駆動電圧が5V→3.3VとなりUSBのバスパワーを使うならレギュレータを通す必要がありそうです。

プロトコルの勉強、というかスニファの準備

既存のUSBプロトコルの通信内容をモニタリングして参考にしたかったので、以下のふたつの方法のスニファを準備しました。


  • 手許の VMware Fusion で Windows 7 仮想マシンの USB プロトコルロギングを有効化、 tail -f vmware.log しておく。1KB/分 までなら問題なく sniff できますが、これを超えるスレッショルドがかかるのが難点です。

  • Windows 7 VM と Windows 7 実機に USBPcapWireshark をインストール。 USBPcapCMD.EXEを実行して sniff 対象の USB ハブを指定すると tcpdump のごとく生ファイルに生データをダンプしてくれます。 Wireshark はこのダンプデータの表示に使います

これらの手段があれば、とりあえずUSBプロトコルで何がおきてるか等は追跡できそうです。

仕事納めした金曜日の夜にここまでの感触を掴んだ私は、土曜日に秋葉原へと繰り出したのでした。


  • PIC18F25J50

  • I-00534 低損失三端子レギュレータ TA48033S \100

ほかにブレットボードやジャンパなどを購入していますが忘れた。申し訳ねぇ申し訳ねぇ

秋葉原から帰る前に、はんだづけカフェに一時間ちょっと寄って、ブレットボードの上でPIC18F25J50がPICKit2に認識されるところまで組みました。



帰宅後、USB Mass StorageのサンプルをPIC上にロードして実効してみるも「不明なデバイス」としてしか表示されません。こまった。でも眠いのでまた明日。


■ day2  - December 22, Sunday

このまま動かなかったらどうしよう、Advent Calendar向けに違うネタ準備しないとダメかもという脅迫観念に追われながら試行錯誤。

配線上の問題などを潰した結果、ちゃんとデバイスが認識されるようになりました。

サンプルのmain.cにある#pragmaのリストをレビュー。内蔵クロックでUSBが駆動できる設定に見直し



REQUEST SENSEでされたらメディア状態にかかわらずとりあえず PASSED を返してみる(usb_function_msd.c)



READ CAPACITYの値をハードコードする(usb_function_msd.c)



MODE SENSEも(usb_function_msd.c)



ResetSenseData()関数でそれっぽい返事を返す(usb_function_msd.c)

INQUIRY のレスポンスを調整(main.c)



よしよし、意図どおり認識されるようになりました。では今日はランニングに行かないといけないのでまた明日。


■ day3  - December 23, Sunday

イベント発生時のコードを追加。トレイが操作されたらRA0 LEDをチカチカさせて、RA1/RA2 LEDをトグルさせる(usb_function_msd.c)



実際には細かい変更をもっといれてたりしますが、だいたいこんな感じですね。

最初はLEDひとつでテストしていたので、その時のビデオをご覧ください。


よし、とりあえず完成です。しかし、しかし何かを忘れていますね?

そう、 これだけではいけません。イベントがトリガされた結果何か有益な結果を得ることが重要なのです。ただ単に LED が反応するだけでは片手落ちで、仮にEjectの貴公子から「目的と手段が入れ替わっている」などと苦言を呈されても仕方がないでしょう。というわけで何かのアウトプットを作ることにします。


秋月にPICを買いに行ったときにアッ、これもっと思って買ってきたキットです。ふふふ、まさかこんなに早く出番がくるとはね。こういうキット組み立てるのって小学生か、中学生かぶりですね。たぶん。手順書も親切だったし、がんがんハンダ付けして通電したら一発で動いてくれました。

これをどうやって制御するかですが、、、いやー、キットってやさしいですね。付属されていた回路図によると START/STOP のジャンパーピンは、ジャンパーしていない状態だと入力に電圧がかかっているようです。で、ジャンパーをつなぐとGNDに落ちて電圧が0Vになるんですかね。

ためしにジャンパーピンを一本GNDに落としてみると、たしかに音が鳴ったり止まったりします。


ここでどうするかちょっと悩んだんだけど、電気工作が判らない私としてはトランジスタやリレーを挟むことを考えたけど、PIC18F25J50のデジタル出力ピンから3.3V?が出ていて、しかもこのキット回路も同じ電源を利用しているので、18F25J50側のデジタル出力を直接つないで1/0切り替えればいいんじゃね?と思って試してみたらうまくいったので、それで対応することにします。抵抗とか挟まないといけないんですかね。私にはわかりませんが今晩動いているのでヨシとします。

大変"実用的"となった次世代デバイス Eject-io の全容をご覧下さい。

とりあえずOKそうです。では今日は神田にお買い物にいくのでまた明日。


■ day4  - December 24, Sunday

さて、ここまでの作業は全て Windows の USB スタック相手にやってきたので他のホストともきちんと接続できるか確認する必要があると言っても過言ではありません。試してみたところ Linux でも(多少エラーは出てますが)次世代I/Oが可能なことが確認できました。MacOS XのUSBスタックはちょっとチェックがキビシイようで、もう少しファームウェアそれっぽく書かないとダメなようです。Advent Calendarの当番が12/24でありながら実際に作業にとりかかったのが4日前の夜だったのでさすがにキレイにデバッグしきるまでには到りませんでした。許してください。

また、エネループから電源供給されたRaspberry Piのバスパワーで本デバイスが動作することも確認できました。USBスタックもLinuxベースなので動作上問題なさそうです。

がんばってビデオを撮影しましたのでご鑑賞いただければと。

Windows 7 での動作チェック


CentOS 6.2 の仮想マシン (VMware Fusion 上)での動作チェック


Raspberry Pi + Eject-io で軽量化された Eject ヘルメット


これなら無駄に大きな5インチCD-ROMやバッテリがなくても機器の制御ができるのでヘルメットが軽くなるし、あと12Vのバッテリに苦心することもありませんね!

2014年もEjectは明るいとおもいます。

では、今日は東京ドームに Perfume のライブにみにいくのでまた明日。