先日#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台とか)だと、構成頑張るだけのメリットはそんなにないように感じた。