2010-03-30

squid で rsync の proxy をサポートする

Debian の squid3 パッケージのデフォルトでは,1024 以下のポート番号との通信は特定のものだけに限られていて,rsync で使う 873 番との通信を中継することができない./etc/squid3/squid.conf の

acl SSL_ports port 443

あたりに以下のように追加すればよい。

acl SSL_ports port 873
acl Safe_ports port 873         # rsync

proxy 越しの MacPorts

基本的にはシステム環境設定の「ネットワーク→詳細→プロキシ」で設定した proxy が用いられるが,port sync は rsync を用いて行われるので rsync 用の proxy を設定する必要がある.これは環境変数 RSYNC_PROXY で設定する.まず,

$ sudo visudo
...
Defaults        env_keep += "RSYNC_PROXY"
...

として sudo 時に環境変数が継承されるようにして,

$ RSYNC_PROXY=hostname:8080 sudo port sync

のようにする(あるいはシェルの初期設定ファイルに export RSYNC_PROXY=hostname:8080 を設定する).

 

もう一つの問題は,ミラーサイトからのソースのダウンロードが止まってしまうことがままあることである.例えば subversion のインストール中に cyrus-sasl2 のダウンロードで止まってしまったとしよう.このときには Ctrl-C を押して一度止めてから,以下のようにする.

$ MASTER_SITE_LOCAL=http://distfiles.macports.org/cyrus-sasl2/ sudo port install subversion

もちろん,事前に sudo を設定しておく必要がある.

$ sudo visudo
...
Defaults        env_keep += "MASTER_SITE_LOCAL"
...

2010-03-25

オレオレ Debian アーカイブの作成

最終ゴール

オレオレ apt リポジトリにオレオレ deb パッケージを置いて,特定少人数に対して配布する.

今回のお題

標準インストールされている apt-ftparchive コマンドと,dupload パッケージを用いてオレオレ apt アーカイブを作成する方法を紹介する.

準備

Chapter 2. Debian Package Management を参考に作成する.以下を仮定する.

  • ホスト名: www.example.com
  • 管理者アカウント: foo
  • URL: http://www.example.com/debian
  • ローカルパス: /srv/www/example/debian
  • パッケージアーキテクチャ: i386

アーカイブ用の公開鍵暗号鍵の生成

$ ssh foo@www.example.com
$ gpg --gen-key
Please select what kind of key you want: DSA and Elgamal
What keysize do you want? (2048)
Key is valid for? (0)
Real name: foo
Email address:
Comment: Debian Archive Key

パスフレーズは空にしておく.空にしていないと後で dupload でアップロードしたときにパスフレーズをリモートからでは入力できなくて失敗する.

この鍵の ID を取得しておく.

$ gpg -k
pub   1024D/6789ABCD 2010-04-07
uid                  foo (Debian Archive Key)

ここでは 6789ABCD が ID である.

アーカイブツリーの作成

Origin (アーカイブの作成者/管理者) が foo で Label (アーカイブの名称) が foo のアーカイブツリーを作成する.Origin, Label については Debian Repository HOWTO を参照.

$ cd /srv/www/example/debian
$ mkdir -p pool/main
$ mkdir -p dists/unstable/main/binary-i386
$ mkdir -p dists/unstable/main/source
$ vi dists/unstable/main/binary-i386/Release
Archive: unstable
Version: 4.0
Component: main
Origin: foo
Label: foo
Architecture: i386
$ vi dists/unstable/main/source/Release
Archive: unstable
Version: 4.0
Component: main
Origin: foo
Label: foo
Architecture: source
$ vi aptftp.conf
APT::FTPArchive::Release {
  Origin "foo";
  Label "foo";
  Suite "unstable";
  Codename "sid";
  Architectures "i386";
  Components "main";
  Description "Private archive for foo";
};
$ vi aptgenerate.conf
Dir::ArchiveDir ".";
Dir::CacheDir ".";
TreeDefault::Directory "pool/";
TreeDefault::SrcDirectory "pool/";
Default::Packages::Extensions ".deb";
Default::Packages::Compress ". gzip bzip2";
Default::Sources::Compress ". gzip bzip2";
Default::Contents::Compress "gzip bzip2";

BinDirectory "dists/unstable/main/binary-i386" {
  Packages "dists/unstable/main/binary-i386/Packages";
  Contents "dists/unstable/Contents-i386";
  SrcPackages "dists/unstable/main/source/Sources";
};

Tree "dists/unstable" {
  Sections "main";
  Architectures "i386 source";
};

なお,元記事では

Default::Sources::Compress "gzip bzip2";

となっていたが,これでは /etc/apt/sources.list に deb-src を指定したときに apt-get update でエラーになってしまうので上のように修正した.

アップロードの設定

手元のマシンでアップロードの設定を行う.

$ sudo aptitude install dupload
$ vi ~/.dupload.conf
package config;

$cfg{'foo'} = {
  fqdn => "www.example.com",
  method => "scpb",
  incoming => "/srv/www/example/debian/pool/main",
  # The dinstall on ftp-master sends emails itself
  dinstall_runs => 1,
};

