Arch LinuxをVirtualBoxにインストールしてみた

今年は何もしませんでしたね……我ながら酷い。4月に、headmasterでLinuxのstring.hが変換できないというissueをいただいて、12月も末になってようやく修正した、そんな年です。

こうも時間がかかったのは、VirtualBoxを使うようになったのが結構最近だからで、私の日常用途にはMacWindows、あと借りているさくらのレンタルサーバFreeBSDなのでそれ、と、OSはそれぐらいしか使ってないのです。所謂ガラケーなのでAndroidとも無縁です。Linuxなんて必要性も空いているPCもない。で、個人的な事なんですが10年前に作った自作PCをPC3Rに有償で回収してもらいました。結構面倒くさかった。リサイクルマークの付いているPCを買いましょう。で、Windows PCが減りましたし、Vista以降のWindowsに付いて行く気は全くないですし、最近はSecureBoot*1なんて物騒な話題もありますし、XP環境を保存する目的でVirtualBoxを使い出しました。クリーンインストール時のスナップショットを残しておけば変なものを入れても巻き戻せます。ゲストでスワップするかホストでスワップするかの違いしか無いのでページファイルを消してしまえます。sdeleteを使えばVDIを圧縮できます。XPというのはなぜこんなに仮想マシンと相性がいいのでしょう。で、どうせならということでFreeBSDLinux仮想マシン環境を作りました。どうでもいい経緯終わり。日本語で言い訳しても伝わるわけがありません。

headmasterはヘッダーファイル変換ツールです。これを作るのが目的であり、Linuxのヘッダーファイルやライブラリにもだらだら文句を書きたいのが本音です。今これをLinuxから読んでおられる方はちょっとstdio.hを開いてみてください。__REDIRECTなんて書かれてますが展開してみると同じ関数が2回宣言されていたりします。しかも2回目は__asm__("...")付きです。この__asm__はインラインアセンブラではなくて、オブジェクトファイル上の外部名を指定するためのものです。つまり一個目のfscanfは_fscanfを、二個目のfscanfは___isoc99_fscanfを呼ぶための宣言であり、全くの別物です。こんなのを警告もなしに通すgccもどうかしてます。一個目と二個目の間に呼び出しを書いて、それがインライン展開されたりしたら呼ばれるのはどっちになるんでしょう?まあそんなのも今はどうでもいいです。

Arch LinuxVirtualBoxにインストールしてみた…私がメモとしてここに残しておきたいのはこれなんです。この手の記事を書くのは久しぶりなのでテンションがおかしいのは勘弁してくださいな。

といっても、手順そのものは本家の解説や、とてもありがたい先人の記録を参考に進めていけば、手間こそかかれ特に難しいところはありませんでした。でもこの手間が問題で、そう、Arch Linuxというのはインストーラが付いてない素敵ディストリビューションなのです。*2 インストールイメージから起動するとLive CDみたいにArch Linuxが普通に立ち上がります。そこからコマンドをぽちぽち打ってインストーラがやる手順を手動で再現しないといけません。なんでわざわざそんなもんをと思われるかもしれませんが、X無し、可能な限りの最小構成でインストールできるLinuxを探したんですよ、configureを走らせたりヘッダーファイルを引っこ抜いたりすることだけが目的ですので。

ようし、前置きは終わった。一気にいくぜ!
最初はVirtualBox仮想マシンと仮想HDD(VDI)を作ります。容量は余裕を持って10GBとしましたが、どう考えてもこんなにはいらなくて、2GBもあれば充分みたいです。VDIは可変サイズですので、容量を多く取ってもインストール直後の実容量は使った分だけになります。使い込んでフラグメンテーションが酷くなってくると、必要なサイズだけに抑えておけばよかったと後悔するようにもなるのでしょうけれども。
で、archlinux-2012.12.01-dual.isoからブートするように設定して、起動。32ビット版にしました。

fdiskでパーティションを作成

fdiskで。WindowsのFDISKとはもちろん別物ですので(当たり前)、検索しながら恐る恐るやりました。LinuxですとHDDは/dev/sdaになるようです。
ブートパーティションに100MiB、スワップパーティションに512MiBが固定で必要で、後は自由に使える領域。

% fdisk /dev/sda
ブートパーティション
	Command: n
	Partition type: p (default)
	Partition number: 1 (default)
	First sector: (default)
	Last sector, +sectors or +size{K,M,G}: +100M
	
	Command: a
	Partition number: 1
スワップパーティション
	Command: n
	Partition type: p (default)
	Partition number: 2 (default)
	First sector: (default)
	Last sector, +sectors or +size{K,M,G}: +512M
	
	Command: t
	Partition number: 2
	Hex code: 82
残り全部
	Command: n
	Partition type: p (default)
	Partition number: 3 (default)
	First sector: (default)
	Last sector, +sectors or +size{K,M,G}: (default) # 残り全部
	
	w # 書き込んで終了

パーティションのフォーマット

ブートはext2スワップパーティションはそれ用のフォーマット、その他はext4

% mkfs.ext2 /dev/sda1
% mkswap /dev/sda2
% mkfs.ext4 /dev/sda3

マウント

フォーマットした領域を/mntとして、そこに色々入れていくことになります。

% mount /dev/sda3 /mnt
% mkdir /mnt/boot
% mount /dev/sda1 /mnt/boot

