Alpine Linux を VirtualBoxに入れてVagrant化してみた(その２)

Alpine Linux を VirtualBoxに入れてVagrant化してみた(その１)
http://qiita.com/hexaforce/items/59c06cbeead814113a6b

続きです。

#VagrantSSHのためのユーザ設定 

まず、DNSが通ってないので悲しいことにネットが繋がりません。(IP直打ち仕様？)
localhost:~# setup-dns -d localhost -n 8.8.8.8

次に、apk というパッケージ管理コマンドがありますがmainレポジトリしか設定されてません。
/etc/apk/repositoriesにレポジトリを追加します。

一見して無いものを追加、ミラーは適時合わせてください。
localhost:~# cat /etc/apk/repositories

echo "http://dl-1.alpinelinux.org/alpine/v3.3/main" >> /etc/apk/repositories
echo "http://dl-1.alpinelinux.org/alpine/v3.3/community" >> /etc/apk/repositories
echo "http://dl-1.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories
echo "http://dl-1.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories
echo "http://dl-1.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories

※edgeは不安定というより新しいもの、既存のものとlibのバージョンが合わなくなるため非推奨といったものがあります。MongoDBなど

パケージ更新
localhost:/# apk update

とりあえず、vagrantユーザのために curl と sudo が欲しいので
localhost:~# apk add curl sudo

vagrantのssh設定は面倒なのでデフォルトで行います。
(vagrant init した時のデフォルトVagrantfileでいけるようにする)

Vagrantデフォルト
・sshdの設定は鍵認証かつパスワード認証であること
・秘密鍵はvagrant自体が最初から持っていて不変
・秘密鍵はvagrantのバージョンがあがっても変わらない
・公式公開鍵はGithubにある(橋本Mitchell さんのやつ?)
・ssh先は127.0.0.1:2222
・sshユーザは「vagrant」パスワードも「vagrant」

・vagrantユーザの追加
localhost:~# addgroup vagrant
localhost:~# adduser vagrant -g vagrant -G wheel -s /bin/ash 
localhost:~# echo "vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

・ssh鍵の設定
localhost:~# su - vagrant
localhost:~$ mkdir ~/.ssh
localhost:~$ chmod 0700 ~/.ssh
localhost:~$ curl -L -o ~/.ssh/authorized_keys https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub
localhost:~$ chmod 0600 ~/.ssh/authorized_keys

これで vagrant ssh できる設定ができました。
shutdown して package します。

localhost:~$ sudo su
localhost:~# shutdown -h now

できませんよね〜

http://wiki.alpinelinux.org/wiki/Alpine_Linux_Init_System
にもあるように Alpineでは OpenRC を使います。

localhost:~# poweroff


#Vagrant BOXイメージの作成

VMイメージのあるディレクトリで vagrant package すると「package.box」ができます。

$ cd ~/VirtualBox\ VMs/alpine-3.3.1-x86_64 
$ vagrant package --base alpine-3.3.1-x86_64
$ ls | grep package.box
package.box

どこか適当なディレクトリで動くか実験します。
$ mkdir ~/test
$ mv package.box ~/test
$ cd ~/test
$ vagrant init alpine-3.3.1-x86_64
$ vagrant box add alpine-3.3.1-x86_64 package.box
$ vagrant up
$ vagrant ssh

お疲れ様でした！と言いたいところですが、何やらvagrantがエラー吐いてます・・・
Vagrantは仮想マシンを立ち上げたあと実際にSSHしてある程度のプロビジョニングを行います。
RHELやUbuntuなど一般的なOSでは問題がありませんがAlpineに合わせて設定されていないためエラーがでます。
Vagrantfileに修正が必要となります。

vagrantのデフォルトShellは /bin/bash で Alpineは /bin/ash です。
下記の１行を追加します。
[Vagrantfile追加]
config.ssh.shell = "/bin/ash"

VirtualBoxから起動した場合は問題ありませんが、vagrantから起動した場合 eth1 が無視されます。
private_network を有効にして auto_config: false を追加します。
[Vagrantfile修正]
＃ config.vm.network "private_network", ip: "192.168.33.10"
　　　　　　　　　↓
config.vm.network "private_network", ip: "192.168.33.10", auto_config: false

vagrantデフォルトの同期フォルダ設定が働いてエラーがでます。それを無効化します。
下記の１行を追加します。
[Vagrantfile追加]
config.vm.synced_folder ".", "/vagrant", disabled: true

もしセキュアな仕様・要件がある場合は sshd.conf をいじったり ssh-keygen で鍵変更したり Vagrantfile をいじったりなどご自身で行ってください。
vagrant公式リファレンスにいろいろ載ってます。

Alpine基本的な使い方
http://wiki.alpinelinux.org/wiki/Alpine_setup_scripts

自分専用のカスタムISOの作り方
http://wiki.alpinelinux.org/wiki/How_to_make_a_custom_ISO_image


#[補足]最低限知っといたほうがいいVagrantコマンド

VMマシンの状態確認
$ vagrant status

登録されているboxイメージリスト確認
$ vagrant box list

VMマシンの初期化
$ vagrant destroy
もしくは
$ vagrant destroy [VMマシン名]
VMマシンがdefaultしか無い場合defaultが初期化されます。
vagrant init した時マシンが１つも無いとdefaultが自動作成されます。

boxイメージ削除
$ vagrant box remove [boxイメージ名]

boxイメージ追加
$ vagrant box add  [boxイメージ名]  [boxファイルパス]

vagrant起動定義(Vagrantfileが作られます)
$ vagrant init [boxイメージ名]  

vagrant ssh確認
$ vagrant ssh-config 

VMマシンの停止(ACPIを止めるやつ)
$ vagrant halt


#最後に
今課題として
・同期ファイルを設定したい
・AlpineのXorgを動かしたい
と思っています。
VBoxGuestAdditionsがビルドできると可能性ありそう・・・