QEMUの仮想HDDにTrimやDiscardを送信出来るようにしたい

-drive file=windows10.raw,format=raw,if=virtio,discard=on
これではだめだった。

-drive file=windows10.raw,format=raw,if=none,discard=on,id=hda \
-device virtio-scsi-pci,id=scsi \
-device scsi-hd,drive=hda

こんな感じで、virtio-scsi-pciを使うと、トリムできるようになる。

BIOSブートなArch LinuxをUSBメモリに入れたら起動しなかった

初期 RAM ディスクを作成 (# mkinitcpio -p linux) する前に、/etc/mkinitcpio.conf の HOOKS の udev のすぐ後に block フックを追加してください。初期ユーザー空間で適切なモジュールをロードするために必要です。

USB キーに Arch Linux をインストール
これが重要だった。
UEFIブートの時は確かmkinitcpio.confを編集しなかったと思うのだが…、UEFIだと必要ない編集なのかな。

ECS LIVA(初代)でGRUBを使ってEFIでブートするのに手間取った。

https://wiki.archlinuxjp.org/index.php/GRUB#UEFI_.E3.83.95.E3.82.A1.E3.83.BC.E3.83.A0.E3.82.A6.E3.82.A7.E3.82.A2.E3.81.AE.E5.BF.9C.E6.80.A5.E5.87.A6.E7.BD.AE
手間取ったとは言え、上記のURLに書いてあることを実施しただけ。
$esp/EFI/boot/bootx64.efiにefiファイルを置かないといけないらしい。
GRUBの更新でコピーし忘れそうなのでメモしておく。

しかし、長い間WordPressを放置していたけど、大丈夫なのか少し不安だ。
自動的に更新されていなかったらしい…

letsencrypt-autoがなかなか自動化できない(本当に動くか未検証)

./letsencrypt-auto run -d akimasa.jp -d www.akimasa.jp -d blog.akimasa.jp --renew-by-defaultで自動化できると思いきや、いろいろと足りなかった。まず、crontabで実行するときの環境変数PATHが足りないようで、apacheが検出できない。PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binを適当なシェルスクリプトの最初に書いておいて、そっから実行するようにした。
ほかに、引数として--no-redirect --non-interactive --apacheが足りていなかったので、ユーザーの操作を求められたり、プラグインの指定が無いと言われたりする。

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
./letsencrypt-auto run -d akimasa.jp -d www.akimasa.jp -d blog.akimasa.jp --renew-by-default --no-redirect --non-interactive --apache
を実行するようにしておいたらなんとかなった。ただ、一定期間に発行できる証明書の数をオーバーしてしまって発行できない状態なので、これが本当に機能するのか謎である。
ちなみに、実際のシェルスクリプトはslackへの通知を行う1> >(in="STDOUT:" postbot) 2> >(in="STDERR:" postbot)とかがついたり、postbotの関数があったりする。process substitutionではfdが返ってくるとよく知らなくて、echo "hogehoge" >(postbot)をやっても、何か変なゴミが出力されているし、postbotで何故か標準入力を受け取れないなあとか思ってしまった。echo "hogehoge" 1> >(postbot)と書くべきだったな

Raspberry Pi 2のmicroSDことmmcblk0への書き込みが多い問題

まずは、blktrace -d /dev/mmcblk0 -o - | blkparse -i - -a writeなりbtrace -a write /dev/mmcblk0なりで書き込みを行っているプロセスを特定…しようと思ったが、kworkerやbtrfs-transactiの書き込みが多いという事しかわからなかった…
179,0 1 45 30.198921748 9215 M WS 3148800 + 64 [kworker/u8:2]
みたいな感じで出力されているのだが、
3148800 + 64の部分がどうもkB単位のオフセットとサイズでは無いかと思い、dd if=/dev/mmcblk0 skip=3148800 count=64 bs=1024 | base64で読み取ってみた。そしたら、軒並みAAAAAAAAAAAAAAAAAAAAAだった。/dev/zeroを読み込んでいるのと同じですな。ゼロクリアされている…。いくつか拾ってみて見ただけなので、もしかしたら何か有効なデータがある場所もあるのかもしれない。
いろいろ調べていたら、fatraceというコマンドで、どのプロセスが書き込みを行っているか調べられるらしい事がわかった。
しかし、apt-getで入れたfatraceは動いてくれなかった。Raspberry Pi 2なのに、Raspbianを使わずcdebootstrapでセットアップしたDebian 8が動いているのが原因かもしれない。実行すると、Cannot initialize fanotify: Invalid argumentと怒られる。仕方が無いので、fatraceのコードを拾ってきて、fatraceのfanotify_initをfanotify_init (0, KERNEL_O_LARGEFILE);からfanotify_init (0, 0);に書き換えたらうまく動いてくれた。
./fatrace  | fgrep Wを動かしつつ、btrace -a write /dev/mmcblk0を眺めていたら原因がわかったっぽい。ログの書き込みが原因だった。ログファイルの書き込みの後に、kworkerやbtrfs-transactiの書き込みが始まっている様だ。btrfsをファイルシステムとして使っているのだが、btrfsはcopy on writeらしい。ログファイルが丸ごとコピーされて、追記されて、元あった空き領域は用済みなのでゼロクリアでもされたんだろうか。それだとしたら、書き込んだところを読み取ってもゼロなのが納得できる。
今のところ、SamsungのmicroSDカードは半年間、問題無く動き続いているが、これだけ書き込んでいればいつ壊れてもおかしくは無さそうな気がする。iostat情報だと、38KB/sで書き込みされているらしいので、半年で315GBWか…。microSDの容量は32GBなので、理想的にウェアレベリングされていても約10回は書き込んだことになる。あれ?思ったよりも少ない…。

はてなブログからインポートした

はてなブログ側ではMT形式でエクスポートして、WordPressにプラグインをインストールして、実行したらあっさり入った。今、使っているWordPressのバージョンでテストされていないとプラグインのインストール時に言われたので少し不安だったが、問題無かった。

パーマリンク

パーマリンクやカテゴリに日本語が含まれていると、WordPressが404を返してアクセス出来ない問題が起こっていた。

いろいろ試してみたが、mod_rewriteは有効だし、.htaccessもちゃんと機能しているのに妙だった。

結局、設定>パーマリンク設定でindex.phpが無い形のURLに変えたら普通にアクセス出来るようになった。

LPC810のI2C-bus ROM APIで苦労した

スレーブから受信したいとき、i2c_master_tx_rx_pollで、送信バッファにアドレスを入れ送信してから、受信するかと思いきや違うらしい。i2c_master_receive_pollの受信バッファの1番目の要素にアドレスを入れて、受信を行うと良いらしい。
d.hatena.ne.jp
ここに答えが書かれていた。
アドレスのR/Wビットが違うからだろうと思い、いろいろ試行錯誤していたが、まさか受信バッファにアドレスを入れるとは思わなかった。
ユーザーマニュアルには確かに送信バッファにアドレスを入れろと書かれていたと思うのだが…。何故、受信バッファにアドレスを入れるのか謎である。しかし、良く気がついたな。
LPC800 User manualには明らかに誤った事が書かれていた。”The slave address with the R/W bit =0 is expected in the first byte of the send buffer. After the task is finished, the slave address with the R/W bit =1 is in the first byte of the receive buffer.”とあった。この通りにやっても全くうまく行かなかった。
安いし、大きさの割にはメモリが多く、高性能そうだったから選んだが、資料の間違いの多さは非常に困る。

ESP8266が不安定だったけど解決した

CH_ENを使って外部からESP8266を起動させていて、動作が不安定な場合はハードウェアユーザーガイドを参照し、RC遅延回路を追加すること

ESP-WROOM-02を使って、インターネットから加工された画像を取得して、メモリ液晶
みんなのラボのブレークアウト基板を使ってテスト中)に表示させたい。インターネットから取得するときだけ、ESP8266を起動して、それ以外の時の液晶のリフレッシュや極性反転はLPC810で行う予定。LPC810ひとつだと、ESP8266の画像取得終了を検知出来ないので、2個のLPC810を使って、ひとつは液晶の駆動、もうひとつは液晶駆動LPC810から信号を受け取って、ESP8266の起動を行い、ESP8266の終了の検知をして、液晶駆動しているLPC810を再開させることにしている。
最初は、終了の検知を出来なくてもいいやと思って、LPC810ひとつでやっていたが、いまいち不安定だった。多分、リセットを行っていないからだろうと思っていたが、違った。電源が使いかけの乾電池だったから、電圧が足りないと思い、昇圧コンバーターを通してみた。そうしたら、多少安定した気がするが、やはり数回に一回はESP8266が起動しない。オシロスコープで観察したところ、電圧降下や発振が見られた。友人にこのことを聞いてみたら、昇圧コンバーターは発振することがあるらしいことが判明した。少し高い電圧に昇圧して、シリーズレギュレーターを通したらどうだろうとアドバイスをもらい、似たようなことをやってみた。9Vの電源を元に三端子レギュレーターでESP8266とLPC810の3.3Vを得て、液晶駆動用の5Vも別の三端子レギュレーターで得てみた。しかし、ダメだった。角形な9Vの電池を使ったから、これでは電流が足りないのかなと思って、単三電池6本の電池ケースを発注したり、9Vからシリーズレギュレーターで3.3Vを得るのは効率が悪すぎるので、DC/DCコンバータも発注してみた。いろいろ合わせて1万円弱を秋月に発注してしまった。発注したものは、ほとんど使わないで放置することになりそうだ。OSコンとかインダクタとかDC/DC制御ICとか。使わない気がするが、スキルをつけるために動かしてみるか…。データシート通り組んで終了だけど、放置よりは良いだろう。
なお、秋月から届いた部品は今のところ、ほぼ放置している。
ESP8266のフラッシュ書き込みのために使っているブレッドボード上でも3.3Vと5Vが得られるので、それでも試してみた。なんとなく、一番安定しているような気がするが、やはり何回かに1度は起動に失敗する。オシロスコープで観察する限りでは、一番安定していた気がする。が、ダメだった。
長くなってしまったが、疑った原因は次の二つだけだ。

  • リセット信号のタイミング
  • 電源

