Ubuntu 22.04: 使用chroot切换到Ubuntu18.04运行环境进行开发编译

在这里插入图片描述
在这里插入图片描述

前言

     在嵌入式开发的过程中, 难免会碰到不同SDK对编译环境的不同需求, 少则安转一些依赖软件和工具, 多的则要求指定的系统版本.
比如, Android 5.1和7.1的SDK, Ubuntu 16.04可以满足, 更高版本的则会要求18.04及以上.
如何来解决这个问题, 一般可以考虑几种做法:

  1. 安装对应版本的主机, 用来编译不同的SDK (适合企业, 有足够的硬件主机)
  2. 使用虚拟技术, 把系统环境安装到虚拟机, 比如: VMware, Virtualbox (需要大量的磁盘空间)
  3. 将系统安装到U盘; (频繁切换系统比较麻烦)
  4. 使用chroot切换运行环境; (灵活, 稍复杂)

由于项目需要, 把Ubuntu18.04 安装在 U 盘上, 而平时的主要工作系统用是22.04, 文档工具也都在22.04中, 频繁切换系统稍显麻烦, 于是考虑使用 chroot 来切换的 Ubuntu 系统进行后续的开发工作;

     chroot 就是 change-root,可以说是最简单和古老的容器化软件之一,它允许用户安全地将应用程序和服务隔离。在计算术语中,隔离是将程序限制在一个受限空间内,具有预定义的资源。

如果您熟悉 Docker 及其工作原理,您可以将 chroot 视为其大幅简化的版本。chroot 通过更改程序的根目录,限制访问和可见性,从而提供了额外的隔离和安全层级。


准备工作

  1. ubuntu 18.04 已经正确安装到U盘, 并可以正常挂在U盘到当前的系统中(本文以/dev/sdc4为例)

  2. 确保有sudo权限:需要挂载文件系统和进行其他管理任务。

  3. 挂载目标分区:首先,需要将/dev/sdc4挂载到一个目录下,比如/mnt/u18

    sudo mkdir -p /mnt/u18
    sudo mount /dev/sdc4 /mnt/u18
    
  4. 挂载必要的文件系统:为了使chroot环境正常运行,你需要挂载一些必要的文件系统,如proc, sys, 和 dev

    for i in /proc /sys /dev /dev/pts; do sudo mount -B $i /mnt/u18$i; done
    

进入chroot环境

sudo chroot /mnt/u18 /bin/bash

退出chroot环境

完成工作后,通过简单的输入exit或按Ctrl+D离开chroot环境。

  • 不要忘记卸载之前挂载的文件系统:

    for i in /proc /sys /dev /dev/pts; do sudo umount /mnt/u18$i; done
    
  • 卸载分区本身:

     sudo umount /mnt/u18
    

这样就完成了从Ubuntu 20.04系统进入到另一个安装在/dev/sdc4上的Ubuntu 18.04系统中, 在这个系统中, 同样可以执行各种各样的命令, 比如: su user, gcc, make, ldd --version等等.


小提示

  1. 尽量简化目标环境(Ubuntu18.04)的分区, 可以考虑使用单分区安装(/ /home等不需要单独分区)
  2. 目标环境系统安装软件和工具时, 不要用snap, 否则容易出错(比如出现过CMake执行卡住)
  3. /proc /sys /dev /dev/pts 需要挂载上, 减少莫名其妙运行命令失败的问题
  4. 开发环境的搭建, 最好是在安装ubuntu18.04系统之后, 减少在chroot中操作导致的问题
  5. 局域网一般是通的, 外网有是需要手动配置DNS(/etc/resolv.conf)
  6. 在成功切换后, 未在Android SDK编译验证; 目前验证过的有buildroot海思平台的SDK
  7. 默认是root身份登录, 要保持文件的权限等属性, 尽量切换到对应的用户

整合文件系统挂载脚本:

#!/bin/bash
# 挂载路径
U18=/mnt/u18

function usage(){
	echo "USAGE: mount all storage device for ubuntu 18.04"
	echo "  after this, you can use 'sudo chroot /mnt/u18' to goto ubuntu 18.04"
	echo "  [start] start mount all"
	echo "  [stop]  stop and umount all"
}

function umountAll(){
	if [ $1 ] && [ $1 == all ]; then
		sudo umount ${U18}/proc
		sudo umount ${U18}/sys
		sudo umount ${U18}/dev
	fi

	sudo umount ${dev_home}
	sudo umount ${dev_code}
	sudo umount ${dev_root}
}

if [ ! $1 ]; then
	usage
	exit 0
fi

# 通过UUID 查找存储设备的设备路径
UUID_HOME="aaaaaaaa-16dc-4201-acc0-0b6205116ffb"
UUID_ROOT="bbbbbbbb-a68b-4336-9ffb-ed44f1d1293f"
UUID_CODE="cccccccc-d38c-405c-bb0a-dca41897e808"

