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が立ち上がる環境が完成した.
自分でやっておきながら言うのも何だが, わけがわからないよ.