QNAP QuTS hero 5 セットアップ
今回は12ベイの「TS-h1283XU-RP」をセットアップする様子を紹介します。
メモリは最大の128GBまで搭載されているモデルなので、様々な用途に活躍してくれそうです。
ページ内目次
QNAP QuTS hero のセットアップ
システム領域としてディスクの一部を使用するため、ディスクが無いとセットアップを開始できません。
電源を入れる前にディスクの取り付けから行います。
QNAPへのHDD取り付け
東芝 MG09ACA18TE を12台用意しました。
本当はWD Goldシリーズが良かったのですが、安いので最近は東芝MGシリーズを買うことが多いかもですね。
どちらにせよ、連続稼働するNASに搭載するディスクはNAS用とするものか、エンタープライズ向けが不具合が少なくて良いです。
今までHDDを3桁本は扱ってきてデスクトップ向けHDDは選択肢に入らなくなりました。
最近であればSSDも選択肢に入ると思いますが、データ復旧がほぼ不可能・RAIDでの同一箇所劣化の懸念があるので除外しています。
とりあえず初期領域として、「Triple Mirror」を使用したいため、3本のディスクを刺します。
初期セットアップまでの準備
このQNAPは情報表示のLCDディスプレイが存在しません。
DHCP配下のLANに接続してセットアップを開始します。
専用のアプリ等のインストールは特に必要ありません。
DHCPサーバーを管理している立場であれば、DHCPリース情報を見て、QNAPに当たったIPアドレスを特定できるでしょう。
起動ボタンを押した際と、そこから数分待って起動完了した際にビープ音が鳴ります。
起動完了後にWebブラウザでそのIPアドレスにアクセスすればよいです。
QuTS hero スマートインストールシステム
スマートインストレーションを開始します。
利用規約に同意して進みます。
ファームウェアは実験時にアップデートしてあったので最新。
NAS名と管理者として使用するユーザー名、パスワードを入力して進みます。
NTPの設定はNICTにしています。
ネットワーク設定はあとで行うのでとりあえずDHCPのままで進みます。
ファームウェア更新の設定をして、設定を適用するのを数分待ちます。
しばらくすると設定が終了して、ログイン画面に移行します。
この際にIPアドレスに変更があるとログイン画面が開かないので、変更後のIPアドレスを指定して開きます。
セットアップ直後のディスクパーティション構成他
ログイン後、SSHだけを有効にし、セットアップ直後の状態を確認してみました。
$ ls /dev/sd*
/dev/sda /dev/sda4 /dev/sdb2 /dev/sdc /dev/sdc4 /dev/sdd2 /dev/sdd6
/dev/sda1 /dev/sda5 /dev/sdb3 /dev/sdc1 /dev/sdc5 /dev/sdd3 /dev/sdd7
/dev/sda2 /dev/sdb /dev/sdb4 /dev/sdc2 /dev/sdd /dev/sdd4
/dev/sda3 /dev/sdb1 /dev/sdb5 /dev/sdc3 /dev/sdd1 /dev/sdd5
$ sudo fdisk -l
Disk /dev/sdb: 18000.2 GB, 18000207937536 bytes
255 heads, 63 sectors/track, 2188400 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 267350 2147483647+ ee EFI GPT
Disk /dev/sda: 18000.2 GB, 18000207937536 bytes
255 heads, 63 sectors/track, 2188400 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 267350 2147483647+ ee EFI GPT
Disk /dev/sdc: 18000.2 GB, 18000207937536 bytes
255 heads, 63 sectors/track, 2188400 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdc1 1 267350 2147483647+ ee EFI GPT
Disk /dev/sdd: 4982 MB, 4982833152 bytes
8 heads, 32 sectors/track, 38016 cylinders
Units = cylinders of 256 * 512 = 131072 bytes
Device Boot Start End Blocks Id System
/dev/sdd1 1 41 5244 83 Linux
/dev/sdd2 42 3948 500096 83 Linux
/dev/sdd3 3949 7855 500096 83 Linux
/dev/sdd4 7856 30240 2865280 5 Extended
/dev/sdd5 7856 7920 8316 83 Linux
/dev/sdd6 7921 7988 8700 83 Linux
/dev/sdd7 7989 30240 2848252 83 Linux
Disk /dev/md9: 542 MB, 542769152 bytes
2 heads, 4 sectors/track, 132512 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md9 doesn't contain a valid partition table
Disk /dev/md13: 469 MB, 469893120 bytes
2 heads, 4 sectors/track, 114720 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md13 doesn't contain a valid partition table
Disk /dev/md322: 32.6 GB, 32633257984 bytes
2 heads, 4 sectors/track, 7967104 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md322 doesn't contain a valid partition table
$ cat /proc/partitions
major minor #blocks name
1 0 204800 ram0
1 1 458752 ram1
1 2 458752 ram2
1 3 204800 ram3
1 4 204800 ram4
1 5 204800 ram5
1 6 204800 ram6
1 7 204800 ram7
1 8 204800 ram8
1 9 204800 ram9
1 10 204800 ram10
1 11 204800 ram11
1 12 204800 ram12
1 13 204800 ram13
1 14 204800 ram14
1 15 204800 ram15
7 0 32768 loop0
8 16 17578328064 sdb
8 17 530125 sdb1
8 18 530142 sdb2
8 19 17543205888 sdb3
8 20 538701 sdb4
8 21 32997507 sdb5
8 0 17578328064 sda
8 1 530125 sda1
8 2 530142 sda2
8 3 17543205888 sda3
8 4 538701 sda4
8 5 32997507 sda5
8 32 17578328064 sdc
8 33 530125 sdc1
8 34 530142 sdc2
8 35 17543205888 sdc3
8 36 538701 sdc4
8 37 32997507 sdc5
8 48 4866048 sdd
8 49 5244 sdd1
8 50 500096 sdd2
8 51 500096 sdd3
8 52 1 sdd4
8 53 8316 sdd5
8 54 8700 sdd6
8 55 2848252 sdd7
9 9 530048 md9
9 13 458880 md13
9 322 31868416 md322
$ ls /dev/md*
/dev/md13 /dev/md322 /dev/md9
$ cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
md322 : active raid1 sdc5[3](S) sdb5[2] sda5[0]
31868416 blocks super 1.0 [2/2] [UU]
bitmap: 0/1 pages [0KB], 65536KB chunk
md13 : active raid1 sdc4[2] sdb4[1] sda4[0]
458880 blocks super 1.0 [128/3] [UUU_____________________________________________________________________________________________________________________________]
bitmap: 1/1 pages [4KB], 65536KB chunk
md9 : active raid1 sdc1[2] sdb1[1] sda1[0]
530048 blocks super 1.0 [128/3] [UUU_____________________________________________________________________________________________________________________________]
bitmap: 1/1 pages [4KB], 65536KB chunk
unused devices: <none>
$ sudo mdadm --detail /dev/md9
/dev/md9:
Version : 1.0
Creation Time : Mon Apr 14 17:08:43 2025
Raid Level : raid1
Array Size : 530048 (517.63 MiB 542.77 MB)
Used Dev Size : 530048 (517.63 MiB 542.77 MB)
Raid Devices : 128
Total Devices : 3
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Mon Apr 14 17:38:51 2025
State : active, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Name : 9
UUID : 4069859c:e4a6c75b:7575e4b9:a9f06ef3
Events : 773
Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
2 8 33 2 active sync /dev/sdc1
6 0 0 6 removed
8 0 0 8 removed
10 0 0 10 removed
(100行以上あるためコマンド結果省略)
254 0 0 254 removed
$ sudo mdadm --detail /dev/md13
/dev/md13:
Version : 1.0
Creation Time : Mon Apr 14 17:08:51 2025
Raid Level : raid1
Array Size : 458880 (448.13 MiB 469.89 MB)
Used Dev Size : 458880 (448.13 MiB 469.89 MB)
Raid Devices : 128
Total Devices : 3
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Mon Apr 14 17:19:40 2025
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Name : 13
UUID : a789ccbf:b313b516:95c08970:8a9b099d
Events : 116
Number Major Minor RaidDevice State
0 8 4 0 active sync /dev/sda4
1 8 20 1 active sync /dev/sdb4
2 8 36 2 active sync /dev/sdc4
6 0 0 6 removed
8 0 0 8 removed
10 0 0 10 removed
(100行以上あるためコマンド結果省略)
254 0 0 254 removed
$ sudo mdadm --detail /dev/md322
/dev/md322:
Version : 1.0
Creation Time : Mon Apr 14 17:09:02 2025
Raid Level : raid1
Array Size : 31868416 (30.39 GiB 32.63 GB)
Used Dev Size : 31868416 (30.39 GiB 32.63 GB)
Raid Devices : 2
Total Devices : 3
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Mon Apr 14 17:14:57 2025
State : clean
Active Devices : 2
Working Devices : 3
Failed Devices : 0
Spare Devices : 1
Name : 322
UUID : 99e027e1:6d464c21:502ac134:bd0acf41
Events : 77
Number Major Minor RaidDevice State
0 8 5 0 active sync /dev/sda5
2 8 21 1 active sync /dev/sdb5
3 8 37 - spare /dev/sdc5
$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount pt> <type> <options> <dump> <pass>
/dev/ram / ext2 defaults 1 1
proc /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
$ cat /proc/mounts
none / tmpfs rw,relatime,size=473088k,mode=755 0 0
devtmpfs /dev devtmpfs rw,relatime,size=65885632k,nr_inodes=16471408,mode=755 0 0
/proc /proc proc rw,relatime 0 0
/proc /proc proc rw,relatime 0 0
devpts /dev/pts devpts rw,relatime,mode=600,ptmxmode=000 0 0
sysfs /sys sysfs rw,relatime 0 0
tmpfs /tmp tmpfs rw,relatime,size=65536k 0 0
tmpfs /dev/shm tmpfs rw,relatime 0 0
tmpfs /share tmpfs rw,relatime,size=16384k 0 0
/dev/sdd5 /mnt/boot_config ext2 rw,relatime,errors=continue 0 0
tmpfs /mnt/snapshot/export tmpfs rw,relatime,size=16384k 0 0
cgroup_root /sys/fs/cgroup tmpfs rw,relatime 0 0
cpu /sys/fs/cgroup/cpu cgroup rw,relatime,cpu 0 0
none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0
securityfs /sys/kernel/security securityfs rw,relatime 0 0
/dev/md9 /mnt/HDA_ROOT ext3 rw,relatime,data=ordered 0 0
/dev/md13 /mnt/ext ext3 rw,relatime,data=ordered 0 0
tmpfs /samba_third_party tmpfs rw,relatime,size=32768k 0 0
tmpfs /samba tmpfs rw,relatime,size=65536k 0 0
/dev/ram2 /mnt/update ext2 rw,relatime,errors=continue 0 0
tmpfs /mnt/ext/opt/FileStation5 tmpfs rw,relatime,size=32768k,mode=777 0 0
/dev/loop0 /mnt/ext/opt/FileStation5 ext3 ro,relatime 0 0
tmpfs /tmp/wfm tmpfs rw,relatime,size=10240k,mode=777 0 0
tmpfs /samba/.samba/lock/msg.lock tmpfs rw,relatime,size=49152k 0 0
tmpfs /mnt/ext/opt/samba/private/msg.sock tmpfs rw,relatime,size=16384k 0 0
$ sudo df -aT
Filesystem Type 1K-blocks Used Available Use% Mounted on
none tmpfs 473088 359600 113488 76% /
devtmpfs devtmpfs 65885632 4 65885628 0% /dev
/proc proc 0 0 0 0% /proc
/proc proc 0 0 0 0% /proc
devpts devpts 0 0 0 0% /dev/pts
sysfs sysfs 0 0 0 0% /sys
tmpfs tmpfs 65536 448 65088 1% /tmp
tmpfs tmpfs 65907340 148 65907192 0% /dev/shm
tmpfs tmpfs 16384 0 16384 0% /share
/dev/sdd5 ext2 7928 47 7473 1% /mnt/boot_config
tmpfs tmpfs 16384 0 16384 0% /mnt/snapshot/export
cgroup_root tmpfs 65907340 0 65907340 0% /sys/fs/cgroup
cpu cgroup 0 0 0 0% /sys/fs/cgroup/cpu
none cgroup 0 0 0 0% /sys/fs/cgroup/memory
securityfs securityfs 0 0 0 0% /sys/kernel/security
/dev/md9 ext3 505300 122956 382344 24% /mnt/HDA_ROOT
/dev/md13 ext3 426984 386300 40684 90% /mnt/ext
tmpfs tmpfs 32768 27900 4868 85% /samba_third_party
tmpfs tmpfs 65536 3216 62320 5% /samba
/dev/ram2 ext2 444276 2318 441958 1% /mnt/update
tmpfs tmpfs 29688 20846 8842 70% /mnt/ext/opt/FileStation5
/dev/loop0 ext3 29688 20846 8842 70% /mnt/ext/opt/FileStation5
tmpfs tmpfs 10240 0 10240 0% /tmp/wfm
tmpfs tmpfs 49152 32 49120 0% /samba/.samba/lock/msg.lock
tmpfs tmpfs 16384 0 16384 0% /mnt/ext/opt/samba/private/msg.socksda, sdb, sdcが今回追加した18TBのHDDです。
sddは5GBのディスクで、システム用として内蔵されているものです。
HDDを追加すると、sde、sdfと末尾にずれていくようです。
ソフトウェアRAIDがシステムで組まれています。
HDDのパーティションの内容は、0.5GBのmd9、0.5GBの予備領域?、メインストレージ領域、0.5GBのmd13、33GBのmd322となっています。
md9, md13のRAIDアレイは3台(128台設定)にまたがっていますが、md322は2台(2台設定)が使用されていて、1台はスペアになっているようです。
HDDを追加するだけでは、システムのRAID領域は再構築されず、今は何がトリガーになっているのか不明です。
md9 は /mnt/HDA_ROOT でマウントされていて、システムメインファイルが格納されていそうです。
md13 は /mnt/ext でマウントされていて、各種アプリの設定情報?が格納されていそうです。
md322 はマウントされていないため不明です。
ストレージプールの作成
ストレージプールを作成しないと上記の通り、最低限のシステム領域しか確保できていないため、一部の設定が保存できなかったりします。
続けて、ストレージプールの作成を行います。
プールオーバープロビジョンはHDDを使用するため無効にします。
最適化が行われるのでしばらく待ちます。
ストレージプール作成後のディスクパーティション構成他
ストレージプール作成後の状態を確認してみました。
(ついでに残りのベイにHDDを差し込んだので、前回とはHDD認識数が異なります)
$ ls /dev/sd*
/dev/sda /dev/sdb2 /dev/sdc4 /dev/sdf2 /dev/sdi1 /dev/sdl /dev/sdm5
/dev/sda1 /dev/sdb3 /dev/sdc5 /dev/sdg /dev/sdi2 /dev/sdl1 /dev/sdm6
/dev/sda2 /dev/sdb4 /dev/sdd /dev/sdg1 /dev/sdj /dev/sdl2 /dev/sdm7
/dev/sda3 /dev/sdb5 /dev/sde /dev/sdg2 /dev/sdj1 /dev/sdm
/dev/sda4 /dev/sdc /dev/sde1 /dev/sdh /dev/sdj2 /dev/sdm1
/dev/sda5 /dev/sdc1 /dev/sde2 /dev/sdh1 /dev/sdk /dev/sdm2
/dev/sdb /dev/sdc2 /dev/sdf /dev/sdh2 /dev/sdk1 /dev/sdm3
/dev/sdb1 /dev/sdc3 /dev/sdf1 /dev/sdi /dev/sdk2 /dev/sdm4
$ sudo fdisk -l
Disk /dev/sda: 18000.2 GB, 18000207937536 bytes
255 heads, 63 sectors/track, 2188400 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 267350 2147483647+ ee EFI GPT
Disk /dev/sdb: 18000.2 GB, 18000207937536 bytes
255 heads, 63 sectors/track, 2188400 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 267350 2147483647+ ee EFI GPT
Disk /dev/sdd: 18000.2 GB, 18000207937536 bytes
255 heads, 63 sectors/track, 2188400 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdd doesn't contain a valid partition table
Disk /dev/sdc: 18000.2 GB, 18000207937536 bytes
255 heads, 63 sectors/track, 2188400 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdc1 1 267350 2147483647+ ee EFI GPT
Disk /dev/sde: 18000.2 GB, 18000207937536 bytes
255 heads, 63 sectors/track, 2188400 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sde1 1 267350 2147483647+ ee EFI GPT
Disk /dev/sdf: 18000.2 GB, 18000207937536 bytes
255 heads, 63 sectors/track, 2188400 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdf1 1 267350 2147483647+ ee EFI GPT
Disk /dev/sdg: 18000.2 GB, 18000207937536 bytes
255 heads, 63 sectors/track, 2188400 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdg1 1 267350 2147483647+ ee EFI GPT
Disk /dev/sdh: 18000.2 GB, 18000207937536 bytes
255 heads, 63 sectors/track, 2188400 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdh1 1 267350 2147483647+ ee EFI GPT
Disk /dev/sdi: 18000.2 GB, 18000207937536 bytes
255 heads, 63 sectors/track, 2188400 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdi1 1 267350 2147483647+ ee EFI GPT
Disk /dev/sdj: 18000.2 GB, 18000207937536 bytes
255 heads, 63 sectors/track, 2188400 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdj1 1 267350 2147483647+ ee EFI GPT
Disk /dev/sdk: 18000.2 GB, 18000207937536 bytes
255 heads, 63 sectors/track, 2188400 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdk1 1 267350 2147483647+ ee EFI GPT
Disk /dev/sdl: 18000.2 GB, 18000207937536 bytes
255 heads, 63 sectors/track, 2188400 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdl1 1 267350 2147483647+ ee EFI GPT
Disk /dev/sdm: 4982 MB, 4982833152 bytes
8 heads, 32 sectors/track, 38016 cylinders
Units = cylinders of 256 * 512 = 131072 bytes
Device Boot Start End Blocks Id System
/dev/sdm1 1 41 5244 83 Linux
/dev/sdm2 42 3948 500096 83 Linux
/dev/sdm3 3949 7855 500096 83 Linux
/dev/sdm4 7856 30240 2865280 5 Extended
/dev/sdm5 7856 7920 8316 83 Linux
/dev/sdm6 7921 7988 8700 83 Linux
/dev/sdm7 7989 30240 2848252 83 Linux
Disk /dev/md9: 542 MB, 542769152 bytes
2 heads, 4 sectors/track, 132512 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md9 doesn't contain a valid partition table
Disk /dev/md13: 469 MB, 469893120 bytes
2 heads, 4 sectors/track, 114720 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md13 doesn't contain a valid partition table
Disk /dev/md322: 32.6 GB, 32633257984 bytes
2 heads, 4 sectors/track, 7967104 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Disk /dev/md322 doesn't contain a valid partition table
$ ls /dev/md*
/dev/md13 /dev/md322 /dev/md9
$ cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
md322 : active raid1 sdc5[2](S) sdb5[1] sda5[0]
31868416 blocks super 1.0 [2/2] [UU]
bitmap: 0/1 pages [0KB], 65536KB chunk
md13 : active raid1 sda4[0] sdc4[2] sdb4[1]
458880 blocks super 1.0 [128/3] [UUU_____________________________________________________________________________________________________________________________]
bitmap: 1/1 pages [4KB], 65536KB chunk
md9 : active raid1 sda1[0] sdc1[2] sdb1[1]
530048 blocks super 1.0 [128/3] [UUU_____________________________________________________________________________________________________________________________]
bitmap: 1/1 pages [4KB], 65536KB chunk
unused devices: <none>
$ sudo mdadm --detail /dev/md9
/dev/md9:
Version : 1.0
Creation Time : Mon Apr 14 17:08:43 2025
Raid Level : raid1
Array Size : 530048 (517.63 MiB 542.77 MB)
Used Dev Size : 530048 (517.63 MiB 542.77 MB)
Raid Devices : 128
Total Devices : 3
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Mon Jun 16 23:21:53 2025
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Name : 9
UUID : 4069859c:e4a6c75b:7575e4b9:a9f06ef3
Events : 29938
Number Major Minor RaidDevice State
0 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
2 8 33 2 active sync /dev/sdc1
6 0 0 6 removed
8 0 0 8 removed
10 0 0 10 removed
(100行以上あるためコマンド結果省略)
254 0 0 254 removed
$ sudo mdadm --detail /dev/md13
/dev/md13:
Version : 1.0
Creation Time : Mon Apr 14 17:08:51 2025
Raid Level : raid1
Array Size : 458880 (448.13 MiB 469.89 MB)
Used Dev Size : 458880 (448.13 MiB 469.89 MB)
Raid Devices : 128
Total Devices : 3
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Mon Jun 16 22:56:08 2025
State : clean, degraded
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Name : 13
UUID : a789ccbf:b313b516:95c08970:8a9b099d
Events : 3804
Number Major Minor RaidDevice State
0 8 4 0 active sync /dev/sda4
1 8 20 1 active sync /dev/sdb4
2 8 36 2 active sync /dev/sdc4
6 0 0 6 removed
8 0 0 8 removed
10 0 0 10 removed
(100行以上あるためコマンド結果省略)
254 0 0 254 removed
$ sudo mdadm --detail /dev/md322
/dev/md322:
Version : 1.0
Creation Time : Mon Jun 16 21:05:28 2025
Raid Level : raid1
Array Size : 31868416 (30.39 GiB 32.63 GB)
Used Dev Size : 31868416 (30.39 GiB 32.63 GB)
Raid Devices : 2
Total Devices : 3
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Mon Jun 16 21:05:29 2025
State : clean
Active Devices : 2
Working Devices : 3
Failed Devices : 0
Spare Devices : 1
Name : 322
UUID : 7ff6838a:f9d4a451:98b0f6fc:1541fb68
Events : 2
Number Major Minor RaidDevice State
0 8 5 0 active sync /dev/sda5
1 8 21 1 active sync /dev/sdb5
2 8 37 - spare /dev/sdc5
$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount pt> <type> <options> <dump> <pass>
/dev/ram / ext2 defaults 1 1
proc /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
$ cat /proc/mounts
none / tmpfs rw,relatime,size=473088k,mode=755 0 0
devtmpfs /dev devtmpfs rw,relatime,size=65885316k,nr_inodes=16471329,mode=755 0 0
/proc /proc proc rw,relatime 0 0
/proc /proc proc rw,relatime 0 0
devpts /dev/pts devpts rw,relatime,mode=600,ptmxmode=000 0 0
sysfs /sys sysfs rw,relatime 0 0
tmpfs /tmp tmpfs rw,relatime,size=65536k 0 0
tmpfs /dev/shm tmpfs rw,relatime 0 0
tmpfs /share tmpfs rw,relatime,size=16384k 0 0
/dev/sdm5 /mnt/boot_config ext2 rw,relatime,errors=continue 0 0
tmpfs /mnt/snapshot/export tmpfs rw,relatime,size=16384k 0 0
/dev/md9 /mnt/HDA_ROOT ext3 rw,relatime,data=ordered 0 0
zpool1 /zpool1 zfs rw,relatime,xattr,richacl 0 0
zpool1/zfs1 /share/ZFS1_DATA zfs rw,relatime,xattr,richacl 0 0
zpool1/zfs2 /share/ZFS2_DATA zfs rw,relatime,xattr,richacl 0 0
zpool1/zfs530 /share/ZFS530_DATA zfs rw,relatime,xattr,richacl 0 0
cgroup_root /sys/fs/cgroup tmpfs rw,relatime 0 0
cpu /sys/fs/cgroup/cpu cgroup rw,relatime,cpu 0 0
none /sys/fs/cgroup/memory cgroup rw,relatime,memory 0 0
securityfs /sys/kernel/security securityfs rw,relatime 0 0
/dev/md13 /mnt/ext ext4 rw,relatime,nodelalloc,data=ordered 0 0
tmpfs /samba_third_party tmpfs rw,relatime,size=32768k 0 0
tmpfs /share/ZFS1_DATA/.samba/lock/msg.lock tmpfs rw,relatime,size=49152k 0 0
tmpfs /mnt/ext/opt/samba/private/msg.sock tmpfs rw,relatime,size=16384k 0 0
tmpfs /mnt/ext/opt/FileStation5 tmpfs rw,relatime,size=32768k,mode=777 0 0
/dev/loop0 /mnt/ext/opt/FileStation5 ext3 ro,relatime 0 0
tmpfs /tmp/wfm tmpfs rw,relatime,size=10240k,mode=777 0 0
$ sudo df -aT
Filesystem Type 1K-blocks Used Available Use% Mounted on
none tmpfs 473088 365196 107892 77% /
devtmpfs devtmpfs 65885316 4 65885312 0% /dev
/proc proc 0 0 0 0% /proc
/proc proc 0 0 0 0% /proc
devpts devpts 0 0 0 0% /dev/pts
sysfs sysfs 0 0 0 0% /sys
tmpfs tmpfs 65536 1460 64076 2% /tmp
tmpfs tmpfs 65907340 148 65907192 0% /dev/shm
tmpfs tmpfs 16384 0 16384 0% /share
/dev/sdm5 ext2 7928 47 7473 1% /mnt/boot_config
tmpfs tmpfs 16384 0 16384 0% /mnt/snapshot/export
/dev/md9 ext3 505300 132900 372400 26% /mnt/HDA_ROOT
zpool1 zfs 13390746611 168 13390746443 0% /zpool1
zpool1/zfs1 zfs 1048576 48636 999940 5% /share/ZFS1_DATA
zpool1/zfs2 zfs 13390746963 520 13390746443 0% /share/ZFS2_DATA
zpool1/zfs530 zfs 13390857531 111088 13390746443 0% /share/ZFS530_DATA
cgroup_root tmpfs 65907340 0 65907340 0% /sys/fs/cgroup
cpu cgroup 0 0 0 0% /sys/fs/cgroup/cpu
none cgroup 0 0 0 0% /sys/fs/cgroup/memory
securityfs securityfs 0 0 0 0% /sys/kernel/security
/dev/md13 ext4 426984 389444 37540 91% /mnt/ext
tmpfs tmpfs 32768 27900 4868 85% /samba_third_party
tmpfs tmpfs 49152 32 49120 0% /share/ZFS1_DATA/.samba/lock/msg.lock
tmpfs tmpfs 16384 0 16384 0% /mnt/ext/opt/samba/private/msg.sock
tmpfs tmpfs 29688 19246 10442 65% /mnt/ext/opt/FileStation5
/dev/loop0 ext3 29688 19246 10442 65% /mnt/ext/opt/FileStation5
tmpfs tmpfs 10240 0 10240 0% /tmp/wfmZFSのパーティションが増えたようですね。
$ zpool list
NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT
zpool1 16.3T 533M 16.3T 0% 1.00x ONLINE -
$ zpool status
pool: zpool1
state: ONLINE
scan: none requested
prune: never
expand: none requested
config:
NAME STATE READ WRITE CKSUM
zpool1 ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
qzfs/enc_0/disk_0x1_5000039D78D36A0A_3 ONLINE 0 0 0
qzfs/enc_0/disk_0x2_5000039D78D38E32_3 ONLINE 0 0 0
qzfs/enc_0/disk_0x3_5000039D78D36898_3 ONLINE 0 0 0
errors: No known data errors
$ zpool iostat
capacity operations bandwidth
pool alloc free read write read write
---------- ----- ----- ----- ----- ----- -----
zpool1 533M 16.3T 0 6 17.9K 241Kzpoolコマンドで確認できますね。
初期設定
スマートインストレーションが終わったあとにコントロールパネルで以下の設定を変更しました。
システム - 一般設定
- 夏時間:「夏時間に合わせてシステムクロックを自動的に調整する」 チェックを外す
- コードページ:「ファイル名符号化」 英語から日本語に変更
ネットワークとファイルサービス - Telnet / SSH
- 「SSH接続を許可する」:任意
ネットワークとファイルサービス - サービス検出
- Bonjour:「Bonjourサービスを有効にする」 チェックを外す
- Qfinderディスカバリーサービス:「Qfinderディスカバリーサービスを有効にする」 チェックを外す
ネットワーク設定
メインマシンは100Gbpsのイーサネットカードを使っていますが、NAS側のPCIeの帯域の関係があり25Gbpsのカードで妥協です。
設定は「ネットワーク&仮想スイッチ」から変更をします。
イーサネットカード増設
「Mellanox MCX4121A-ACAT (NVIDIA ConnectX-4 Lx Ethernet Adapter Card)」を準備しました。
25Gbpsまで対応する2ポートSFP28のイーサネットカードです。
MellanoxがNVIDIAに買収されたため、社名はどちらかの表記です。
「互換性一覧」から「TS-h1283XU-RP」を選択してリストを見ると「Mellanox MCX4121A-ACAT」は存在していません。
しかし、同じMellanox社のConnectX-3シリーズがリストに存在することから、ドライバが内蔵されていると踏んでConnectX-4カードを選択しました。
NASのPCIeスロット(PCIe 3.0 x4 スロット4・CPU側)に刺すだけで無事、認識されてそのまま使用可能でした。
IPアドレス設定
「ネットワーク&仮想スイッチ」からネットワークを開き、インターフェース内で設定を行います。
対象のインターフェースにて、メニューから設定を開き、IPv4設定を静的IPアドレス、DNSの設定をします。
仮想スイッチ作成
「ネットワーク&仮想スイッチ」から仮想スイッチを開き、仮想スイッチを作成します。
NAS内で仮想化環境を含め、様々なところから同一ネットワークを使用したいです。
そのため内部で仮想スイッチを作成し、複数のアプリケーションからの接続を許可します。
詳細モードでネットワークに接続するためのアダプター・MACアドレスを指定して進みます。
仮想スイッチのIPアドレスは、アダプターと同一にできるので、同一設定にしておきます。
NAT / DHCPサーバー / IPv6 は有効にせず作成で、「Virtual Switch 1」が作成されます。
ゲートウェイ
複数のネットワークに接続する場合、どこをデフォルトゲートウェイにするか設定しないといけません。
「ネットワーク&仮想スイッチ」からネットワークを開き、インターフェース内で設定を行います。
「システムの既定のゲートウェイ」を押すと設定開始できます。
自分の場合は仮想スイッチを指定しました。
NCSIサービスは無効にしました。
ドメインコントローラ(DNSサーバー)の構築
SynologyはGUIからDNSサーバー構築が可能ですが、QNAPはDNSサーバー単体の構築ができません。
しかし、QNAPでもDNSサーバーを内包しているドメインコントローラーの構築は可能となっています。
自宅では複数のコンピュータが存在し、複数人で使うこともあることからドメインコントローラでの構築を行ってみることにします。
(Docker等でDnsmasqを動かす方法はありますが、基本的なDNSはNAS上でネイティブで上がってきて欲しいのです)
なお、単体のLDAPサーバー機能も内蔵されていますが、ドメインコントローラと動作がかぶるため同時に動かすことは出来ません。
Windowsログオンも行いたい場合は、LDAPサーバーも内包するドメインコントローラを構築しましょう。
(つまり、ドメインコントローラとはDNSサーバーやLDAPサーバーなど複数の要因からなる複合的機能ということです)
ドメインコントローラって何?
簡単に言えばPCにログインするユーザーの管理をするソフトウェアです。「Active Directory」や「Samba」が有名です。
会社や大学などのPCが大量にある環境で、どのPCでも任意のユーザーがログインできるように、ユーザー情報を集中管理するものです。
ノートパソコンを持ち歩いて1人で使うだけであれば関係ありません。デスクトップPCが複数台あり、複数人で使う環境向けの話です。
ドメインの決め方
要点は以下の通り。
- .localは使用しない(mDNSで使用されるようになったため不具合の原因になる)
- 所有しているパブリックドメインのサブドメインが理想
- サブドメイン名部分はNetBIOS名との兼ね合いで15文字以下推奨
例えば、このサイトのドメインを例にすると、「ad.htlab.net」「home.htlab.net」などになると思われます。
証明書を作成する際は実在のドメインでないと無理なので、ドメインを持っていない方は何らかのgTLD(ccTLDは避けたほうが良いです)を購入するのが良いと思われます。
詳しく知りたい場合は「Active Directory」や「ドメインコントローラ」等のワードで調べてください。
ドメインコントローラを設定する
「コントロールパネル」の「権限設定」から「ドメインコントローラ」を開きます。
「ドメインコントローラを有効にします」にチェックを入れます。
種別は「ドメインコントローラ」のままにして、「ドメイン」に使用するドメインを入力。
ドメインコントローラの管理者パスワードを設定して「適用」をクリックします。
この時点からドメインコントローラとしての動作を開始するため、DNSサーバーの構築が完了します。
適当なPCから「nslookup -debug google.com [QNAPのIPアドレス]」などとコマンドを叩いてみればDNSサーバーが動作していることがわかると思います。
この時点でドメインコントローラとして使用せずともDNSサーバーとして使用出来ます。
※設定画面中ドメインコントローラ内のDNSタブで「DNSインターフェイス」ボタンを押し、使用する上流のDNSサーバー(LANインターフェース)を指定しておくこと。
標準でも複数のLANインターフェースがあり、デフォルトでは全てのインターフェースよりDNSを拾おうとするため、指定しないとDNSが使用できない場合があります。
なお、ネットワークの設定画面で仮想スイッチを作成している場合には、仮想スイッチ上でDNSサーバーを指定した上で、そこに繋がるインターフェースをドメインコントローラーから指定します。
ドメインコントローラのパスワードポリシー
「コントロールパネル」中の「システム」「セキュリティ」「パスワードポリシー」から設定できるパスワードポリシーに関しては、QNAPのローカルユーザーのみに適用されるものです。
つまり、ドメインコントローラ内のユーザーには適用されません。
パスワードの複雑性が要求されますが、以下のようにコマンドで確認すると設定は有効になっていません。
$ sudo /usr/local/samba/bin/samba-tool domain passwordsettings show
Password information for domain 'DC=*****,DC=*****,DC=*****'
Password complexity: off
Store plaintext passwords: off
Password history length: 0
Minimum password length: 8
Minimum password age (days): 0
Maximum password age (days): 0
Account lockout duration (mins): 30
Account lockout threshold (attempts): 0
Reset account lockout after (mins): 30つまり、WebUI上でJavaScriptでのパスワード複雑性要件のチェックを実装していて、実際のドメインコントローラの設定を元にはしないようです。
簡単なパスワードでユーザーを作成したい場合は、以下のようにコマンドライン経由でユーザーを作成すれば良いでしょう。
$ sudo /usr/local/samba/bin/samba-tool user create ユーザー名 パスワード
User 'ユーザー名' added successfullyもしくは、複雑性チェックを通過できるパスワードでWebUIからユーザーを作成した後、以下のようにパスワード変更をすれば良いでしょう。
$ sudo /usr/local/samba/bin/samba-tool user setpassword ユーザー名 --newpassword=新しいパスワード
Changed password OK
ホームフォルダ機能を設定する
「コントロールパネル」の「権限設定」から「ユーザー」を開きます。
「詳細設定」から「ホームフォルダー」を開きます。
「すべてのユーザーのホームフォルダーを有効にする」にチェックを入れると、各ユーザーごとに自動で「home」フォルダが用意されるようになります。
ドメインコントローラにユーザーを追加する
「コントロールパネル」の「権限設定」から「ドメインコントローラ」を開きます。
「ユーザー」タブより「作成」、「ユーザの作成」とクリックすると「ユーザの作成」ウィザードが開きます。
追加したいユーザー名とパスワードを入れて進みます。
ユーザーグループはデフォルトで「Domain Users」に属し、他に特に編集する必要はありません。
管理者権限が欲しい場合は、「Domain Admins」にも属する必要があります。
(ドメイン参加時に必要なので1ユーザーはDomain Adminsにも属しておきましょう)
Windows 10 / 11からドメインに参加する
前提としてHomeエディションではドメイン参加不可です。
Pro以上のエディションでしかドメインは使用出来ません。
また、ドメインコントローラ自体をDNSサーバーとして参照していないと接続出来ません。
固定IPにしている場合はそのPCで、DHCPサーバーで配布している場合はDHCPサーバー上で、DNSをドメインコントローラに向けてください。
なお、ユーザーフォルダ名に関しては、ユーザー名がローカルユーザーと被る場合は「ユーザー名.AD」などサブドメイン名が反映され、被らない場合はそのままドメインユーザー名でフォルダが生成されます。
「設定」の「システム」からドメイン参加する方法
Windows11の場合は「設定」を開き、「システム」「バージョン情報」「ドメインまたはワークグループ」の順にクリック。
Windows10の場合は「設定」を開き、「システム」「詳細情報」下部の関連設定から「このPCの名前を変更(詳細設定)」の順にクリック。
システムのプロパティが開くので「コンピューター名」タブ下部の「変更」ボタンをクリック。
「所属するグループ」を「WORKGROUP」からドメインに変更して、ドメイン名を入力。
続いてドメイン管理者のユーザー名とパスワードを入力。
(Domain Admins権限が無いと、ドメインに参加できずコンピューター名が競合しているとのエラーが出ます)
「設定」の「アカウント」からドメイン参加する方法
Windows 10 / 11 ともに同じで「設定」を開き、「アカウント」「職場または学校へのアクセス」の順にクリックし、「接続」ボタンをクリック。
「職場または学校アカウントのセットアップ」画面が出るので、下部、別の操作セクションにある「このデバイスをローカルのActive Directoryドメインに参加させる」をクリック。
ドメイン名を入力し、続いてドメイン管理者のユーザー名とパスワードを入力。
(この際にアカウントに対する権限の種類が選べるが、スキップで飛ばすと上記手順と同様の扱いになる)
ユーザープロファイルのプロファイルパス設定
ドメインコントローラのユーザーから、ユーザープロファイルの編集で見える設定内容についてです。
ユーザーがログインした際のプロファイルパスを設定します。
「/Profile」と入力しました。
なお、入力したパス末尾に、勝手にユーザー名が追加されるようです。
非表示共有フォルダ「Profile」を作成して、その中にプロファイルデータが入るようにしています。
logonCount:
profilePath: \\[DC name]\Profile$\[ユーザー名]
whenChanged:
ただ、軽く試した感じ、うまく動きませんでした。
「移動プロファイルに問題がありました。以前に保存されたローカルプロファイルでサインインしています。 イベントログで詳細を確認するか、管理者に問い合わせてください。」とエクスプローラーが通知してきます。
うまく動けば、C:\Users\ユーザー名\AppData\Roaming\ 以下のプロファイルをログイン・ログアウト毎にサーバーにコピーする運用になるので、時間がかかるようになります。
また複数台のPCに同じユーザーで同時にログインするとファイルの競合が起きて、環境が壊れる可能性も大きく、トラブルシューティングはせずに使用しないことにします。
ユーザープロファイルのログインスクリプト設定
ドメインコントローラのユーザーから、ユーザープロファイルの編集で見える設定内容についてです。
QNAP上にはすでに、「netlogon」フォルダ、「sysvol/ドメイン名/scripts」フォルダが生成されているが、実際には同一のフォルダとなっています。
QuTS hero h5.2.x - Modifying domain user account information
/shareフォルダ以下にてlsコマンドでリンク先を探った結果、以下のようになっているようです。
netlogon -> ZFS1_DATA/.samba_target/state/sysvol/ドメイン名/scripts/
sysvol -> ZFS1_DATA/.samba_target/state/sysvol/
つまり、「netlogon」フォルダにしても、「sysvol/ドメイン名/scripts」フォルダにしても、同一です。
実体は「ZFS1_DATA/.samba_target/state/sysvol/ドメイン名/scripts/」にあると言えます。
ユーザープロファイルのホームフォルダー設定
ドメインコントローラのユーザーから、ユーザープロファイルの編集で見える設定内容についてです。
ドライブレターとパスが設定できるようになっています。
ユーザーが利用するフォルダと、グループで共有するフォルダなどをマウントすることが多いと思われます。
私はドライブレター「U:(UserのU)」にし、パスを「/home」(勝手にUNCパス形式で保存されます)を入力して設定しました。
これはホームフォルダー機能が有効であれば、/homeは接続時のユーザー向けに勝手にディレクトリが生成されるので便利です。
実際には、/homes/DOMAIN=サブドメイン名大文字/ユーザー名/に入ります。
例えば、ad.example.comのドメインで、ユーザー名がuserだった場合には、
/homes/DOMAIN=AD/user/ フォルダが勝手に生成され、このユーザーからは/homeフォルダがそのディレクトリにリンクされるように見えます。
ホームフォルダーの設定しか出来ない(1行しかマウント設定を入れられない)ので、共有フォルダ等はログインスクリプトを記述すると良いと思われます。
コマンドラインで確認すると以下のようになります。
$ sudo /usr/local/samba/bin/samba-tool user show ユーザー名
lastLogonTimestamp:
homeDirectory: \\[DC name]\home
homeDrive: U:
lastLogon:
のように設定されていると思われます。
homeDirectoryはUNCパス形式でないといけないようです。
DC nameを確認するには
$ sudo /usr/local/samba/bin/samba-tool domain info 127.0.0.1
コマンドラインから設定するには
$ sudo /usr/local/samba/bin/samba-tool user edit
ただ、Vi等のエディタでの設定ファイルの書き換えになるので、間違えがないように。
WebUIからやったほうが楽だと思います。
ドライブレターの考え方は以下の通りです。
フロッピーを接続する場合に、A:, B:の割り当てを使用します。
システムドライブやデータドライブで、C:, D:を使用します。
E:~はUSBドライブ等を接続するときに備えて開けておきます。
私は、光学ドライブはQ:に当てておくことが多いです。
- http://deztec.jp/x/01/tips/comp/c0054.html
- https://culage.hatenablog.com/entry/20170602/p2
- https://onechu312.blog.jp/archives/1005012395.html
ユーザーフォルダーのドライブレターの例としては、
- H: Homeフォルダ
- U: Userフォルダ
- P: Personalフォルダ
などの例があると思います。
まぁ、自分がわかりやすければ何でも良いと思いますが、ドライブを接続するごとに順番に使用されるので、末尾に近いところが個人的な好みです。
グループで使う共有フォルダは、
- P: Publicフォルダ
- S: Shareフォルダ
- T: Tempフォルダ
- V: Vaultフォルダ
- W: Workフォルダ
などの例もありますし、普通に末尾から使用していく、ということも多いと思います。
ちなみに、QNAPでは共有フォルダとしてPublicフォルダが生成されています。
ドメイン環境下のアイコン画像について
thumbnailPhoto属性で画像設定が可能。1:1アスペクト比のJPEG画像ファイル推奨となります。
Microsoft 365やSharePoint等のサービスでは、648 x 648 pxの500KBファイルまで許容されているが、Active Directoryでは100KBまで。
当初、推奨画像サイズは96 x 96 pxとされていたが、拡張されて648px解像度まで許容されたようです。
しかし、ファイルサイズに関しては、以下スキーマ属性に示されている通り。
- MS-ADLS - 2.364 Attribute thumbnailPhoto
- MS-ADA3 - 2.307 Attribute thumbnailPhoto
- Managing AD User Photos: Size Requirements, Format, and Deployment Methods
rangeUpper: 102400 とのことから、102400バイト=100KBとなります。
QNAP上ではSambaでの実装となるが、同様であると思われため、解像度648 x 648 px以下の100KB未満のJPEG画像ファイルが適するでしょう。
アプリケーション - Webサーバー
内蔵のApacheを有効にできます。この際、「Web」という共有フォルダが生成され、そこがドキュメントルートとなります。
自宅サーバーではWebサーバーをどこに置くかが悩ましいです。
NASのWebサーバーを公開にした場合、脆弱性の追従が少し不安です。また、何かあった場合に重要なデータにアクセスされる可能性があります。
Webサーバーを仮想化等で別の場所に置いた場合には、ファイル共有とWebサーバーのアドレスが異なってしまう問題も起こります。
通常使用している際に、アドレスが分かれていると面倒です。
QNAPにはGUIでHTTP/HTTPSのリバースプロキシを設定できるので、HTTP/HTTPSだけ別サーバーに送ることも出来ます。(コントロールパネル、ネットワークアクセス内で設定)
しかし、HTTPSアクセスの際のSSL証明書はQNAPにデフォルトで設定されているものが参照されてしまいます。
よって、WebサーバーをQNAPで構築するにしろ、別で構築するにしろ、QNAPにはSSLの証明書を設定したほうが良い、という結論になります。
証明書の入れ替え
今の時代、SSL証明書が必須です。Let's Encryptで証明書を準備できると良いです。
QNAPはセキュリティ設定より証明書の入れ替えボタンでLet's Encryptを指定できるところまでは良いのですが、入れ替えた証明書については自動更新はできないようです。(サポートは出来るとの返答だが、ネット上では出来ないという話を聞く)
(QNAPが推しているmyQNAPcloudを使用すると自動更新できるようですが、カスタムドメインは使用できず、末尾myqnapcloud.comというDDNSアドレスが付与されるようです)
カスタムドメインでのLet's Encrypt自動更新ができれば良いのですが、手動で行うしかない?
そのため、Let's Encrypt自動更新する方法を探します。
- Let's Encrypt on QNAP を利用する方法(SSHログインしgit/pythonをEntware経由でインストールしないといけない)
- Certbot を利用する方法(同様にSSHログインしてインストール作業が必要)
- Certbot公式Dockerイメージ を利用する方法(証明書をQNAP側にインポートする必要がある)
- 他、別の物理、仮想マシンにてCertbot等のACMEクライアントを動かしてQNAP側にインポートする等
どちらにしても、Let's Encryptの更新には外部からアクセスできる80番ポートもしくは443番ポートが必要になるので、Webサーバーを動かすところで同時に動かせるのが一番良いと思います。
Dockerにて分離する場合には、例えばQNAP側のWebサーバーを外部公開しているのであれば、検証に必要な一部ディレクトリを考慮する必要があります。
ただし、ワイルドカード証明書を必要とする場合には、DNSのチャレンジ認証でドメイン自体の所有を証明する必要があり、DNSサーバーとの連携が必要になります。
私はドメイン・DNSを Amazon Route53 にて管理しているので、DNS認証のほうが楽かもしれないです。
以下、Container Stationのセクションをご覧ください。別ページにて解説しています。
Apacheでのリバースプロキシ
LAN内で複数サーバーがある状況だと、リバースプロキシをしたいときがあります。
コントロールパネル中のネットワークアクセス・リバースプロキシ設定より、HTTPとHTTPSのリバースプロキシ設定ができますが、ポート番号に対してすべて転送してしまいます。
そのため、特定のディレクトリだけ転送したい時はApacheの設定を変更するしかありません。
最初にSSH経由で接続し、mod_proxyが使用可能かを確認します。
sudo /usr/local/apache/bin/apachectl -M
モジュールを確認してみると、mod_proxyが読み込まれていません。
sudo vi /etc/config/apache/apache.conf
コマンドで設定を確認しておきます。たしかに、LoadModuleは書かれていません。
sudo /etc/init.d/Qthttpd.sh restart
設定反映はこのコマンドで行います。Apacheが再起動します。
Shutting down Qthttpd services:/etc/config/php.d/php_ext.ini not found
OK.
Recover apache confiugre
Starting Qthttpd services:/etc/config/php.d/php_ext.ini not found
OK
設定に問題があった場合には、このように「Recover apache confiugre」と表示され、設定が巻き戻ります。
WebUIからWebサーバーの設定をし直す必要があります。設定を手動で初期化するボタンもあるので、Apacheの設定変更に関しては比較的安全でしょう。
では、Apacheの設定を記述していきましょう。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /test/ http://192.168.0.100/test/
ProxyPassReverse /test/ http://192.168.0.100/test/このような設定を入れることによって、[NASのIPアドレス]/test/にアクセスした場合に、192.168.0.100/test/の内容が表示されるようになります。
Apacheの設定は、「/share/Web/apache-config.conf」に保存しました。
/etc/config/apache/apache.conf に書き連ねてもいいですが、設定に問題があった場合や、WebUIから設定初期化した際に消えます。
よって別ファイルにし、Includeで対応することにします。
以下のような反映するためのシェルスクリプトも用意しました。
#!/bin/bash
CONFIG_FILE="/etc/config/apache/apache.conf"
INCLUDE_LINE="Include /share/Web/apache-config.conf"
if ! grep -Fxq "$INCLUDE_LINE" "$CONFIG_FILE"; then
echo "$INCLUDE_LINE" >> "$CONFIG_FILE"
fi
/etc/init.d/Qthttpd.sh restart/etc/config/apache/apache.conf にInclude文を追記するスクリプトです。
これを「/share/Web/add-apache2-config.sh」として保存し、chmod +xで実行権限を与えておきます。
sudo ./add-apache2-config.sh
とスクリプトを実行すれば、Webサーバーに設定が反映されます。
仮想ホスト(VirtualHost)を有効にしている場合には上記の方法ではうまく動作しません。
全部のドメインで同じ転送をしてしまうことになります。
そのため、ドメインごとに設定する必要があるのですが、少し設定を探ってみましょう。
WebUIから仮想ホストを設定すると、apache.conf末尾にIncludeが増えるようです。
Include /etc/config/apache/extra/httpd-vhosts-user.conf
Include /etc/config/apache/extra/httpd-ssl-vhosts-user.conf
これらの設定ファイルを変更して、Webサーバーを再起動すると、なんとファイル内容が巻き戻ります。
再起動の度に、WebUIの設定内容を書き出ししていて、唯一、/etc/config/apache/apache.confのみが変更されないようです。
また、VirtualHostを複数箇所で宣言すると、設定内容によって取り合いになってしまうため、うまく動かないことが多いです。
つまり、先ほどとは別のアプローチを取る必要があります。
(ProxyPass・ProxyPassReverseはIfディレクティブ内での使用はできませんし、.htaccessでも動作しません。VirtualHost内に書くのが安全です。)
まず、書き戻されない領域に、VirtualHostの設定ファイルをコピーします。
cp /etc/config/apache/extra/httpd-vhosts-user.conf /share/Web/httpd-vhosts-user.conf
cp /etc/config/apache/extra/httpd-ssl-vhosts-user.conf /share/Web/httpd-ssl-vhosts-user.conf
/share/Web/以下であれば勝手に書き換えされることはないです。
そして、WebUIから、仮想ホスト機能を無効化します。
すると、/etc/config/apache/apache.confから書き戻されてしまうVirtualHostの設定は読まれないことになります。
先程コピーしたVirtualHostの設定ファイルに変更を加えていきます。
vi /share/Web/httpd-vhosts-user.conf
以下の内容を先頭に貼り付け。モジュールをロードします。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyRequests Off
ProxyPreserveHost OnドメインごとのDocumentRootより下に以下の設定を入れます。
<Location "/test">
ProxyPass http://example.com/test
ProxyPassReverse http://example.com/test
Require all granted
</Location>これで、特定ディレクトリのリバースプロキシが出来るでしょう。
HTTPだけの設定変更になるため、HTTPSでも接続する場合は同様に設定を行います。
vi /share/Web/httpd-ssl-vhosts-user.conf
SSL関係の記述が増えているため、SSLCertificateFileより下に同様の設定を入れましょう。
<Location "/test">
ProxyPass http://example.com/test
ProxyPassReverse http://example.com/test
Require all granted
</Location>これで、HTTPSの場合でも同様の動作をすることになります。
モジュールのロードは1度で大丈夫なので、こちらの設定ファイルには記述しませんでした。
これらの設定を読み込ませるために、/etc/config/apache/apache.confの末尾に以下の内容を追記します。
Include /share/Web/httpd-vhosts-user.conf
Include /share/Web/httpd-ssl-vhosts-user.conf
そして、Webサーバーを再起動します。
sudo /etc/init.d/Qthttpd.sh restart
これでVirtualHost環境でも同様にリバースプロキシが使えているはずです。
Container Station
QNAP上でDocker等のコンテナをGUI管理できるソフトウェアです。
「App Center」から「Container Station」を探し、インストールを行います。
この際、「Container」という共有フォルダが生成されます。
certbot/dns-route53 を使用してワイルドカード証明書を自動更新
Route53管理のドメインでDNS認証を行ってワイルドカード証明書を発行・更新する方法。
lldap/lldap を使用して LLDAP Server 環境を構築
Webサービス用にLDAPサーバーを立ててみます。
ドメインコントローラーとして構築した情報をLDAP経由で使用することも可能なのですが、LAN内のPCにログインする”簡易的”なパスワードと、外部に公開するための各種Webサービスで使用するパスワードは別にしたいのです。
この場合、ドメインコントローラーでユーザーに対して複数のパスワードを設定できれば良いのですが、基本的にはできません。
(スキーマ拡張して、カスタム属性を追加することによって対応可能と思われるが、認証側でカスタム属性を読みに行く実装になっているものが少ない)
そのため、Webサービス用にLDAPサーバーを立ててみます。
joplin/server を使用して Joplin Server 環境を構築
NASのローカルに保存可能なメモアプリを運用します。
gitea/gitea を使用して Gitea Server 環境を構築
Gitのホスティングサーバーを構築します。
mysql を使用して MySQL Server 環境を構築
各種アプリのデータベースとなるMySQLサーバーを構築します。
nextcloud を使用して Nextcloud Server 環境を構築
各種データの保存先となるオンラインストレージのNextcloudサーバーを構築します。
jellyfin/jellyfin を使用して Jellyfin Server 環境を構築
マルチメディアサーバーとして利用可能なJellyfinサーバーを構築します。
各コンテナから名前解決を追加する方法
QNAPをドメインコントローラーとして運用している場合、Docker内部から設定したDNS情報を参照することが出来ません。
それは自身のDNSサーバーを指定することになり、循環参照となってしまうためです。
なので、別のコンテナよりLDAPSなどで証明書を利用してドメイン名でLDAPサーバーに接続したい場合に問題になります。
簡単な解決策はコンテナ内の /etc/hosts を変更する方法です。
QNAP自身の /etc/hosts ファイルは書き換えを行っても再起動?のタイミングでもとに戻ってしまうようなので、別の場所にコピーしておきます。
cp /etc/hosts /Container/hosts
vi /Container/hosts
このように、例えばContainerディレクトリにhostsファイルをコピーし、Vi/Vim等で末尾に「[自身のIPアドレス] [ドメイン名]」のペアを追記します。
その追記されたhostsファイルを各コンテナで/etc/hostsにマッピングさせれば、各コンテナ内から名前解決が行えます。
QNAP内部のDocker(Container Station)について
普通にDockerが動いているだけです。
/share/Container/ が自動的に生成されるフォルダで、共有フォルダとなります。
フォーラムの情報だとこのディレクトリ内にコンテナが保存されていたようだが、Container Station バージョン 3.0.9.1038 (2024/11/08) で確認すると、実際には保存されていないよう。
過去バージョンでは生成された共有フォルダ内に保存されていた模様。
SSH経由でdockerコマンドの位置を探ると、
$ which docker
/share/ZFS530_DATA/.qpkg/container-station/bin/docker
となっており、コンテナの設定に関しては、
/var/lib/docker/containers/[コンテナID]/config.v2.json
に保存されている。
GUIから行った設定で永続化されているため、コンテナをコマンドライン経由で起動したい場合は、
docker start [コンテナID]
でOK。
docker inspect [コンテナID]
で相違がないか確認できるでしょう。
docker ps -a コマンドで作成されているコンテナは確認可能です。
Dockerコンテナアップデートの追跡方法
私は定期的にCronでチェックすべく、DockerHubと比較するPHPスクリプトを書きました。
現状、動作はしていますが、きちんとデバッグしていないので参考程度にどうぞ。
function dockerUpdateCheck($container_name){
$cmd_docker = '/share/ZFS530_DATA/.qpkg/container-station/bin/docker';
$image_full = trim(shell_exec($cmd_docker.' inspect --format "{{.Config.Image}}" ' . escapeshellarg($container_name)) ?? '');
$image_id = trim(shell_exec($cmd_docker . ' inspect --format "{{.Image}}" ' . escapeshellarg($container_name)) ?? '');
$digest_raw = trim(shell_exec($cmd_docker.' inspect --format "{{index .RepoDigests 0}}" ' . escapeshellarg($image_id)) ?? '');
$image = strpos($image_full, ':') !== false ? explode(':', $image_full)[0] : $image_full;
$tag = strpos($image_full, ':') !== false ? explode(':', $image_full)[1] : 'latest';
$sha256 = strpos($digest_raw, '@') !== false ? explode('@', $digest_raw)[1] : $digest_raw;
if (strpos($image, '/') === false && $image !== '') {
$image = 'library/' . $image;
}
$token_url = "https://auth.docker.io/token?service=registry.docker.io&scope=repository:{$image}:pull";
$token_json = file_get_contents($token_url);
$token = json_decode($token_json, true)['token'] ?? null;
if (!$token) return;
$manifest_url = "https://registry-1.docker.io/v2/{$image}/manifests/{$tag}";
$context = stream_context_create([
'http' => [
'method' => 'GET',
'header' =>
"Accept: application/vnd.docker.distribution.manifest.v2+json\r\n" .
"Authorization: Bearer {$token}\r\n",
],
]);
file_get_contents($manifest_url, false, $context);
$hub_sha256 = null;
foreach ($http_response_header as $h) {
if (stripos($h, 'Docker-Content-Digest:') === 0) {
$hub_sha256 = trim(substr($h, strlen('Docker-Content-Digest:')));
break;
}
}
return !(strcmp($sha256, $hub_sha256) === 0);
}PHP中でdockerUpdateCheck("コンテナ名")と呼べばアップデートが必要な場合にTrueが返ってきます。
if (dockerUpdateCheck("コンテナ名")) echo "アップデート必要!";
などとして使えるでしょう。自分はCurlを使ってTelegram APIを叩き、自分宛てにメッセージを送るようにしています。
CLIでPHPスクリプトを叩く場合には、phpのパスが通っていないので、 /mnt/ext/opt/apache/bin/php ./docker_update_check.php などフルパスで叩きましょう。
ついでに、docker inspect [コンテナ名]の結果も.jsonとしてファイル保存しておくと、GUIで設定した設定内容が保管できます。
(直接設定を戻すことは出来ないが設定の参考にすることが出来る)
Container StationでのDockerコンテナアップデート方法
コンテナにもよりますが大抵の場合、「latest」タグのイメージを使用していると思います。
これを最新版にするには、まずContainer Stationの「イメージ」タブより、対象のイメージをプルします。(歯車アイコンから)
次に「コンテナ」タブで、歯車アイコンから「直接再作成」でコンテナを再作成します。
この際、「コンテナを作成する前にレジストリからイメージをプルしてみてください。」にチェックを入れれば、先程のプル作業も自動で行ってもらえます。
ある程度のリリースバージョンでlatestタグがつけられていることを期待しますが、リリース直後にバグを踏む可能性もありますので、重要なものに関しては「latest」タグではなくバージョンを指定して運用しておくと良いとは思います。
Container Stationからコンテナを作成してしまうと、docker-compose.ymlは作成されませんので、上記GUI操作のみでのアップデートとなると思います。
(※Container Stationのバグか不明ですが、直接再作成を行った際にMACアドレスが被りDockerネットワークが不安定になることがありました。MACアドレスは必ず設定の上、コンテナを利用すると良いでしょう。)
Virtualization Station
「App Center」から「Virtualization Station」を探し、インストールを行う。
共有フォルダは自動で生成されないようなので、「Virtualization」という共有フォルダを手動で作成しました。
中にISOフォルダを作成して、インストール用のISOイメージを保管しておきます。
実際のインストール等は、「QNAP Virtualization Station GUIゲームサーバー構築」をご覧ください。
Virtualization Station上でゲームサーバー構築
「QNAP Virtualization Station GUIゲームサーバー構築」をご覧ください。
仮想環境以外でも使える手法です。
GPU/USB拡張
NVIDIA T1000 8GBをスロット2(PCIe 3.0 x8 スロット 2)に、USB-U31A2P01をスロット1(PCIe 2.0 x4 スロット 1・電源側)に刺しました。
