epgrecUNA on Fedora 20

2014/05/07
epgrecUNAをFedoraで動かす上で困るのは、カーネルのアップデート毎にpt1_drvをビルドする必要があるのと、SELinuxが有効の環境ではepgrecUNAが動かない。そこでモジュールを自動でビルドするためにDKMSを使用する。また、クリーンインストールする機会があったので、epgrecUNA用のポリシーも作ってみた。

DKMS

pt1_drvのソースを配置する。Makefileとかいじったような気もするけど、前の環境からコピってきてるので、どこをいじったかよくわからない。他の情報も参考にしつつ、ビルドできるようにいい感じに修正して下さいすみません。
# tree -A /usr/src/pt1_drv-1.1.0
# tree -A /usr/src/pt1_drv-1.1.0
/usr/src/pt1_drv-1.1.0
├── dkms.conf
└── src
    ├── Makefile
    ├── etc
    │   └── 99-pt1.rules
    ├── modules.order
    ├── pt1_com.h
    ├── pt1_i2c.c
    ├── pt1_i2c.h
    ├── pt1_ioctl.h
    ├── pt1_pci.c
    ├── pt1_pci.h
    ├── pt1_tuner.c
    ├── pt1_tuner.h
    ├── pt1_tuner_data.c
    └── pt1_tuner_data.h
# ln /usr/src/pt1_drv-1.1.0/src/etc/99-pt1.rules /etc/udev/rules.d/99-pt1.rules
 

pt1_drvは、もともとあるearth-pt1とかぶっているので、earth-pt1を無効にしないと読み込まれない
# echo "blacklist earth-pt1" >> /etc/modprobe.d/blacklist.conf
# echo "blacklist earth-pt1" >> /etc/modprobe.d/blacklist.conf
 

DKMSパッケージをインスコ
# yum install dkms
# yum install dkms
 

dkms.confを書く
# cat /usr/src/pt1_drv-1.1.0/dkms.conf
# cat /usr/src/pt1_drv-1.1.0/dkms.conf
#パッケージの名前
PACKAGE_NAME="pt1_drv"
#パッケージのバージョン
PACKAGE_VERSION="1.1.0"
#ビルドするコマンド
MAKE="cd src/ && BUILD_KERNEL=${kernelver} make"
#中間ファイルの削除コマンド
CLEAN="cd src/ && make clean"
#作成されるモジュールの名前(拡張子.koは付けない)
BUILT_MODULE_NAME="pt1_drv"
#モジュールが作成される場所(ソースディレクトリからの相対パス)
BUILT_MODULE_LOCATION="src/"
#元々のインストール先(/lib/modules/`uname -r`をルートとしたパス)
DEST_MODULE_LOCATION="/kernel/drivers/video/"
REMAKE_INITRD="yes"
#自動更新の有効化
AUTOINSTALL="yes"
 

add! build! install!
# dkms add -m pt1_drv -v 1.1.0
# dkms add -m pt1_drv -v 1.1.0
 
Creating symlink /var/lib/dkms/pt1_drv/1.1.0/source ->
                 /usr/src/pt1_drv-1.1.0
 
DKMS: add completed.
 

# dkms build -m pt1_drv -v 1.1.0
# dkms build -m pt1_drv -v 1.1.0
 
Kernel preparation unnecessary for this kernel.  Skipping...
 
Building module:
cleaning build area...
cd src/ && BUILD_KERNEL=3.14.2-200.fc20.x86_64 make...
cleaning build area...
 
DKMS: build completed.
 

# dkms install -m pt1_drv -v 1.1.0
# dkms install -m pt1_drv -v 1.1.0
 
pt1_drv:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/3.14.2-200.fc20.x86_64/extra/
Adding any weak-modules
 
depmod...
 
Backing up initramfs-3.14.2-200.fc20.x86_64.img to /boot/initramfs-3.14.2-200.fc20.x86_64.img.old-dkms
Making new initramfs-3.14.2-200.fc20.x86_64.img
(If next boot fails, revert to initramfs-3.14.2-200.fc20.x86_64.img.old-dkms image)
dracut........
 
DKMS: install completed.
 

yumでカーネルのアップデートがあった場合には、勝手にビルドしてくれるサービスを起動。いらないかも?
# systemctl start dkms
# systemctl status dkms
dkms.service - Builds and install new kernel modules through DKMS
   Loaded: loaded (/usr/lib/systemd/system/dkms.service; enabled)
   Active: active (exited) since 月 2014-05-12 23:22:07 JST; 5s ago
     Docs: man:dkms(8)
  Process: 20572 ExecStart=/bin/sh -c dkms autoinstall --verbose --kernelver $(uname -r) (code=exited, status=0/SUCCESS)
 Main PID: 20572 (code=exited, status=0/SUCCESS)
# systemctl enable dkms
ln -s '/usr/lib/systemd/system/dkms.service' '/etc/systemd/system/multi-user.target.wants/dkms.service'
 

ポリシー

何か足りないかもしれないけど、一応これでひと通り動いてる
# cat epgrecUNA.te
# cat epgrecUNA.te
 
module epgrecUNA 1.0;
 
require {
        type httpd_t;
        type httpd_sys_script_t;
        type unconfined_t;
        type shadow_t;
        type device_t;
        type crond_t;
        type crond_var_run_t;
        type user_cron_spool_t;
        type user_tmpfs_t;
        class process signal;
        class msgq { unix_read destroy create };
        class file { read write create setattr getattr open unlink };
        class dir { write search read add_name remove_name open getattr };
        class sem { unix_read read write unix_write associate };
        class shm { unix_read read write unix_write associate getattr };
        class chr_file { read ioctl open };
}
 
allow httpd_t shadow_t:file { read getattr open };
allow httpd_t user_cron_spool_t:dir { write search read add_name remove_name open getattr };
allow httpd_t user_cron_spool_t:file { open create setattr unlink };
 
allow httpd_t crond_t:process signal;
allow httpd_t crond_var_run_t:file { read open };
 
allow httpd_t unconfined_t:sem { unix_read read unix_write write associate };
allow httpd_t unconfined_t:shm { unix_read read unix_write write associate getattr };
 
allow httpd_sys_script_t device_t:chr_file { read ioctl open };
allow httpd_sys_script_t self:msgq { unix_read destroy create };
 
allow httpd_t user_tmpfs_t:file { read write };
 

ポリシーのコンパイルとインストールは、下記を使わせてもらいましょう
SELinux - Take's Wiki
# ./installSELPolicy epgrecUNA
# ./installSELPolicy epgrecUNA
# setsebool -P httpd_mod_auth_pam 1
# semanage fcontext -a -t httpd_sys_content_t "/usr/share/epgrecUNA(/.*)?"
# restorecon -RF /usr/share/epgrecUNA
 

動かない時は、以下で足りないポリシーを探して追加する
# setenforce 0
# setenforce 0
(動かなかった動作をもう一度。それでも動かない場合は、SELinux以外の原因と思われ)
# setenforce 1
# sealert -l*
# grep httpd /var/log/audit/audit.log | audit2allow -M mypol
# cat mypol.te
 

あとffmpegは、rpmfusionリポジトリを追加しないと入らない
# rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm
# rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm
# yum install ffmpeg
 

0 件のコメント:

コメントを投稿