Atualmente, tento obter acesso ao GPIO em um contêiner de aplicativos LXC sem privilégios. No futuro, esse contêiner deverá executar um aplicativo. Mas por enquanto (enquanto desenvolvimento) eu apenas inicio um bash normal no container:
sudo lxc-execute -n gpio-client -f /var/proj/gpio-client/lxc.conf -- bin/bash
Quando faço isso com um contêiner privilegiado (significa que meu lxc.conf não contém mapeamento UID ou GID), posso usar o GPIO.
O GPIO pode ser acessado por arquivos em / sys / class / gpio (a saída seguinte vem de um bash dentro de um contêiner privilegiado que foi iniciado com o comando acima):
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
Por exemplo, posso exportar um 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
Quando imprimo os processos em execução no host com "ps -a", consigo ver o bash em execução como root:
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
Mas quando eu insiro um mapeamento de UID e GID no lxc.conf (e também os subuids e subgids em / etc / subuid e / etc / subgid) eu sempre recebo uma "Permission denied" quando tento acessar / sys / class / gpio:
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
Este é o meu 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
Este é o sistema linux em execução:
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
O sistema foi construído usando o Yocto para um AVNET-Zedboard (que possui um Xilinx Zynq-SoC).
Alguém tem uma idéia ou aconselha como fazer isso funcionar ou onde encontrar a solução / informação para isso? Eu tentei colocá-lo em funcionamento por algumas horas, mas infelizmente não consegui ...
Melhores cumprimentos
Sebastian
Tags permissions lxc sysfs gpio