Proxmox VE 4.2上にGentoo Linuxをインストールしてみる

先日#ssmjp 2017/01に行ってきたのだが、そこでGentooについて特集されていた。 有名なディストリだし、名前は知っていたのだが…やっぱりイメージ的になんか辛そうというのがあって今まで敬遠していた。 あと、正直なところ趣味で利用されるディストリというイメージがあったのだが、意外とサーバとしても利用されてるらしい。 Papper君とかがGentooベースで動いてるとは知らなかった…。

で、一部企業ではサーバとしても動いてるらしいので、試しにProxmox VE 4.2上でインストールしてみることにした。 KVMなので、まぁ動かないってことはないだろ。 他のディストリと違ってインストーラーという感じではなく、自分でディスクフォーマットとかが必要にはなるのでちょい面倒かもしれないが。

手順については、Gentoo Wikiを参照に進めている。 基本的にやってることはそのまんまなので、↓の内容を参照すれば普通にインストールできる。 正直、噂ほど難しいとは思わなかった(面倒臭かったけど)。

1. DiscBootさせる

まず、インストール用のISOファイルから取ってくる。 とりあえず、amd64のMinimal Installation CDにしとこう。 適当にVMを作成して、ISOファイルを読み込ませて起動。 起動後、以下のような画面が表示されるのでそのままEnterでbootさせる。

Boot後、最初にKeymapの設定が入るので、英字キーボードであればそのままEnter。

LiveCDなので、操作用のコンソールが表示される。

DHCPのないネットワークで起動したので、IPアドレスが振られてない状態。 適当にipコマンドで一時的なアドレス振っておこう。 (なお、systemdなのでデフォルトではeth0とかじゃなくて、enp0s18とかが割り振られているはず)

ip addr add IPアドレス/サブネット dev ネットワークデバイス名
ip route add default via Gatewayのアドレス
echo 'nameserver 8.8.8.8' >> /etc/resolv.conf

また、とりあえずsshで操作できるよう、rootユーザに適当なパスワードを付与してsshdを起動しておこう。

echo root:P@ssw0rd | chpasswd
/etc/init.d/sshd start

2. ディスクの準備

一時利用のネットワーク設定が終わって疎通確認ができたら、ディスクをフォーマット(今回は仮想ディスク新品なのでやらない)してパーティションを区切ってやろう。 partedでちゃちゃっとやってしまおう。

parted -s -a optimal /dev/sda mklabel gpt
parted -s -a optimal /dev/sda mkpart primary 1 3
parted -s -a optimal /dev/sda name 1 grub
parted -s -a optimal /dev/sda set 1 bios_grub on
parted -s -a optimal /dev/sda mkpart primary 3 131
parted -s -a optimal /dev/sda name 2 boot
parted -s -a optimal /dev/sda mkpart primary 131 643
parted -s -a optimal /dev/sda name 3 swap
parted -s -a optimal /dev/sda 'mkpart primary 643 -1'
parted -s -a optimal /dev/sda name 4 rootfs

実行後の状態がこちら。

livecd ~ # parted -l /dev/sda
Model: ATA QEMU HARDDISK (scsi)
Disk /dev/sda: 53.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name    Flags
 1      1049kB  3146kB  2097kB               grub    bios_grub
 2      3146kB  131MB   128MB                boot
 3      131MB   643MB   512MB                swap
 4      643MB   53.7GB  53.0GB               rootfs

3. ファイルシステムの作成・マウント

次に、作成したディスクのパーティションにファイルシステムを作成する。 とりあえず、btrfsを使ってみるかな。 ブートパーティションはxfsにしとこう。

mkfs.xfs /dev/sda2
mkfs.btrfs /dev/sda4

また、SWAP領域についても有効にしておこう。

mkswap /dev/sda3
swapon /dev/sda3

次に、できたファイルシステムを操作するためにマウントする。

mount /dev/sda4 /mnt/gentoo
mkdir /mnt/gentoo/boot
mount /dev/sda2 /mnt/gentoo/boot

4. stage tarballをダウンロードして展開する

ファイルシステムが出来上がったら、そこにGentooをインストールする。 links(テキストブラウザ)を使用して、適当なミラーを選択してイメージをダウンロードしてくる(面倒なのでミラーサイト直接指定してる)。

cd /mnt/gentoo
links http://ftp.jaist.ac.jp/pub/Linux/Gentoo/releases/amd64/autobuilds

とりあえず、Stage3のsystemdのイメージをとってくる。 dキーでダウンロードできるので、中のtar.bz2ファイルを選択してダウンロードする。

無事ダウンロードできたら、qキーでブラウザを終了してファイルの展開を行う。

tar xvjpf stage3-*.tar.bz2 --xattrs

ファイルの展開が終わったら、環境に合わせてコンパイルオプションの設定をする。 設定ファイル「/mnt/gentoo/etc/portage/make.conf」でコンパイルオプションを指定できる。

詳細についてはWikiを見てもらうとして、とりあえず今回はこのままにしておこう。

次に、インストール時に必要となるデータを取ってくるためのミラーサーバを指定する。 Wikiにあるように、とりあえず日本のミラーサーバを選択してリダイレクトで追記してしまおう。

mirrorselect -i -o >> /mnt/gentoo/etc/portage/make.conf

portageで使うためのリポジトリファイルの配置をする。

mkdir /mnt/gentoo/etc/portage/repos.conf
cp /mnt/gentoo/usr/share/portage/config/repos.conf /mnt/gentoo/etc/portage/repos.conf/gentoo.conf

chrootを行う前に、DNSの設定ファイルや既存PATHのマウントを行う。

cp -L /etc/resolv.conf /mnt/gentoo/etc/
mount -t proc proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev

