ECS LivaというBay-Trail MベースのPCがあります。秋葉原の複数の店舗やAmazonで扱っています。2万円しない小型PCで、メモリ(2GB)とストレージ(eMMC 32GB)を搭載しているので、OSさえ用意すれば他には何もなくても使えるマシンです。 公式でUbuntu 14.04が動作すると書かれているのですが、やはりDebianを使いたいのでなんとかしてインストールしてみました。 しかし、wheezyのインストーラではストレージを認識できません。Linux kernel 3.8から入ったsdhc_acpiというホストドライバが必要なのですが、Debian wheezyの標準kernelは3.2と古いのが原因です。 結局、自分は一度Ubuntu Live USBイメージから起動して、debootstrapで頑張ってDebianをインストールするという手段で実現しました。Debianさえ入ってしまえば、backportsにある3.14 kernelがwheezyでも使えます。 最初はwheezy用のインストーラを作るべく頑張ってみたのですが、3.14 debian udebにsdhc-acpi.koが含まれていないというバグがあるため(kernel debにはある)、kernelパッケージを作り直す必要がありました。しかし作り直しても、eMMCデバイスは見えるけれどもアクセスすると固まるという問題があったため、挫折しました。 今のbackports kernelでは一応動いていますが、Replay Protected Memory Block(RPMB)と呼ばれる領域にアクセスできないという不具合があります。この警告はUbuntu kernelだと出ません。 [ 3.202626] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 [ 3.205033] mmcblk0rpmb: timed out sending r/w cmd command, card status 0x400900 [ 3.207399] mmcblk0rpmb: timed out sending r/w… Continue reading Intel Celeron N2806のeMMC(RPMB)
Category: Debian
Debianでrootにaufsを使う(initramfsのカスタマイズ)
大掃除をしていたら初代EeePCが出てきました。最近いろいろあって実マシン環境が複数欲しかったので、この機会にDebianを入れて動かすことにしました。 箱が見当たらなかったので型番がわからないのですが、おそらく 初代EeePC 4G-Xと思われます。当時メモリも一緒に購入したので、RAMだけは2GBとそれなりにあります。
Debianでbackportsにパッケージを登録する(ディストリビューション/パッケージマネージャー Advent Calendar 2013)
これはディストリビューション/パッケージマネージャー Advent Calendar 2013 17日目の記事です。 Debianの安定版(stable)と呼ばれるものは、一度リリースされると致命的なバグやセキュリティに問題がない限り、ソフトウェアのメジャーバージョンが上がることはありません。またリリース間隔が不定期なため、状況によっては古いソフトウェアを使い続けることになります。これはメリットであり、デメリットでもあります。 安定板でも新しいパッケージを使いたい、という要望に応えたものがbackportsです。かつてはwww.backports.orgで非公式サービスとして提供されていましたが、現在では公式なものとして扱われています。 どのようにしてbackportsにパッケージをアップロードするのかは、http://backports.debian.org/Contribute/に基本的にはすべて記述されています。ここでは実体験を交えて説明します。 ACL(Access Contorol List)への追加リクエスト Debian開発者であれば、backportsのACLに自分のIDを追加してもらうだけでアップロードができるようになります。ACLの追加は自力ではできないので、RT(Request Tracker)にチケットを作成してリクエストをします。 チケットの作成はメールで行います。backports@rt.debian.orgあてに”Debian RT”という文字列を含んだメールを送ることで、その内容がチケットになります。以下は私が出したメールの例です backportsに関する情報を得るために、debian-backports MLも購読しておきましょう。 さて、チケットを作って待つこと一週間、何も動きがありませんでした。催促の意味を込めて、次のようなメールをMLに投げました。 するとすぐACLに追加され、チケットはresolvされました。これでdebian/changelogのdistributionの項目に”wheezy-backports”などとしたパッケージを通常のincomingサーバーにアップロードすれば、backportsに登録されるようになります。 Debian開発者ではない人がアップロードをしたい場合は、sponsorを探す必要があります。debian-backports MLでsponsorを募集してみましょう。アップロード先にはhttp://mentors.debian.net/等を利用しましょう。 パッケージの作成 いよいよパッケージのbackportをやります。まず対象となるソフトのソースを入手しましょう。 dgetはdpkg-sourceまで実行してソースコードを展開してくれるので、次はdebian/changelogを更新します。dchには親切にも–bpoというbackportsのポリシーに合わせてバージョン番号を上げる機能がついているので、これを使います。 これで自動生成されるエントリーは以下のようになります。wheezyのdchはデフォルトでsqueeze向けのbpo情報を埋め込みます。 今回はwheezy向けにパッケージを作るので、バージョンとディストリビューションを修正します。 bpo60+1をbpo+72と、現在のwheezyのバージョン番号に合わせました。ディストリビューションもsqueeze-backportsからwheezy-backportsに変えました。 さて、実際にビルドしてみましょう。ビルドには、きれいな(純粋にwheezyのパッケージだけで構成された)環境の利用が推奨されています。pbuilder等の利用を検討しましょう。pbuilderの使い方については、今回ここでは行いません。 上記の例では、まず実環境でビルドしてdscファイルを生成し、それをもとにpbuilderでビルドを行っています。これでビルドに成功すれば、晴れて完成です。 足りないパッケージも作る 完成に見えたこのbackports用パッケージですが、実はこれだけではwheezyで動きません。mikutterのビルド自体はwheezyでできるのですが、インストールしてみといくつかのパッケージがwheezyに存在しないため、エラーになります。 ruby-addressableとruby-oauthはwheezyにもあるようですが。残りは存在しないようです。足りないパッケージを同様にしてbackport化しましょう。 debuildを実行するときには、-Fオプションを忘れないようにしましょう。初回のアップロード時にはupstreamのソースコードも必要だからです。 一通りのパッケージをインストールし、動作することが確認できたら、いよいよアップロードです。 stableが大好きな皆さんはbackportsを活用してゆきましょう。
git-builpackageを使う(Debian/Ubuntu JP Advent Calendar 2013)
これはDebian/Ubuntu JP Advent Calendar 2013 11日目の記事です。 Debianではパッケージを管理する際に、オリジナルのソースコードの上にdebianというディレクトリを作成し、その下にDebian固有のパッケージングに関する情報を記録してゆくようになっています。 かつてはこのファイルの管理はそう大変なことではありませんでした。しかし現在のDebianはoldstable, stable, testing, unstableという4つ(場合によってはexperimentalを含めた5つ)のdistributionを同時に管理しなければなりません。こうなると、やはりバージョンコントロールシステムが使いたくなるところです。 そのためのパッケージのひとつがgit-buildpackageです。名前の通りSCMにgitを使います。この記事ではその解説を行います。他にもsvnやcvs, bzrに対応したものがありますが、それぞれ設計思想から異なるのでここでは触れません。個人的にはsvn-buildpackageも使ってはいます。 ソースコードのインポート 一番最初に行うのは、すでにあるdeb用ソースコード一式のインポートです。これにはgit-import-dscコマンド(あるいはgit-import-dscs)を使います。 これでパッケージ名(この場合hallo)のディレクトリが作成され、そこがgitリポジトリになります このようにインポートされたdebianバージョンとupstreamのタグが作成されます。内容を更新し、新しいバージョンをリリースする際には同様に新しいdebianバージョンのtagを生成することになります。 変更 適当に変更をしてみます。このあたりは普通のgitリポジトリを扱うのと変わりはありません。 テストビルド 修正をコミットする前にテストビルドをするには、git-buildpackage build –git-ignore-newを実行します。–git-ignore-newオプション以外はdebuildと同じです。 問題がなければ、親ディレクトリにパッケージと各種ファイルが生成されます。これでよいと思ったら普通にgit commitしましょう。 リリース向けビルド リリース用のビルドは–git-tagオプションを付けることでできます 新しく作ったdebian versionのタグができていることが確認できます。 参考 PackagingWithGit (Debian Wiki)
squeezeからwheezyへのアップグレード
最近いくつかのDebian squeeze(6.0)環境をwheezy(7.0)にアップグレードしたので、その時に直面した問題などをここに記録してゆきます。何かあったら随時追記します。 makefile style init script(insserv) devfsdというかなり古いパッケージがずっと残っていたのですが、これのせいでinit scriptの依存関係がループを起こし、insservがエラーを出してパッケージのconfigureが完了しない、という事態が起きました。 init scriptはsqueezeから依存関係が記述できるようになり、可能な限り並列でdaemonを起動しようとするのですが、devfsdはそれより古いパッケージ(そもそも現在使われていない)ものだったので、デフォルトで与えられる依存関係情報とmdadm-raidの依存関係とが循環参照を起こし、止まってしまいました。一時的にmdadm-raidからdevfsdの記述を削除することで、この問題は解決しました。 本来ならdevfsdなんてインストールすらされていないはずなので、バグレポートはしていません。 phpとrep2ex 2011年ごろのかなり古いrep2exをずっと使っていたのですが、wheezyのphp(5.3.3)で動いていたrep2exがsqueezeのphp(5.4.4)で正常に動作しなくなりました。 確実に動かないのはImageCahe2で、これは新しいphpでDataObjectクラスがsqlite2をサポートしなくなったことが原因です。MySQLかPostgreSQLを使うようにすれば動作します。 ただ、何も考えないとデータベースが移行できないので、データベースの初期化だけ行ってから、sqlite2 image.sqlite .dumpコマンドでエクスポートし、INSERT文だけ抽出してデータベースに食わせることでデータを引き継いでいます。 他に板の名前など一部の日本語が表示されない、という問題が起きているので、これの解決に取り組もうとしています。 最新のrep2exにアップグレードすることも検討したのですが、ディレクトリ構造を含め大きく変わっているので、とりあえず今のrep2exが使える状態になってから取り組もうと思っています。 今後進展があれば、随時更新してゆきます。 追記1(5/27) rex2exの日本語が出ない問題は、php 5.3->5.4でのhtmlspecialcharsの挙動の変化が原因でした。デフォルトでは、エンコーディングの指定がないと5.3ではISO-8859-1、5.4ではUTF-8で処理しようとします。基本的に2chはSJISなので、日本語を含む文字列の変換に失敗して空の文字列を返してしまうようです。 あちこちにhtmlspecialcharsが存在していますが、ある程度機械的に置換してSJISを明示してやることで、大体動くようになりました。これで様子をみつつ、最新のrep2exに追従したいと思います。
特定のファイルがどのパッケージに含まれているかを調べる
あるファイルがどのパッケージに含まれているかを調べたいことはよくあります。 既にインストールされたものの中から探すのなら、dpkg -Sが使えます。 $ dpkg -S /bin/ls coreutils: /bin/ls しかしこれは線形探索なので、結構時間がかかります。また、インストールされていないファイルに対しては調べられません。 一応、Webで探索できるページ(http://packages.debian.org/ja/)も用意されていますが、オフラインのときには使えません。 ftpサイトのdebian/dists/(stable|testing|unstable)/Contents-(i386|amd64|…).gzというファイルに、そのアーキテクチャの全パッケージのファイルリストがあるので、これをあらかじめ取得しておいて調べるという方法もあります。 しかし、そこまでやるならapt-fileを使った方がよいでしょう。apt-fileはContents-$arch.gzを取得してインデックス化してくれるので、検索も高速です。 同様のことができるパッケージは他にもあります(auto-apt等)。うまく活用するとよいでしょう。
Debian/Ubuntu JP Advent Calendar 2012 – grub2のデフォルト起動エントリーを変更する
この記事は Debian/Ubuntu JP Advent Calendar 2012 : ATND の 12/6(木) の記事です。 今日のお題はDebianのデフォルトブートローダーであるgrub2の起動エントリーを変更する方法について紹介します。 現在のgrub2は設定ファイルである/boot/grub/grub.cfgを直接編集することはなく、基本的な制御は/etc/default/grubを編集し、update-grubを実行することでgrub.cfgを再生性させる使い方が正しいとされています。 デフォルトでインストールされる/etc/default/grubでは、エントリーの一番先頭がデフォルトで選択されるようになっています(GRUB_DEFAULT=0)。複数のOSをインストールしている環境では、毎回カーソルキーで起動OSを選択するのは面倒だと思うので、一度選択したエントリーを記憶させるモードを使っている人も多いと思います。 具体的には、以下のような感じに/etc/default/grubを書き換えます。 GRUB_DEFAULT=0をGRUB_DEFAULT=savedにかえ、GRUB_SAVEDEFAULT=trueを追加します。これで次回起動したOSのエントリーが/boot/grub/grubenvにsaved_entry=OS Entry Nameという形で保存されます。 これは、Debianが起動中であればgrub-set-defaultコマンドで変更させることができます。エントリー名はgrub.cfgのなかでmenuentry命令で定義しているので、grepしてみればどういう名前で登録されているかがわかります。 たとえばこの状態で、grub-set-default “Windows 8 (loader) (on /dev/sda1)”を実行すれば、grubenvが書き換わり次回の起動時に自動的にWindows8を起動するエントリーが初期選択される状態になります。 これで、リモートから起動するOSを変更することも可能です。 過去の記事、「Windons7のVirtualBoxでデュアルブート用のraw partitionにあるLinuxを起動させる」と連携すれば、Windows OS側で一度VirtualBoxを起動し、その中のDebianでgrub-set-defaultを実行することで、Windowsでもgrubのエントリー変更させることが間接的に可能です。できれば直接Windowsでgrubenvの修正ができるとよいのですが、/boot/grub以下の読み書きができないといけないのでちょっと難しいでしょうね。
Debian Advent Calendar – cron-aptで常に最新状態を保つ
私はDebianの中でもStableを好んで使っています。Debianパッケージされたソフトウェアのなかで、脆弱性が見つかるとそれを修正したものを提供してくれる点が気に入っています。 過去、DSA(Debian Security Advisory)を常に見張りながら報告があるたびにapt-get upgradeをするという運用をしていたのですが、うっかり更新ミスをしてしまったがために外部からの侵入を許してしまったことがあります。 そういった事態に陥らないために、stableを常用している人はぜひcron-aptを入れましょう。cron-aptは毎日apt-get update, upgradeを実施してくれるパッケージです。しかしながら、デフォルトでは更新されたパッケージをダウンロードするだけで、インストールはしてくれません。 インストールまで自動化するためには、/etc/cron-apt/action.d/3-downloadの内容を修正しましょう。標準では以下のようになっています。 これはapt-getに与えられる引数です。この中から、”-d”オプションを取り除きます これで自動的にインストールまでが行われます。なにか失敗があったとき(たまたまミラーサーバーが止まっていたりなど)は、cronでメールがrootに飛んでくるので見落とさないようにしましょう。
不安定なマシンを無理やり動かす(watchdog, memtest)
実家に設置してあるサーバがここのところ妙に挙動があやしく、いろいろ調べてみた結果どうもメモリがあやしい、という結論に至りました。しかしそのためだけに新幹線で名古屋まで帰ることも出来ず、しかも今ちょっと入院中なので、リモートで出来る限りのことをしてみました。 まずはsoftware watchdogの導入です。これは/dev/watchdogというデバイスをつくり、定期的に書き込みがあるかチェックして、一定時間(デフォルトは60秒)書き込みがなかったら再起動するというものです。チェックをするためのソフトウェアがDebianにはwatchdogという名前のパッケージであります。インストール時にdebconfでいくつか質問されます。私の設定は以下になります。 moduleは利用するwatchdogドライバのモジュール名で、software watchdogはsoftdogを指定します。watchdogデーモンが起動するときにこれがinsmodされます。runは自動起動するかどうかの設定、restartはアップグレード時に再起動をさせるかさせないかを指定します。下手に再起動させると、kernelがwatchdogがとまったと誤認識することがあるので、falseのほうが安全です。 次に/etc/watchdog.confを編集します。デフォルトではコメントアウトされているwatchdog-deviceの行を有効にします。 これで何かあってシステムがハングすると、再起動するようになります。ただし、ソフトウェア実装なので確実ではありません。 しかしそもそも不安定な原因がメモリにあるので、そこをなんとかしたいところです。昔はbadramというパッチがあって、問題のあるメモリ領域を手動で指定して使わないようにさせる、という方法があったのですが、今はもっといい方法があります。 Linux 2.6.26から導入されたkernel組み込みmemtestです。起動パラメータにmemtest=試行回数を指定することで、メモリのエラーをチェックしエラー領域を使わないよう動作します。 残念ながら、Debianデフォルトのカーネルでは有効になっていないので、 CONFIG_MEMTEST=yを.configに追加して自分でカーネルの再構築をする必要があります(make-kpkgを利用) 自作したカーネルパッケージをインストールしたら、カーネルパラメータを追加してやる必要があります。/etc/default/grubを編集します。 GRUB_CMDLINE_LINUXにmemtest=数値を指定して、テスト回数を指定してやります。この例では32回テストします。テストを増やせばエラーを発見する確立が高まりますが、当然起動には時間がかかります。手持ちのノートPCで試しに255を指定したところ、数分待っても終わる様子がないので完走させる前に止めてしまいました。 最後にupdate-grubを実行して、このパラメータをgrub.cfgに反映させてから再起動します。カーネルがエラーを発見すれば、dmesgに以下のような出力が出ます。 これで今のところ問題は起きていません。しかしこんな状態で利用し続けるのも問題なので、可能であればECCメモリーにでも乗せかえたいところです。
Android 2.x向けにL2TP/IPSecサーバ(openswan+xl2tpd)を設定する
前々から設定しかけてはうまくいかなかった、Android向けL2TP/IPSecがようやく動くようになったので、どんな設定をしたかをまとめてみます。対象はDebian squeezeです。 パッケージとして必要になるのは、openswanとxl2tpdです。これらをapt-get installします。 まずopenswanの設定をします。これはIPSecの実装の一つです。もともとFreeS/Wanというプロジェクトがあったのですが、その開発が止まったためforkしてできたのがOpenswanです。ほかにStrongswanという実装もあるようですが、ここでは触れません。 /etc/ipsec.confというファイルが存在しているので、それを編集します。冗長なコメントは消しています。 次に、L2TP向けの設定ファイル/etc/ipsec.d/l2tp-psk.confを新規に作成します。 次に、/etc/ipsec.secretsを編集します。ハイライトされた行を追加します。your-passwordを自分が設定したいパスワードにしてください。このパスワードがIPSec事前共有鍵になります。 次に、sysctl関連の設定をします。/etc/sysctl.d/for-ipsec.confファイルを作成し、以下のように設定します。自分はすべてのインターフェースに{accept,send}_redirectsを設定しています。各自のインターフェース名に合わせて設定してください。 ファイルを作成したら、sysctl -p /etc/sysctl.d/for-ipsec.confを実行してこのsysctl設定を有効化します。リブート時には/etc/init.d/procpsの中でこのファイルが自動的に読まれます。 ここで、一度ipsecを起動してみます。/etc/init.d/ipsec startして、ipsec verifyを実行してみてください。問題なければ以下のような出力が出ます。[NG]という出力があれば、何か設定に失敗していることになります。 ipsecはデフォルトでは自動起動になっていないので、insserv ipsecを実行して自動起動するようにしてください。 最後は、xl2tpdの設定です。/etc/xl2tp.confを以下のように設定します。 2行目で、ppp認証用のユーザー、パスワードを記述したファイル名を指定します。10,11行目でVPNに振るアドレスを指定します。各自にあったIPアドレスレンジを使ってください。16行目では、xl2tpdが起動するpppdの設定ファイル名を指定しています。うまく動かないときは、各種デバッグオプションを有効にしてみてください。 /etc/xl2tpd/l2tp-secretsは以下のように書きます。user, passwdは適切なものにしてください。 /etc/ppp/options.l2tpd.lnsの設定例は以下になります。 最初、MTU/MRUのサイズを指定しないで動かしていたら外部との通信がうまくいかなかったので、かなり小さめ(1280)にしています。16行目のネームサーバは適切なものに変更してください。 あとは/etc/init.d/xl2tpd restartを実行して、Android側の設定をしてゆきます。VPNのタイプはL2TP/IPSec PSK、VPNサーバ名とIPSec事前共有鍵(ipsec.secretsの値)を設定します。L2TPセキュリティ保護は無効にします。 あとは接続を実行し、l2tp-secretsに書いたユーザー名、パスワードを入力すれば接続できるはずです。設定がおかしいと、一瞬pppセッションが確立したあとすぐ切られる、というような状況が起きることがあるので気を付けてください。 知人から、これらに関していくつか助言をいただいています。 [blackbirdpie id=”237744346173153281″] ICSとOpenswanの組み合わせでは動かないことがあるようです。 [blackbirdpie id=”237735014954070016″] 新しいkernelにはopenl2tpというin-kernel l2tpモジュールがあるそうです。ただし、まだuserlandはDebianパッケージが(sidにも)ありません。 参考: AndroidスマートフォンからLinuxサーバにVPN接続する – いろいろwiki@princo.org 追記(2012/8/24): MS-CHAP-v2の脆弱性と攻撃ツールの流通が報告されていますが、pppの設定を見ての通り、L2TP/IPSecでもMS-CHAP-v2を使っています。暗号化されたトンネルの下でpppを確立するため、直ちに危険というわけではありませんが、PSK共有鍵方式だと安全とはいえないようです。 セキュリティ アドバイザリ 2743314 カプセル化されていない MS-CHAP v2 認証により、情報漏えいが起こる を公開 【注意喚起】MS-CHAPv2プロトコルの破綻 証明書ベースの接続(CRT VPN)の設定を今後は調べてみようと思います。