読者です 読者をやめる 読者になる 読者になる

めもぶろぐ

お勉強したこと、趣味なんかを適当に書いてます。。。

CENTOS7 コンテナ systemd-nspawn

docker使ってみようと思って以前やってみたがよくわからず。。。

 

今回はCentOS7のサービスを洗い出していたらsystemd-nspawnを発見。どうやらコンテナらしい。

 

ということでメモしておきます。

 

まずはコンテナ格納ディレクトリを作成します。

[root@centos-btrfs lib]# mkdir /var/lib/machine

 

/var/lib/machineディレクトリ下にコンテナを作成します。

--installroot インストールディレクトリを指定します。ここはから出ないと実行することができません。

install の引数にsystemdを入れておきましょう。他のパッケージは後で入れれば良いです。

[root@centos-btrfs lib]# yum -y --nogpgcheck --installroot=/var/lib/machine/container --disablerepo='*' --enablerepo='dvdmedia' install systemd yum vim bash-completion passwd

 

ほいでは、コンテナを使ってみましょう。最初はパスワードの設定をして、それからコンテナ起動としましょう。

 

-D でコンテナのディレクトリを指定します。

--bindでホストOS側のディレクトリをコンテナにマッピングしたければ指定します。

 

--bind=/mnt:/mntとしていますが、同じディレクトリ名である場合、後半の/mntは省略可能です。

 

ちなみに、passwdの実行が上手くできなくてエラーになる!という場合は、後述する手順でインストールメディアをバインドして、yumリポジトリを追加して、yum -y remove passwd; yum -y install passwdでパッケージを入れ直しましょう。

 

もしくはいろいろなところで見たのですが、pwunconv; pwconvを実行してshadowファイルの整合性を取ってからpasswdによるパスワード設定を行ってみてください。

[root@centos-btrfs lib]# systemd-nspawn -D /var/lib/machine/container --bind=/mnt:/mnt
Spawning namespace container on /var/lib/machine/container (console is /dev/pts/1).
Init process in the container running as PID 3426.
-bash-4.2# passwd
Changing password for user root.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
-bash-4.2# exit

logout

 

 

 exitでログアウトしたら、コンテナをsystemdを使って起動します。

[root@centos-btrfs lib]# systemd-nspawn -D /var/lib/machine/container --boot
The kernel auditing subsystem is known to be incompatible with containers.
Please make sure to turn off auditing with 'audit=0' on the kernel command
line before using systemd-nspawn. Sleeping for 5s...
Spawning namespace container on /var/lib/machine/container (console is /dev/pts/1).
Init process in the container running as PID 3489.
systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ)
Detected virtualization 'systemd-nspawn'.

Welcome to CentOS Linux 7 (Core)!

Initializing machine ID from random generator.
Cannot add dependency job for unit display-manager.service, ignoring: Unit display-manager.service failed to load: No such file or directory.

 

 

起動しましたが、auditがincompatibleと行っているので、ホスト側のgrub設定を変更します。

vim /etc/default/grub
GRUB_TIMEOUT=0
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rhgb quiet audit=0"
GRUB_DISABLE_RECOVERY="true"

 

 

grubの設定を反映したイメージファイルを作成し再起動します。

[root@centos-btrfs lib]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-229.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-229.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-0e3ed4ddb29b4798ab2b48258e3ea1a5
Found initrd image: /boot/initramfs-0-rescue-0e3ed4ddb29b4798ab2b48258e3ea1a5.img
done
[root@centos-btrfs lib]# reboot

 

 

再起動が完了したら、もう一度コンテナを起動してみます。

[root@centos-btrfs ~]# systemd-nspawn -D /var/lib/machine/container --boot

Spawning namespace container on /var/lib/machine/container (console is /dev/pts/1).

Init process in the container running as PID 1835.

systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ)

Detected virtualization 'systemd-nspawn'.

 

Welcome to CentOS Linux 7 (Core)!

 

Cannot add dependency job for unit display-manager.service, ignoring: Unit display-manager.service failed to load: No such file or directory.

[  OK  ] Reached target Remote File Systems.

[  OK  ] Created slice Root Slice.

[  OK  ] Created slice User and Session Slice.

[  OK  ] Created slice System Slice.

[  OK  ] Created slice system-getty.slice.

[  OK  ] Reached target Slices.

[  OK  ] Listening on Delayed Shutdown Socket.

[  OK  ] Listening on /dev/initctl Compatibility Named Pipe.

[  OK  ] Listening on Journal Socket.

         Starting Journal Service...

[  OK  ] Started Journal Service.

[  OK  ] Reached target Paths.

         Mounting Debug File System...

         Mounting Configuration File System...

         Mounting POSIX Message Queue File System...

         Mounting Huge Pages File System...

[  OK  ] Reached target Encrypted Volumes.

[  OK  ] Reached target Swap.

         Starting Load/Save Random Seed...

[  OK  ] Reached target Local File Systems (Pre).

