VPS上のLinuxのユーザー空間にArch Linuxの環境を構築する話


なんでこんなに特異な状況に関する記事を書いているかというと, まさに私がとあるサーバーのユーザー空間を共有する仕組みを作ったからである. 仕組みを作ったと言ったら大げさだが, 単にUnixのユーザーを作っただけである.

さて, これによりユーザーはその空間で自由に遊ぶことができるのだが, どこかのC++ enthusiastはCentOS 7のGCCの古さに不満なようで, サーバーでGCCをコンパイルするという暴挙に出た.

それに対し私は, 「自分でコンパイルするとかアホか. 私ならfakerootなり何なりを使う.」 とか言っていたのだが, そのような構成に妙に興味が出たので実際に環境を構築してみる. 今後他のユーザーの参考にもなろう.

prootをインストール

prootは「権限、設定なしにchroot, mount --bind, binfmt_miscしてくれるツール」である. つまりrootなしで「イイ感じに」してくれるのだ. 早速インストールする. 私はrootが使えるので普通にyumでインストールした. かくして当サーバーでは誰でもすぐにprootを使うことができる.

sudo wget http://download.opensuse.org/repositories/home:cedric-vincent/CentOS_7/home:cedric-vincent.repo -O /etc/yum.repos.d
yum install proot

Arch Linuxをインストール

いきなりぶっ飛んだ話になったように聞こえるかもしれないが, 非常に容易にこれは達成できる.

方法はだいたい既存の Linux からインストール - ArchWikiに従うだけである. ぐぐってたらフォロワーさんの にゃるら氏root 権限の無い Linux サーバ上でも chroot な Archlinux を使えるスクリプトを作ってみた! - カラクリサイクルなんていう記事を書いていたのに気づいたが, Arch Linuxではtarballにしたbootstrap用imageが公開されていたので, 怠け者の私はそちらを使うことにした. 実に, 怠け者でなかったらArch Linuxなぞ使わずGentooを使うものだ. それにしてもぶっ飛んだ人がフォロワーになっていたのだな.

bootstrap用イメージはArch Linux - Downloadsからテキトーなミラーのリンクを踏めば見つかる. 試しにftp.tsukuba.wide.ad.jpに行ってみると無造作にファイルが置かれた中にarchlinux-bootstrap-2016.11.01-x86_64.tar.gzがあるのでこれを使う.

wget http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/iso/2016.11.01/archlinux-bootstrap-2016.11.01-x86_64.tar.gz -O - | tar xz

まずpacmanをセットアップする. mirrorlistの編集から始める. 既に用意されたmirrorlistの中から近場のサーバーを見つけ出しコメントアウトしよう.

nano root.x86_64/etc/pacman.d/mirrorlist

それから, キーリングの作成. 信頼できるエントロピー源のないVPS上では秘密鍵が生成できないので, ローカルで作成したものをデプロイする. pacman-keyはシェルスクリプトであり, そこから秘密鍵生成のコードを引用した. ここだけがローカルでの作業である.

gpg --homedir gnupg --gen-key --batch <<EOF
%echo Generating pacman keyring master key...
Key-Type: RSA
Key-Length: 2048
Key-Usage: sign
Name-Real: Pacman Keyring Master Key
Name-Email: pacman@localhost
Expire-Date: 0
%no-protection
%commit
%echo Done
EOF

tar cf gnupg.tar gnupg
scp -P 110 gnupg.tar kagucho.net

ローカルでも秘密鍵生成には時間がかかる. イマドキのPCならTPMというセキュリティモジュールがあり, それが乱数生成を行ってくれるので, Linux環境ならこれを使うためにrng-toolsを設定しよう. そうこうしているうちに数々のコマンド入力などによりエントロピーが生成され, 秘密鍵の生成が終わるはずである.

アップロードした秘密鍵を展開する.

tar -C root.x86_64/etc/pacman.d xf gnupg.tar

これで準備は完了. いよいよprootでArch Linuxを開始する. 今回は今後の利用のためarchlinuxというコマンドを作成しておく. .bashrcに次のように追記.

alias 'archlinux=proot -0 -b /etc/resolv.conf -m /dev -m /sys -m /proc -w / -r root.x86_64'

では早速archlinuxコマンドでArch Linuxを実行しよう.

archlinux

ここからはproot上での作業だ. pacman-keyでキーリングを仕上げる.

pacman-key --init
pacman-key --populate archlinux

そして念願のGCCをbase-develグループごとインストールする.

pacman -S base-devel

動作を確認しよう.

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --enable-libmpx --with-system-zlib --with-isl --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-gnu-indirect-function --disable-multilib --disable-werror --enable-checking=release
Thread model: posix
gcc version 6.2.1 20160830 (GCC)

以上で, CentOS/RHEL/ナントカLinux でユーザー空間からarchlinuxコマンドを叩くだけでArch Linuxが立ち上がる環境が完成した. 自分でやっておきながら言うのも何だが, わけがわからないよ.

[top]