Pages

Tuesday, 25 June 2024

ubuntu制作chroot系统镜像

 

这里的使用场景是在ubuntu x64上编译arm程序,需要一个开发环境,而最省心的方式就是自己做一个arm环境的chroot镜像,然后自由用apt-get安装依赖,然后编译程序。所以这里就以制作arm镜像为例。

在我们开始之前,我们需要了解一下ARM的几种架构:
armel(abi):这个是老架构,之前的arm硬件没有浮点处理单元,所以采用软件模拟的方式进行浮点计算,兼容新架构
armhf:这个是新架构,有了独立的硬件浮点处理单元,这个不兼容老架构
arm64:这个就直接用了新架构,没有el和hf之分了
kernel、rootfs和app编译的时候,指定的必须保持一致才行

1、首先我们需要安装相关程序来支持chroot环境

sudo apt-get install qemu-user-static

如果你有现成的镜像,那么只需要安装这个就行了,然后你就可以chroot进去了

2、接着我们需要安装制作镜像所需要的工具环境

sudo apt-get install binfmt-support debootstrap qemu

这里最主要是这个debootstrap,另外两个看着办

3、然后我们利用debootstrap来制作镜像
首先我们建立一个文件夹

sudo mkdir /opt/ubuntu-arm-64

然后我们运行debootstrap来联网下载对应的ubuntu版本基础镜像来制作我们的镜像

debootstrap --arch=arm64 --foreign trusty /opt/ubuntu-arm-64 http://ports.ubuntu.com/

这里的trusty是ubuntu 14.04的版本代号,关于debootstrap支持的版本代号,可以在debootstrap的脚本目录下查看,路径为 /usr/share/debootstrap/scripts/ 这下面有很多以ubuntu代号命名的文件

4、接着我们就等待3的操作完成,然后拷贝qemu-aarch64-static 到我们镜像的bin目录

cp  /usr/bin/qemu-aarch64-static  /opt/ubuntu-arm-64/usr/bin/

这里要注意了,是aarch64,如果你是armhf环境,那么请使用【qemu-arm-static】接着我们chroot进去

sudo chroot /opt/ubuntu-arm-64

这一步的时候,你可能会遇到 "i have no name" 的情况,不要急,我们来利用debootstrap对我们的镜像进行初始化操作

debootstrap/debootstrap --second-stage

如果没找到debootstrap脚本,那么请检查步骤3中遇到的错误,可能是mount proc失败。
然后等待初始化完成,你就会发现一切ok了。

5、接着我们来编辑apt的源,方便我们安装其他依赖

    deb http://ports.ubuntu.com/ trusty main restricted universe multiverse
    deb-src http://ports.ubuntu.com/ trusty main restricted universe multiverse
    deb http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty main universe
    deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty main universe
    deb http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty-updates main universe
    deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ trusty-updates main universe

这里的trusty根据你版本的不同,可以换

6、接着就是关于chroot挂载真实系统设备到我们的虚拟系统,这个需要在chroot之前调用挂载,作用是比如你想多线程编译 make -j4 那么你就需要运行下面的脚本,挂载设备

#!/bin/bash
mount -t proc proc proc/
mount -t sysfs sys sys/
mount -o bind /dev dev/
mount -t devpts pts dev/pts/

参考:
http://www.360doc.com/showweb/0/0/804170657.aspx
https://wiki.debian.org/EmDebian/CrossDebootstrap
https://linux.cn/article-4936-1.html
---------------------------------------------

设置ssh直连chroot环境

前言

该方案实现的效果就是通过指定用户名可以直接ssh连接到某个linux机器中的chroot开发环境,在 ubuntu 22.04 环境测试通过
流程

首先我们需要有个现成的 chroot 环境,我这里是 debian10-aarch64 文件夹,如果你没有,可以参考上面的文章制作一个。

这个环境不要位于某个用户目录下,最好位于 opt 这种顶层目录下,不然会出现各种权限导致的 ssh 无法连接的问题

然后我们需要设置 chroot 环境文件夹的权限为 755,接着设置其 owner 为 root:root

chmod 755 -R debian10-aarch64
chown root:root -R debian10-aarch64

然后我们在外面系统创建一个用户名,这里我创一个用户 debian10:
adduser debian10

然后我们 cd 到 chroot 环境的 home 目录,创建一个 debian10 用户名文件夹当做其 chroot 环境的用户目录,然后修改其 owner 为 debian10:debian10
接着我们配置 ssh 配置文件,在最下面加入:
Match User debian10
ChrootDirectory /opt/debian10-aarch64

然后我们将外面 linux 环境的 /etc/passwd 和 /etc/group 拷贝到 chroot 环境的 /etc 目录,这个步骤是为了解决 chroot 环境 ssh 上去后,命令行只会显示一个 $ 而不是 debian10@xxxx$ 的问题

接着我们要解决 chroot 环境无法 su 到 root 用户的问题,这个需要我们先从外面 linux 环境使用 chroot 进去,这样我们默认就是 root 用户,就可以执行一些安装操作,我们需要安装一个 sudo,安装完后,我们需要修改 sudoer 文件,这里我们使用 vi sudo 指令来修改,这样方便 sudo 即刻生效,添加下面这条:
debian10  ALL=(ALL:ALL) NOPASSWD:ALL

然后我们就可以 ssh 上去,使用 sudo -i 来切换到 root 用户,或者使用 sudo 指令来执行一些命令了。

No comments:

Post a Comment