Archive : 2012

仮想化が大流行りな今日この頃、ホストのセットアップもテンプレートからで済むケースが身の回りでも増えていますが、そうはいっても、いや仮想化が流行っているからこそ、KVM用に何台もの物理サーバーにLinuxのインストール繰り返す、そんな刺身タンポポな作業も出てきます。最近はよくUbuntu Server 12.04 LTSを触っているので、いい加減これはインストール作業を自動化する方法を覚えねば、とPreseedingによるUbuntu Serverの自動インストールに取り組んでみました。PreseedingはUbuntu Serverのインストーラのダイアログへの応答を事前に定義しておくことで、完全自動インストールを実現する仕組みです。

今回作成した設定ファイルの中身は以下の通り。なお、設定は、Ubuntu Serverのインストーラに対してtftpで食わせたりもできるのですが、今回は完全にCDのISOイメージの中に入れ込む形で作りました。詳しくは日本HPによるUbuntu Serverの自動インストールCD作成手順Appendix B. Automating the installation using preseeding – Ubuntu Official Documentationを参照されるとよいのではないかと思います。

isolinux.cfg
default install
label install
  menu label ^Install Ubuntu Server
  kernel /install/vmlinuz
  append auto=true locale=en_US.UTF-8 console-setup/charmap=UTF-8 console-setup/layoutcode=us console-setup/ask_detect=false pkgsel/language-pack-patterns=pkgsel/install-language-support=false vga=normal file=/cdrom/isolinux/preseeding.cfg initrd=/install/initrd.gz quiet --
label hd
  menu label ^Boot from first hard disk
  localboot 0x80
timeout 3
preseeding.cfg.erb
d-i debian-installer/language string en
d-i debian-installer/country string US
d-i debian-installer/locale string en_US.UTF-8
d-i localechooser/supported-locales en_US.UTF-8d-i console-setup/ask_detect boolean false
d-i console-setup/layoutcode string us
d-i console-setup/charmap select UTF-8
d-i keyboard-configuration/layoutcode string us
d-i netcfg/choose_interface select autod-i netcfg/disable_autoconfig boolean trued-i netcfg/dhcp_failed note
d-i netcfg/dhcp_options select Configure network manuallyd-i netcfg/get_ipaddress string <%= conf['ip_addr'] %>
d-i netcfg/get_netmask string <%= conf['netmask'] %>
d-i netcfg/get_gateway string <%= conf['gateway'] %>
d-i netcfg/get_nameservers string <%= conf['nameserver'] %>
d-i netcfg/confirm_static boolean trued-i netcfg/get_hostname string <%= conf['hostname'] %>
d-i netcfg/get_domain string <%= conf['domainname'] %>
d-i mirror/country string manual
d-i mirror/http/hostname string ftp.jaist.ac.jp
d-i mirror/http/directory string /pub/Linux/ubuntu
d-i mirror/http/proxy stringd-i clock-setup/utc boolean trued-i time/zone string Asia/Tokyod-i clock-setup/ntp boolean trued-i partman-auto/init_automatically_partition select biggest_freed-i partman-auto/method string lvmd-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean trued-i partman-auto-lvm/guided_size string maxd-i partman-auto/choose_recipe select atomicd-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i passwd/user-fullname string <%= conf['username'] %>
d-i passwd/username string <%= conf['username'] %>
d-i passwd/user-password-crypted password <%=conf['password'] %>
d-i user-setup/encrypt-home boolean false
tasksel tasksel/first multiselect noned-i pkgsel/include string openssh-server build-essential
d-i pkgsel/update-policy select unattended-upgrades
d-i pkgsel/install-language-support boolean trued-i grub-installer/only_debian boolean trued-i grub-installer/with_other_os boolean trued-i finish-install/reboot_in_progress notexserver-xorg xserver-xorg/autodetect_monitor boolean true
xserver-xorg xserver-xorg/config/monitor/selection-method \
       select medium
xserver-xorg xserver-xorg/config/monitor/mode-list \
       select 1024x768 @ 60 Hz

そして、これだけ用意しても、後でまた設定を変更して再度ISOイメージを作りなおすとなると面倒なので、Rubyの勉強も兼ねて、ISOイメージを作成するRakeタスクも作成しました。これらをまとめてGithubに置いてあります。

https://github.com/ynojima/aigus

呼び出し方は以下の通り。引数は、config/rake.ymlにデフォルト値を記述してあります。

sudo bundle exec rake install_iso:make ip_addr="192.168.0.2" version="12.04" hostname="test" domainname="sharplab.org"
NOV
11

