使用LXC建立USB以及X forward環境
因為修課需要一些debian系的工具,不過我不想讓debian系的和Arch Linux混在一起,所以LXC看起來是一個不錯的解。環境
- OS: Arch Linux (4.15.7-1-ARCH)
- LXC
- ubuntu on LXC
步驟
LXC準備
安裝 LXC
$ sudo pacman -Sy lxc arch-install-scripts debootstap
建立 Host Network (NAT bridge) (Arch Wiki寫得很好看Arch Wiki)
建立/etc/default/lxc-net(詳情見Arch Wiki)USE_LXC_BRIDGE="true" LXC_BRIDGE="lxcbr0" LXC_ADDR="10.0.3.1" LXC_NETMASK="255.255.255.0" LXC_NETWORK="10.0.3.0/24" LXC_DHCP_RANGE="10.0.3.2,10.0.3.254" LXC_DHCP_MAX="253"修改lxc template conf,在/etc/lxc/default.conf新增
lxc.net.0.type = veth lxc.net.0.link = lxcbr0 lxc.net.0.flags = up lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx安裝dnsmasq
$ sudo pacman -Sy dnsmasq開啟以及設定開機啟動:
sudo systemctl start lxc-net sudo systemctl enable lxc-net
建立container (ubuntu)
建previleged的container$ sudo lxc-create -n UbuntuBuild -t /usr/share/lxc/templates/lxc-ubuntu [ -P lxc-location]修改container的網路(由於我要裝的軟體的license綁mac address,所以我需要修改一下mac address),修改lxc的路徑下的config file,若沒指定lxc的位置,預設是在/var/lib/lxc/CONTAINER_NAME/config,有指定路徑則在 /PATH/YOU/DEFINED/CONTAINER_NAME/config
## default values ... ... ## network lxc.net.0.type = veth lxc.net.0.link = br0 lxc.net.0.flags = up lxc.net.0.name = eth0 lxc.net.0.hwaddr = .... ## 自行修改mac address
LXC Xorg
修改container的config(同上位置)## default values ... ... # network ... ... ## for xorg lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir lxc.mount.entry = /dev/snd dev/snd none bind,optional,create=dir lxc.mount.entry = /tmp/.X11-unix tmp/.X11-unix none bind,optional,create=dir,ro lxc.mount.entry = /dev/video0 dev/video0 none bind,optional,create=file lxc.mount.entry = tmpfs tmp tmpfs defaults基本上邏輯是把Xorg需要的device mount進來。
/dev/dri為direct rendering manager(DRM)的device file,
/dev/snd為音效的device file
/dev/video0為video device file
ubuntu on LXC中安裝X相關套件
$ sudo lxc-console -n UbuntuBuild [ -P /path]進到ubuntu lxc
# sudo apt-get install xauth x11-apps
使用ssh -X進入LXC# /usr/bin/xclock應該要有windows跑出來
其他app可能會需要裝dbus
# sudo apt-get install dbus dbus-x11其他部份可以看以連結How Do I Get X11 Applications Running in a LXC Container?
LXC USB
修改container的config(同上位置)## usb lxc.cgroup.devices.allow = c 189:* rwm lxc.mount.entry = /dev/bus/usb/001 dev/bus/usb/001 none bind,optional,create=dir lxc.mount.entry = /dev/bus/usb/002 dev/bus/usb/002 none bind,optional,create=dir lxc.mount.entry = /dev/bus/usb/003 dev/bus/usb/003 none bind,optional,create=dir lxc.mount.entry = /dev/bus/usb/004 dev/bus/usb/004 none bind,optional,create=dir接下來我們來探究一下
lxc.cgroup.devices.allow = c 189:* rwm
這行的意思,首先$ ls -al /dev/bus/usb/001 drwxr-xr-x 2 root root 80 Mar 8 23:06 . drwxr-xr-x 6 root root 120 Mar 8 23:06 .. crw-rw-r-- 1 root root 189, 0 Mar 8 23:06 001 crw-rw-r-- 1 root root 189, 1 Mar 8 23:06 002你會發現189這個數字,這數字其實是major number,這些數字在Linux的文件中都有定義,請看https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/devices.txt
逗號後為minor number,有於usb裝置多,所以在lxc.cgroup.devices.allow中用wildcard取代。底下部份就是把usb的device folder mount進LXC中。
LXC Serial Port設定
由於修課需要用到serial port,但是Serial Port的tty只有插上後才會出現,這對開機就需mount的lxc來說偏麻煩。這時有一個好用的指令出現了。lxc-device
在使用lxc-device時仍須注意cgroup是否有允許該裝置。例如Serial Port常用(USB serial converters)的major number為188。所以需要在config中新增
lxc.cgroup.devices.allow = c 188:* rwm這樣開機後才有效果。接下來,在插入裝置後找到該裝置device名稱,例如
/dev/ttyUSB1。這時我們需要透過lxc-device把其接入中。
$ sudo lxc-device -n CONTAINER_NAME [-P path] add /dev/ttyUSB1這樣這個裝置就會被加入LXC中了。