ICPC2011国内予選

先週(6/25)ICPC国内予選に参加しました。チームmisoは無事アジア地区予選には出れそうですが合宿は難しい感じです。WA出してないのにtimeがやばいことになってます。

A,Bはかんたん。
Cは全探索やるだけ。問題の読み違いに因るデバッグに時間がかかりDより後に提出。
Dも探索で重複排除する。bit使うといい感じ。計算量を見誤って杜撰なコーディングをしてしまい時間を食われる。
EはDP。たぶん早かった。
Fは面倒なだけ。時間切れ。

B,DとEの補助、あとFで残り時間の消費を担当しました。

結果
公式(問題もある) http://icpc2011.ait.kyushu-u.ac.jp/icpc2011/common/guest_standings_en.php
まとめ http://imoz.jp/icpc/2011-domestic.html

6/29追記
予選通過チーム確定 http://icpc2011.ait.kyushu-u.ac.jp/ja/domestic-contest/result

Gentooシステムの応急処置

なにかしらsystem系に問題が起きたときはemergeできなくなるケースが多い。例えばビルド系のbinutils,gcc,glibcの他、coreutils,libtool,sedあたりも致命的。
そんなときはビルド済みパッケージ。普段からbuildpkgしていれば過去のビルドを使えるが、そんなことしてなかったりするので配布されているものを使う。障害の原因のパッケージを究明する方法はここでは言及しない。
但し、電源を落としても問題が無く、他のレスキューシステム(デュアルブートやLiveCD)が使えるなら当然その方法を取った方がいい。

# 初めて使うときはディレクトリがないかも
$ sudo mkdir /usr/portage/packages
# app-portage/portage-utilsが有効な場合
$ sudo QMERGE=1 qmerge -K <pkgname>

入ってなかったり古かったりしてqmergeが使えないときは、

$ sudoedit /etc/make.conf
# このURLはportage-utilsのバイナリに内蔵されているものと同じ
PORTAGE_BINHOST=http://tinderbox.dev.gentoo.org/default-linux/x86/
$ sudo emerge -gK <atom>

更に致命的なのはパッケージの配布に使われてるbzip2が壊れたとき。tarはもう知らない。

# 別のシステムでトランスコード
$ bzip2 -cd bzip2.tbz2|gzip > bzip2.tgz
# 対象のシステムに転送したのち
$ sudo tar -xvzpf bzip2.tgz -C /
# ※危険(いい方法あれば教えて)

短時間で複数台のマシンにLinuxを入れる

研究室で8台のマシンにDebianを入れることになったので、少し考えてみた。ネットワークブートを利用したネットインストール環境を素早く構築する方法を、建てるサーバを減らしてwwwへの通し方も含めてまとめる。(4 Steps)

Step 0. 必要なもの

  • 一台のホスト用Linux(LiveCDでもいい)←文中のコマンドはこのroot
  • ホストに2口のNICが無ければBBルータ
  • インストールしたいマシン(PXEに対応)
  • 全てのマシンをつなげるLAN

Step 1. インストール用ネットワークを構築する

ネットワークの設定をする。eth0がWAN(あるいは上流LAN)、eth1がLAN(192.168.123.1/24)。BBルータを使うときは設定不要で、ホストはクライアントと同様に並べる。

   eth0 +------+ eth1    (LAN) 192.168.123
<-------| Host |------+---------+---------+----...
  (WAN) +------+      |         |         |
                   +------+  +------+  +------+
                   |Client|  |Client|  |Client|        画像作るの面倒だし...
                   +------+  +------+  +------+
$ grep "^[^#]" /etc/network.interfaces
auto lo
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet dhcp
allow hotplug eth1
iface eth1 inet static
  address 192.168.123.1
  netmask 255.255.255.0
$ ifup eth1    # LAN
...
$ ifconfig eth1    # だいぶ省略
eth1      inet addr:192.168.123.1  Bcast:192.168.123.255  Mask:255.255.255.0

