PackerでVirtualBoxのUbuntuイメージを作る話

PackerとVirtualBoxを使って、OSの自動インストールをします。 インストール対象はUbuntu 12.04.3 LTSを使いますので、自動化にはPreseedも使います。 Vagrantの話はしません。

PackerでVirtualBoxのUbuntuイメージを作る話

Packerのインストール

ダウンロードしてきて好きなところにぶちまけるだけの簡単なお仕事です。

今回はWindowsを使うので、zipをダウンロードしてパスの通った適当な場所に置きます。

OSのインストールイメージの取得

適当なところからダウンロードしましょう。理研さんとかが良いですかね。

Packerはインストールイメージの検証を行うので、MD5SUMSまたはSHA1SUMSもダウンロードしておくと良いです。
もしこの記事に従ってainoniwa/packer-templatesを使う場合は、恐らく気にしなくても使えるんじゃないかと思います。

フォルダ構造とファイル群

こんな感じですかね

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
+ 0.5.1_windows_amd64
    - packer.exe
    + packer-templates
        + ubuntu1204
            - build1204_3_vbox.bat
            - disable_udev_persistent_net.sh
            - enable_serial_ttyS0.sh
            - preseed.cfg
            - ubuntu-12.04.3-server-amd64.iso
            - ubuntu1204_3_vbox.json
  • build1204_3_vbox.bat: 単にpacker.exeを起動するだけのバッチファイル
  • disable_udev_persistent_net.sh: OSインストール後の追加設定その1。仮想マシンをクローンすることを想定して、eth0とかを固定しないようにする設定を入れる
  • enable_serial_ttyS0.sh: OSインストール後の追加設定その2。シリアルコンソールを有効化しておく
  • preseed.cfg : Debian系のOSで使われる自動インストール用の構成情報が書かれたファイル
  • ubuntu-12.04.3-server-amd64.iso: さっきダウンロードしてきたUbuntuのCDイメージ
  • ubuntu1204_3_vbox.json: Packerの構成ファイル

build1204.3-vbox.bat

1
..\..\packer.exe build -only=virtualbox-iso ubuntu1204.3.json

disable_udev_persistent_net.sh

1
2
sudo echo -n   > /etc/udev/rules.d/70-persistent-net.rules
sudo echo "# " > /etc/udev/rules.d/75-persistent-net-generator.rules

enable_serial_ttyS0.sh

1
2
3
4
5
6
7
sudo echo "# ttyS0 - getty
start on stopped rc or RUNLEVEL=[12345]
stop on runlevel [!12345]

respawn
exec /sbin/getty -L 115200 ttyS0 vt102" > /etc/init/ttyS0.conf
sudo start ttyS0

preseed.cfg

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
d-i debian-installer/locale string en_US
d-i console-setup/ask_detect boolean false
d-i keyboard-configuration/layoutcode string jp
d-i netcfg/disable_autoconfig boolean false
d-i netcfg/choose_interface select eth0 
d-i netcfg/get_hostname string ubuntu
d-i netcfg/get_domain string ainoniwa.net
d-i netcfg/wireless_wep string
d-i time/zone string Asia/Tokyo
d-i clock-setup/utc-auto boolean true
d-i clock-setup/utc boolean true
d-i base-installer/kernel/override-image string linux-server
d-i debconf debconf/frontend select Noninteractive
d-i pkgsel/install-language-support boolean false
tasksel tasksel/first multiselect standard, ubuntu-server
d-i mirror/http/proxy string
d-i partman-auto/method string lvm
d-i partman-auto/choose_recipe select atomic
d-i partman-auto-lvm/guided_size string max
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-lvm/device_remove_lvm boolean true
d-i partman/confirm boolean true
d-i partman/confirm_write_new_label boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman/choose_partition select finish
d-i passwd/user-fullname string yuki
d-i passwd/username string yuki
d-i passwd/user-password password yuki
d-i passwd/user-password-again password yuki
d-i user-setup/encrypt-home boolean false
d-i user-setup/allow-password-weak boolean true
d-i pkgsel/include string openssh-server ntp
d-i pkgsel/upgrade select full-upgrade
d-i pkgsel/update-policy select none
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true
d-i finish-install/reboot_in_progress note

ubuntu1204_3_vbox.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
{
    "variables": {
        "base_username": "yuki",
        "base_password": "yuki"
    },
    "builders":[
        {
            "type": "virtualbox-iso",
            "guest_os_type": "Ubuntu_64",
            "output_directory": "ubuntu1204.3-ovf",
            "vm_name": "ubuntu1204.3",

            "iso_url": "ubuntu-12.04.3-server-amd64.iso",
            "iso_checksum_type": "md5",
            "iso_checksum": "2cbe868812a871242cdcdd8f2fd6feb9",

            "ssh_username": "{{user `base_username`}}",
            "ssh_password": "{{user `base_password`}}",
            "ssh_wait_timeout": "30m",
            "shutdown_command": "echo {{user `base_password`}} | sudo -S sh -c 'shutdown -P now'",
            "guest_additions_mode": "disable",
            "hard_drive_interface": "sata",

            "http_directory": "./",
            "boot_wait": "10s",
            "boot_command":[
                "<esc></esc><esc><enter><wait>",
                "/install/vmlinuz noapic ",
                "auto=true url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg ",
                "hostname={{ .Name }} ",
                "fb=false debconf/frontend=noninteractive ",
                "initrd=/install/initrd.gz -- ",
                "<enter><wait>"
            ]
        }
    ],
    "provisioners": [{
        "type": "shell",
        "execute_command": "echo {{user `base_password`}} | sudo -S bash '{{.Path}}'",
        "scripts": [
            "./disable_udev_persistent_net.sh",
            "./enable_serial_ttyS0.sh"
        ]
    }]
}

自動インストール

適当にbuild1204_3_vbox.batをダブルクリックすれば、同じフォルダにubuntu1204_3_isoが出来上がる。
出来上がりまでは座して待つ。
ちなみに、インストール時の初期ユーザ名は我らが雪さん(username:yuki / password:yuki)です。ainoniwaだけに(これが言いたかった)

うにょうにょインストールされていく。

出来上がるとこんな感じに。

後は、ovfファイルをダブルクリックとかして、VirtualBoxにインポート。

後は起動すれば使える状態になる。

いくつか作って置いておくと、別の作業しながら試験環境作れてお得です。

Built with Hugo
テーマ StackJimmy によって設計されています。