Gentoo Linux から Arch Linux に乗り換え
スポンサーリンク
Gentoo LinuxのKVMホストをArch Linuxに移行したので備忘録として環境構築手順の記録。
ほぼwikiのままなのであまり役には立たないかも。
乗り換えの動機について
- 依存関係を解決するために
emerge -auDN @world
は正直しんどい - Arch Linux の wiki サイトのお世話になる頻度が増えている
- あんまりカスタマイズしてない
- さすがにそろそろsystemd...…
- Gentooは妙なところで保守的すぎる
正直なところ、SSDへの負荷を軽減するためとはいえtmpfs
に4GB - 8GBも割り当てるのは無駄な気がしたので…。
Arch Linux はKVMゲストとして利用しているのでインストールはこれが二度目。
システム構成など
5年前に自作したAMD Phenome II マシンをGentooからArch に移行させる。 マザーボードが古いので、UEFIもGPTも関係なし。BIOS、MBRパーティションのレガシー環境。ネットワーク接続は有線LAN。
ハードウェア構成
最新機種には見劣りするけどまだまだ十分な性能。
基本的な方針として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
下記のコマンドでベースシステムを展開する。
# 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設定にする。enp2s0
はNICのデバイス名。
# 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>
ブートローダ
# 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
# 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 Linux のWikiを見るとセクションを分ける必要はないかも。
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 をちゃんと設定する
- パラメータの調整?