OSSTech株式会社

個人用開発環境サーバーのセットアップ

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 である必要があります。
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