〔備忘録〕 Ubuntu 16.04LTS (xenial) 上での chroot 環境の構築方法

【動機】

Ubuntu 16.04LTS (xenial) 上で、chroot環境下で動作する DNS Server (BIND9) を構築しようとしたら chroot 環境が作れなかったので、調査結果&作成手順をメモ。

Ubuntu 16.04LTS では systemd が採用されており、以下のように bind9.service ファイルで起動オプションに -t {chroot directory} を追加しただけでは、動作しなかった。


[Unit]
Description=BIND Domain Name Server
Documentation=man:named(8)
After=network.target

[Service]
ExecStart=/usr/sbin/named -f -u bind -t /chroot/named
ExecReload=/usr/sbin/rndc reload
ExecStop=/usr/sbin/rndc stop

[Install]
WantedBy=multi-user.target



【方法概要】

systemd 環境下で chroot 環境を構築するための systemd-nspawn を利用する。



【参考にしたサイト】


【確認環境】


【構築手順】

  • (1) Host マシン(上記の Virtualbox 仮想マシン上)で、以下のパッケージをインストールする。


$ sudo apt-get install systemd-container debootstrap ubuntu-keyring

  • (2) コンテナを作成する(イメージ名はtest)。


$ cd /var/lib/machine
$ sudo debootstrap --arch=amd64 --variant=minbase \
--include=dbus,netbase,net-tools,ifupdown,vim,apt,sudo \
xenial test http://jp.archive.ubuntu.com/ubuntu

  • (3) chroot 環境側 の初期設定(ユーザの追加、追加ユーザのsudo権限付与、rootユーザのロック、コンソールログイン用のttyの設定)を行う。


host# systemd-nspawn -D test
test# adduser testuser
test# sed -E '/^sudo/s/:$/:testuser/g' /etc/group > /tmp/group ; mv /tmp/group /etc/group
test# passwd -l root
test# echo 'pts/0' >> /etc/securetty
test# exit

  • (4) chroot 環境側 Network IF を host 側の IF にする。

ホスト側で、以下を実行する。


host# systemctl enable --now systemd-networkd systemd-resolved
host# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
更に、/etc/nsswitch.conf の hosts: セクションに mymachines を追加します。

hosts: files mymachines dns myhostname

最後に、/lib/systemd/system/systemd-nspawn@.service ファイル内の起動コマンドの設定から、"--network-veth" オプションを削除し、コンテナ側の Network IF をホストの NIF と同じにする。

修正前:


[Service]
ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --boot \
--link-journal=try-guest --network-veth \
--settings=override --machine=%I

修正後:


[Service]
ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --boot \
--link-journal=try-guest \
--settings=override --machine=%I



chroot環境使用手順】

まず、作成したコンテナを起動します。


host# machinectl start test

次に、コンテナにログインします。


host# machinectl login test

Connected to machine test. Press ^] three times within 1s to exit session.

Ubuntu 16.04 LTS test pts/0

bindtest login: testuser
Password:
Last login: Fri May 26 15:04:31 UTC 2017 on pts/0
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-62-generic x86_64)

* Documentation: https://help.ubuntu.com/
testuser@test:~$

※ これ以降はコンテナ内での作業になりますので、私の目的である「bind9 のインストール」となりますが、この記事の範疇外になるので割愛します。


コンテナからログオフするには、1秒以内に Ctrl-] を3回押します。

コンテナを shutdown するのは、


host# machinectl poweroff test
です。




【所感】

感覚的には、今までの chroot 環境というより、 FreeBSD の jail 環境に近いように思えます。

今回は、『systemd で動作させようとした bind9 が chroot 環境で動かせない』というのが発端で、調べていったら systemd-nspawn にたどり着いたのですが、
同様の仕組みは docker や LXC, LXD でも行えるようです。しかし、その違い・メリットデメリットが分からないので、今後調査していく必要があります。

〔個人メモ〕 Error of samba4 replicate confirmation

