5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Intel NUC に Arch Linux をインストールする

Last updated at Posted at 2020-01-19

はじめに

サーバー立てたいと思ってもSynology NAS の DSM で大抵出来てしまって、それで十分なのですが、
「Linux使えないからそれ使ってるんでしょ?(被害妄想)」って思われるのが悔しかったので、Linuxを用意することにしました。
基本的に管理はSSHで作業することを考えているので、
この記事ではインストールからssh接続出来るところまでを目標とします
また、この記事では Arch 以外の作業を行ってるPCは Windows 10 想定です。
Arch LinuxはWikiが充実しており、インストールについても詳しくwikiに載っています。
この記事の内容とArchWikiの内容に差が大きくあった場合、間違いなくArchWikiの方が新しいので、この記事はArchWikiの補助程度に捉えてください。
インストールする際はArchWikiを第一に参考にしましょう。
インストール中のスクリーンショットは直撮りで見にくいです。

この記事は以下二つを特に大きく参考にしました。
参考: ArchWiki - インストールガイド
参考: Qiita - Arch Linux インストール俺々式完全版

デバイス選定

今回選んだNUCはこちらです。
[Intel NUC 8 Rugged ][(https://www.intel.co.jp/content/www/jp/ja/products/docs/boards-kits/nuc/nuc8rugged-nuc8cchk-cchb.html)
自宅にサーバーを置くことの懸念として、電気代とうるさくなることが大きな理由だったのですが、CPUのTDPが6Wと低くファンレスでファンがうるさいという心配が無くそれが決め手となりました。
Intel NUCキットというとメモリ, ストレージ, OSを自分で用意する必要がある場合が多いですが、こちらの製品はメモリははじめから4GB搭載されており、
ストレージについては64GBのeMMCが搭載されていました。
ストレージについてはさらにM.2接続のSSDを追加することが出来ます。
eMMCというとただ廉価なストレージという印象が先行しますが、多くの場合HDDよりも高速です。
また、eMMC最大の長所としてHDDよりはもちろん、SSDよりも消費電力が低いです。
消費電力を抑えたいサーバー用途としては割と適任だと思います。
64GBもあれば今回は十分なので、SSDは追加せず、eMMCにインストールします。

Arch Linux のインストール

USBメディアの作成

参考: ArchWiki - USB インストールメディア

まずはUSBインストールメディアを作ります。
WSLの dd を使ってできないか模索したのですが、うまくいかなかったので
USB Writer for Windows を使用しました。
インストール不要で使えます。

NUCの下準備

まず、NUCのUEFI画面に入ります
NUCに NUCの電源を入れてスプラッシュ画面が表示されたらF2キーを押します。

UEFIが起動したら[bootタブ] → [Secure boot] → [Disabled]を選択

IMG_4956.JPG

Secure Boot をオフにする
参考: Intel - Support

また、UEFI Boot はEnabled、Legacy Boot はDisabled になっていることを確認します。
これらが上記になっていない場合BIOSブートします。
BIOSブートでも問題ありませんが、この記事ではUEFIブートでインストールすることを前提にします。
F10を押して保存して再起動します。
1度電源を落としてUSBインストールメディアを接続して起動します。
つける時と同様に電源ボタンを短く押せば電源を落とせます。

次の画面が表示されれば、UEFIブートに成功しています。
IMG_4957.JPG
このboot画面でeキーを押して末尾に nomodeset を追記して Enter で起動します。
(末尾には ctrl + e か、 End キーを押せば一発で飛べます)
nomodeset を付け足さないと、画面が真っ暗で何も表示されませんでした。
参考: Arch Linuxとの格闘 第2ラウンド
もし、画面真っ暗で起動してしまった場合、何も見えない中でも shutdown -h now と入力してEnter押すとシャットダウン出来ます。
画面が映っていないだけで、正常に起動出来ています。
まだ、何もインストールしていないので、普通に本体の電源ボタンを押して電源を落としても良いでしょう。

USBからArch Linuxが起動したら何もせずともrootとしてログインされることでしょう。
ここでまた

# ls /sys/firmware/efi/efivars

を実行して、UEFIモードで起動出来ているか確認出来ます。

パーティションの設定

参考: ArchWiki - EFI システムパーティション

UEFI ブートではいつでも GPT を使うことが推奨されます。

2GB 以上の物理 RAM を持っているなら、スワップパーティションがないほうが一般的に良いパフォーマンスを発揮すると思われます。
ArchWiki - パーティショニング

とあるので、パーティションテーブルはGPT、swapパーティションは作りません。

マウントポイント パーティション パーティションタイプ 容量
/mnt/boot /mmcblk0p1 EFIシステムパーティション 512MB
/mnt /mmcblk0p2 Linux filesystem 残り全て

でパーティションを作ります。

# fdisk -l
# gdisk /dev/mmcblk0

image.png

eMMCのストレージは mmcblk0 と表示されています。
ここに表示されている sda はインストール先のストレージでは無くて、USBインストールメディアです。
もし、SSDを追加した場合はその分表示が変わっているはずなので、読み変えてください。
n でパーティションを作成中に

Hex code or GUID (L to show codes, Enter = '8300'):

と表示されます。ここのコードでパーティションタイプを選択します。
EFIシステムパーティションef00
Linux filesystem はデフォルトの 8300
別のパーティションを作る場合、書いてあるとおり L で一覧を表示できるので、それを参考にしましょう。

image.png
image.png

最終確認が出ますので、 y で進めて The operation has completed successfully. が表示されればOKです。
続いてパーティションが分けられたことを確認して、フォーマット、マウントします。

# lsblk

image.png

# mkfs.fat -F32 /dev/mmcblk0p1
# mkfs -t ext4 /dev/mmcblk0p2
# mount /dev/mmcblk0p2 /mnt
# mkdir /mnt/boot
# mount /dev/mmcblk0p1 /mnt/boot

ネットワーク設定

# ip link
# ping archlinux.jp
# systemctl start dhcpcd@enp2s0.service
# ping archlinux.jp
# systemctl enable dhcpcd@enp2s0.service

image.png

時刻設定

# timedatectl set-ntp true
# timedatectl status

ArchWiki - 時刻

インストール

本当に必要最低限のものだけインストールします。
これだけでは当たり前のように足りないのですが、それらは必要になり次第 pacman でインストールします。

# pacstrap /mnt base linux linux-firmware

システムの設定

fstab

# genfstab -U /mnt >> /mnt/etc/fstab

chroot

# arch-chroot /mnt

chroot した後、インターネットに繋がらなくなるので、再度

# systemctl start dhcpcd@enp2s0.service

タイムゾーン

# timedatectl set-timezone Asia/Tokyo
# hwclock --systohc --utc
# timedatectl status

ロケール

# pacman -S vim
# vim /etc/locale.gen
en_US.UTF-8 UTF-8 と ja_JP.UTF-8 UTF-8 のコメントアウトを外す
# locale-gen
# echo LANG=en_US.UTF-8 > /etc/locale.conf

ホスト名

# echo MYHOSTNAME > /etc/hostname
# vim /etc/hosts
127.0.0.1	localhost
::1		localhost
127.0.1.1	MYHOSTNAME.localdomain	MYHOSTNAME

rootのパスワード

# passwd

ブートローダー

参考: ArchWiki - systemd-boot

ブートローダーは systemd-boot をインストールします。
GRUB も比較的使われていると思います。
GRUB はUEFI、BIOS共に実行出来ますが、 Systemd-boot はUEFIのみです。

インストールおよび更新設定

# bootctl --path=/boot install
# bootctl update
# mkdir /etc/pacman.d/hooks
# vim /etc/pacman.d/hooks/systemd-boot.hook
/etc/pacman.d/hooks/systemd-boot.hook
[Trigger]
Type = Package
Operation = Upgrade
Target = systemd

[Action]
Description = Updating systemd-boot
When = PostTransaction
Exec = /usr/bin/bootctl update

ローダー追加と設定

# vim /boot/loader/loader.conf
/boot/loader/loader.conf
console-mode 1
default  arch
timeout  4
editor   no

console-mode 1 はHiDPI対応です。実際に設定してみて、自身の環境で見やすい値を設定してください。
ArchWiki - HiDPI

# pacman -S intel-ucode
# vim /boot/loader/entries/arch.conf
/boot/loader/entries/arch.conf
title   Arch Linux
linux   /vmlinuz-linux
initrd  /intel-ucode.img
initrd  /initramfs-linux.img
options root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx rw nomodeset

loader.confdefault で設定した文字列とentriesに追加したファイルの .conf を除いた文字列が一致するようにしましょう。
options で指定する LABEL や UUID は lsblk -f で確認出来ます。
参考: shioleap blog - ArchLinuxのブートローダーはsystemd-bootが便利
ラベルの設定仕方分からなかったので、UUIDで設定しました。
もし、boot画面でdefaultが別の物になってしまった場合、カーソルを合わせて、 d を押す事で切り替え出来ます。

再起動

# exit
# shutdown -h now

電源が切れたらUSBメモリを抜いて、再起動 user は root password は先ほど設定したものを入力してログイン。

ユーザーの設定

# pacman -S sudo
# useradd -d /home/MYUSERNAME -s /bin/bash -m MYUSERNAME
# passwd MYUSERNAME
# usermod -aG wheel MYUSERNAME
# EDITOR=vim visudo

# %wheel ALL=(ALL) ALL のコメントアウトを外す

参考: ArchWiki - Sudo

sshの設定

参考: ArchWiki - Secure Shell
参考: ArchWiki - SSH 鍵
参考: Qiita - SSHの公開鍵認証設定をする

# pacman -S openssh
# echo 'AllowUsers MYUSERNAME' >> /etc/ssh/sshd_config
# echo 'PermitRootLogin no' >> /etc/ssh/sshd_config
# systemctl start sshd.service
# ip address

これでssh接続出来るようになったはずなので、sshクライアントとなるPCから ssh MYUSERNAME@192.168.1.x で接続出来ることを確認。
確認出来たら、切断して

クライアントPCで

> ssh-keygen -t ed25519
> ssh-add ~\.ssh\id_ed25519
> scp ~\.ssh\id_ed25519.pub MYUSERNAME@192.168.1.x:

arch に先ほど作成したユーザーでログインするとホームディレクトリ直下に公開鍵があるはずです。

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ cat ~/id_ed25519.pub >> ~/.ssh/authorized_keys
$ rm ~/id_ed25519.pub
$ chmod 400 ~/.ssh/authorized_keys
$ sudo vim /etc/ssh/sshd_config
PasswordAuthentication no
PermitEmptyPasswords no

の行のコメントアウトを外します。

ChallengeResponseAuthenticationPort などを設定しても良いでしょう。

再度クライアントPCで

> code ~\.ssh\config
Host MYHOSTNAME
    HostName 192.168.1.x
    User MYUSERNAME
    IdentityFile ~/.ssh/id_ed25519
    Port 22

と設定し、

> ssh MYHOSTNAME

とすれば、公開鍵認証で、ssh接続できるはずです。

これでついに、NUCからキーボードとHDMIを外せます…

おまけ

Windows の SSH

PowerShell で有効化は

 Get-WindowsCapability -Online | ? Name -Match ssh


Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

> Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

scoopchocolatey でもインストールできます。インストールされるのはたぶんこれ
wsl でもできるはずですけど、ssh-agentには ssh-agent-wslというものが別途必要になるらしいです。
Windowsの機能として用意され始めたのでこれから先は Add-WindowsCapability で入れるのが安定になってくるように思います。

参考: Microsoft Docs - Windows Server 2019 および Windows 10 用 OpenSSH のインストール

Windows の ssh-agent

ssh-agent の設定はこちらの記事が分かりやすかったです。
参考: Qiita - Windows 10のssh-agentをコマンド プロンプト、WSL、Git Bashで使ってみた

sc config ssh-agent start=auto
sc start ssh-agent

ですが、今ならPowerShellで上記コマンドと同じことが以下で出来ます。

Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent

参考: Microsoft Docs - OpenSSH キーの管理

pacman

  • インストール
pacman -S PKGNAME
pacman --sync PKGNAME
  • 検索
pacman -Ss PKGNAME
pacman --sync --search PKGNAME
  • アップデート
pacman -Syu
pacman --sync --refresh --sysupgrade
  • アンインストール
pacman -R PKGNAME
pacman --remove PKGNAME

検索すると省略系ばかりがヒットしてなんて覚えにくいんだって思ってたのですが、
-h で見てみると基本的に省略しない形式が載っていて、オプションの意味も分かりやすかったです。
アンインストール時に pacman -Rns とする場合があるのも、

pacman --remove --nosave --recursive

の意味なので、キャッシュを残さず、再帰的に依存関係も削除していくのだとわかります。

$ pacman -S -h
usage:  pacman {-S --sync} [options] [package(s)]
options:
  -b, --dbpath <path>  set an alternate database location
  -c, --clean          remove old packages from cache directory (-cc for all)
  -d, --nodeps         skip dependency version checks (-dd to skip all checks)
  -g, --groups         view all members of a package group
                       (-gg to view all groups and members)
  -i, --info           view package information (-ii for extended information)
  -l, --list <repo>    view a list of packages in a repo
  -p, --print          print the targets instead of performing the operation
  -q, --quiet          show less information for query and search
  -r, --root <path>    set an alternate installation root
  -s, --search <regex> search remote repositories for matching strings
  -u, --sysupgrade     upgrade installed packages (-uu enables downgrades)
  -v, --verbose        be verbose
  -w, --downloadonly   download packages but do not install/upgrade anything
  -y, --refresh        download fresh package databases from the server
                       (-yy to force a refresh even if up to date)
      --arch <arch>    set an alternate architecture
      --asdeps         install packages as non-explicitly installed
      --asexplicit     install packages as explicitly installed
      --assume-installed <package=version>
                       add a virtual package to satisfy dependencies
      --cachedir <dir> set an alternate package cache location
      --color <when>   colorize the output
      --config <path>  set an alternate configuration file
      --confirm        always ask for confirmation
      --dbonly         only modify database entries, not package files
      --debug          display debug messages
      --disable-download-timeout
                       use relaxed timeouts for download
      --gpgdir <path>  set an alternate home directory for GnuPG
      --hookdir <dir>  set an alternate hook location
      --ignore <pkg>   ignore a package upgrade (can be used more than once)
      --ignoregroup <grp>
                       ignore a group upgrade (can be used more than once)
      --logfile <path> set an alternate log file
      --needed         do not reinstall up to date packages
      --noconfirm      do not ask for any confirmation
      --noprogressbar  do not show a progress bar when downloading files
      --noscriptlet    do not execute the install scriptlet if one exists
      --overwrite <path>
                       overwrite conflicting files (can be used more than once)
      --print-format <string>
                       specify how the targets should be printed
      --sysroot        operate on a mounted guest system (root-only)

$ pacman -R -h
usage:  pacman {-R --remove} [options] <package(s)>
options:
  -b, --dbpath <path>  set an alternate database location
  -c, --cascade        remove packages and all packages that depend on them
  -d, --nodeps         skip dependency version checks (-dd to skip all checks)
  -n, --nosave         remove configuration files
  -p, --print          print the targets instead of performing the operation
  -r, --root <path>    set an alternate installation root
  -s, --recursive      remove unnecessary dependencies
                       (-ss includes explicitly installed dependencies)
  -u, --unneeded       remove unneeded packages
  -v, --verbose        be verbose
      --arch <arch>    set an alternate architecture
      --assume-installed <package=version>
                       add a virtual package to satisfy dependencies
      --cachedir <dir> set an alternate package cache location
      --color <when>   colorize the output
      --config <path>  set an alternate configuration file
      --confirm        always ask for confirmation
      --dbonly         only modify database entries, not package files
      --debug          display debug messages
      --disable-download-timeout
                       use relaxed timeouts for download
      --gpgdir <path>  set an alternate home directory for GnuPG
      --hookdir <dir>  set an alternate hook location
      --logfile <path> set an alternate log file
      --noconfirm      do not ask for any confirmation
      --noprogressbar  do not show a progress bar when downloading files
      --noscriptlet    do not execute the install scriptlet if one exists
      --print-format <string>
                       specify how the targets should be printed
      --sysroot        operate on a mounted guest system (root-only)
5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?