あるファイルがどのパッケージに含まれているかを調べたいことはよくあります。 既にインストールされたものの中から探すのなら、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等)。うまく活用するとよいでしょう。
Category: 開発
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に飛んでくるので見落とさないようにしましょう。
Software Freedom Day 2012
Software Freedom Day 2012にFSIJとして参加しました。 私はその中で「自由なデータ」について話をしました。しかし、「データ」というのは枠が広すぎて、十分にまとめきれなかったのが残念です。発表資料をsfd2012freedata.odpとして公開しておきます(slideshareにも置きました)。 発表のときは日本語コンピューティングを軸にした内容にしてみましたが、言語に依存しないけどドメスティックなもの、例えば地図などもあります。OpenStreetMapの活動には頭が下がります。 個人的にはスペルチェッカ、文法チェッカをどうにかしたいと昔から思っているのですが、自然言語処理の知識を体系的に学んでいないと難しそうです。
不安定なマシンを無理やり動かす(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)の設定を今後は調べてみようと思います。
川崎でSoftware Freedom Day 2012イベント
来る9/15に川崎の専修大学 サテライトキャンパスにてSoftware Freedom Day連動イベントをやります。概要はFSIJの案内ページをご覧ください。 私は「自由なデータ」について、議論できればと思っています。以前から自由に使えるデータに関しては自分も関心があり、Flashでプレゼンテーション資料を作るという試みもしていました。その時に、自由に流用できるパーツ的なものがないことを残念に思い、せめて自分が作ったパーツぐらいは、と公開しています。まあでも、Flash自体がこのまま入滅しそうな情勢になってしまいましたね。 Flashで資料を作っていた当時はまだOpenOffice.orgもなく、Unix系技術者のプレゼンテーションはたいていMagic Pointが使われていました。Magic Point自体はそんなに悪いソフトウェアでもないのですが、利用感覚としてはLaTeXに近く、サクサクとテキストベースでソースをかける反面、凝ったレイアウトを作るのはちょっと大変でした。 OpenOffice.org以降はImpressを使えばよいので楽になりましたが、商用ソフトにあるような豊富なクリップアート、ステンシルなどがないのが残念です。 最近はプレゼンテーションを作るのにGoogle Presentationを使うことが増えています。しかしWebアプリは自由ソフトウェアでないのが難点です。SFDでは、アウトラインだけGoogle Presentationで書いています。あとでLibreOffice Impressにて整形することになりそうです。
LibreOfficeを使うのにMS Officeのマニュアルが便利
いやあ、こんなことじゃいけないんだろうとは思いつつも、LibreOfficeのCalcで「この計算はどうやるんだ」と思った時に、LibOのマニュアルではよくわからなかったので、結局Excelのマニュアルを見てしまいました。 [blackbirdpie id=”230924683334275072 “] こんな過去のことをちょっと思い出してしまいました。
groongaとlibedit
groongaはとてもいいソフトなのだけど、基本バックエンドに徹しているので、ファイルベースの検索に使えるようなフロントエンドを作れるといいなあ、と思いつつちょこちょこ試しています。 ありがたいことに、初めからDebian packageがapt-lieとともに用意されているのですが、groongaコマンドは行編集ができません。調べてみると、libeditに対応しているとのことなので、自前でビルドしてリンクさせてみようとしました。しかし、まだdebになっていないlibedit3を要求するので困ってしまいました。 [blackbirdpie id=”228688948141096960″] ということなので、バージョン3は必須のようです。new upstreamを出してほしいというリクエストはすでにあるので、これ以上は待つかNMUするかしないとどうにもならないところです。出したところでwheezyには間に合わないのも困りどころ。
Dokan SSHにHTTP proxyサポートを追加
Windowsで動くsshfs実装に、Dokan SSHというものがあります。DokanというFUSEのようなライブラリがあり、それとSharpSSHを組み合わせて、sshfsを実現しています。 なかなか便利なのですが、手元の環境はHTTP proxyしかなく、しかも認証が必要です。なので、それらの対応を加えたコードをgithubで公開しています。もともとSharpSSH自体がHTTP proxyをサポートしていたので、自分はそれを使うガワの方をちょこっと足しただけでした。