[  OK  ] Reached target Local File Systems.

         Starting Trigger Flushing of Journal to Persistent Storage...

         Starting Create Volatile Files and Directories...

[  OK  ] Mounted Debug File System.

[  OK  ] Mounted Configuration File System.

[  OK  ] Mounted POSIX Message Queue File System.

[  OK  ] Mounted Huge Pages File System.

[  OK  ] Started Load/Save Random Seed.

[  OK  ] Started Trigger Flushing of Journal to Persistent Storage.

[  OK  ] Started Create Volatile Files and Directories.

         Starting Update UTMP about System Reboot/Shutdown...

[  OK  ] Started Update UTMP about System Reboot/Shutdown.

[  OK  ] Reached target System Initialization.

[  OK  ] Listening on D-Bus System Message Bus Socket.

[  OK  ] Reached target Sockets.

[  OK  ] Reached target Timers.

[  OK  ] Reached target Basic System.

         Starting Login Service...

         Starting D-Bus System Message Bus...

[  OK  ] Started D-Bus System Message Bus.

         Starting Permit User Sessions...

[  OK  ] Started Permit User Sessions.

         Starting Console Getty...

[  OK  ] Started Console Getty.

[  OK  ] Reached target Login Prompts.

[  OK  ] Started Login Service.

[  OK  ] Reached target Multi-User System.

[  OK  ] Reached target Graphical Interface.

 

CentOS Linux 7 (Core)

Kernel 3.10.0-229.el7.x86_64 on an x86_64

 

container login: 

うまくいきました。

 

ほんなら必要だけど最初にyum installしたのは” systemd vim bash-completion passwd” だけなので、それ以外のパッケージをインストールしてみましょう。 

 

まずはインストールメディアを認識させないといけません。ホスト側でメディアをマウントしてから、コンテナ起動時の--bind=/mntを実行してあげます。

コンテナ起動済みだよ、という場合は下記を実行してください。

[root@centos-btrfs ~]# machinectl bind container /mnt

Unknown operation bind

[root@centos-btrfs ~]# 

 

とおもったら、7.1では実装されていませんでした。。。7.2から実行できるオペレーションみたいです。仕方がないので、一旦コンテナを停止して、起動時のオプションで指定しておきたいと思います。

[root@centos-btrfs ~]# systemd-nspawn -D /var/lib/machine/container --boot --bind=/mnt

Spawning namespace container on /var/lib/machine/container (console is /dev/pts/1).

Init process in the container running as PID 1973.

systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ)

Detected virtualization 'systemd-nspawn'.

 

Welcome to CentOS Linux 7 (Core)!

 

 

ホスト側のメディアマウントしたディレクトリがコンテナ側と共有できたらyumリポジトリを追加して、確認しましょう。 

 

ディレクトリのバインド確認

-bash-4.2# ls /mnt
CentOS_BuildTag EULA LiveOS RPM-GPG-KEY-CentOS-7 TRANS.TBL isolinux
EFI GPL Packages RPM-GPG-KEY-CentOS-Testing-7 images repodata
-bash-4.2#

 

 

 

yumリポジトリ作成

-bash-4.2# echo "
> [InstallMedia]
> name=InstallMedia
> baseurl=file:///mnt
> " > /etc/yum.repos.d/media.repo
-bash-4.2# cat /etc/yum.repos.d/media.repo

[InstallMedia]
name=InstallMedia
baseurl=file:///mnt

-bash-4.2#

 

 

 

yumリスト確認

-bash-4.2# yum list --disablerepo='*' --enablerepo='InstallMedia' | grep -i installmedia

389-ds-base.x86_64                      1.3.3.1-13.el7              InstallMedia

389-ds-base-libs.x86_64                 1.3.3.1-13.el7              InstallMedia

ElectricFence.x86_64                    2.2.2-39.el7                InstallMedia

GConf2.x86_64                           3.2.6-8.el7                 InstallMedia

GeoIP.x86_64                            1.5.0-9.el7                 InstallMedia

ImageMagick.x86_64                      6.7.8.9-10.el7              InstallMedia

ImageMagick-c++.x86_64                  6.7.8.9-10.el7              InstallMedia

ImageMagick-perl.x86_64                 6.7.8.9-10.el7              InstallMedia

作成したリポジトリが認識されていますので、これでyumインストール準備は完了

 

ためしにrsyslogをインストールします。

-bash-4.2# rpm --import /mnt/RPM-GPG-KEY-CentOS-7
-bash-4.2# yum -y --disablerepo='*' --enablerepo='InstallMedia' install rsyslog
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package rsyslog.x86_64 0:7.4.7-7.el7_0 will be installed
--> Processing Dependency: logrotate >= 3.5.2 for package: rsyslog-7.4.7-7.el7_0.x86_64
--> Processing Dependency: libjson-c.so.2()(64bit) for package: rsyslog-7.4.7-7.el7_0.x86_64
--> Processing Dependency: libestr.so.0()(64bit) for package: rsyslog-7.4.7-7.el7_0.x86_64
--> Running transaction check
---> Package json-c.x86_64 0:0.11-4.el7_0 will be installed
---> Package libestr.x86_64 0:0.1.9-2.el7 will be installed
---> Package logrotate.x86_64 0:3.8.6-4.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================================
Package Arch Version Repository Size
=====================================================================================================
Installing:
rsyslog x86_64 7.4.7-7.el7_0 InstallMedia 556 k
Installing for dependencies:
json-c x86_64 0.11-4.el7_0 InstallMedia 31 k
libestr x86_64 0.1.9-2.el7 InstallMedia 20 k
logrotate x86_64 3.8.6-4.el7 InstallMedia 64 k