chrootを行う。

chroot /mnt/gentoo /bin/bash
source /etc/profile
export PS1="(chroot_now) $PS1"

5.Portageの設定を行う

次に、Portageの設定を行う。 どんなツールがインストールできるか確認するため、おすすめされている「emerge-webrsync」を実行してみる。 (結構長い)

emerge-webrsync
(chroot_now) livecd / # emerge-webrsync
Fetching most recent snapshot ...
Trying to retrieve 20170128 snapshot from ftp://ftp.iij.ad.jp/pub/linux/gentoo ...
Fetching file portage-20170128.tar.xz.md5sum ...
Fetching file portage-20170128.tar.xz.gpgsig ...
Fetching file portage-20170128.tar.xz ...
Checking digest ...
Getting snapshot timestamp ...
Syncing local tree ...

Number of files: 206,223 (reg: 178,616, dir: 27,607)
Number of created files: 1,319 (reg: 1,244, dir: 75)
Number of deleted files: 0
Number of regular files transferred: 1,244
Total file size: 415.18M bytes
Total transferred file size: 2.10M bytes
Literal data: 2.10M bytes
Matched data: 0 bytes
File list size: 131.05K
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 6.38M
Total bytes received: 52.48K

sent 6.38M bytes  received 52.48K bytes  104.62K bytes/sec
total size is 415.18M  speedup is 64.53
Cleaning up ...

Performing Global Updates
(Could take a couple of minutes if you have a lot of binary packages.)

 * IMPORTANT: 12 news items need reading for repository 'gentoo'.
 * Use eselect news read to view new items.

とりあえず、profileはそのままにする。 リストもアップデートしないでいいので省略。

タイムゾーン・ロケールの設定をする。

echo "Asia/Tokyo" > /etc/timezone
echo "ja_JP.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen
(chroot_now) livecd / # eselect locale list
Available targets for the LANG variable:
  [1]   C
  [2]   POSIX
  [3]   ja_JP.utf8
  [ ]   (free form)
(chroot_now) livecd / # eselect locale set 3
Setting LANG to ja_JP.utf8 ...

最後に、再度環境をリロードする。

env-update && source /etc/profile && export PS1="(chroot_now) $PS1"

6.カーネルのインストールをする

次はLinuxカーネルのインストールをする。 amd64の場合だと「sys-kernel/gentoo-sources」が推奨されてるようなので、以下のコマンドでカーネルのインストールをする。

emerge --ask sys-kernel/gentoo-sources

後の諸々の設定はWikiを参考に実施。 環境に合わせて必要なオプション有効にしていく。

emerge --ask sys-apps/pciutils
cd /usr/src/linux
make menuconfig

menuconfigが終わったら、コンパイルおよびインストールを行う。

make && make modules_install
make install

7. その他設定

作業前に、vimだけインストールしておく。

emerge --ask app-editors/vim

とりあえず、fstabにブート時のマウントについて設定を記述する。

cat <<EOF >> /etc/fstab
/dev/sda2   /boot        ext2    defaults,noatime     0 2
/dev/sda3   none         swap    sw                   0 0
/dev/sda4   /            ext4    noatime              0 1
EOF

ホスト名とドメイン名の設定。

sed -i '/^hostname/chostname="gentoo"' /etc/conf.d/hostname
echo 'dns_domain_lo="blacknon.local"' > /etc/conf.d/net

ネットワーク周りの設定。 まさかここでまたインストールが必要になるとは…。

emerge --ask --noreplace net-misc/netifrc
cat << "EOF" >> /etc/conf.d/net
config_enp0s18="IPアドレス netmask サブネットマスク brd ネットワークアドレス"
routes_enp0s18="default via Gatewayアドレス"
EOF
cd /etc/init.d
ln -s net.lo net.enp0s18
rc-update add net.enp0s18 default

パスワードの設定をする。

passwd

その他、cronやらsyslogやらをインストールしていく。 今回は、とりあえずrsyslogを選ぶことにした。

emerge --ask app-admin/rsyslog app-admin/logrotate sys-process/cronie sys-fs/e2fsprogs sys-fs/xfsprogs sys-fs/btrfs-progs
rc-update add rsyslog default
rc-update add cronie default
rc-update add sshd default

ブートローダーをインストールする。 GRUB2でいいよね。

emerge --ask --verbose sys-boot/grub:2
grub-install /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg

インストール完了後、chrootを終了して再起動する。

exit
reboot

これで、あとは再起動後のコンソールにログインするだけだ。 なお、インストール後に気付いたのだが、デフォルトではsshdのrootログインが鍵認証のみ許可されている状態なので、ログイン用のユーザ作るなりPermitRootLoginをyesにするなりするといいだろう(ちゃんと運用するならrootでログインさせるべきではないが)。

Gentoo、よくインストールは難しいと言われてたが、情報もそろってるし難易度がそこまで高いという感じではない。 ただ、面倒くさいというのはすごい感じた…。

ちゃちゃっとサーバ作って上になんか乗っけるという感じではないと思う。 少し調べたけど、RHELでいうKickStart的なものもbashスクリプトで記述してやるようだ。 一応、ISOやネットワークブートでのOSのデプロイ自体はできるみたいだけど、Kickstartの構成ファイル記述するのとスクリプト書くの、どっちが楽かなぁ…(´・ω・`)

ただまぁ確かに応用は効くので、大規模なシステムとかで使われてるってのはなんとなく納得がいった。 構成も自動的にインストールするように事前に作っておけばいいだけだし。

小規模なシステム(VM含め、サーバ10台とか)だと、構成頑張るだけのメリットはそんなにないように感じた。