haiju's 開発メモ

開発に必要な情報を自分用にメモ

Manjaro Fluxbox 15.12_x86-64のsystemd-nspawnでFedora25 Serverのコンテナを構築してみた

金曜日の夜に仕事で詰まってる間にsystemd-nspawnの使い方

の復習をしていて、とても分かりやすく解説しているサイト

を見つけたので、その方法に則って実際にやってみた。

たしかにその手順通りにやると、2時間で構築できて感激した。

なぜFedora25 Serverなのか?っていうと、32bitの開発環境

で使っていたFedora24 Workstation LXDECentOSより

使いやすかったことと、NginxとかBitcoinとか試してみたい

ことがあるってのとUbuntuより軽かったからという

安易な理由。

[構築手順]

1. 依存関係を解決するために、とりあえずdnfインストール。

% yaourt -S dnf

  yaourtだからってこともあるし、依存関係が複雑ってのもあるし

 作業時間のほとんどを、このビルドで取られる。

2. dnfの設定。

1) Fedoraリポジトリの追加

% sudo mkdir -p /etc/yum/repos.d

% sudo vim /etc/yum/repos.d/fedora.repo

2) fedora.repoの書き方

(ex) Fedora25 Serverの場合

[fedora]

name=fedora

baseurl=http://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/25/Server/x86_64/os/

enabled=1

3) リポジトリを認識させる

% sudo dnf repolist

3. chroot環境の構築。

% mkdir fedora_container

% sudo dnf groupinstall core --nogpgcheck --installroot=$HOME/fedora_container

4. rootパスワードの設定。

 FedoraUbuntu同様、空パスワードでは許可されないのでchrootで事前設定する。

% sudo chroot fedora_container

[root@manjaro-fluxbox /]# passwd root

ユーザー root のパスワードを変更。

新しいパスワード:

新しいパスワードを再入力してください:

passwd: すべての認証トークンが正しく更新できました。

5. コンテナの起動。

 コンテナ起動の際に実行するコマンドとオプション

% sudo systemd-nspawn -b -D fedora_container -n

-b:コンテナの起動

-D:コンテナのrootディレクト

-n :ホストとコンテナを繋ぐプライベートネットワークを設定

6. ネットワーク接続。

 コンテナの中から外に向かってネットワークを繋ぐ

 -> systemd-networkd を利用すると簡単。

 -> コンテナ内でサービスを有効にして、resolv.conf のシンボリックリンク

  を張ると繋がるようになる。

 -> 但し、ホスト側でもsystemd-networkdが有効になってる必要がある。

1) ホスト側のsystemd-networkdが有効か確認。

% sudo systemctl status systemd-networkd

● systemd-networkd.service - Network Service
Loaded: loaded (/usr/lib/systemd/system/systemd-networkd.service; disabled; vendor preset: enabled) --- disabled = 無効
Active: inactive (dead)
Docs: man:systemd-networkd.service(8)

2) disabled となっているので、有効にする。

% sudo systemctl enable systemd-networkd
Created symlink /etc/systemd/system/multi-user.target.wants/systemd-networkd.service → /usr/lib/systemd/system/systemd-networkd.service.
Created symlink /etc/systemd/system/sockets.target.wants/systemd-networkd.socket → /usr/lib/systemd/system/systemd-networkd.socket.

3) 有効になったか確認。

% sudo systemctl status systemd-networkd
 ● systemd-networkd.service - Network Service
 Loaded: loaded (/usr/lib/systemd/system/systemd-networkd.service; enabled; vendor preset: enabled)
 Active: active (running) since 土 2016-11-26 15:32:22 JST; 21h ago
 Docs: man:systemd-networkd.service(8)
 Main PID: 447 (systemd-network)
 Status: "Processing requests..."
 Tasks: 1 (limit: 4915)
 CGroup: /system.slice/systemd-networkd.service
 └─447 /usr/lib/systemd/systemd-networkd

4) コンテナ側のサービスを有効にする。

# systemctl enable --now systemd-networkd systemd-resolved

# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

7. コンテナの終了。

 コンテナ側でpoweroffコマンドを実行。

[root@fedora_container ~]# poweroff
 Sending SIGTERM to remaining processes...
 Sending SIGKILL to remaining processes...
 Process 191 (plymouthd) has been marked to be excluded from killing. It is running from the root file system, and thus likely to block re-mounting of the root file system to rea d-only. Please consider moving it into an initrd file system instead.
 Powering off.
 Container fedora_container has been shut down.

 参考サイトの情報通りに、作業しただけなので実は詳細に設定しないと動かない

って部分も多々あると思うので、それはまた次の機会に。

[参考サイト]

qiita.com

blog.0x972.info

gist.github.com