〔備忘録〕 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 を利用する。
【参考にしたサイト】
- https://superuser.com/questions/688733/start-a-systemd-service-inside-chroot
- https://wiki.archlinuxjp.org/index.php/Systemd-nspawn
- https://unix.stackexchange.com/questions/347881/why-does-the-nspawn-of-an-ubuntu-image-fail
- http://manpages.ubuntu.com/manpages/xenial/en/man8/debootstrap.8.html
- http://manpages.ubuntu.com/manpages/xenial/en/man1/systemd-nspawn.1.html
- http://manpages.ubuntu.com/manpages/xenial/en/man1/machinectl.1.html
- http://h-s-maga.blogspot.jp/2016/06/machinectlkali.html
【確認環境】
- OS: Ubuntu 16.04 LTS (xenial) / security updated on 2017-May-26 by apt-get upgrade
- PC: Virtualbox 5.1 仮想マシン
【構築手順】
- (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 にする。
ホスト側で、以下を実行する。
更に、/etc/nsswitch.conf の hosts: セクションに mymachines を追加します。
host# systemctl enable --now systemd-networkd systemd-resolved
host# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
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 testConnected 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 が起動できなくなったので、ブートローダーを修復することになったので、その作業をメモします。
≪手順≫
※参考サイト:
- http://blog.myskng.xyz/entry/2016/07/04/005126
- https://msdn.microsoft.com/ja-jp/library/hh824874.aspx
(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
〔備忘録〕 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 を起動し、テストします。
テストで問題がなければ、自動起動スクリプトを用意します。
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 を試してみる
今まで、Linux は Debian系(Debian, Ubuntu)を使ってきたが、
Redhat系も試してみたいと思い立ち、CentOS 7 に浮気してみる。
まずは、コンソール (X環境なし)で使えるようにしたところまでの
メモ。
参考サイト:
- https://www.centos.org/
- http://qiita.com/fetaro/items/8cf5169dc4d8a7ac9af6
- http://qiita.com/s_makinaga/items/ce45f3e20b8edafab9dd
- http://qiita.com/tukiyo3/items/67182edee4f937e7f707
- http://sogoth.com/?tag=sysv-rc-conf-redhat-equivalent
- http://ohkubo.info/modules/xpress/?p=94
手順:
- (1) centos.org より ISO イメージをダウンロード
- (2) ISOイメージを起動
- (3) インストーラは GUI で各種設定を行う様になっているが、NICを有効にするのを忘れないようにする。(最初この設定をしないでインストールを実行して、 yum でのパッケージが追加できず嵌ってしまいました。)
- (4) 再起動後、必要なパッケージを、yum コマンドで順次インストールしていく。私が追加したパッケージは以下のとおり。
- net-tools
- bind-utils
- ntsysv
- wget
ここまで触ってみた所感ですが、
欲しいコマンドすらデフォルトで入っていないのは、
Linux 初心者にはとっつきにくいOSですね。
サーバー用途を重視して、コマンドを必要最小限にし、
セキュリティを強化しているのでしょうが…