查看: 1364|回复: 1

[分享] 带有 ARM 装置的容器技术在 i.MX6UL 的使用

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3299

    主题

    6546

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32024
    最后登录
    2024-4-25
    发表于 2020-8-11 10:57:43 | 显示全部楼层 |阅读模式
    带有 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 //查看错误信息


    详情请查看>>

    签到签到
    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    108

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    281
    最后登录
    2020-9-10
    发表于 2020-8-28 08:52:15 | 显示全部楼层
    学习了
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-26 01:55 , Processed in 0.116243 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表