Step 2. インストーラを取得する

インストーラのtarbalのURLはDebianのサイト(netinst)などから「netboot.tar.gz」 という名前のファイルを探せば良い。gtk/netboot.tar.gzを選べば容量は大きいがgraphicalでマウスが使えるインストーラになる。

$ wget d-i.debian.org/daily-images/i386/daily/netboot/netboot.tar.gz
...
$ tar xzf netboot.tar.gz -C /srv/tftp/    # どこでもいい
$ ls -F /srv/tftp
debian-installer/  pxelinux.0@  pxelinux.cfg@  version.info
# pxelinux.0 が初期ブートイメージ(ブートローダ的な働き)

Debian netinst CUI
CUI installer

Debian netinst GTK
GTK installer

Step 3. PXEサーバを建てる

PXEのための2つのサーバ(DHCP,TFTP)と、www(HTTP)を提供する必要がある。以下で使用するソフトがもし使えなかったり設定に手間取るようならすぐ別の方法を考えてもいい。

dnsmasqはDNSフォワーダ/DHCPサーバでサブシステムとしてTFTPも提供できる。ここではDNSは必要ないが、簡単な設定でサブシステムと連携できるので採用した。Debianではdnsmasqの代わりにtftpd-hpaとdhcp3-serverを使うこともでき、これらには公式のガイドがある(というよりこの代わりにdnsmasqを使おうとした)。

$ apt-get install dnsmasq
...
$ grep "^[^#]" /etc/dnsmasq.conf
interface=eth1            # BBルータの場合はeth0でいい
dhcp-range=192.168.123.50,192.168.123.150,12h
                          # LAN(BBルータの場合はサブネット内で被らないIP)
#dhcp-option=3,1.2.3.4    # BBルータの場合はそのIPを指定
dhcp-boot=pxelinux.0      # /srv/tftp/以下のブートイメージのファイル名前
enable-tftp
tftp-root=/srv/tftp       # netboot.tar.gzを展開した場所
$ /etc/init.d/dnsmasq restart
Restarting DNS forwarder and DHCP server: dnsmasq.

squid3はウェブキャッシュプロキシで、wwwを提供できる。BBルータの場合はそっち経由でWANに行けるため不要。キャッシュが利くと嬉しいが、パッケージはでかいファイルが多いのであんまり期待できないかも。

$ apt-get install squid3
...
$ grep "^[^#]" /etc/squid3/squid.conf    # ほぼデフォルト、重要な箇所をハイライトした
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl localnet src 192.168.123.0/24
...
http_access allow localnet
...
http_port 3128                  # 覚えにくかったら8080でもおk
...
cache_dir /var/spool/squid3 100 16 256
...
$ /etc/init.d/squid3 restart    # インスト時に勝手に起動されてた
...

squidの代わりにNAPT(IP masquerade)の設定をする場合(BBルータの動作)

# これらの設定は全て一時的なもので再起動時に元に戻る
$ iptables -t nat -F    # 既存の設定を消す
$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$ sysctl -w net.ipv4.ip_forward=1
$ sysctl -w net.ipv4.ip_dynaddr=1    # omake for DHCP-WAN

Step 4. インストールする

Installer boot menu
Installer boot menu

大抵のマシンでは起動直後にF12やEscなど(画面にガイドが出る)を押して Network boot に入る。 Installer boot menu (右図)が表示されない場合はPXEサーバの設定を見直す。 Install を押すとStep 1.の画像ようなインストーラが起動し、他の方法と同様にインストールできる。

squidを使用しているときは HTTP proxy に http://192.168.123.1:3128 を指定する。

補足

BBルータで構成したLANではDHCPサーバが2台あることになるが、 Network boot では大抵不適切なDHCP応答を無視しれくれるので起動できる。更にサブネットを合わせているのでルータをデフォルトゲートウェイに指定すればWANにも届く。

更に多くの台数にインストールする場合は preseed を利用したインストールの自動化することも考えてたほうがいい。