個人用開発環境サーバーのセットアップ
2022-06-07 - 鈴木 慶太
サーバーセットアップ
インストールメディアの作成
書き込みソフトのインストール
etcherをインストールします https://www.balena.io/etcher/
インストールディスクをダウンロード
- archlinux-x86_64.iso をダウンロード
https://ftp.jaist.ac.jp/pub/Linux/ArchLinux/iso/latest/
- etcher で、インストールイメージをUSBメディアに書き込みます。
etcherの操作
- Flash from file からダウンロードしたISOファイルを選択
- USBドライブを選択
- flash を選択
- 終了したらドライブをサーバーに挿してUSBブート
- 今回のサーバーは起動時にDEL連打でUEFIシェルに入れました
UEFIシェルの設定
- Secure boot を無効化します
Arch Linuxのインストール
パーティション構成
OSSTechでは、ドライブを暗号化することになっているので、パーティションの暗号化も行います
- EFIブートパーティションは暗号化されません
- EFIパーティション(/boot配下)にパスワード等の重要なファイルを置かないように気をつけてください。
- LUKS on LVM でファイルシステムを構成します
- ブロックデバイスを暗号化してからLVM(論理パーティション)を作成します
パーティションレイアウト
パーティションは以下のように構成します
- SSD
容量 | パーティション |
---|---|
512MB | /boot (EFI) |
残り | / |
- HDD
容量 | パーティション |
---|---|
すべて | /vault |
SSDのフォーマット
gdiskを利用し、パーティションを作成します
gdisk /dev/nvme0n1
既存のパーティションをすべて削除します。
Command (? for help): d
No partitions
GPT でパーティショニングします。MBRは2TBまでしか認識できないので、今どきはGPTでパーティショニングする必要があります。
Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y
新しいパーティションを作成します。
まずはブートに利用するEFI用のパーティションを作成します。
Command (? for help): n
Partition number (1-128, default 1): (空欄でEnter)
First sector (34-7814037134, default = 2048) or {+-}size{KMGTP}: (空欄でEnter)
Last sector (2048-7814037134, default = 7814037134) or {+-}size{KMGTP}: +512M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): EF00
Changed type of partition to 'EFI System'
続いて、OSのインストールに利用するLVM用のパーティションを作成します。
Command (? for help): n
Partition number (1-128, default 2): (空欄でEnter)
First sector (34-7814037134, default = 2048) or {+-}size{KMGTP}: (空欄でEnter)
Last sector (2048-7814037134, default = 7814037134) or {+-}size{KMGTP}: (空欄でEnter)
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8e00
Changed type of partition to 'Linux LVM'
以下のように2つのパーティションのみになっている事を確認します。
Command (? for help): p
Number Start (sector) End (sector) Size Code Name
1 2048 1050623 512.0 MiB EF00 EFI system partition
2 1050624 3907028991 1.8 TiB 8E00 Linux LVM
変更を書き込みます
Command (? for help): w
Do you want to proceed? (Y/N): Y
HDDのフォーマット
gdisk /dev/sda
既存のパーティションをすべて削除します。
Command (? for help): d
No partitions
GPT でパーティショニングします。
Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y
新しいパーティションを作成します。 システムから参照する、データ保存用のLVMパーティションを作成します。
Command (? for help): n
Partition number (1-128, default 1): (空欄でEnter)
First sector (34-7814037134, default = 2048) or {+-}size{KMGTP}: (空欄でEnter)
Last sector (2048-7814037134, default = 7814037134) or {+-}size{KMGTP}: (空欄でEnter)
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 8e00
Changed type of partition to 'Linux LVM'
以下のように1つのパーティションのみになっている事を確認します。
Command (? for help): p
Number Start (sector) End (sector) Size Code Name
1 2048 3907028991 1.8 TiB 8E00 Linux LVM
変更を書き込みます
Command (? for help): w
Do you want to proceed? (Y/N): Y
EFIパーティションのフォーマット
EFIパーティションは暗号化しないため、そのままフォーマットします
mkfs.vfat -n EFI /dev/nvme0n1p1
システムパーティションの暗号化
パーティションの暗号化
システムパーティションとデータ保存用のパーティションを暗号化します。
- SSD
cryptsetup luksFormat /dev/nvme0n1p2
Are you sure? (Type uppercase yes): YES
Enter passphrase for /dev/nvme0n1p2: パスワードを作成
Verify passphrase: パスワードを再入力
- HDD
cryptsetup luksFormat /dev/sda1
Are you sure? (Type uppercase yes): YES
Enter passphrase for /dev/sda1: パスワードを作成
Verify passphrase: パスワードを再入力
パスワードが設定されたか確認
情報が表示されることを確認します
cryptsetup luksDump /dev/nvme0n1p2
cryptsetup luksDump /dev/sda1
luksで暗号化してないため、EFIパーティションは動作しません
cryptsetup luksDump /dev/nvme0n1p1
作成済みの暗号化パーティションを名前をつけて開く
cryptsetup luksOpen /dev/nvme0n1p2 system
Enter passphrase for /dev/nvme0n1p2: 指定したパスワード
cryptsetup luksOpen /dev/sda1 data
Enter passphrase for /dev/sda1: 指定したパスワード
lvmの作成
物理パーティションの作成
LVM用のパーティションを作成します
pvcreate /dev/mapper/system
pvcreate /dev/mapper/data
ボリュームグループの作成
ボリュームグループを作成します
- 2つのディスクも合体させられますが、以下の二点の理由によりやりません
- ディスクのどちらかが壊れた時につらい
- せっかくSSDなのにHDDがボトルネックになる
vgcreate vg-system /dev/mapper/system
vgcreate vg-data /dev/mapper/data
論理パーティションの作成
SSDではスワップは作成しないのが推奨なので、ルーとパーティションとブートパーティションのみ作成します
- homeは開発サーバーで必要になったことないのと、homeの容量不足になる等、あって邪魔だった事しかないので、パーティションは分離しません。
lvcreate -l 100%FREE vg-system -n root
lvcreate -l 100%FREE vg-data -n data
論理パーティションのフォーマット
論理パーティションをフォーマットします。
mkfs.ext4 /dev/vg-system/root
mkfs.ext4 /dev/vg-data/root
作成した論理パーティションのマウント
作成したパーティションを、 /mnt にマウントします
mount /dev/vg-system/root /mnt
ブートパーティションを、インストールしたOSの /boot となる /mnt/boot にマウントします。
mkdir -p /mnt/boot
mount /dev/nvme0n1p1 /mnt/boot
データ保存用ディスクを /mnt/vault にマウントします。
mkdir -p /mnt/vault
mount /dev/vg-data/data /mnt/vault
ベースシステムをインストール
pacstrap を利用して、OSのベースシステムをインストールします。
* 論理パーティションを利用するため、 lvm2
パッケージも必要となります。
pacstrap /mnt base base-devel linux linux-firmware lvm2
fstabの作成
パーティション情報の出力
現在のパーティションのマウント状態を、/etc/fstab に保存し、起動時に読み込むようにします。
genfstab -U -p /mnt >> /mnt/etc/fstab
中身を確認し、意図したパーティション構成になっているか確認する
cat /mnt/etc/fstab
# Static information about the filesystems.
# See fstab(5) for details.
# <file system> <dir> <type> <options> <dump> <pass>
# /dev/mapper/vg--system-root
UUID=<UUID値> / ext4 rw,relatime 0 1
# /dev/nvme0n1p1 LABEL=EFI
UUID=<UUID値> /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8.errors=remount-ro 0 2
# /dev/mapper/vg--data-data
UUID=<UUID値> /vault ext4 rw,relatime 0 2
chroot
インストールしたシステムにchrootし、OSのセットアップを行います。 * chroot をすることで、実質的にインストールしたシステムのrootでログインした状態となります
arch-chroot /mnt /bin/bash
エディタのインストール
デフォルトではエディタも用意されていないため、エディタをインストールします * neovim派なので、neovimをインストールします
pacman -S neovim
ロケール設定
ロケール設定をやらないと、インストール完了後のOSでの言語環境が空となり、以降のソフトで正常に動作しなくなります
ロケールファイルの生成
利用する言語をコメント解除します
nvim /etc/locale.gen
- en_US.UTF-8 UTF-8
- ja_JP.UTF-8 UTF-8
その後、以下のコマンドを実行し、ロケール設定を生成します
locale-gen
デフォルト言語の設定
システムのデフォルト言語を設定します。
echo LANG=C.UTF-8 > /etc/locale.conf
export LANG=C.UTF-8
時計の設定
タイムゾーンと時刻を設定します。
timedatectl set-ntp true
ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
hwclock --systohc --utc
ホスト名の命名
適当なホスト名を指定します
echo <hostname> > /etc/hostname
initramの作成
必要なフックの追加
luksによるストレージの暗号化を行ったため、 initram
の処理で encrypt フックがないとストレージが復号化されなくなります
また、暗号化パーティションでLVMを利用するため、 lvm2
フックがないとパーティションの内容を読み取れなくなります
nvim /etc/mkinitcpio.conf
- HOOKS=“base systemd modconf keyboard block encrypt lvm2 filesystems fsck”
initramの生成
mkinitcpio -p linux
CPUのマイクロコードをインストール
サーバーのCPUはRyzenであるため、AMDの最新の命令コードをインストールします
pacman -S amd-ucode
systemd-bootのインストール
ブートローダーのインストール
EFIに、systemd-bootのブートローダーをインストールします
bootctl install
ブートエントリーの作成
/boot/loader/entries/ 配下に設定を作成します。
- /boot/loader/entries/arch.conf
- AMDは不要ですが、マイクロコードは最初の
initrd
である必要があります。
- AMDは不要ですが、マイクロコードは最初の
title Arch Linux
linux /vmlinuz-linux
initrd /amd-ucode.img
initrd /initramfs-linux.img
options cryptdevice=UUID=<ROOT-PARTITION-UUID>:root root=/dev/vg-system/root quiet rw acpi_backlight=vendor
UUIDは以下の方法で確認可能です
blkid
rootパスワードの設定
適当なパスワードを設定します、設定しない場合ログインできなくなります
passwd
動作の確認
chroot環境を抜けます
exit
再起動し、正常にOSが起動できることを確認します
reboot
正常に起動ができたら、必要なパッケージのインストールを行います
ネットワーク設定
systemd-networkd
systemd-networkd
を利用して、ネットワークに接続します
有線での設定を作成します
ip a
ネットワークデバイスがどのような名前で認識されているか確認します * 今回は enp2s0 の名前で認識されていました
1: lo: <LOOPBACK,UP,LOWER UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid lft forever prefferd lft forever
inet6 ::1/128 scope host
valid lft forever prefferd lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER UP> mtu 1500 qdisc fq codel state UP group default qlen 1000
設定を作成します
- /etc/systemd/network/20-wired.network
[Match]
Name=enp2s0
[Network]
Address=<サーバーのIPのCIDR表記>
Gateway=<ルーターのIPアドレス>
DNS=<DNSキャッシュサーバーのIPアドレス>
サービスを起動します
systemctl enable systemd-networkd
systemctl start systemd-networkd
名前解決のため、 systemd-resolved
も起動します
systemctl enable systemd-resolved
systemctl start systemd-resolved
諸々のパッケージのインストール
シェル環境
pacman -S openssh zsh fzf powerline powerline-fonts
systemctl enable openssh
仮想化環境
仮想化環境のため、以下のソフトウェアをインストールします。
pacman -S docker docker-compose vagrant qemu libvirt dnsmasq nftables
systemctl enable docker
systemctl enable dnsmasq
systemctl enable libvirtd
systemctl enable nftables
日本語環境
pacman -S fcitx-im fcitx-configtool fcitx-mozc otf-ipafont noto-fonts
KDE
pacman -S plasma-desktop sddm sddm-kcm lxterminal kwallet-pam gnupg xorg-server
ディスプレイマネージャーを自動的に起動するよう設定します
systemctl enable sddm
実際に起動し、GUIが利用できることを確認します
systemctl start sddm
VNCのインストール
リモートから社内環境にGUIでアクセスするため、VNCサーバーをインストールします
pacman -S tigervnc
ユーザー権限で以下の操作を実行します
systemctl --user enable vncserver@:1