メディアサーバ用にminidlnaを立ち上げるのだが、
メディア系は依存パッケージをソースコンパイルするなど
色々とシステムを汚してしまうのでPodmanを利用して構築する。
dockerhub上のminidlnaを使用する。
https://hub.docker.com/r/vladgh/minidlna/
Contents
audioとvideo用の公開ディレクトリ準備
Windows上からそのままアップしたいのでsambaディレクトリ配下を指定。
|
1 2 |
$ mkdir -p ~/samba/media/audio $ mkdir -p ~/samba/media/video |
podman起動
上記ディレクトリを指定してpodman起動
|
1 2 3 4 5 6 7 8 9 10 |
$ podman run -d \ > --net=host \ > --name dlna \ > --p 8200:8200 \ > -v /home/[user name]/samba/media/audio:/media/audio \ > -v /home/[user name]/samba/media/video:/media/video \ > -e MINIDLNA_MEDIA_DIR_1=A,/media/audio \ > -e MINIDLNA_MEDIA_DIR_2=V,/media/video \ > -e MINIDLNA_FRIENDRY_NAME=MyDLNA \ > vladgh/minidlna |
が、起動失敗。ログを見る。
$ podman logs dlna
|
1 2 3 4 5 6 7 8 9 10 11 12 |
minidlna.c:1048: warn: Starting MiniDLNA version 1.2.1. minidlna.c:346: warn: Creating new database at /minidlna/cache/files.db minidlna.c:1098: warn: HTTP listening on port 8200 scanner.c:763: warn: Error scanning /media/video [Permission denied] scanner.c:763: warn: Error scanning /media/audio [Permission denied] playlist.c:135: warn: Parsing playlists... playlist.c:269: warn: Finished parsing playlists. monitor.c:125: error: inotify_add_watch(/media/video) [Permission denied] monitor.c:125: error: inotify_add_watch(/media/audio) [Permission denied] monitor.c:125: error: inotify_add_watch(/media/video) [Permission denied] monitor.c:125: error: inotify_add_watch(/media/audio) [Permission denied] monitor.c:218: warn: WARNING: Inotify max_user_watches [8192] is low or close to the number of used watches [4] and I do not have permission to increase this limit. Please do so manually by writing a higher value into /proc/sys/fs/inotify/max_user_watches. |
問題は2つ。
1つはディレクトリへのPermission deined。
もう一つはmax_user_watchesの設定。
max_user_watcherの設定編集
minidlnaで必要なファイル同期数が上限を超えているとのことで、
以下のように直接/etc/sysctl.confを編集して対応する。
設定値はシステム上限値である524288。
|
1 2 |
$ echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf $ sudo sysctl -p |
Permission deniedの対応
これはSELinuxの問題。
無効にしてやれば解決するが、SELinuxだけは無効にしないという
セキュリティポリシーでサーバ運用しているため解決する。
(ただ、ガバガバにするだけなのでセキュリティ的にはあまり意味ない)
SELinuxの問題とわかっているので、一旦無効にしてログを確認
|
1 |
$ sudo setenforce 0 |
上記実行後、最初のpodman runコマンドを実行してAVC Reportを確認
|
1 2 3 4 5 6 7 8 9 10 |
# aureport -a AVC Report =============================================================== # date time comm subj syscall class permission obj result event =============================================================== 48. 2020年04月21日 20:18:19 minidlnad system_u:system_r:container_t:s0:c463,c748 254 dir read unconfined_u:object_r:samba_share_t:s0 denied 4481 49. 2020年04月21日 20:18:19 minidlnad system_u:system_r:container_t:s0:c463,c748 254 dir read unconfined_u:object_r:samba_share_t:s0 denied 4482 50. 2020年04月21日 20:18:19 minidlnad system_u:system_r:container_t:s0:c463,c748 254 dir read unconfined_u:object_r:samba_share_t:s0 denied 4483 51. 2020年04月21日 20:18:19 minidlnad system_u:system_r:container_t:s0:c463,c748 254 dir read unconfined_u:object_r:samba_share_t:s0 denied 4484 |
container_tラベルのminidlnadでは、samba_share_tラベルのディレクトリにアクセスできない。
まぁ、当たり前なので、このAVC Reportを許可するようにモジュール登録してしまう。
|
1 2 |
# ausearch -c 'minidlnad' --raw | audit2allow -M my-dlna # semodule -i my-dlna.pp |
ただ、これでもPermission deinedは解決できなかったので、
SELinuxのポリシー分析のためにsetools-consoleをインストール。
|
1 2 3 4 5 6 7 8 9 10 |
# dnf install setools-console ==================================================================================================================================================== パッケージ アーキテクチャー バージョン リポジトリー サイズ ==================================================================================================================================================== インストール: setools-console x86_64 4.2.2-1.el8 BaseOS 31 k トランザクションの概要 ==================================================================================================================================================== インストール 1 パッケージ |
container_tとsamba_share_tの関係を確認
|
1 2 3 4 5 6 7 8 9 10 |
# sesearch -A -s container_t -t samba_share_t allow container_domain file_type:filesystem getattr; allow container_t samba_share_t:dir read; allow container_t samba_share_t:file { open read }; allow domain file_type:blk_file map; [ domain_can_mmap_files ]:True allow domain file_type:chr_file map; [ domain_can_mmap_files ]:True allow domain file_type:file map; [ domain_can_mmap_files ]:True allow domain file_type:lnk_file map; [ domain_can_mmap_files ]:True allow svirt_sandbox_domain file_type:dir { getattr open search }; allow svirt_sandbox_domain file_type:filesystem getattr; |
readのみしか許容してないことが問題だった模様。
よく考えたら、AVC Reportの時点で分かった問題だった。
my-dlna.teを直接編集して権限を追加。
# vim my-dlna.te
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
module my-dlna2 1.0; require { type samba_share_t; type container_t; class dir { getattr ioctl lock open read search write }; class file { getattr ioctl lock map open read }; } #============= container_t ============== #allow container_t samba_share_t:dir { open read }; allow container_t samba_share_t:dir { getattr ioctl lock open read search write }; #allow container_t samba_share_t:file { read }; allow container_t samba_share_t:file { getattr ioctl lock map open read }; |
.teファイルのmakeのためにselinux-policy-develをインストール。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# dnf install selinux-policy-devel ==================================================================================================================================================== パッケージ アーキテクチャー バージョン リポジトリー サイズ ==================================================================================================================================================== インストール: selinux-policy-devel noarch 3.14.3-20.el8 BaseOS 1.4 M 依存関係のインストール: m4 x86_64 1.4.18-7.el8 BaseOS 223 k policycoreutils-devel x86_64 2.9-3.el8_1.1 BaseOS 292 k トランザクションの概要 ==================================================================================================================================================== インストール 3 パッケージ |
my-dlna.teファイルがあるディレクトリで以下を実行。
|
1 |
# make -f /usr/share/selinux/devel/Makefile |
再生成されたmy-dlna.ppを適用。(の前に以前適用したmy-dlnaを外す)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
# semodule -r my-dlna # semodule -i my-dlna.pp # sesearch -A -s container_t -t samba_share_t allow container_domain file_type:filesystem getattr; allow container_t samba_share_t:dir { getattr ioctl lock open read search write }; allow container_t samba_share_t:file { getattr ioctl lock map open read }; allow domain file_type:blk_file map; [ domain_can_mmap_files ]:True allow domain file_type:chr_file map; [ domain_can_mmap_files ]:True allow domain file_type:file map; [ domain_can_mmap_files ]:True allow domain file_type:lnk_file map; [ domain_can_mmap_files ]:True allow svirt_sandbox_domain file_type:dir { getattr open search }; allow svirt_sandbox_domain file_type:filesystem getattr; |
これでSELinuxを再度有効化
# setenforce 1
して、最初のpodmanコマンドを実行することでminidlnaが正常起動する。
ファイアウォール設定
httpアクセスのために8200、メディアサーバ用に1900/udp, 5000/tcpを開ける。
|
1 2 3 |
# firewall-cmd --zone=public --add-port=1900/udp --permanent # firewall-cmd --zone=public --add-port=5000/tcp --permanent # firewall-cmd --reload |
MiniDLNAアクセス確認
正常に起動していたら、ブラウザ上で[IP Address]:8200が以下のように見える。

システム再起動時の立ち上げ
起動時スクリプトを作成するのでもいいけど、
どうもpodmanは自動起動はうまく動かないとの報告あり。
システム再起動後は、まずはpodman ps -aでコンテナの確認。
以下は既に立ち上げ後の状態なのでSTATUSがUpになってるけど、
システム再起動後はExitedになってる。
|
1 2 3 |
$ podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 61c2f768ac23 docker.io/vladgh/minidlna:latest 2 months ago Up 10 hours ago dlna |
存在していれば、podman start dlnaで立ち上げが可能。