Transaction Summary
=====================================================================================================
Install 1 Package (+3 Dependent packages)

Total download size: 671 k
Installed size: 2.1 M
Downloading packages:
-----------------------------------------------------------------------------------------------------
Total 22 MB/s | 671 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : json-c-0.11-4.el7_0.x86_64 1/4
Installing : logrotate-3.8.6-4.el7.x86_64 2/4
Installing : libestr-0.1.9-2.el7.x86_64 3/4
Installing : rsyslog-7.4.7-7.el7_0.x86_64 4/4
Verifying : libestr-0.1.9-2.el7.x86_64 1/4
Verifying : logrotate-3.8.6-4.el7.x86_64 2/4
Verifying : json-c-0.11-4.el7_0.x86_64 3/4
Verifying : rsyslog-7.4.7-7.el7_0.x86_64 4/4

Installed:
rsyslog.x86_64 0:7.4.7-7.el7_0

Dependency Installed:
json-c.x86_64 0:0.11-4.el7_0 libestr.x86_64 0:0.1.9-2.el7 logrotate.x86_64 0:3.8.6-4.el7

Complete!
-bash-4.2#

 

 

できました。これで好き放題パッケージをインストールしてください。あとはだいたいホストOSと同じように操作が可能です。

 

プロンプトが−bash−4.2#になっていますが、/root/.bashrcとか/root/.bash_profileが無いのでそうなっちゃってます。 

 

なので用意してあげれば良いです。/etc/skelあたりから持ってきましょう。

-bash-4.2# cp -a /etc/skel/.bash* /root

-bash-4.2# source /root/.bashrc
[root@container ~]#
[root@container ~]#

 

 

 コンテナから抜ける場合はマシンを停止しましょう。

[root@container ~]# poweroff 

[  OK  ] Removed slice user-0.slice.

[  OK  ] Removed slice system-getty.slice.

[  OK  ] Stopped target Graphical Interface.

[  OK  ] Stopped target Multi-User System.

         Stopping System Logging Service...

[  OK  ] Stopped target Login Prompts.

         Stopping Console Getty...

         Stopping Login Service...

         Stopping D-Bus System Message Bus...

[  OK  ] Stopped Login Service.

[  OK  ] Stopped System Logging Service.

[  OK  ] Stopped D-Bus System Message Bus.

[  OK  ] Stopped Console Getty.

         Stopping Permit User Sessions...

[  OK  ] Stopped Permit User Sessions.

[  OK  ] Stopped target Basic System.

[  OK  ] Stopped target Slices.

[  OK  ] Removed slice User and Session Slice.

[  OK  ] Stopped target Paths.

[  OK  ] Stopped target Timers.

[  OK  ] Stopped target Sockets.

[  OK  ] Closed D-Bus System Message Bus Socket.

[  OK  ] Stopped target System Initialization.

[  OK  ] Stopped target Encrypted Volumes.

         Stopping Load/Save Random Seed...

         Stopping Update UTMP about System Reboot/Shutdown...

[  OK  ] Stopped target Swap.

[  OK  ] Stopped target Remote File Systems.

[  OK  ] Stopped Load/Save Random Seed.

[  OK  ] Stopped Update UTMP about System Reboot/Shutdown.

         Stopping Create Volatile Files and Directories...

[  OK  ] Stopped Create Volatile Files and Directories.

[  OK  ] Reached target Shutdown.

Container has been shut down.

[root@centos-btrfs ~]# 

 

 バージョンによって実装されていないものが結構あるので、不便なこともありますが、他のコンテナによる仮想化よりsystemdについては圧倒的な安定性と利便性がありますので、ぜひ使ってみてください。

 

バックグラウンドで動かせなかったのが残念。なにか方法があれば教えて下さい。。。。

 

ちなみにコンテナはハードウェアのエミュレーションしていないので、grubやらディスクやらはいじることができませんのでご了承ください。

 

NICですが、既定の動作としてはホストOSのNICを共有ということになります。ipコマンドで確認してみてください。同一アドレスになっているはずです。

 

当然ブリッジ等もできますので調べてやってみましょう。ネットワーク周りはホストと共有になっているので、sshやらfirewallやらはあまり使用することはできません。

 

が、中にはポートを変更すれば起動できる(SSH等)ものもあるので試してみてください。

 

おわり

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

広告を非表示にする