Apple Silicon mac上の仮想環境にArch Linuxをインストールして自宅サーバ構築
May 18, 2025
linux ArchLinux VirtualBox UTM目次
はじめに
Apple Silicon mac上にお手頃なLinuxサーバーを立ててみます。チョイスしたディストリビューションは軽量さとローリングリリースで定評なArch Linux。
あくまでサーバとしての利用を想定しています。従ってデスクトップ環境は入れません。デスクトップもArch Linuxでやってみるなら全て揃っているManjaroでいいかなと。
サーバを稼働させる仮想環境はUTMを使用してみます。Intel Mac時代の仮想環境といえばVirtualbox, VMWare Fusion, Parallelsなどが大勢でしたが、Apple Silicon Macで最もHotな仮想環境はUTMだと思います。UTMは仮想環境でarm64版のOSを動かせるだけでなく、x64版のOSのエミュレートもできるすぐれものです。
UTMのインストール
以下のサイトからUTMをインストール
https://mac.getutm.app/
Securely run operating systems on your Mac
ここからUTMをダウンロードします。あとはインストーラーの指示に従いインストールします。
macのアプリをHomebrewで管理している場合は、
$ brew install --cask utm
これで準備完了です。
Arch Linuxインストーラーの入手
arm64版の最新のArch Linuxインストーラーの入手先は以下のページです。
https://release.archboot.net/aarch64/latest/iso/
ここにいくつかのisoファイルが置かれていますが、そのうち無印のものをダウンロードします。
archboot-2025.04.19-02.26-6.14.2-1-aarch64-ARCH-aarch64.iso <-これをダウンロード
archboot-2025.04.19-02.26-6.14.2-1-aarch64-ARCH-latest-aarch64.iso
archboot-2025.04.19-02.26-6.14.2-1-aarch64-ARCH-local-aarch64.iso
ダウンロードしたisoファイルに悪意の改変が加えられていないかを確認するため、署名の検証を行います。
https://release.archboot.com/aarch64/latest/b2sum.txt
このファイルをダウンロードし、対象のisoファイルのチェックサムを確認します。
...
BLAKE2b (iso/archboot-2025.04.19-02.26-6.14.2-1-aarch64-ARCH-aarch64.iso) = 8ce02c24c874152cf49d2ea420ab07dc26b77d6c147cec24371e6585c1a9fe72b28836ae2baaea1905f8527b351c46de16fd7c763995905b6c35c09c7d69832d
...
ダウンロードしたisoファイルのチェックサムを確認するために(もし無かったら)b2sumをインストールし、
$ brew install b2sum
チェックサムを計算します。
$ b2sum archboot-2025.04.19-02.26-6.14.2-1-aarch64-ARCH-aarch64.iso
8ce02c24c874152cf49d2ea420ab07dc26b77d6c147cec24371e6585c1a9fe72b28836ae2baaea1905f8527b351c46de16fd7c763995905b6c35c09c7d69832d archboot-2025.04.19-02.26-6.14.2-1-aarch64-ARCH-aarch64.iso
b2sumで計算した値とb2sum.txtに記載された値が一致していたらOKです。
Arch Linux仮想マシンの作成
UTMでArch Linuxが動作する仮想マシンを作成します。
UTMを起動し、「新規仮想マシンを作成」をクリック。
「仮想化」を選択。
「Linux」を選択。
起動isoイメージを指定。前節でダウンロードしたインストーラーisoファイルを指定。
仮想マシンのメモリを指定。使い方にもよりますが、2GB〜4GB程度でいいでしょう。
ストレージ量は必要な分だけ。メモリのスワップ分も考慮に入れて決めてください。64GBにしました。
共有ディレクトリは今回はパス。
名前をArchLinuxに変更しました。一通り設定できたので保存。
左側の仮想マシンリストの中から作成した仮想マシンを右クリックして「編集」
追加設定ができます。「保存」クリックで設定完了。
再生ボタンをクリックすると仮想マシンが起動します。
Arch Linuxのインストール
UTMのArchLinux仮想マシンの再生ボタンをクリックすると、EFI画面があらわれます。ここで「*Archboot - Arch Linux AA64」を選択。
初回起動時のセットアップ画面が表示されます。ここでCTRL-Cをクリックするとbashに落ちます。bashから全てコマンドでセットアップを続けていくことも可能ですが、今回はインストーラーに付属しているsetupを使うことにします。CTRL-Cを入力せずに、ENTERを入力します。
まずはLocaleの設定をします。ここでえはJapaneseが選択できないのでEnglishにしておきます。
「Network Interface」の設定。そのまま進みます。
以下同じような感じでセットアップが続きます。
以下のような構成でインストールしていくことにします。
メモリ 4GB
ストレージ: 64GB
/ 24GB
SWAP 8GB
/Home 32GB
Network Profile Name: デフォルトのまま
Network Configuration: Do you want to use DHCP?
インストール時はDHCPを有効にしておいて、サーバとして運用する場合は後で固定IPに変更することにします。
Proxy Server: デフォルトのまま
Summary: 提示されたまま
Package Mirror: 「http://tw.mirror.archlinuxarm.org 」を選択し
「http://jp.mirror.archlinuxarm.org 」は何故か稼働していませんでした。そこで次に近そうな台湾のサーバを指定しました。応答が悪いサーバでもエラーが出ずに以降のインストールが進んでしまうので、ミラーの選び方は最重要!ミラーの選び方によっては、インストールがうまく出来ず、なにコレってことになってしまうことも。
New Kernel Available …
Launcher Menu: 「1 Launch Archboot Setup」のまま
Setup Menu: 「1 Prepare Storage Device」を選択し
Prepare Storage Device: 「1 Quick Setup (erase the ENTIRE storage device)」を選択し
Storage Device: 「/dev/vda 64G」を選択し
Device Name Scheme: 「PARTUUID PARTUUID=
EFI SYSTEM PARTITION (ESP): 「/boot SINGLEBOOT」を選択し
EFI SYSTEM PARTITION (ESP) in MiB: 512のまま
Swap in MiB: 8192を指定して
仮想マシンのメモリ量の2倍にしておきます。
Filesystem / and /home: 「ext4 Ext4」を選択し
Confirmation:
/ in MiB: 24576に変更し
Confirmation:
/dev/vda will COMPLETELY ERASED!
Setup Menu: 「2 Install Packages」を選択し
Summary:
Setup Menu: 「3 Configure System」を選択し
New root Password: パスワードを設定して
Retype root Password: パスワードを設定して
Text Editor: 「NEOVIM VIM variant for experts」を選択し
MKINITCPIO EARLY USERSPACE: 「BUSYBOX Small and Fast」を選択し
System Configurationで設定ファイルの中身を埋めていくことができますが、これは後で普通に起動した後でも可能なので、ここでは未設定のまま。
User Management: 「1 Set Default Shell」を選択し
Default Shell: 「BASH Standard Base Shell」を選択し
User Management: 「2 Create User Account」を選択し
Create User Account: Enter Username: アカウント名を入力し
Enable <アカウント名> as Administrator and part of wheel
<アカウント名> Account: Enter a comment eg. your Full Name: フルネームを入力し
New user Password: パスワードを設定して
Retype user Password: パスワードを設定して
User Management: 「
System Configuration: 「<Back Return to Main Menu」を選択し
Setup Menu: 「4 Install Bootloader」を選択し
AA64 UEFI Bootloader: 「GRUP_UEFI GRUP(2) for AA64 UEFI」を選択し、< OK >
「You must now review the GRUB(2) configuration file.」が出て< OK >を選択し、Enter押下後、grub.cfgの編集画面に切り替わるので、何も編集せずに終了。
Setup Menu: 「< Exit」を選択し、< OK >
Exit Menu:「3 Poweroff System」を選択し、< OK >
仮想マシンを停止。インストールは完了。
初期セットアップ
まずは仮想マシンからインストーラーisoイメージを抜きます。
UTMのメニューからArchLinux仮想マシンを右クリックして「編集」
ドライブ>USBドライブ>パス
インストーラーISOファイルが指定されているので「消去」をクリック
この仮想マシンをサーバーとして利用する場合は、ネットワークモードを変更しておきます。
ネットワーク>ネットワークモード>共有ネットワーク
を
ネットワーク>ネットワークモード>ブリッジ(詳細)
ネットワーク>仮想ネットワークカード>Intel i82562 Ethernet (i82562)
に変更し、
「保存」をクリック。
isoイメージを抜いたら、仮想マシンを起動するとEFI画面になるので、「*Arch Linux」を選択します。
その後、ログイン画面になります。
Arch Linux 6.8.6-1-aarch64-ARCH (tty1)
myhostname login:
まずはインストール時に作成したuserアカウントでログインします。
rootになれることの確認
[username@myhostname ~]$ su Password: [root@myhostname /home/username]# |
userアカウントでログインして、suコマンドでルートになれることは確認できました。
キーマップの設定
最初のログイン直後、キーボードから記号を叩いてみて、キートップの記号と入力された記号が異なっていたら、それはキーマップが正しく設定されていないということです。日本語キーボードを使っている場合などに起こります。適切なキーマップに設定しておきましょう。
# localectl set-keymap jp106
ロケールを日本語に設定
まず/etc/locale.genの、ja_JP.UTF-8 UTF-8 をアンコメントします。
...
#ja_JP.EUC-JP EUC-JP
ja_JP.UTF-8 UTF-8
#ka_GE.UTF-8 UTF-8
...
以下を実行
$ sudo locale-gen
Generating locales...
en_US.UTF-8... done
en_US.ISO-8859-1... done
ja_JP.UTF-8... done
Generation complete.
locale.confを書き換えて、
#LANG=en_US.UTF-8
LANG=ja_JP.UTF-8
LC_COLLATE=C
ログアウト後、再ログインするとメッセージが日本語になっています(表示が日本語になるだけで、日本語入力ができる訳では無い)。
ただし、日本語ロケールを設定すると、UTMのコンソールが文字化けしてしまいます。sshで接続する場合は、sshクライアント側が日本語が使えれば大丈夫です。macからsshでアクセスする場合、iTermでもターミナルでも文字化けはしません。
コマンドが無かったらpacmanで入れる
Arch Linuxインストール直後は最低限の機能しか含まれておらず、あとはパッケージマネージャpacmanで必要な機能を入れていくことになります。
# which which
bash: command not found
# pacman -Syu which
...
# which which
/usr/bin/which
インストール直後はviすら入っていません。インストーラーでテキストエディタとしてnvimを入れたので不要なのかもしれませんが…とりあえず、vi入れときます。
# pacman -Syu vi
sudoのインストール
pacmanはroot権限でしか実行できません。suでrootに入って作業を続けるのは気が引けますので、まずはsudoをインストールします。
# pacman -Syu sudo
# visudo
visudoで/etc/sudoersの編集画面になるので、
# %wheel ALL=(ALL:ALL) ALL
を
%wheel ALL=(ALL:ALL) ALL
に修正します。これでsudoが使えるようになったので、suから抜けます。次からはsuではなくsudoを使いましょう。
sshサーバのインストール
$ sudo pacman -Syu sudo
$ sudo systemctl enable --now sshd
これでsshでリモートログインできるようになりました。
$ sudo systemctl enable --now sshd
$ ip a
これでipアドレスを確認し、クライアント(macのターミナルやiTerm)から、
$ ssh <ARchLinuxnのipアドレス>
こうしてリモートログインして以降の作業を続けたほうが、コピペできるんで作業がはかどりますよ。
いつもの環境を構築
.bashrcに以下のaliasを追加
alias cls='clear'
alias ll='ls -l --color=auto'
ネットワーク関連の設定
まずは、/etc/hostnameを修正してコンピュータ名を設定します。varchという名前にしました。
varch
次に、ネットワークインターフェースを確認します。
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether fe:a1:56:90:3d:ae brd ff:ff:ff:ff:ff:ff
インターフェースはenp0s1であることがわかります。インストール直後のネットワークはdhcp接続でした。
$ cat /etc/systemd/network/enp0s1-ethernet.network
#/etc/systemd/network/enp0s1-ethernet.network generated by Archboot setup
[Match]
Name=enp0s1
[Network]
MulticastDNS=yes
DHCP=yes
$ ip a
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 preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp0s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether fe:a1:56:90:3d:ae brd ff:ff:ff:ff:ff:ff
inet 192.168.1.128/24 metric 1024 brd 192.168.1.255 scope global dynamic enp0s1
valid_lft 14342sec preferred_lft 14342sec
inet6 2400:xxxx:yyyy:zzzzz:uuuu:vvvv:wwww:zzzz/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 14345sec preferred_lft 12545sec
inet6 fe80::aaaa:bbbb:cccc:dddd/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
ネットワークが繋がっていることも確認できました。
インストール時はお手軽にdhcpによるネット接続設定にしましたが、サーバとして利用するなら固定IP接続に変更しておいたほうが好都合です。
以下の固定アドレスを割り当てるとします。
IPv4アドレス: 192.168.1.7/24
IPv6アドレス: 2400:xxxx:yyyy:zzzzz::7/64
2400:xxxx:yyyy:zzzzzは、プロバイダーから払い出されたipv6プレフィクス。 2400:xxxx:yyyy:zzzzz:uuuu:vvvv:wwww:xxxxは、自宅ルーターのipv6アドレス
[Match]
Name=enp0s1
[Network]
Address=192.168.1.7/24
Address=2400:xxxx:yyyy:zzzzz::7/64
Gateway=192.168.1.1
Gateway=2400:xxxx:yyyy:zzzzz:uuuu:vvvv:wwww:xxxx
DNS=192.168.1.1
DNS=2400:xxxx:yyyy:zzzzz:uuuu:vvvv:wwww:xxxx
DNSサーバも自宅LAN用に変更しておきます。
nameserver 192.168.1.1
options edns0 trust-ad
search .
以上の設定で、次回起動時からは固定IPでつながるようになります。
docker
Dockerを入れておきます。
$ sudo pacman -Syu docker docker-compose
自分のログインアカウントをdockerグループに入れておく。
$ sudo groupadd -f docker
$ sudo usermod -aG docker myaccount
起動
$ sudo systemctl enable --now docker.service
$ sudo systemctl enable --now containerd.service
動作確認。rootではないユーザアカウントで動作すればOK。
$ docker run hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
ファイルサーバー
Sambaをインストール
$ sudo pacman -Syu samba
Sambaのセットアップ
/home/samba/share をvarchという名前で公開
$ sudo mkdir /home/samba
$ sudo mkdir /home/samba/share
$ sudo chmod 777 /home/samba/share
$ sudo chown nobody:nobody /home/samba/share
[global]
unix charset = UTF-8
dos charset = CP932
workgroup = WORKGROUP
server string = %h server (Samba, Alpine)
dns proxy = no
interfaces = 127.0.0.0/8 192.168.1.0/24
bind interfaces only = yes
map to guest = Bad User
log file = /var/log/samba/log.%m
max log size = 1000
syslog = 0
panic action = /usr/share/samba/panic-action %d
server role = standalone server
passdb backend = tdbsam
obey pam restrictions = yes
unix password sync = no
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
pam password change = yes
map to guest = bad user
usershare allow guests = yes
fruit:metadata = netatalk
fruit:encoding = native
[varch]
path = /home/samba/share/
writable = yes
browseable = yes
guest ok = no
guest only = no
create mode = 0664
directory mode = 0775
valid user = username
ファイル共有時のアカウントの設定、usernameは変えてください
$ sudo pdbedit -a -u username
sambaの起動
$ sudo systemctl start smb nmb
$ sudo systemctl enable smb nmb
ファイル共有サーバを他のPCから見えるようにする
$ sudo pacman -Syu avahi dbus
$ sudo systemctl start dbus avahi-daemon
$ sudo systemctl enable dbus avahi-daemon
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">%h</name>
<service>
<type>_smb._tcp</type>
<port>445</port>
</service>
</service-group>
$ sudo systemctl restart avahi-daemon
Webサーバー
WebサーバーはApacheを使用。Apacheはdocker-composeで立ち上げることにします。
version: '3.3'
services:
httpd:
image: httpd:2.4
ports:
- '80:80'
volumes:
- ./htdocs:/usr/local/apache2/htdocs
- ./conf:/usr/local/apache2/conf
restart: always
<html>
<body>
<h1>My Homepage</h1>
</body>
</html>
ディレクトリ構成
apache
│ docker-compose.yml
│
├─conf
│ │ httpd.conf
│ │ magic
│ │ mime.types
│ │
│ ├─extra
│
└─htdocs
index.html
apacheを仮起動し、confディレクトリを抽出する。
$ docker run --rm --name httpd -d httpd:2.4
$ sudo docker cp httpd:/usr/local/apache2/conf/ conf
$ docker rm -f httpd
apacheを起動
$ docker comppose up -d --build
動作確認
$ curl http://localhost/
<html>
<body>
<h1>My Homepage</h1>
</body>
</html>
ファイアーウォール
Arch Linuxは初期状態ではファイアーウォールは入っていませんので、iptablesで簡易ファイアーウォールを構築します。
アクセスPolicyは、
- 内部から外部へのアクセスはすべて可能。
- 同一サブネットの外部からのアクセスはssh, samba avihi, http(80と8080)のみ可能
- 外部からのping可能
としました。
まず、iptablesとipv6用のip6tablesがインストール済みかを確認します。
$ which iptables
/usr/bin/iptables
$ which ip6tables
/usr/bin/ip6tables
iptablesがインストール時点で入っているようなので、iptablesでFirewallを構築すしていきます。
iptablesを起動
$ sudo systemctl start iptables
$ sudo systemctl start iptables6
$ sudo systemctl enable iptables
$ sudo systemctl enable iptables6
iptablesとip6tablesで全てDENYでsshとpingとhttpとsmbとavihiだけ通すファイアーウォールを設定していきます。/etc/iptables/simple_firewall.rulesというファイアーウォール設定のサンプルが置いてありますので、これを元に設定します。
# varch rules
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:TCP - [0:0]
:UDP - [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
# ssh
-A INPUT -s 192.168.1.0/255.255.255.0 -p tcp --dport 22 -j ACCEPT
# samba
-A INPUT -s 192.168.1.0/255.255.255.0 -p udp --dport 137 -j ACCEPT
-A INPUT -s 192.168.1.0/255.255.255.0 -p udp --dport 138 -j ACCEPT
-A INPUT -s 192.168.1.0/255.255.255.0 -p tcp --dport 139 -j ACCEPT
-A INPUT -s 192.168.1.0/255.255.255.0 -p tcp --dport 445 -j ACCEPT
# avahi-daemon
-A INPUT -s 192.168.1.0/255.255.255.0 -p tcp --dport 5353 -j ACCEPT
# web
-A INPUT -s 192.168.1.0/255.255.255.0 -p tcp --dport 80 -j ACCEPT
-A INPUT -s 192.168.1.0/255.255.255.0 -p tcp --dport 8080 -j ACCEPT
#
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
COMMIT
ip6tablesのルールはiptablesのルールと同じにしましたが、ipv6を使用していないならすべてDROPでもいいと思います。
# varch rules
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:TCP - [0:0]
:UDP - [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -p udp --sport 547 --dport 546 -j ACCEPT
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p ipv6-icmp -m icmp6 --icmpv6-type 128 -m conntrack --ctstate NEW -j ACCEPT
# ssh
-A INPUT -s 2400:4150:8aa0:cd00::/64 -p tcp --dport 22 -j ACCEPT
# samba
-A INPUT -s 2400:4150:8aa0:cd00::/64 -p udp --dport 137 -j ACCEPT
-A INPUT -s 2400:4150:8aa0:cd00::/64 -p udp --dport 138 -j ACCEPT
-A INPUT -s 2400:4150:8aa0:cd00::/64 -p tcp --dport 139 -j ACCEPT
-A INPUT -s 2400:4150:8aa0:cd00::/64 -p tcp --dport 445 -j ACCEPT
# avahi-daemon
-A INPUT -s 2400:4150:8aa0:cd00::/64 -p tcp --dport 5353 -j ACCEPT
# web
-A INPUT -s 2400:4150:8aa0:cd00::/64 -p tcp --dport 80 -j ACCEPT
-A INPUT -s 2400:4150:8aa0:cd00::/64 -p tcp --dport 8080 -j ACCEPT
#
-A INPUT -p udp -j REJECT --reject-with icmp6-adm-prohibited
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp6-adm-prohibited
COMMIT
iptables service停止
$ sudo systemctl stop iptables
$ sudo systemctl stop ip6tables
iptables service起動
$ sudo systemctl start iptables
$ sudo systemctl start ip6tables
起動時に iptables が自動的にロードされるようにしたいとき
$ sudo systemctl enable iptables
$ sudo systemctl enable ip6tables
思惑通りファイアーウォールが設定されたかは必ず確認しておいてくださいね。
システムの更新
Arch Linuxの特徴の1つローリングリリースは、常に最新のシステムに更新されて稼働できることを意味します。Windows UpdateやiOSなんかも自動更新を有効にしておけば似たようなものですが…
手動で更新する場合は以下のコマンドで。
$ sudo pacman -Syyu
cronを使って定期的に自動更新する方法がArchWikiに記載があります。
https://wiki.archlinux.jp/index.php/%E5%88%A9%E7%94%A8%E8%80%85:Crontab_%E3%81%A7%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E6%9B%B4%E6%96%B0
利用者:Crontab でパッケージを更新
今回はUTM上にインストールしたサーバなので自動更新はやめておきます。
おわりに
以上でファイル共有、Webサーバ機能を持ったサーバの出来上がり。dockerでWebアプリをガンガン入れて動かすこともできますよ。