dev_home=`blkid -U ${UUID_HOME}`
dev_root=`blkid -U ${UUID_ROOT}`
dev_code=`blkid -U ${UUID_CODE}`

echo "HOME: ${dev_home}"
echo "ROOT: ${dev_root}"
echo "CODE: ${dev_code}"

if [ $1 == start ]; then
	echo "start umount"
	umountAll


	if [ ! -d /mnt/u18 ]; then
		sudo mkdir ${U18}
	fi

	sudo chmod 777 ${U18}

	sudo mount ${dev_root} ${U18}
	sudo mount ${dev_home} ${U18}/home
	sudo mount ${dev_code} ${U18}/mnt
	
	sudo mount -t proc /proc ${U18}/proc
	sudo mount --rbind /sys ${U18}/sys
	sudo mount --rbind /dev ${U18}/dev

elif [ $1 == stop ]; then
	echo "stop, umount all"
	umountAll all
fi

参考

Linux 中的 chroot 是什么以及它的工作原理
Chroot 简介

<think>嗯,用户想知道如何通过修改release文件让Ubuntu 22.04模拟成18.04的环境。首先,我得回忆一下Ubuntu的版本管理机制。release文件通常位于/etc/os-release和/etc/lsb-release,里面包含了系统的版本信息。当用户安装软件或者运行某些脚本时,这些文件会被读取以确定系统版本。所以,理论上修改这些文件中的版本号可以让系统“伪装”成旧版本。不过,这样做可能会有风险,比如导致依赖关系错误或者软件不兼容。 接下来,我需要参考提供的引用内容。引用[1]提到用户之前升级了系统,可能残留了18.04的源地址,需要改成22.04的。但这里的情况相反,用户是想让22.04看起来像18.04,所以可能需要反过来操作,把源地址保留或改为18.04的?不过引用[3]提到直接升级系统更安全,因为单独升级GLIBC麻烦。但用户现在不想升级,而是想模拟旧环境。 步骤方面,首先备份原文件,然后修改os-release和lsb-release中的版本号,把jammy改成bionic,22.04改成18.04。可能还需要处理APT源,将源地址指向18.04的仓库,如引用[1]所说,替换源中的版本名。但这样可能导致安装的软件包不兼容,因为系统内核还是22.04的,只是APT会尝试安装18.04的包,这可能会引发依赖问题,甚至系统不稳定。 然后,用户可能需要在修改release文件后,使用类似Docker或者虚拟机来更安全地模拟环境。引用[4]提到安装特定PHP版本的方法,但这里用户需要的是整个系统环境的模拟。所以,可能建议使用容器技术,比如LXC或Docker,来创建18.04的环境,而不是修改宿主机的release文件。这样更安全,也能避免破坏现有系统。 总结一下,回答需要分步骤说明修改release文件的方法,同时强调风险,并提供更安全的替代方案,比如容器或虚拟机。还要提醒用户注意潜在的问题,如软件冲突和系统不稳定。</think>### 如何通过修改 release 文件模拟 Ubuntu 18.04 环境? #### 步骤说明 1. **备份原始 release 文件** 修改前需备份系统关键文件,防止操作失误导致系统异常: ```bash sudo cp /etc/os-release /etc/os-release.bak sudo cp /etc/lsb-release /etc/lsb-release.bak ``` 2. **编辑 `/etc/os-release` 文件** 使用文本编辑器(如 `nano` 或 `vim`)修改以下字段: ```bash sudo nano /etc/os-release ``` 将 `VERSION_ID="22.04"` 改为 `VERSION_ID="18.04"`,`UBUNTU_CODENAME=jammy` 改为 `UBUNTU_CODENAME=bionic`。 3. **编辑 `/etc/lsb-release` 文件** 同样修改以下内容: ```bash sudo nano /etc/lsb-release ``` 将 `DISTRIB_RELEASE=22.04` 改为 `DISTRIB_RELEASE=18.04`,`DISTRIB_CODENAME=jammy` 改为 `DISTRIB_CODENAME=bionic`。 4. **更新软件源(可选但高风险)** 若需进一步模拟 18.04 的软件环境,需修改软件源地址[^1]: ```bash sudo sed -i 's/jammy/bionic/g' /etc/apt/sources.list sudo apt update ``` **注意**:此操作可能导致依赖冲突,需谨慎执行。 5. **验证修改** 运行以下命令检查版本信息: ```bash lsb_release -a ``` #### 风险与替代方案 - **风险**: - 修改 `release` 文件可能导致系统工具(如 `apt`)行为异常,甚至软件包依赖冲突[^3]。 - 强行使用旧版软件源可能引发系统不稳定。 - **更安全的替代方案**: 1. **容器化技术**:使用 Docker 或 LXC 创建 Ubuntu 18.04 容器环境: ```bash docker run -it ubuntu:18.04 ``` 2. **虚拟机**:通过 VirtualBox 或 KVM 安装 Ubuntu 18.04 虚拟机。 3. **多版本共存**:使用 `chroot` 隔离环境。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值