samba wiki (https://wiki.samba.org/index.php/Join_an_additional_Samba_DC_to_an_existing_Active_Directory) を参考に、
DC のレプリケーションを TRY!

でもエラー。

# samba-tool drs showrepl
Default-First-Site-Name\*
DSA Options: 0x00000001
DSA object GUID: ********-****-****-****-************
DSA invocationId: ********-****-****-****-************

==== INBOUND NEIGHBORS ====

CN=Schema,CN=Configuration,DC=*,DC=x,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
DSA object GUID: *
Last attempt @ Tue Sep 27 21:04:13 2016 JST was successful
0 consecutive failure(s).
Last success @ Tue Sep 27 21:04:13 2016 JST

CN=Configuration,DC=*,DC=x,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
DSA object GUID: *
Last attempt @ Tue Sep 27 21:04:14 2016 JST was successful
0 consecutive failure(s).
Last success @ Tue Sep 27 21:04:14 2016 JST

DC=ForestDnsZones,DC=*,DC=x,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
DSA object GUID: *
Last attempt @ Tue Sep 27 21:04:13 2016 JST failed, result 1326 (WERR_LOGON_FAILURE)
1 consecutive failure(s).
Last success @ Tue Sep 27 20:45:29 2016 JST

DC=DomainDnsZones,DC=*,DC=*,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
DSA object GUID: *
Last attempt @ Tue Sep 27 21:04:13 2016 JST was successful
0 consecutive failure(s).
Last success @ Tue Sep 27 21:04:13 2016 JST

DC=*,DC=*,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
DSA object GUID: *
Last attempt @ Tue Sep 27 21:04:14 2016 JST was successful
0 consecutive failure(s).
Last success @ Tue Sep 27 21:04:14 2016 JST

==== OUTBOUND NEIGHBORS ====

==== KCC CONNECTION OBJECTS ====

Connection --
Connection name: *
Enabled : TRUE
Server DNS name : *.*.*.mydns.jp
Server DN name : CN=NTDS Settings,CN=*,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=*,DC=*,DC=mydns,DC=jp
TransportType: RPC
options: 0x00000001
Warning: No NC replicated for Connection!



ちなみに primary domain contoller で実行したら、
# samba-tool drs showrepl

==== INBOUND NEIGHBORS ====

CN=Schema,CN=Configuration,DC=*,DC=x,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
.... (WERR_GENERAL_FAILUER)

というエラーで、replication 状態が確認できず。

よくよく見ると、 primary dc と secondary dc との時刻が大幅にずれていた… f(^^;

# primary dc を仮想PC上で動作させており、その仮想PCの host が 何度か sleep で停止していたため、時刻がずれていた。


で、primary dc の時刻を ntp サーバと同期(実際には再起動)させたら、
primary 側は、INBOUND NEIGHBORS 側の WERR_GENERAL_FAILUER のエラーは消え、

Connection --
Connection name: *
Enabled : TRUE
Server DNS name : *.*.*.mydns.jp
Server DN name : CN=NTDS Settings,CN=*,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=*,DC=*,DC=mydns,DC=jp
TransportType: RPC
options: 0x00000001
Warning: No NC replicated for Connection!

という Warning が残った状態に変化。


一方、secondary dc 側は、下記のようにエラーの嵐。

# samba-tool drs showrepl
Default-First-Site-Name\*
DSA Options: 0x00000001
DSA object GUID: *
DSA invocationId: *

==== INBOUND NEIGHBORS ====

CN=Schema,CN=Configuration,DC=*,DC=*,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
DSA object GUID: *
Last attempt @ Tue Sep 27 21:39:12 2016 JST failed, result 31 (WERR_GENERAL_FAILURE)
4 consecutive failure(s).
Last success @ Tue Sep 27 21:19:12 2016 JST

CN=Configuration,DC=*,DC=*,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
DSA object GUID: *
Last attempt @ Tue Sep 27 21:39:13 2016 JST failed, result 31 (WERR_GENERAL_FAILURE)
4 consecutive failure(s).
Last success @ Tue Sep 27 21:19:12 2016 JST

DC=ForestDnsZones,DC=*,DC=*,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
DSA object GUID: *
Last attempt @ Tue Sep 27 21:39:12 2016 JST failed, result 31 (WERR_GENERAL_FAILURE)
4 consecutive failure(s).
Last success @ Tue Sep 27 21:19:12 2016 JST

DC=DomainDnsZones,DC=*,DC=*,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
DSA object GUID: *
Last attempt @ Tue Sep 27 21:39:12 2016 JST failed, result 31 (WERR_GENERAL_FAILURE)
4 consecutive failure(s).
Last success @ Tue Sep 27 21:19:12 2016 JST

DC=*,DC=*,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
DSA object GUID: *
Last attempt @ Tue Sep 27 21:39:13 2016 JST failed, result 31 (WERR_GENERAL_FAILURE)
4 consecutive failure(s).
Last success @ Tue Sep 27 21:19:12 2016 JST

==== OUTBOUND NEIGHBORS ====

CN=Schema,CN=Configuration,DC=*,DC=*,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
DSA object GUID: *
Last attempt @ Tue Sep 27 21:39:32 2016 JST failed, result 31 (WERR_GENERAL_FAILURE)
24 consecutive failure(s).
Last success @ NTTIME(0)

CN=Configuration,DC=*,DC=*,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
DSA object GUID: *
Last attempt @ Tue Sep 27 21:39:32 2016 JST failed, result 31 (WERR_GENERAL_FAILURE)
83 consecutive failure(s).
Last success @ NTTIME(0)

DC=ForestDnsZones,DC=*,DC=*,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
DSA object GUID: *
Last attempt @ Tue Sep 27 21:39:31 2016 JST failed, result 31 (WERR_GENERAL_FAILURE)
24 consecutive failure(s).
Last success @ NTTIME(0)

DC=DomainDnsZones,DC=*,DC=*,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
DSA object GUID: *
Last attempt @ Tue Sep 27 21:39:32 2016 JST failed, result 31 (WERR_GENERAL_FAILURE)
24 consecutive failure(s).
Last success @ NTTIME(0)

DC=*,DC=*,DC=mydns,DC=jp
Default-First-Site-Name\* via RPC
DSA object GUID: *
Last attempt @ Tue Sep 27 21:39:32 2016 JST failed, result 31 (WERR_GENERAL_FAILURE)
24 consecutive failure(s).
Last success @ NTTIME(0)

==== KCC CONNECTION OBJECTS ====

Connection --
Connection name: *
Enabled : TRUE
Server DNS name : *.*.*.mydns.jp
Server DN name : CN=NTDS Settings,CN=*,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=*,DC=*,DC=mydns,DC=jp
TransportType: RPC
options: 0x00000001
Warning: No NC replicated for Connection!

〔備忘録〕 KVM on debian 8

≪参考サイト≫

Windows ブートローダの修正 (Windows10 / 7 のデュアルブート)

≪動機≫
一般に Windows 10 と Windows 7デュアルブートできるようにするには、
(1) Windows 7 をインストールした後、
(2) Windows 10 をインストールする
のがセオリーのようです。

でも私の場合、訳あって Windows 10 をインストールした後、
HDD(SSD)の追加後に Windows 7 をインストールする機会がありました。
その際、Windows 10 が起動できなくなったので、ブートローダーを修復することになったので、その作業をメモします。


≪手順≫
※参考サイト:

 (1) Windows 10 を修復モードで起動する。
   (1-1) Windows 10 のインストールメディアを挿し、
   (1-2) インストール開始画面が表示されたら、下部にある「コンピュータを修復する」を選択する。
   (1-3) 「詳細オプション」→「コマンドプロンプト」を選択する。

 (2) bcdboot コマンドでブートレコーダを修復・更新する。
   (2-0) 前提: ディスクが以下のように構成されているとします。
        +-------+------------------------------------------+
    disk 0 | EFI | Windows 7 |
        +-------+------------------------------------------+
        +-------+--------+---------------------------------+
    disk 1 | 回復 | EFI* | Windows 10 |
        +-------+--------+---------------------------------+

   また、Windows 7 パーティションはドライブ文字 "C" に、
   Windows 10 パーティションはドライブ文字 "E" に割り当てられている
   とします。

   (2-1) diskpart コマンドで EFI パーティション (上図 disk 0 の EFI 領域)
     にドライブ文字 "S" を割り当てる。
     ※ 以下では、">" がプロンプトを、赤字部分が入力文字を表す。

      X:\Sources> diskpart
      DISKPART>list disk

      ディスク   状態 サイズ 空き ダイナ GPT
      ### ミック
      ------------ ------------- ------- ------- --- ---
      ディスク 0 オンライン xxx GB 0 B *
      ディスク 1 オンライン yyy GB 0 B *

      DISKPART> select disk 0
      DISKPART> list part

      Partition ### Type Size Offset
      ------------- ------------------- ------- -------
      Partition 1 システム 100 MB 1024 KB
      Partition 3 予約 xx MB yyyy MB
      Partition 2 プライマリ zzz GB wwww GB

      DISKPART> select part 1
      DISKPART> assign letter=S
      DISKPART> exit

   (2-2) bcdboot コマンドでブートローダーを更新します。
      X:\Sources> bcdboot C:\Windows /s S: /f ALL
      X:\Sources> bcdboot E:\Windows /s S: /f ALL

以上で、Windows 7/10 のデュアルブートが可能になります。

〔備忘録〕 Samba4 のインストール (訂正版)

http://d.hatena.ne.jp/grasso0210/20160726/1469534806 に、
Ubuntu 16.04 上での Samba4 のインストール方法をメモしたが、
その後、運用を始めたらsamba deamonが自動起動されていなかったので、
原因調査。

〔原因〕
samba が systemd に対応するようにビルドされていなかったため、
OS 起動直後には Samba deamon が起動するが、2〜3分すると deamon が terminate していた。

〔対策〕
https://wiki.samba.org/index.php/Operating_system_requirements/Dependencies_-_Libraries_and_programs#Debian_.2F_Ubuntu
の注記に記載されているように、
パッケージ libsystemd-dev を事前にインストールしておくこと。
なお、私は Samba 4.5.0 をビルドしたので、libgpgme11-dev python-gpgme python-m2crypto の3つのパッケージもインストールしてからビルド/インストールしたところ、正常に samba が起動・維持されるようになった。

〔備忘録〕 Samba4 Active Directory on Ubuntu 16.04

Ubuntu 16.04 に Samba4 (最新版でソースコードのビルドを含む)をインストールしたときのメモ。


(1) Samba4 のインストール

基本的には、Samba wiki (https://wiki.samba.org/index.php/Setup_a_Samba_Active_Directory_Domain_Controller#Installation) に記載されている手順のとおりです。

まずは、静的な IP アドレスを設定し、/etc/hosts にホスト名とIPアドレスの対応を記載します。
静的アドレスの設定は、 以下のように /etc/network/interfaces に設定します。
iface enp0s3 inet static
address 192.168.0.1
netmask 255.255.255.0
gateway 192.168.0.254
dns-nameservers 192.168.0.1 192.168.0.254
dns-search local.***.mydns.jp

注)dns-nameservers には Samba4 を起動する自身のIPアドレスを追加しておきます。

また、上記のように NIC に静的IPを割り当てたら、/etc/hosts には以下のように記載します。
192.168.0.1 dc.local.***.mydns.jp dc

Samba でCIFSファイル共有をする場合には、 /etc/fstab にオプションを追加しておきます。
/dev/sda1 / ext4 errors=remount-ro,defaults,barrier=1 0 1
※ 一応、https://wiki.samba.org/index.php/Operating_system_requirements/File_system_support#Testing_your_filesystem のテストはしておくように。

次に、Samba wiki の Operating system requirements (https://wiki.samba.org/index.php/Operating_system_requirements/Dependencies_-_Libraries_and_programs#Debian_.2F_Ubuntu) に従って、build 環境を準備します。

準備ができたら、 Samba wiki Build from samba source (https://wiki.samba.org/index.php/Build_Samba_from_source#Introduction) を参考にビルドします。
ビルド手順はおおよそ以下のとおりです。

  • source のダウンロード
  • tar ball の展開
  • configure の実行
  • make
  • make install

上記の場合、samba4 一式は、 /usr/local/samba の下にインストールされますので、
PATH に /usr/local/samba/sbin:/usr/local/samba/bin を追加する等、実行できるように環境を整えます。

次に、Active Directory Controller にするための設定= Provisioninig (https://wiki.samba.org/index.php/Setup_a_Samba_Active_Directory_Domain_Controller#Provisioning_the_Samba_Active_Directory) を行います。
# samba-tools domain provision --use-rfc2307 --interactive
Realm [LOCAL.***.MYDNS.JP]: LOCAL.***.MYDNS.JP
Domain [LOCAL]: LOCAL
Server Role (dc, member, standalone) [dc]: dc
DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]: SAMBA_INTERNAL
DNS forwarder IP address (write 'none' to disable forwarding) [192.168.0.254]: 192.168.0.254
Administrator password: Passw0rd
Retype password: Passw0rd

interactive モードで provisioning すると、Realm名, NT Domain名, Server Role, DNS backend, DNS forwarder, Administrator のパスワードを問われるので、適切に入力します。
(ほとんどデフォルトのままでOKでした。)

設定ファイル(/usr/local/samba/etc/smb.conf) ができたら、Samba wiki Testing your samba domain controller (https://wiki.samba.org/index.php/Setup_a_Samba_Active_Directory_Domain_Controller#Testing_your_Samba_Domain_Controller) を参考に、手動で Samba を起動し、テストします。


(2) 自動起動スクリプトの用意と設定

テストで問題がなければ、自動起動スクリプトを用意します。
Ubuntu 16.04 では、System Init Deamon として systemd が採用されていますので、
以下の内容を /etc/systemd/system/samba.service として保存します。
参考サイト: http://wiki.eri.ucsb.edu/stadm/AD_Samba4_Centos_7#Adding_Samba_to_Systemd
[Unit]
Description=Samba4 Active Directory
After=network.target syslog.target

[Service]
Type=forking
PIDFile=/usr/local/samba/var/run/samba.pid
ExecStart=/usr/local/samba/sbin/samba

[Install]
WantedBy=multi-user.target

スクリプトを用意したら、以下のコマンドを実行して、自動起動するように設定します。
# systemctl enable samba

OSを再起動して、samba が起動されていれば、完了です。

〔備忘録〕 CentOS7 を試してみる

今まで、LinuxDebian系(Debian, Ubuntu)を使ってきたが、
Redhat系も試してみたいと思い立ち、CentOS 7 に浮気してみる。

まずは、コンソール (X環境なし)で使えるようにしたところまでの
メモ。

参考サイト:

手順:

  • (1) centos.org より ISO イメージをダウンロード
  • (2) ISOイメージを起動
  • (3) インストーラGUI で各種設定を行う様になっているが、NICを有効にするのを忘れないようにする。(最初この設定をしないでインストールを実行して、 yum でのパッケージが追加できず嵌ってしまいました。)
  • (4) 再起動後、必要なパッケージを、yum コマンドで順次インストールしていく。私が追加したパッケージは以下のとおり。
    • net-tools
    • bind-utils
    • ntsysv
    • wget

ここまで触ってみた所感ですが、
欲しいコマンドすらデフォルトで入っていないのは、
Linux 初心者にはとっつきにくいOSですね。

サーバー用途を重視して、コマンドを必要最小限にし、
セキュリティを強化しているのでしょうが…

# あくまで、Debian/Ubuntu との比較です。