fsprotectによるテスト実行環境初期化

Published:2012-11-11 02:45:57 UTC

システム全体に対して変更を加えるようなプログラム、例えばChefのRecipeみたいなもののリグレッションテスト、副作用の範囲が大きいだけに、テスト実施毎に環境を巻き戻すのが大変です。一番手っ取り早い解としては、テスト環境全体をVM化し、テスト前のスナップショットに仮想ディスクをロールバックする、というのがあり、この前のSoftwareDesignのChef特集でもVagrantを使用して実現した例が載っていました。ただ、ChefのRecipeのようなプログラムはハードウェア構成の差分の影響を受けやすく、VMなど本番とハードウェア構成の異なるテスト環境では信頼性の高いテストの実施が難しい場合もあります。

要はテスト実施毎に変更を捨てられれば良いので、ファイルシステムレベルで巻き戻すことを考えます。Windows Embeddedで言うところのEWF(Enhanced Write Filter)の機能をLinuxで実現できればよいのですが、Linuxだとaufsで実現できました。

aufsとは、複数のファイルシステムを重ね合わせて、仮想的なファイルシステムを提供するファイルシステムです。普段使っているディスクをroで使い、tmpfsでメモリ上に変更を貯めておけば、プログラム側に対してrw可能に見せておきながら再起動すると変更を全て捨てるテスト環境を作ることが出来ます。いわゆるLive CD的な挙動ですね。これを実現するシェルスクリプトが、Debian系ディストリではその名もずばりfsprotectというパッケージで提供されており、簡単に導入することが可能です。

Ubuntu 12.04での導入方法は以下の通り。

# aufsとfsprotect、apparmor-utilsの導入
sudo apt-get install aufs-tools fsprotect apparmor-utils
# DHCP Clientがapparmorに引っかかってうまく動かないので調整
sudo aa-complain dhclient3


DHCP ClientがAppArmorに引っかかってしまうので、調整が必要です。

また、fsprotectはカーネルオプションにfsprotectという文字列を渡したかどうかによって、fsptotectの有効・無効を切り替えることが出来るので、GRUBの設定変更が必要です。

vim /etc/dafault/grub

#(変更行抜粋)
#GRUB_HIDDEN_TIMEOUT=0 #コメントアウト
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash fsprotect" #ブートオプションにfsprotect追加

GRUBへの変更の反映

update-grub

テスト中に加わった変更を迅速に巻き戻せる環境の構築という点では、fsprotectを基本有効にしておき、リブートするたびにクリーンな環境を利用できるようにし、メンテナンスのためにテスト環境に変更を加えたい場合はGRUB画面からエントリ編集を行い、一時的にfsprotectを外して起動させる、という運用がお勧めです。

なお、注意点として、fsprotectはデフォルトでは"/"パーティションにのみ保護を提供し、他のマウントされているパーティションについては何もしません。他のパーティションについても保護したい場合は、/etc/default/fsprotectを編集し、以下のように保護対象に加えてやる必要があります。

PROTECT="<directory path>=<tmpfsで確保するメモリ量>"
OCT
30

Kindle Paperwhite買いました。

Published:2012-10-30 20:32:17 UTC

P1080792つい勢いでUS版を。。
良いですよこれ。最高。電子書籍を読むという目的だけにフォーカスした端末なので、軽くて、電子ペーパーなので目が疲れず、更にタップで文中の単語から英和辞書が引ける、という!通勤の良い御伴になりそうです。

O’Reilly Japan Ebook Store

amazon.com

Apress

Microsoft Press電子書籍(日経BP)

達人出版会

電子書籍、大体上5サイトで買ってるのですけど、他いいサイトないですかね。。

JAN
2

あけましておめでとうございます。今年もよろしくお願いします。

新年の抱負を語る前に、去年のことを振り返ってみると、去年の初めも、「今年こそはBlogでしっかりアウトプットを出していく!」と考えていたのですが、結局またアウトプットを出せなかった一年となってしまいました。でも!今年こそは!今年こそは!書きます!・・・と宣言するだけでは去年から進歩がないので、Blogを書くネタにできるようなソフトウェアを今書いています。今春から働き始める会社が、IPネットワーク関係の会社なので、その辺の流行のトピックと絡めたソフトウェアをC#で書くことで、ネットワーク技術の流行とモダンなC#のコーディングスタイルのキャッチアップを図りつつ、Blogのネタにしていきたいと考えています。働き始めると慣れるまで時間がとりにくくなるかと思うので、とりあえず4月までを目途に、リリースしたいなと考えています。頑張ります。