読者です 読者をやめる 読者になる 読者になる

Gentoo Linux から Arch Linux に乗り換え

Gentoo LinuxKVMホストをArch Linuxに移行したので備忘録として環境構築手順の記録。

ほぼwikiのままなのであまり役には立たないかも。

乗り換えの動機について

  • 依存関係を解決するためにemerge -auDN @worldは正直しんどい
  • Arch Linuxwiki サイトのお世話になる頻度が増えている
  • あんまりカスタマイズしてない
  • さすがにそろそろsystemd...…
  • Gentooは妙なところで保守的すぎる

正直なところ、SSDへの負荷を軽減するためとはいえtmpfs に4GB - 8GBも割り当てるのは無駄な気がしたので…。 Arch LinuxKVMゲストとして利用しているのでインストールはこれが二度目。

システム構成など

5年前に自作したAMD Phenome II マシンをGentooからArch に移行させる。 マザーボードが古いので、UEFIもGPTも関係なし。BIOSMBRパーティションのレガシー環境。ネットワーク接続は有線LAN。

ハードウェア構成

  • CPU: AMD Phenom(tm) II X4 955(3.2GHz))
  • Mem: 24GB
  • 128GB SSD x1
  • 64GB SSD x1
  • 1TB HDD x1

最新機種には見劣りするけどまだまだ十分な性能。

基本的な方針としてKVM環境まで構築する。ややこしいことはKVM上のゲストの方で行うことにして、極力シンプルに。

準備

インストーラの入手

ダウンロードサイト から日本のミラーサイトを探して'archlinux*-dual.iso'をダウンロード。

md5コマンドでチェックサムを確認したのち、ddコマンドでUSBメモリにインストールイメージを書き込む*1

事前に書き込み先のUSBメモリはアンマウントしておかないと'device busy...' で怒られる。

Mac OSなので以下のようにした。disk2 は環境に応じて変更する。

# dd bs=4096 if=archlinux.iso of=/dev/disk2
# sync

日本語版Wikiをよく読むとbs=8192とありますが、問題なくインストール完了。*2

USBフラッシュメモリのLEDが消えるまで少し待ってから取り外す。 Arch Linux の英語版Wikiを読むと、Macの場合はdiskXではなくrdiskXにした方が速いと 書いてある。なので以下のようにするとより短時間で完了かも。

# dd bs=8192 if=archlinux.iso of=/dev/rdisk2
# sync

インストール

ASUSマザーなのでF8で起動デバイスを切り替え。x86_64でインストールを開始。

ひとまずキーボード設定と、ssh接続のためにrootユーザのパスワードを設定しておく。

キーマップ設定とrootパスワード

# loadkeys jp106
# passwd

リモート接続(sshd)

webを見ながら作業できるように、sshdを起動してリモートログイン。

# systemctl start sshd

IPアドレスを確認してssh -l root ...で接続して設定作業を続ける。

パーディション構成

  • /boot:  256MB( boot flag をつける)
  • / :  残り全部
  • swap :  設定しない

fdiskで適当にsdaのみ設定する。残りのディスクは以前のデータをそのまま残すので触らない。 sdb、sdcはフォーマットせずに後で適当なところにマウントする。

ファイルシステムの作成

/bootをext2とし、ルートパーティションはXFSにしてみる。

# mkfs.ext2 /dev/sda1
# mkfs.xfs /dev/sda2

フォーマット済み云々でエラーが出るならmkfs.xfsに'-f' をつける。

# mount -t auto /dev/sda2 /mnt
# mkdir /mnt/boot
# mount -t auto /dev/sda1 /mnt/boot

ベースシステムの展開

先にmirrorlistを編集しておく。

# vi /etc/pacman.d/mirrorlist

jaist筑波大学ミラーサイトを先頭に持ってくる。

下記のコマンドでベースシステムを展開する。

# pacstrap /mnt base base-devel

choroot

fstabを生成したら新しい環境にchrootする。この辺はGentooと同じ要領。

# genfstab -p /mnt >> /mnt/etc/fstab
# arch-chroot /mnt

hostname

# echo <hostname> >>  /etc/hostname

<hostname> は任意のホスト名。

TimeZone

# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

locale

en_US.UTF-8、ja_JP.UTF-8 という行のコメントを外す。この辺りはGentooと大差なし。

# vi /etc/locale.gen
# locale-gen

キーマップ(vconsole)設定

# vi /etc/vconsole.conf
KEYMAP=JP106

ネットワーク設定

dhcp用の設定になっているので一時的に固定IP設定にする。enp2s0NICのデバイス名。

# vi /etc/systemd/network/enp2s0.network
[Match]
Name=enp2s0

[Network]
DNS=192.168.0.1

[Address]
Address=192.168.0.X/24

[Route]
Gateway=192.168.0.1  

サブネット192.168.0.0/24 の設定。X は設定したいIPアドレスに合わせて変更。 起動時に有効になるようにしておく。

# systemctl enable systemd-networkd.service

resolve.conf

# vi /etc/resolve.conf
nameserver 192.168.0.1

initramfs

initramfs を作成する。念のためxfsモジュールを追加しておく。

# vi /etc/mkinitcpio.conf

修正箇所は一行のみ。

MODULES="xfs"

あとはwikiの通り。

# mkinitcpio -p linux

パスワードの再設定

chroot 環境なのでもう一度rootのパスワードを設定する。

# passwd
<skip>

ブートローダ

