非特権 LXC コンテナ内の GPIO

非特権 LXC コンテナ内の GPIO

現在、特権のない LXC アプリケーション コンテナーに GPIO アクセスを取得しようとしています。将来的には、このコンテナーでアプリケーションを実行することになります。しかし、今のところ (開発中)、コンテナーで通常の bash を起動するだけです。

sudo lxc-execute -n gpio-client -f /var/proj/gpio-client/lxc.conf -- bin/bash

これを特権コンテナで実行すると (つまり、lxc.conf に UID または GID マッピングが含まれていない場合)、GPIO を使用できます。GPIO
には、/sys/class/gpio 内のファイルを介してアクセスできます (次の出力は、上記のコマンドで開始された特権コンテナ内の bash から取得されます)。

bash-4.3# cd /sys/class/gpio/
bash-4.3# ls -l
total 0
-rwxrwx---    1 gpio-cli 1001          4096 Feb 20 12:41 export
lrwxrwxrwx    1 gpio-cli 1001             0 Feb 20 12:41 gpiochip890 -> ../../devices/gpiochip2/gpio/gpiochip890
lrwxrwxrwx    1 gpio-cli 1001             0 Feb 20 12:41 gpiochip898 -> ../../devices/gpiochip1/gpio/gpiochip898
lrwxrwxrwx    1 gpio-cli 1001             0 Feb 20 12:41 gpiochip906 -> ../../devices/soc0/amba/e000a000.gpio/gpio/gpiochip906
-rwxrwx---    1 gpio-cli 1001          4096 Feb 20 12:41 unexport

たとえば、GPIO をエクスポートできます。

bash-4.3# echo 898 > export
bash-4.3# ls -l
total 0
-rwxrwx---    1 gpio-cli 1001          4096 Feb 20 14:06 export
lrwxrwxrwx    1 gpio-cli 1001             0 Feb 20 14:06 gpio898 -> ../../devices/gpiochip1/gpio/gpio898
lrwxrwxrwx    1 gpio-cli 1001             0 Feb 20 12:41 gpiochip890 -> ../../devices/gpiochip2/gpio/gpiochip890
lrwxrwxrwx    1 gpio-cli 1001             0 Feb 20 12:41 gpiochip898 -> ../../devices/gpiochip1/gpio/gpiochip898
lrwxrwxrwx    1 gpio-cli 1001             0 Feb 20 12:41 gpiochip906 -> ../../devices/soc0/amba/e000a000.gpio/gpio/gpiochip906
-rwxrwx---    1 gpio-cli 1001          4096 Feb 20 12:41 unexport

「ps -a」を使用してホスト上で実行中のプロセスを出力すると、root として実行中の bash を確認できます。

      587 root       0:00 lxc-execute -n gpio-client -f /var/proj/gpio-client/lxc.conf -- bin/bash
      598 root       0:00 /init.lxc.static -- bin/bash
      615 root       0:00 bin/bash

しかし、UID と GID のマッピングを lxc.conf (および /etc/subuid と /etc/subgid のサブ UID とサブ GID) に挿入すると、/sys/class/gpio にアクセスしようとすると常に「Permission denied」というエラーが発生します。

bash-4.3# cd /sys/class/
bash-4.3# ls -l
total 0
drwxrwx---    2 65534    gpio             0 Feb 20 14:11 gpio
bash-4.3# cd gpio/
bash: cd: gpio/: Permission denied

これは私の lxc.conf です:

# *************************************************************************
# * general configuration
# *************************************************************************

# container name
lxc.utsname = gpio-client

# *************************************************************************
# * configure networking
# *************************************************************************

lxc.network.type          =   veth
lxc.network.flags         =   up
lxc.network.link          =   local_br0
lxc.network.name          =   lxcnet0
lxc.network.hwaddr        =   4a:49:43:49:79:ac
lxc.network.ipv4          =   10.10.0.98
lxc.network.ipv4.gateway  =   10.10.0.1

# *************************************************************************
# * configure container filesystem
# *************************************************************************

# set rootfs
lxc.rootfs = /var/proj/gpio-client/rootfs

# mount needed directories from host
lxc.mount.entry=/lib                lib             none    ro,bind     0   0
lxc.mount.entry=/sys/class/gpio     sys/class/gpio  none    rw,bind     0   0
lxc.mount.entry=/sys/devices        sys/devices     none    rw,bind     0   0
lxc.mount.entry=/usr/lib            usr/lib         none    ro,bind     0   0
lxc.mount.entry=/usr/bin            usr/bin         none    ro,bind     0   0
lxc.mount.entry=/bin                bin             none    ro,bind     0   0

# *************************************************************************
# * configure privileges of container
# *************************************************************************

# map user and group ids
lxc.include = /usr/share/lxc/config/userns.conf
# comment the following out for a privileged container:
lxc.id_map = u 0 1000000 65536
lxc.id_map = g 0 1000000 65536

これは実行中の Linux システムです:

zedboard-zynq7:/var/proj/gpio-client$ cat /proc/version 
Linux version 4.6.0-rt1-xilinx-v2016.3 (sebastian@ubuntu1604vm) (gcc version 6.2.0 (GCC) ) #5 SMP PREEMPT RT Fri Apr 7 13:43:09 CEST 2017

このシステムは、AVNET-Zedboard (Xilinx Zynq-SoC を搭載) 用に Yocto を使用して構築されました。

これを実行する方法や、これに対する解決策/情報をどこで見つけられるかについてのアイデアやアドバイスをお持ちの方はいらっしゃいますか? 数時間実行しようとしましたが、残念ながらできませんでした...

よろしくお願いいたします
セバスチャン

関連情報