$cfg{'foo'}{postupload}{'changes'} = "
  echo 'cd /srv/www/example/debian;
        apt-ftparchive generate -c=aptftp.conf aptgenerate.conf;
        apt-ftparchive release -c=aptftp.conf dists/unstable > dists/unstable/Release;
        rm -f dists/unstable/Release.gpg;
        gpg -u 6789ABCD -bao dists/unstable/Release.gpg dists/unstable/Release' |
  ssh foo@www.example.com  2>/dev/null;
  echo 'Package archive created!'";

アップロード

*.changes ファイルがあるディレクトリで下のようにする.

$ dupload --to foo .

apt

インストールするマシンの apt を設定する.リポジトリの公開鍵をインストールするマシンの鍵束に加える.

$ ssh foo@www.example.com gpg --export -a 6789ABCD | sudo apt-key add -

これで通常の操作をすればよい.

$ sudo aptitude update

問題点

このやりかただと,パッケージをバージョンアップしてアップロードすると,前のバージョンがそのままアーカイブに残るという問題点がある.この場合でもインストール時には最新バージョンがインストールされるが,apt-cache search や apt-cache show で複数のバージョンが表示されてしまい気持ち悪い.以下の記事を参照して新しい方法を試してみる方がいいかもしれない.

2010-03-11

X で caps lock キーを control キーにする

前記で無事大型モニタで X を起動することに成功したのだが,今度は caps lock キーを control キーにするのがうまくいかない.

Section "InputDevice"
    Identifier  "Generic Keyboard"
    Driver      "keyboard"
    Option      "CoreKeyboard"
    Option      "XkbRules"    "xfree86"
    Option      "XkbModel"    "pc104"
    Option      "XkbLayout"   "us"
    Option      "XkbOptions"  "ctrl:nocaps"
EndSection

ではうまくいかないのである(おそらく USB キーボードだから).「http://kmuto.jp/d/index.cgi/debian/input-hotplug-guide.htm」などによると,HAL や udev などからハードウェア情報を取っている関係上,xorg.conf からの情報は無視されるようである.

あちこち探し回った結果(上の文書にも記述がある),debian では console-setup パッケージがキーボードの設定の面倒を見てくれることが判明した.

$ sudo aptitude install console-setup
$ sudo vi /etc/default/keyboard
XKBMODEL="pc104"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS="ctrl:nocaps"

としてリブートすると,何とコンソールでも caps lock キーが control になり,X Window でも同様に設定された.なお上記ではキーボードを us 配列に設定しているが普通の人は pc106, jp に設定することになるだろう.

なお,console-setup を設定するとコンソールのフォントがしょぼい感じに変わってしまう.これを元に戻すには,

$ sudo dpkg-reconfigure console-setup

として,フォントを Fixed その他ではなく,「ブート時のをそのまま使う」に設定してやればよい.

X の nvidia ドライバでデュアルディスプレイの片方だけを回転する

Dell の巨大なモニタの設定が終わったので,それまで使っていた Dell のそれほど巨大でもないモニタを縦置きしてデュアルディスプレイ構成で使うことにした.このとき片方だけ画面を回転しなければならないが,これにもそこそこ苦労したので記録しておく.

まずはデュアルディスプレイの設定から.X ではデュアルディスプレイは昔からサポートされている.ただしこの設定では独立した複数のデスクトップができてしまう.Xinerama を用いるとデスクトップを統合し,それを複数のディスプレイで表示するようにできる(nvidia ドライバでは TwinView という方法もある).しかし統合デスクトップで片方のディスプレイの表示だけ回転というのは敷居が高そうだし,そもそも今回のようにディスプレイの大きさ が異なる場合,独立したデスクトップの方が便利そうなので,独立デスクトップの方で設定することにする.

最近では画面の回転(や解像度の変更)に XRandR という拡張を用いるようである.この機能を有効にし,xorg.conf の中で Option "Rotate" "left" などとすると,一応回転ができるのであるが,この場合ドライバのアクセラレート機能がオフになってしまうようなのである.いろいろ試行錯誤した結果,以下 のような方法におちついた.

まず xorg.conf:

Section "ServerLayout"
    Identifier     "Layout"
    Screen         0 "Screen 0" 0 0
    Screen         1 "Screen 1" LeftOf "Screen 0"
EndSection

Section "Device"
    Identifier     "Device 0"
    Driver         "nvidia"
    Screen         0
EndSection

Section "Device"
    Identifier     "Device 1"
    Driver         "nvidia"
    Option         "RandRRotation" "true"
    Screen         1
EndSection

Section "Screen"
    Identifier     "Screen 0"
    Device         "Device 0"
    DefaultDepth    24
EndSection

Section "Screen"
    Identifier     "Screen 1"
    Device         "Device 1"
    DefaultDepth    24
EndSection

上の別項目で説明したような解像度の設定などは取り去っているが,nVidia Quadro FX 380 の出力はどちらも DVI なので,自動で認識するようだ.また,デュアルリンクを有効にする nv ドライバの設定も nvidia ドライバでは必要ないようだ.