BIOS+MBR環境なので何も考えなくてOK.

# pacman -S grub
# grub-install /dev/sda
# grub-mkconfig -o /boot/grub/grub.cfg

再起動

chroot環境から抜ける。

# exit

chrootから抜けた状態(USBメモリからブートした環境)で以下のコマンドを実行。

# unmont -R /mnt
# reboot

再起動後の設定あれこれ

sshd

何はともあれssh

# pacman -S openssh
# systemctl enable sshd
# systemctl start sshd

追加パッケージetc.

# pacman -S tmux ruby vim git openntpd wget

ユーザの追加

# useradd -m  -g users -G wheel <user-name>
# passwd <user-name>

そのほか

不便なのでalias を設定しておく。

alias vi='vim'

SSD関連の設定

fstrimをインストールする。

# pacman -S fstrim

まずは手動で一度は実行しておく。

# fstrim -v /
/: 109.6 GiB (117669027840 bytes) trimmed

systemdで面倒見てくれるようなので、fstrim.timerを有効化。週1回実行される。

# systemctl enable fstrim.timer
Created symlink from /etc/systemd/system/multi-user.target.wants/fstrim.timer to /usr/lib/systemd/system/fstrim.timer.
# systemctl start fstrim.timer

c.f. https://github.com/karelzak/util-linux/blob/master/sys-utils/fstrim.timer

KVM

カーネル再構築とかはなし。仮想スイッチとかややこしいことはやらない。

# pacman -Syu
# pacman -S qemu libvirt
resolving dependencies...
:: There are 4 providers available for libgl:
:: Repository extra
   1) mesa-libgl  2) nvidia-304xx-libgl  3) nvidia-340xx-libgl  4) nvidia-libgl

Enter a number (default=1): 1
looking for conflicting packages...
<skip>

pacman がlibglについて問い合わせてくるので、とりあえずmesaを選択する。

以下のパッケージを追加でインストールしておく。

# pacman -S  ebtalbes dnsmasq dmidecode virt-manager

kvmモジュールの確認

# lsmod | grep kvm
kvm_amd                65536  0
kvm                   446464  1 kvm_amd

何故か勝手にロードされているので、問題なし。

# systemctl start libvirtd
# virsh list --all

まだゲスト未登録なので空のリストが出力される。エラーが出ていなければひとまずOK.

ブリッジの設定

せっかくなのでsystemd−networkd に任せてみる。

# pacman -S bridge-utils

ネットワークデバイスを再起動する必要がるので、ローカルのコンソールで作業する。

まず、現状のEthernet設定をどこか適当なところにバックアップする。 enp2s0 は環境に応じて置き換える。

# cp /etc/network/enp2s0.network /root

パケットのフォワード設定を有効にしておく

echo 1 >/proc/sys/net/ipv4/ip_forward

設定の永続化。

vi /etc/sysctl.d/99-sysctl.conf
sysctl net.ipv4.ip_forward=1

Ethernetバイスの設定を書き換える。

# vi /etc/network/enp2s0.network
[Match]
Name=enp2s0

[Network]
Bridge=br0

続いて、ブリッジ接続用のデバイスを作る。

# vi /etc/systemd/network/br0.netdev
[NetDev]
Name=br0
Kind=bridge
# vi /etc/systemd/network/br0.network
[Match]
Name=br0

[Network]
DNS=192.168.0.1

[Address]
Address=192.168.0.24/24

[Route]
Gateway=192.168.0.1

Arch LinuxWikiを見るとセクションを分ける必要はないかも。

systemd-netwokd をリスタートしても上手くいかなかったので潔く再起動。 pingで接続確認。たぶんsystemctl daemon-reloadすれば再起動しなくてもいいかと思う…。

libvirt

一般ユーザでもlibvirt関連の操作を行えるようにする。

# groupadd libvirt
# gpasswd  -a <user name> libvirt
vi /etc/libvirt/qemu.conf

下記の2箇所のコメントを外す。

12: vnc_listen = "0.0.0.0"
353: hugetlbfs_mount = "/dev/hugepages"
# vi /etc/libvirt/libvirtd.conf

同じ要領で。

 90: unix_sock_group = "libvirt"
 97: unix_sock_ro_perms = "0777"
107: unix_sock_rw_perms = "0770"
138: auth_unix_ro = "none"
147: auth_unix_rw = "none"

SSDを/var/lib/libvirt/filesystems にマウントする。

# mount -t auto  /dev/sdc1 /var/lib/libvirt/filesystems
# systemctl enable libvirtd
Created symlink from /etc/systemd/system/multi-user.target.wants/libvirtd.service to /usr/lib/systemd/system/libvirtd.service.

ゲストのimport

既存の仮想ディスクからゲストを再構築する。

# virt-install --import --virt-type kvm  --name ArchLinux  
  --disk path=/var/lib/libvirt/filesystems/archlinux.img --network=default \
  --graphics vnc,listen=0.0.0.0 --noautoconsole -\
  -os-type linux --vcpus 2 --memory 1024 
Starting install...
Creating domain...                                          |    0 B  00:00
Domain creation completed.

ゲストの起動

# virsh start ArchLinux

ひとまずこれで仮想マシンの起動まで成功。ゲストにsshできたのでOKとする。

Todo

  • Hugepage をちゃんと設定する
  • パラメータの調整?

参考にしたサイト

*1:Arch Linux のisoはそのままUSBメモリに書き込めば起動できる。

*2:インストールしてから気がつきましたが…