結局、両方とも原因では無かった。

[Document list 0A-0D] ESP8266 Hardware Guide – ESP8266 Developer Zone
原因は、ESP8266のHardware User Guideに次のように書かれていた

Note: If the power management IC is connected with the power-on enable pin CHIP_EN, it can control the power on-and-off of ESP8266EX by output high and low voltage through its GPIOs. However, pulsed current might be produced at the same time. In order to delay the transmission of pulsed signal and avoid unstable current of CHIP_EN, a RC time-delay circuit (R=1kΩ, C=100nF) is needed. There is an internal pull-up in the CHIP_EN pin, so no external pull-up is needed.

そう。
RC遅延回路を組めば良かった。

発注していなかったが、幸い、1kΩの抵抗と、0.1μFのコンデンサが家に転がっていたので利用した。
そしたら、かなり安定して動作するようになった。20回近く電源を入れ直してみたが、動作しないことは全く無かった。
そういえば、RSTピンは浮かせてはならない的な事が書かれてあった気がするが、接続忘れていても確か普通に動作した。あとでプルアップするか3.3Vに接続するかしておかねば。
RC遅延回路をユニバーサル基板に組んだ際、CH_ENに接続するところを間違えてRSTに接続してしまったり、RSTから抵抗を切り離そうとしたら、銅のパターンごと取れてしまったので最初から作り直したりして、結構時間がかかった。作り直したときも裏面だと左右か上下が反転するが、そのことで混乱して左右逆に抵抗を実装して抵抗を取るのも面倒なので1から作り直したりした。
没作が2枚出来てしまった…。

ともかく、今のところ、安定して動くので、いろいろ試してみよう。
昇圧コンバーターによる動作も行えるか試してみなければ。
あるいは、9Vからシリーズレギュレーターで電源を得た場合とかも。
乾電池で何日持つんだろう。