上のような設定で起動した後で,

$ xrandr --screen 1 -o left

とすると片方のディスプレイだけ回転できた.これを ~/.xsession などに書いておけばよい.

man xrandr を見て設定していると,つい

$ xrandr --screen 1 --output default --rotate left

としたくなるが,これはうまくいかない.--rotate でなく -o (orientation) を使うのがポイントであった.

xorg の nvidia ドライバーに大苦労した話

先日Dell の大型モニタが届いた.このモニタには Mac を接続する予定なのだが,到着はもう少し先になりそうなので,とりあえず Linux マシンをつないで凌ぐことにしたのだが,設定に大苦労したというお話.

このモニタの解像度は 2560x1600 で,DVI 接続ではデュアルリンクが必要である.これはケーブルがデュアルリンク対応というだけでなく,グラフィックカード側もデュアルリンク出力をする必要があ る.Linux マシンのグラフィックカードは nVidia Quadro FX 380 というもので,仕様的には十分対応できるものである.

xorg 付属ドライバを試す

Linux マシンも届いたばかりなので,まずはいつもの通り Debian をインストールし,squeeze に upgrade した.そして X Window をインストール開始.

$ sudo aptitude install xorg twm
$ vi ~/.xsession
exec twm
$ chmod +x ~/.xsession
$ startx

... 真っ暗.何故か kill ではうまく終了させられないので,リモートログインから,

$ sudo telinit s

で終了させる.で,いつものごとく /etc/X11/xorg.conf をいじろうとしたのだが...無い!

$ sudo dpkg-reconfigure xserver-xorg

としても何も起こらない.「Xサーバ1.7→1.8、HAL から udev « Kawaji's Weblog」 などによると,最近の X はハードウェア環境について HAL や udev から情報を取得して自らを構成するようになっていて,xorg.conf は必要なくなっているそうだ.しかし xorg.conf が無いと話が始まらない./var/log/Xorg.0.log を見たところ,内部で利用している xorg.conf の内容が表示されていたので,それを元に generic な xorg.conf を作成した.

Section "ServerLayout"
    Identifier     "Builtin Default Layout"
    Screen         "Builtin Default nv Screen 0"
EndSection

Section "Device"
    Identifier     "Builtin Default nv Device 0"
    Driver         "nv"
EndSection

Section "Screen"
    Identifier     "Builtin Default nv Screen 0"
    Device         "Builtin Default nv Device 0"
    DefaultDepth    24
    SubSection     "Display"
        Depth       24
        Modes      "2560x1600"
    EndSubSection
EndSection

まず man nv をチェックしたところ,Option "AllowDualLinkModes" "boolean" というのを発見した.

Section "Device"
    Identifier     "Builtin Default nv Device 0"
    Driver         "nv"
    Option         "AllowDualLinkModes" "true"
EndSection

としてみた.その結果,表示されるにはされたが,画面が点滅を繰り返して使い物にならない.いろいろ実験した結果,vesa ドライバで 1600x1200 ならなんとか表示されることが判明した.

Section "Device"
    Identifier     "Builtin Default nv Device 0"
    Driver         "vesa"
EndSection

Section "Screen"
    Identifier     "Builtin Default nv Screen 0"
    Device         "Builtin Default nv Device 0"
    DefaultDepth    24
    SubSection     "Display"
        Depth       24
        Modes      "1600x1200"
    EndSubSection
EndSection

nVidia 製ドライバのインストール

しかしこれでは宝の持ち腐れである.そこで nVidia 謹製のドライバをインストールすることを決意.さっそくダウンロードしてインストールしてみたところ,全然だめなことが判明した.

そこで検索したところ,「404 - Not Found」というページを発見!だが,このページの通りにやったところ,m-a clean,a-i -i -t -f nvidia-kernel-source のところで,BUILD FAIL! となって失敗に終わった.

調べてみると,nvidia-kernel-source パッケージのバグ報告ページに既に報告されていた.そこには,nvidia-kernel-source を一旦消して,apt リポジトリを sid に一時的に変更してビルドするというヤレヤレな workaround が報告されていた.いろいろやったところ成功したので,手順を記しておく.

まず,話をややこしくしないために,クリーンインストールを行い,上記の Option "AllowDualLinkModes" "boolean" を xorg.conf に記入したところまでリプレイした.以下,「404 - Not Found」に従って nvidia ドライバをビルドする.

# aptitude install nvidia-kernel-common module-assistant
# aptitude install pkg-config  # 後に sid からインストールされるのを防ぐため
# m-a -i -t prepare
# m-a clean,a-i -i -t -f nvidia-kernel-source
BUILD FAIL!
# vi /etc/apt/sources.list
{squeeze を sid に書き換え}
# apt-get update  # 安全のため aptitude でなく apt-get を使った
# m-a clean,a-i -i -t -f nvidia-kernel-source
# depmod -a
# apt-get install nvidia-glx nvidia-glx-dev nvidia-xconfig nvidia-settings
# vi /etc/apt/sources.list
{sid を squeeze に書き換え}
# aptitude update
# nvidia-xconfig

で無事成功!