リポジトリのミラーを設定

% vi /etc/pacman.d/mirrorlist

Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$archの行を先頭に持ってくればいいのかな?
vi素人のメモ。

	yy # 現在の行をコピー
	p # ペースト
	wq # 書き込んで終了

Linux本体のインストール

% pacstrap /mnt base base-devel

ブートローダーのインストーラのインストール

% arch-chroot /mnt pacman -S grub-bios

Yと答えてインストール開始。

fstabを生成

% genfstab -p /mnt >> /mnt/etc/fstab

以降は/mntで作業する

% arch-chroot /mnt

/mntが/のように見えるようになります。

ホスト名

% echo 'ArchLinux' >> /etc/hostname

なんでもいいのですがとりあえず'ArchLinux'。

タイムゾーン

% ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

東京。

ロケール

% echo 'LANG=en_US.UTF-8' >> /etc/locale.conf
%  vi /etc/locale.gen

viのほうは、en_US.UTF-8 UTF-8 の行の#を消します。
最初ja_JP.UTF-8にしたのですが、ターミナルのフォントは日本語フォントではないので親切にローカライズされている部分が逆に読めなくなりましたので、en_US.UTF-8にします。

% locale-gen

よくわかってませんが何かのおまじない

% vi /etc/mkinitcpio.conf # 編集しなくてもいい
% mkinitcpio -p linux

ブートローダーのインストール

% grub-install --target=i386-pc --boot-directory=/boot --recheck --debug /dev/sda
% grub-mkconfig -o /boot/grub/grub.cfg

rootのパスワードを設定

% passwd

ここで再起動

% exit # arch-chrootの終了
% umount /mnt/boot
% shutdown -h now # 最初-pと間違えた

仮想マシンが終了したらVirtualBoxのほうでISOイメージから起動するようにした設定を解除します。
で、再起動して、先ほど設定したrootのパスワードでログインします。

ネットワーク接続

% ip link set eth0 up
% systemctl start dhcpcd@eth0

毎回起動するたびにこれをやらないとつながりません。面倒になったら起動スクリプトにでも放り込めばいいのでしょう、恐らく。startをenableに変えたら再起動後も勝手に起動してくれるようになるかも。
以降、何の疑問もなくroot以外にユーザーを作るつもりで作業してますが、rootだけでいいかもしれません。というのは、VirtualBoxのファイル共有機能がrootからしかアクセスできないので、大変面倒なんです。

sudo入れる

pacman経由のインストールのためにネットワーク接続が必要です。

% pacman -S sudo
% sudoedit /etc/sudoers #↓参照

sudoeditでは、%wheel ALL=(ALL) ALLの行のコメントアウトを外します。

ユーザーの作成

% adduser

新規ユーザーはadduserコマンドで作りwheelのメンバーにします。(初期状態ではstaffは無い?)
あとパスワードが空だとSSHで拒否られますので何か入れときます。
以降はこのユーザーで入りなおして、sudoで作業しました。rootのままでやっちゃったほうが早いです。

Guest Additionのインストール

Guest AdditionはVirtualBoxの機能を使うためのものです。
pacman経由でインストールしますのでネットワーク接続が必要です。

% pacman -S virtualbox-guest-utils
% groupadd vboxsf # 共有フォルダ用のグループを作るのですが、インストールした時点でできてる?
% vi /etc/modules-load.d/virtualbox.conf #↓参照

virtualbox.confには以下3行を記述。

	vboxguest
	vboxsf
	vboxvideo

または、virtualbox.confを作らなくても次のコマンドで手動でロードできるようです。

% modprobe -a vboxguest vboxsf vboxvideo

あとXを使うときは.xinitrcにVBoxClient-all &の行を追加すればいいようです。
ここで罠がありまして、Guest Additionを入れるとlibX11や関連ライブラリもインストールされて/usr/libが結構膨らみます。ごっちゃになって後から消すのは難しそうですので、クロスコンパイラを作るために/usr/libを引っこ抜くならこれより前にやらないと最小構成になりません。私はもう手遅れですので、再インストールする機会があれば、このメモを見なおして思い出せるといいな。

Guest Additionの起動

% systemctl start vboxservice.service

これも毎回必要です。起動スクリプトに放り込むべきかな。

共有フォルダ

Guest Additionが必要です。

% ls /media/sf_XXXX # XXXXはVirtualBoxで設定した名前

VirtualBox側で設定した共有フォルダは、/media/sf_XXXXとして見えます。

% gpasswd -a $USER vboxsf # アクセス権

これでユーザーにアクセス権を付与……できるようなことが書かれてますが、できません!rootでないとアクセスできません!何か勘違いしてますでしょうか?

他に必要なものをちょこちょこインストールして、/usr/includeをtarballにでもして共有フォルダ経由でホスト側で受け取れば終了。pacmanは速い速い。

% pacman -S w3m
% pacman -S libyaml
% pacman -S libxml2
...

Linuxのlibc.soは実はテキストファイルで、中に絶対パスが書かれているのでクロス環境を作るにはパスを書き換えないといけないとかそういうのはまた別の話……。

それでは、よいおとしを!

*1:名前に反してWindows以外が起動できなくなるだけのゴミらしいです。最近はどこも囲い込みに必死で困る。

*2:昔はインストーラがあったが消えたらしい?