带有 ARM 装置的容器技术在 i.MX6UL 的使用
环境:
硬件:i.MX6UL EVK
软件:L4.14.98 GA
目标:安装 Ubuntu xenial(16.04)+ Docker
步骤:
•创建基本的 Ubuntu rootfs
•安装 Docker
•修改内核配置
•创建 Docker Demo SDCard 映像
•测试 Docker
创建基本的 Ubuntu rootfs
机主准备
•要安装 xenial(16.04),请确保主机 ubuntu 操作系统版本不低于 xenial(16.04)
•安装必要的软件
sudo apt-get install qemu-user-static debootstrap binfmt-support
•工作区
mkdir〜/workspace
mkdir -p〜/ workspace / mnt#用于挂载
在工作区中准备 L4.14.98 Linux 源代码
在工作区中准备 L4.14.98 GA Linux Binary Demo 映像
工作区/
|--fsl-image-validation-imx-imx6ul7d.sdcard --- L4.14.98 GA Linux 二进制演示映像
|--linux-imx --- L4.14.98 Linux 源代码
`-mnt
解除引导以创建 ARM32(armhf)rootfs
distro=xenial
arch=armhf
target=rootfs_${distro}_${arch}
mkdir ${target}
sudo debootstrap --arch=${arch} --foreign ${distro} ${target}
# 复制 qemu-arm-static binary 以及
# resolv.conf 从主机到目标目录
sudo cp /usr/bin/qemu-arm-static ${target}/usr/bin
sudo cp /etc/resolv.conf ${target}/etc/
#sudo chroot rootfs_xenial_armhf
sudo chroot ${target}
# 现在我们在 chroot 步骤中,运行如下:
distro=xenial
arch=armhf
export LANG=en_US.UTF-8
export LC_ALL=C.UTF-8
# 设置第二阶段
/debootstrap/debootstrap --second-stage
现在我们有了基本的 ubuntu rootfs
#可选但建议
apt-get install -y openssh-server vim ntpdate
exit
workspace/
|-- fsl-image-validation-imx-imx6ul7d.sdcard
|-- linux-imx
|-- mnt
`-- rootfs_xenial_armhf
修改 ARM32(armhf)rootfs
可以在“ sudo chroot $ {target}”中完成以下操作或直接从主机端,但需要 sudo,例如“ sudo vim ”编辑$ {target} /etc/apt/sources.list 并添加以下内容:
deb http://ports.ubuntu.com/ubuntu-ports xenial main restricted universe multiverse
deb http://ports.ubuntu.com/ubuntu-ports xenial-updates main restricted universe multiverse
编辑$ {target} / etc / fstab 并添加以下内容:
/dev/root / auto defaults 1 1
编辑$ {target} / etc / hostname
Xenial Armhf
#哪个是$ {distro}-$ {arch}
编辑$ {target} / etc / hosts 并添加以下内容:
127.0.0.1 本地主机 xenial-armhf
注意:xenial-armhf 来自/ etc / hostname
编辑$ {target} / etc / network / interfaces 并添加以下内容:
source-directory/etc/network/interfaces.d
iface eth0 inet dhcp
auto eth0
修改 ARM32(armhf)rootfs(续)
确保我们在“ sudo chroot $ {target}”中执行以下操作:
sudo chroot ${target}
export LANG=en_US.UTF-8
export LC_ALL=C.UTF-8
useradd user -g sudo -m
# 添加到 tty 组以进行 tty 访问
usermod -a -G tty user
# 添加到拨出组以进行 UART 访问
usermod -a -G dialout user
#添加到 sudo 组进行 root 访问
usermod -a -G sudo user
# 设置 root 密码
passwd
# 设置用户密码
passwd user
#以下是可选的
locale-gen en_US.UTF-8
localectl set-locale LANG=en_US.UTF-8
localectl set-locale LC_ALL=C.UTF-8
安装 docker
参考文件
http://docs.docker.com/install/linux/docker-ce/ubuntu/
Docker 安装
确保我们仍然在“ sudo chroot $ {target}”中执行以下操作:
sudo chroot ${target}
export LANG=en_US.UTF-8
export LC_ALL=C.UTF-8
apt-get update
apt-get install -y libltdl7 libseccomp2
apt-get install -y apt-transport-https ca-certificates curl gnupg-agent
software-properties-common
curl -fsSL http://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
apt-key fingerprint 0EBFCD88
add-apt-repository "deb [arch=armhf] http://download.docker.com/linux/ubuntu
$(lsb_release -cs) stable"
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io
exit
ARM 侧安装完成后, ${target}/usr/bin/qemu-arm-static 可以将其删除.
安装后(可选)
确保我们仍然在“ sudo chroot $ {target}”中
groupadd docker
usermod -a -G docker user
apt-get clean
ARM 侧安装完成后, ${target}/usr/bin/qemu-arm-static 可以将其删除.
修改内核配置
通常需要 Docker Linux 内核配置
CONFIG_NAMESPACES
CONFIG_NET_NS
CONFIG_PID_NS
CONFIG_IPC_NS
CONFIG_UTS_NS
CONFIG_CGROUPS
CONFIG_CGROUP_CPUACCT
CONFIG_CGROUP_DEVICE
CONFIG_CGROUP_FREEZER
CONFIG_CGROUP_SCHED
CONFIG_CPUSETS
CONFIG_MEMCG
CONFIG_KEYS
CONFIG_VETH
CONFIG_BRIDGE
CONFIG_BRIDGE_NETFILTER
CONFIG_NF_NAT_IPV4
CONFIG_IP_NF_FILTER
CONFIG_IP_NF_TARGET_MASQUERADE
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE
CONFIG_NETFILTER_XT_MATCH_CONNTRACK
CONFIG_NETFILTER_XT_MATCH_IPVS
CONFIG_IP_NF_NAT
CONFIG_NF_NAT
CONFIG_NF_NAT_NEEDED
CONFIG_POSIX_MQUEUE
Docker Linux 内核配置可选功能
CONFIG_USER_NS
CONFIG_SECCOMP
CONFIG_CGROUP_PIDS
CONFIG_MEMCG_SWAP
CONFIG_MEMCG_SWAP_ENABLED boot option
"swapaccount=1"
CONFIG_LEGACY_VSYSCALL_EMULATE
CONFIG_MEMCG_KMEM
CONFIG_BLK_CGROUP
CONFIG_BLK_DEV_THROTTLING
CONFIG_IOSCHED_CFQ
CONFIG_CFQ_GROUP_IOSCHED
CONFIG_CGROUP_PERF
CONFIG_CGROUP_HUGETLB
CONFIG_CGROUP_HUGETLB
CONFIG_NET_CLS_CGROUP
CONFIG_CGROUP_NET_PRIO
CONFIG_CFS_BANDWIDTH
CONFIG_FAIR_GROUP_SCHED
CONFIG_RT_GROUP_SCHED
CONFIG_IP_NF_TARGET_REDIRECT
CONFIG_IP_VS
CONFIG_IP_VS_NFCT
CONFIG_IP_VS_PROTO_TCP
CONFIG_IP_VS_PROTO_UDP
CONFIG_IP_VS_RR
CONFIG_EXT4_FS
CONFIG_EXT4_FS_POSIX_ACL
CONFIG_EXT4_FS_SECURITY
Docker Linux 内核配置网络驱动程序
"overlay":
CONFIG_VXLAN
CONFIG_BRIDGE_VLAN_FILTERING
Optional (for encrypted networks):
CONFIG_CRYPTO
CONFIG_CRYPTO_AEAD
CONFIG_CRYPTO_GCM
CONFIG_CRYPTO_SEQIV
CONFIG_CRYPTO_GHASH
CONFIG_XFRM XFRM_USER
CONFIG_XFRM_ALGO
CONFIG_INET_ESP
CONFIG_INET_XFRM_MODE_TRANSPORT
"ipvlan":
CONFIG_IPVLAN
"macvlan":
CONFIG_MACVLAN
CONFIG_DUMMY
"ftp,tftp client in container":
CONFIG_NF_NAT_FTP
CONFIG_NF_CONNTRACK_FTP
CONFIG_NF_NAT_TFTP
CONFIG_NF_CONNTRACK_TFTP
Docker Linux 内核配置存储驱动程序
"aufs":
CONFIG_AUFS_FS
"btrfs":
CONFIG_BTRFS_FS
CONFIG_BTRFS_FS_POSIX_ACL
"devicemapper":
CONFIG_BLK_DEV_DM
CONFIG_DM_THIN_PROVISIONING
"overlay":
CONFIG_OVERLAY_FS
修改内核设置
仅供参考:
在内核重新配置过程中,您的内核可能仍缺少执行该任务所需的模块,它们需要 docker 以
来正常工作; 您可以尝试在以下脚本中运行以查看缺少的内容:
http://github.com/docker/docker/blob/master/contrib/check-config.sh
修改内核配置后,用户可以使用 check_config.sh 来检查您的内核配置文件,查看常规必要
选项是否缺失。
chmod +x check-config.sh
dos2unix check-config.sh
source
/opt/fsl-imx-fb/4.14-sumo/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
make imx_v7_defconfig -C linux-imx
./check-config.sh linux-imx/.config
请忽略 CONFIG_DEVPTS_MULTIPLE_INSTANCES 的丢失
workspace/
|-- check-config.sh
|-- fsl-image-validation-imx-imx6ul7d.sdcard
|-- linux-imx
|-- mnt
`-- rootfs_xenial_armhf
修改了内核配置(续)
L4.14.98 GA,需要特别启用:
CONFIG_NAMESPACES, CONFIG_CGROUPS,
CONFIG_CGROUP_**,
CONFIG_BRIDGE,
CONFIG_BRIDGE_NETFILTER,
CONFIG_VETH,
CONFIG_IP_NF_IPTABLES,
CONFIG_BRIDGE_NF_EBTABLES,
CONFIG_XFRM_USER,
CONFIG_NF_CT_NETLINK…
CONFIG_OVERLAY_FS, CONFIG_MACVLAN, CONFIG_BTRFS_FS,
CONFIG_BTRFS_FS_POSIX_AL
make imx_v7_defconfig -C linux-imx
make menuconfig -C linux-imx
注意:修改内核配置后,可以使用 make savedefconfig 生成新的
默认配置 linux-imx / defconfig 并复制到 arch / arm / configs / imx_v7_docker_defconfig
make savedefconfig -C linux-imx
cp linux-imx / defconfig linux-imx / arch / arm / configs / imx_v7_docker_defconfig
生成内核/模块并安装内核/模块
生成内核/模块和模块
distro=xenial
arch=armhf
target=rootfs_${distro}_${arch}
workspace/
|-- fsl-image-validation-imx-imx6ul7d.sdcard
|-- linux-imx
|-- mnt
`-- rootfs_xenial_armhf
source
/opt/fsl-imx-fb/4.14-sumo/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
make imx_v7_docker_defconfig -C linux-imx
LDFLAGS="" CC="$CC" make -j8 zImage modules -C linux-imx
现在,我们有了新的内核映像和模块
sudo make modules_install INSTALL_MOD_PATH=$(pwd)/${target} ARCH=arm LDFLAGS=""
-C linux-imx
INSTALL_MOD_PATH 需要完整路径
注意: distro = xenial
arch = armhf
workspace/
|-fsl-image-validation-imx-imx6ul7d.sdcard
|-linux-imx
|-mnt
` -rootfs_xenial_armhf
$ {target}→target = rootfs _ $ {distro} _ $ {arch}
→rootf_xenial_armhf
创建 Docker 的 Demo 以及 SDCard 映像
调整 SDCard rootfs 分区的大小
truncate -s 7G fsl-image-validation-imx-imx6ul7d.sdcard
sudo parted fsl-image-validation-imx-imx6ul7d.sdcard unit MiB print
型号:(文件)
磁盘 fsl-image-validation-imx-imx6ul7d.sdcard:7168MiB
扇区大小(逻辑/物理):512B / 512B
分区表:msdos
磁盘标志:
编号 初始存储 最大存储 内存大小 型号 文件系统 标志
1 4.00MiB 36.0MiB 32.0MiB primary fat16 lba
2 36.0MiB 980MiB 944MiB primary ext4
sudo parted fsl-image-validation-imx-imx6ul7d.sdcard resizepart 2 7160MiB
sudo parted fsl-image-validation-imx-imx6ul7d.sdcard unit MiB print
型号:(文件)
fsl-image-validation-imx-imx6ul7d.sdcard:7168MiB
扇区大小(逻辑/物理):512B / 512B
分区表:msdos
磁盘标志:
编号 初始存储 最大存储 内存大小 型号 文件系统 标志
1 4.00MiB 36.0MiB 32.0MiB primary fat16 lba
2 36.0MiB 7160MiB 7124MiB primary ext4
sudo kpartx -av fsl-image-validation-imx-imx6ul7d.sdcard
sudo e2fsck -f /dev/mapper/loop0p2
sudo resize2fs /dev/mapper/loop0p2
sudo kpartx -d fsl-image-validation-imx-imx6ul7d.sdcard
现在,rootfs 的大小已调整为 7160M。您还可以将其他值设置为 2G。
注意:这些操作可以在“真实” SD 卡上完成。
替换为 Ubuntu Rootfs 并更新 Linux 内核映像
sudo kpartx -av fsl-image-validation-imx-imx6ul7d.sdcard
sudo mkfs.ext4 /dev/mapper/loop0p2
sudo mount /dev/mapper/loop0p2 mnt/
sudo cp -rf ${target}/* mnt/
sudo umount mnt
sudo mount /dev/mapper/loop0p1 mnt/
sudo cp -rf linux-imx/arch/arm/boot/zImage mnt/
sudo umount mnt
sudo kpartx -d fsl-image-validation-imx-imx6ul7d.sdcard
做完了!
使用 Linux dd 命令或 Windows win32diskimager 刻录到 SDCard 进行测试。
建立 Docker Demo SDcard 的映像
测试 Docker
引导板并连接以太网,并确保板可以访问互联网
dhclient eth0
#ping baidu.com
date +%Y%m%d -s “20190917” //把日期设置为真实的日期
docker version
docker pull hello-world
docker run hello-world
docker run -it ubuntu bash //可能需要调整 SD card 的大小,参阅后续幻灯片
仅用于调试:
systemctl status docker
docker ps -a
systemctl stop docker
sudo dockerd //查看错误信息
详情请查看>>
|