Alpine Linux を VirtualBoxに入れてVagrant化してみた(その1)
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 です。
下記の1行を追加します。
[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デフォルトの同期フォルダ設定が働いてエラーがでます。それを無効化します。
下記の1行を追加します。
[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 した時マシンが1つも無いと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がビルドできると可能性ありそう・・・