<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ARM on 个人技术随想</title>
        <link>https://www.dhao2001.com/tags/arm/</link>
        <description>Recent content in ARM on 个人技术随想</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Wed, 26 Jun 2024 11:00:00 +0800</lastBuildDate><atom:link href="https://www.dhao2001.com/tags/arm/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>树莓派快速入门</title>
            <link>https://www.dhao2001.com/2024/06/26/raspberry-pi-quick-start/</link>
            <pubDate>Wed, 26 Jun 2024 11:00:00 +0800</pubDate>
            <guid>https://www.dhao2001.com/2024/06/26/raspberry-pi-quick-start/</guid>
            <description>&lt;h2 id=&#34;前言&#34;&gt;&lt;a href=&#34;#%e5%89%8d%e8%a8%80&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;前言&#xA;&lt;/h2&gt;&lt;p&gt;实际上这又是一篇类似于 &lt;a class=&#34;link&#34; href=&#34;https://www.dhao2001.com/2024/01/29/diabolic-tricks-wicked-craft/&#34; &gt;这篇博客&lt;/a&gt; 的文章，但内容主要是使用和测试树莓派时踩过的坑与解决方法。&lt;/p&gt;&#xA;&lt;p&gt;文章的内容从树莓派系统的安装配置，到程序的编程开发都有涉及。但都不是什么保姆式的指引，毕竟树莓派的资料众多，可以在网上轻松搜索到。&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h2 id=&#34;背景&#34;&gt;&lt;a href=&#34;#%e8%83%8c%e6%99%af&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;背景&#xA;&lt;/h2&gt;&lt;p&gt;前段时间突发奇想，想要在房间里搭建一些物联网模块，自己动手实现一个包括温湿度监测、异常状态检测、稀奇古怪的音乐播放等功能。&lt;/p&gt;&#xA;&lt;p&gt;购入一块树莓派Zero 2后，又发现了还有包括STM32/ESP32等等架构可以试玩，还有像CH32这种国产化的同型号替代可以测试，正是一入硬件深似海啊。&lt;/p&gt;&#xA;&lt;p&gt;至于树莓派，主要是作为原型测试使用，毕竟相较于硬件性价比更高的国产开发板，树莓派的活跃社区和丰富文档可能是仅有的优势之一了。之后只要有条件，肯定会测试采用香橙派、幸狐这种国产板子的方案的。届时再在本站点上进行更新。&lt;/p&gt;&#xA;&lt;p&gt;不过，也别太认真，这些方案更多是测试和整活为主，事实上要实现的内容已经有相当成熟的产品可以直接购买。就请把这一系列当作是一个大学生消遣娱乐所玩弄的东西好了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;树莓派raspberry-pi-os防止wifi自动休眠&#34;&gt;&lt;a href=&#34;#%e6%a0%91%e8%8e%93%e6%b4%beraspberry-pi-os%e9%98%b2%e6%ad%a2wifi%e8%87%aa%e5%8a%a8%e4%bc%91%e7%9c%a0&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;树莓派Raspberry Pi OS防止Wifi自动休眠&#xA;&lt;/h2&gt;&lt;h3 id=&#34;问题&#34;&gt;&lt;a href=&#34;#%e9%97%ae%e9%a2%98&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;问题&#xA;&lt;/h3&gt;&lt;p&gt;由于是嵌入式场景，给树莓派安装的是官方的Raspberry Pi OS Lite（也就是以前的Raspbian，无GUI版），并使用SSH通过局域网访问树莓派。&lt;/p&gt;&#xA;&lt;p&gt;但在使用的头几天里，总是遇到一个问题：静置一段时间后，树莓派就从网络上消失了。路由器里也找不到树莓派的连接。&lt;/p&gt;&#xA;&lt;p&gt;一开始以为，是系统存在自动休眠机制，但按网上的说法，无GUI版RPiOS Lite不存在X Window，按理说不会自动休眠。同时查看&lt;code&gt;dmesg&lt;/code&gt;，也不存在休眠的记录。&lt;/p&gt;&#xA;&lt;p&gt;后来查阅资料才知道，树莓派官方Raspberry Pi OS默认启用Wifi网卡自动休眠，以节约能耗。&lt;/p&gt;&#xA;&lt;p&gt;但对于嵌入式与服务器这种，需要长期开机联网的场景来说，这简直是灾难性的。&lt;/p&gt;&#xA;&lt;h3 id=&#34;解决方法&#34;&gt;&lt;a href=&#34;#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;解决方法&#xA;&lt;/h3&gt;&lt;p&gt;解决方法当然是关闭Wifi网卡的自动休眠。只需要一句命令：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;iw dev wlan0 &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; power_save off&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# OR use nmcli&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nmcli connection modify &amp;lt;CONNECTION&amp;gt; wifi.powersave &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;首先创建一个&lt;em&gt;systemd&lt;/em&gt;服务：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl --full --force edit wifi-powersave-off.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# OR edit service file manually&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo vim /etc/systemd/system/wifi-powersave-off.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Reloading daemon is needed after editing manually&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl daemon-reload&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;填入以下内容：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Unit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Description&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Turn&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;off&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;WiFi&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;power&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;save&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;After&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sys-subsystem-net-devices-wlan0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;device&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;oneshot&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;RemainAfterExit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;yes&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;sbin&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;iw&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;dev&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;wlan0&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;power_save&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;off&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Install&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;WantedBy&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;multi-user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;target&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;保存上述文件，启用该服务，并重启系统，网络就不会随意中断了。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; wifi-powersave-off&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo reboot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h2 id=&#34;设置chroot交叉编译环境&#34;&gt;&lt;a href=&#34;#%e8%ae%be%e7%bd%aechroot%e4%ba%a4%e5%8f%89%e7%bc%96%e8%af%91%e7%8e%af%e5%a2%83&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;设置chroot交叉编译环境&#xA;&lt;/h2&gt;&lt;h3 id=&#34;问题-1&#34;&gt;&lt;a href=&#34;#%e9%97%ae%e9%a2%98-1&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;问题&#xA;&lt;/h3&gt;&lt;h4 id=&#34;不同的体系结构&#34;&gt;&lt;a href=&#34;#%e4%b8%8d%e5%90%8c%e7%9a%84%e4%bd%93%e7%b3%bb%e7%bb%93%e6%9e%84&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;不同的体系结构&#xA;&lt;/h4&gt;&lt;p&gt;树莓派Zero 2采用的是ARM64(aarch64, ARMv8)处理器架构，因此不能简单使用x86平台工具链为树莓派开发应用。&lt;/p&gt;&#xA;&lt;p&gt;想要针对树莓派开发应用，一种最简单能想到的方法是，&lt;strong&gt;直接在树莓派上安装和设置编译工具链，在树莓派上进行编译和生成应用程序&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;这种方法最为直接且麻烦最少，但最大的瓶颈在于树莓派极其有限的硬件资源。对于一个四核A53 SoC来说，编译大型应用有点强人所难了。&lt;/p&gt;&#xA;&lt;p&gt;因此，通常还希望寻找在普通x86电脑上编译ARM应用的方法，以充分利用不同平台上的硬件优势。&lt;/p&gt;&#xA;&lt;p&gt;为了在x86 PC上编译ARM应用，一种方法是直接在x86系统中引入ARM的编译工具链，就可以生成对应的可执行文件。针对ARM的GNU工具链可以在ARM官网&lt;a class=&#34;link&#34; href=&#34;https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Home / Downloads / Arm GNU Toolchain Downloads&lt;/a&gt;找到。&lt;/p&gt;&#xA;&lt;p&gt;使用上述工具，编写如Hello World等程序就是没有问题的了。这种方法同样具有简单易行的优点。&lt;/p&gt;&#xA;&lt;h4 id=&#34;不同的依赖库体系结构&#34;&gt;&lt;a href=&#34;#%e4%b8%8d%e5%90%8c%e7%9a%84%e4%be%9d%e8%b5%96%e5%ba%93%e4%bd%93%e7%b3%bb%e7%bb%93%e6%9e%84&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;不同的依赖库体系结构&#xA;&lt;/h4&gt;&lt;p&gt;然而，事实上，我们编写的程序常常还需要链接到各种第三方库，如ncurses, openmp等等。而在我们x86主机上，这些库文件通常是x86版本的，不能被正常链接到ARM的应用。&lt;/p&gt;&#xA;&lt;p&gt;既然如此，那是否可以将ARM的库文件放到x86系统里供编译器查找链接呢？答案当然是可以的。&lt;/p&gt;&#xA;&lt;p&gt;例如在Debian/Ubuntu系统中，可以使用多架构功能，为系统添加不同的体系结构，之后就可以直接使用&lt;code&gt;apt&lt;/code&gt;安装指定的库文件。如：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dpkg --add-architecture arm64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install libc6:arm64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h4 id=&#34;不同的库环境&#34;&gt;&lt;a href=&#34;#%e4%b8%8d%e5%90%8c%e7%9a%84%e5%ba%93%e7%8e%af%e5%a2%83&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;不同的库环境&#xA;&lt;/h4&gt;&lt;p&gt;然而，上述方法存在一些问题。首先，向系统中添加多体系结构软件包容易造成混乱，毕竟并非人人都是Debian系统运维专家。&lt;/p&gt;&#xA;&lt;p&gt;更重要的是，通过上述方法获得的ARM库文件，其版本号直接由x86主机系统决定，这可能与树莓派Raspberry Pi OS的版本号不同，从而造成一些奇怪的问题。&lt;/p&gt;&#xA;&lt;p&gt;这并非是什么稀奇事，因为Linux系统的诸多发行版，库文件之间常常存在兼容性差异。&lt;/p&gt;&#xA;&lt;p&gt;就我个人经历而言，也遭遇了在x86 Ubuntu系统上编译好的程序，在Raspberry Pi OS Bookworm中，由于Debian Bookworm和Ubuntu的&lt;code&gt;GLIBCXX&lt;/code&gt;库版本号有3个小版本的差距，从而导致找不到库文件，程序无法正确运行的情况。&lt;/p&gt;&#xA;&lt;h4 id=&#34;虚拟化的选择&#34;&gt;&lt;a href=&#34;#%e8%99%9a%e6%8b%9f%e5%8c%96%e7%9a%84%e9%80%89%e6%8b%a9&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;虚拟化的选择&#xA;&lt;/h4&gt;&lt;p&gt;到了这里，鉴于直接使用x86主机系统进行编译时存在的诸多限制和挑战，一个答案呼之欲出：虚拟化。我们希望在虚拟化的环境中完成对树莓派应用的编译。&lt;/p&gt;&#xA;&lt;p&gt;目前为止，能在Linux上虚拟出ARM系统的，似乎只有QEMU。但QEMU的完全虚拟化ARM虚拟机性能极其感人，不信可以自己试试看。&lt;/p&gt;&#xA;&lt;p&gt;且慢，我们只是需要一套虚拟的环境，并不需要一个完全隔离的系统。因此，我们可以使用轻量级的&lt;code&gt;chroot&lt;/code&gt;设置一个隔离的系统目录环境。&lt;/p&gt;&#xA;&lt;p&gt;到此为止，我们就确定了接下来的目标：&lt;strong&gt;在x86系统中设置针对树莓派开发的ARM体系结构chroot环境&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;本文还使用了在Debian系统下的&lt;code&gt;chroot&lt;/code&gt;管理小工具&lt;code&gt;schroot&lt;/code&gt;。要是不喜欢这玩意，也没关系，它最大的作用就是简化&lt;code&gt;chroot&lt;/code&gt;之前的挂载步骤和设置资源隔离（但实际上在我们当前场景中安全并不是很重要）。只需要自行在&lt;code&gt;chroot&lt;/code&gt;前设置好&lt;code&gt;/dev&lt;/code&gt;, &lt;code&gt;/sys&lt;/code&gt;, &lt;code&gt;/proc&lt;/code&gt;等挂载点，两者效果完全相同。&lt;/p&gt;&#xA;&lt;h3 id=&#34;设置x86主机系统&#34;&gt;&lt;a href=&#34;#%e8%ae%be%e7%bd%aex86%e4%b8%bb%e6%9c%ba%e7%b3%bb%e7%bb%9f&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;设置x86主机系统&#xA;&lt;/h3&gt;&lt;p&gt;在开始前首先需要设置一下x86主机上的主系统。&lt;/p&gt;&#xA;&lt;p&gt;笔者使用的x86主机系统是Debian 12，其他发行版可能需要按需修改一下。经测试，&lt;strong&gt;加入一些简单的额外步骤后也可以用于WSL内的Debian/Ubuntu系统&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;h4 id=&#34;安装schroot&#34;&gt;&lt;a href=&#34;#%e5%ae%89%e8%a3%85schroot&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;安装schroot&#xA;&lt;/h4&gt;&lt;p&gt;首先需要安装&lt;code&gt;schroot&lt;/code&gt;（会一同安装&lt;code&gt;build-essential&lt;/code&gt;）:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install sbuild&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h4 id=&#34;安装debootstrap&#34;&gt;&lt;a href=&#34;#%e5%ae%89%e8%a3%85debootstrap&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;安装debootstrap&#xA;&lt;/h4&gt;&lt;p&gt;如果希望创建一个Debian的chroot环境，那么肯定需要用到&lt;code&gt;debootstrap&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install debootstrap&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;如果需要使用基于Ubuntu的chroot环境，可以使用Ubuntu Base。其他发行版需要自行寻找方法。&lt;/p&gt;&#xA;&lt;h4 id=&#34;仅wsl开启systemd&#34;&gt;&lt;a href=&#34;#%e4%bb%85wsl%e5%bc%80%e5%90%afsystemd&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;(仅WSL)开启Systemd&#xA;&lt;/h4&gt;&lt;p&gt;接下来使用的&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Binfmt_misc&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;binfmt_misc&lt;/a&gt;模块需要&lt;code&gt;systemd&lt;/code&gt;的支持，因此需要提前为WSL子系统开启&lt;code&gt;systemd&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;首先编辑WSL子系统内的&lt;code&gt;/etc/wsl.conf&lt;/code&gt;，填入以下内容：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;boot&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;systemd&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;然后在子系统内安装&lt;code&gt;systemd&lt;/code&gt;组件：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install systemd systemd-sysv&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;完成后退出WSL，在Windows命令行中执行&lt;code&gt;wsl --shutdown&lt;/code&gt;以彻底关闭WSL系统，再重新打开WSL即可。&lt;/p&gt;&#xA;&lt;h4 id=&#34;配置arm二进制文件转译支持&#34;&gt;&lt;a href=&#34;#%e9%85%8d%e7%bd%aearm%e4%ba%8c%e8%bf%9b%e5%88%b6%e6%96%87%e4%bb%b6%e8%bd%ac%e8%af%91%e6%94%af%e6%8c%81&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;配置ARM二进制文件转译支持&#xA;&lt;/h4&gt;&lt;p&gt;首先安装：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install qemu-user-static binfmt-support&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;两个软件包中，&lt;code&gt;qemu-user-static&lt;/code&gt;可以在允许用户直接执行另一个体系结构的可执行文件。&lt;/p&gt;&#xA;&lt;p&gt;而&lt;code&gt;binfmt-support&lt;/code&gt;会为系统添加&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Binfmt_misc&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;binfmt_misc&lt;/a&gt;模块，从而在直接调用ARM体系结构ELF二进制文件时，自动判断所属体系结构，并自动调用&lt;code&gt;qemu-user-static&lt;/code&gt;翻译器。查看该模块的运行状态与已注册的文件类型可以前往&lt;code&gt;/proc/sys/fs/binfmt_misc/&lt;/code&gt;查看。&lt;/p&gt;&#xA;&lt;p&gt;完成安装后重启系统或WSL子系统。到此为止，x86系统就可以（高性能损失地）翻译执行ARM应用了。以Debian软件源中的&lt;code&gt;hello&lt;/code&gt;示例软件包为例：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Check package version and filename if failed or 404&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -sSL http://deb.debian.org/debian/pool/main/h/hello/hello_2.10-3_arm64.deb &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; dpkg -x - hello&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Run hello world from ARM64 architecture.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./hello/usr/bin/hello&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# (Optional) Equals to above line.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qemu-aarch64-static ./hello/usr/bin/hello&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h4 id=&#34;安装libc以支持动态链接&#34;&gt;&lt;a href=&#34;#%e5%ae%89%e8%a3%85libc%e4%bb%a5%e6%94%af%e6%8c%81%e5%8a%a8%e6%80%81%e9%93%be%e6%8e%a5&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;安装libc以支持动态链接&#xA;&lt;/h4&gt;&lt;p&gt;为了支持ARM虚拟环境中的动态链接，需要在主机上安装ARM体系结构的&lt;code&gt;libc&lt;/code&gt;库。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dpkg --add-architecture arm64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install libc6:arm64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;至此，主系统上的前期配置就已经全部完成。下面将开始设置&lt;code&gt;chroot&lt;/code&gt;环境。&lt;/p&gt;&#xA;&lt;h3 id=&#34;创建arm架构chroot环境&#34;&gt;&lt;a href=&#34;#%e5%88%9b%e5%bb%baarm%e6%9e%b6%e6%9e%84chroot%e7%8e%af%e5%a2%83&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;创建ARM架构chroot环境&#xA;&lt;/h3&gt;&lt;p&gt;在接下来的文段中，会把&lt;code&gt;chroot&lt;/code&gt;出来的虚拟化ARM环境，称为虚拟环境。&lt;/p&gt;&#xA;&lt;h4 id=&#34;初始化虚拟环境文件目录rootfs&#34;&gt;&lt;a href=&#34;#%e5%88%9d%e5%a7%8b%e5%8c%96%e8%99%9a%e6%8b%9f%e7%8e%af%e5%a2%83%e6%96%87%e4%bb%b6%e7%9b%ae%e5%bd%95rootfs&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;初始化虚拟环境文件目录(rootfs)&#xA;&lt;/h4&gt;&lt;p&gt;以创建Debian Bookworm ARM64的虚拟环境为例，需要运行以下命令：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo debootstrap --arch&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;arm64 --foreign bookworm /srv/chroot/bookworm-arm64-build https://deb.debian.org/debian/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;着重解释：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;--foreign&lt;/code&gt;参数会跳过&lt;code&gt;debootstrap&lt;/code&gt;的第二阶段，即&lt;code&gt;apt&lt;/code&gt;执行软件包配置代码的阶段。由于体系结构的不同，在当前阶段直接执行配置代码会出错，因此需要推迟到&lt;code&gt;chroot&lt;/code&gt;进入系统之后执行（后文介绍步骤）。&lt;strong&gt;本参数不能省略！&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;/srv/chroot/bookworm-arm64-build&lt;/code&gt;是自行指定的&lt;code&gt;chroot&lt;/code&gt;环境存放目录，&lt;strong&gt;爱放哪放哪&lt;/strong&gt;。不过&lt;code&gt;/srv/chroot&lt;/code&gt;是&lt;code&gt;schroot&lt;/code&gt;推荐的目录。&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;https://deb.debian.org/debian/&lt;/code&gt;是指定的软件源，国内可以使用如&lt;code&gt;http://mirrors.163.com/debian/&lt;/code&gt;等镜像站替代。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;执行上述命令后，&lt;code&gt;/srv/chroot/bookworm-arm64-build&lt;/code&gt;就是新创建的ARM架构系统根目录(rootfs, &lt;code&gt;/&lt;/code&gt;)。&lt;/p&gt;&#xA;&lt;p&gt;接着还需要复制QEMU翻译器到&lt;code&gt;chroot&lt;/code&gt;目录下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo cp /usr/bin/qemu-aarch64-static /srv/chroot/bookworm-arm64-build/usr/bin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# (Alternative) This should work too.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo cp &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;which qemu-aarch64-static&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; /srv/chroot/bookworm-arm64-build/usr/bin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h4 id=&#34;挂载文件系统&#34;&gt;&lt;a href=&#34;#%e6%8c%82%e8%bd%bd%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;挂载文件系统&#xA;&lt;/h4&gt;&lt;p&gt;进入虚拟环境前还需要给它挂载一些有用的虚拟系统。以下命令根据&lt;a class=&#34;link&#34; href=&#34;https://wiki.debian.org/chroot&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;chroot - Debian Wiki&lt;/a&gt;编写：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; f in dev dev/pts sys proc run &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; sudo mount --bind /&lt;span class=&#34;nv&#34;&gt;$f&lt;/span&gt; /srv/chroot/bookworm-arm64-build/&lt;span class=&#34;nv&#34;&gt;$f&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;（另一种方案）不过在&lt;a class=&#34;link&#34; href=&#34;https://wiki.archlinux.org/title/chroot&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;chroot - ArchWiki&lt;/a&gt;上，介绍的挂载点略有差异，但似乎都能运行，暂时没遇到问题：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /srv/chroot/bookworm-arm64-build/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount -t proc /proc proc/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount --rbind /sys sys/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount --rbind /dev dev/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h4 id=&#34;完成debootstrap第二阶段&#34;&gt;&lt;a href=&#34;#%e5%ae%8c%e6%88%90debootstrap%e7%ac%ac%e4%ba%8c%e9%98%b6%e6%ae%b5&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;完成Debootstrap第二阶段&#xA;&lt;/h4&gt;&lt;p&gt;如果使用上上节中的&lt;code&gt;debootstrap&lt;/code&gt;命令创建Debian系统，那么现在还需要执行&lt;code&gt;debootstrap&lt;/code&gt;的第二阶段，以完成虚拟环境的配置。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chroot /srv/chroot/bookworm-arm64-build /debootstrap/debootstrap --second-stage&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;经过漫长的等待后，配置过程总算结束了。&lt;/p&gt;&#xA;&lt;h3 id=&#34;使用schroot管理chroot环境&#34;&gt;&lt;a href=&#34;#%e4%bd%bf%e7%94%a8schroot%e7%ae%a1%e7%90%86chroot%e7%8e%af%e5%a2%83&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;使用schroot管理chroot环境&#xA;&lt;/h3&gt;&lt;h4 id=&#34;schroot配置chroot环境&#34;&gt;&lt;a href=&#34;#schroot%e9%85%8d%e7%bd%aechroot%e7%8e%af%e5%a2%83&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;schroot配置chroot环境&#xA;&lt;/h4&gt;&lt;p&gt;实际上，&lt;code&gt;sbuild&lt;/code&gt;等工具可以帮助我们自动创建虚拟环境并自动配置。但是！相较于完全透明的完整工具，我还是更享受将这些过程掌握在手里的感觉。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;schroot&lt;/code&gt;可以帮忙管理&lt;code&gt;chroot&lt;/code&gt;环境，简化激活&lt;code&gt;chroot&lt;/code&gt;环境所需要的命令。&lt;/p&gt;&#xA;&lt;p&gt;如果希望使用&lt;code&gt;schroot&lt;/code&gt;而非&lt;code&gt;chroot&lt;/code&gt;，只需要编写配置文件即可。&lt;/p&gt;&#xA;&lt;p&gt;在&lt;code&gt;/etc/schroot/chroot.d/&lt;/code&gt;下创建配置文件，如&lt;code&gt;/etc/schroot/chroot.d/bookworm-arm64-build.conf&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bookworm-arm64-build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;directory&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Debian&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Bookworm&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;arm64&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;build&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;directory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;srv&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;chroot&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bookworm-arm64-build&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;root-users&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;root&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;这样就足以直接开始使用：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# List all chroot(s)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;schroot -l&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# chroot to virtual environment.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;schroot -c bookworm-arm64-build -d /&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;上述配置是最简单的配置，可以附加其他很多选项，参见：&lt;a class=&#34;link&#34; href=&#34;https://linux.die.net/man/1/schroot&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;schroot(1)&lt;/a&gt;和&lt;a class=&#34;link&#34; href=&#34;https://linux.die.net/man/5/schroot.conf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;schroot.conf(5)&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;例如，希望使用一个更短的别名：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[bookworm-arm64-build]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;type=directory&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;description=Debian Bookworm arm64 build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;directory=/srv/chroot/bookworm-arm64-build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gi&#34;&gt;+aliases=d12arm64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root-users=root&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;之后就可以直接使用以下命令访问容器：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;schroot -c d12arm64 -d /&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;h4 id=&#34;schroot配置文件目录挂载&#34;&gt;&lt;a href=&#34;#schroot%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6%e7%9b%ae%e5%bd%95%e6%8c%82%e8%bd%bd&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;schroot配置文件目录挂载&#xA;&lt;/h4&gt;&lt;p&gt;有时我们希望允许虚拟环境访问指定的某个目录，但在&lt;code&gt;chroot&lt;/code&gt;环境下，软连接是无法访问的（超过了访问路径范围），而硬链接又只能链接单个文件。&lt;/p&gt;&#xA;&lt;p&gt;因此，通常的做法是把主机上希望允许访问的目录&lt;code&gt;mount --bind&lt;/code&gt;到虚拟环境中。例如：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mount --bind /host/example /srv/chroot/bookworm-arm64-build/chroot/some/example&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;这种方法，在使用原始的&lt;code&gt;chroot&lt;/code&gt;，或是当上一节&lt;code&gt;schroot&lt;/code&gt;配置文件第一行指定环境类型为&lt;code&gt;type=plain&lt;/code&gt;时是可行的。&lt;/p&gt;&#xA;&lt;p&gt;需要首先介绍一下&lt;code&gt;schroot&lt;/code&gt;的大致工作机制。&lt;code&gt;schroot&lt;/code&gt;为了允许指定的非root用户访问虚拟环境，在用户要求访问虚拟环境时，会先将虚拟环境的rootfs，也就是&lt;code&gt;/srv/chroot/bookworm-arm64-build/&lt;/code&gt;，使用&lt;code&gt;mount&lt;/code&gt;挂载到&lt;code&gt;/run/schroot/mount/&lt;/code&gt;下，再&lt;code&gt;chroot&lt;/code&gt;到这一映射后的目录下，允许用户访问。&lt;/p&gt;&#xA;&lt;p&gt;当配置文件&lt;code&gt;type=plain&lt;/code&gt;时，&lt;code&gt;schroot&lt;/code&gt;在&lt;code&gt;mount&lt;/code&gt;rootfs时使用的参数是&lt;code&gt;--rbind&lt;/code&gt;，此时原先挂载到rootfs下的所有挂载点都能被正常跟随处理。&lt;/p&gt;&#xA;&lt;p&gt;但在&lt;code&gt;type=directory&lt;/code&gt;时，由于&lt;code&gt;schroot&lt;/code&gt;改而使用&lt;code&gt;--bind&lt;/code&gt;参数（有什么差别？参见&lt;a class=&#34;link&#34; href=&#34;https://man7.org/linux/man-pages/man8/mount.8.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;mount(8) - Linux manual page&lt;/a&gt;）挂载rootfs，此时原先挂载到虚拟环境中的挂载点将不会被正常跟随，在打开的虚拟环境中，所见目标目录为空。&lt;/p&gt;&#xA;&lt;p&gt;解决这一问题的办法一是，直接将配置文件中的&lt;code&gt;type=directory&lt;/code&gt;改回&lt;code&gt;type=plain&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;```diff&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[bookworm-arm64-build]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gd&#34;&gt;-type=directory&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gi&#34;&gt;+type=plain&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;description=Debian Bookworm arm64 build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;directory=/srv/chroot/bookworm-arm64-build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;aliases=d12arm64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root-users=root&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;然而&lt;code&gt;plain&lt;/code&gt;类型的&lt;code&gt;schroot&lt;/code&gt;环境需要手动挂载&lt;code&gt;dev&lt;/code&gt;/&lt;code&gt;sys&lt;/code&gt;/&lt;code&gt;proc&lt;/code&gt;等路径，和&lt;code&gt;chroot&lt;/code&gt;没有大差异。在不需要考虑安全等因素的场景中，选择使用&lt;code&gt;schroot&lt;/code&gt;正是为了免去这些麻烦而准备的，现在直接改回去大有一夜回到解放前的感觉。&lt;/p&gt;&#xA;&lt;p&gt;因此尝试以下第二种方法，也就是&lt;a class=&#34;link&#34; href=&#34;https://linux.die.net/man/5/schroot.conf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;schroot.conf(5)&lt;/a&gt;所提到的，&lt;strong&gt;通过指定挂载虚拟环境时的&lt;code&gt;fstab&lt;/code&gt;文件配置挂载点&lt;/strong&gt;。该文件格式与&lt;code&gt;/etc/fstab&lt;/code&gt;格式相同。&lt;/p&gt;&#xA;&lt;p&gt;下面以挂载&lt;code&gt;/host/example&lt;/code&gt;到虚拟环境中的&lt;code&gt;/chroot/example&lt;/code&gt;为例。注意这里的&lt;code&gt;/chroot/example&lt;/code&gt;是&lt;strong&gt;虚拟环境中的路径&lt;/strong&gt;，不是相对主机系统而言的。&lt;/p&gt;&#xA;&lt;p&gt;首先在&lt;code&gt;/etc/schroot/&lt;/code&gt;下创建一个&lt;code&gt;fstab.d&lt;/code&gt;文件夹，再创建一个独立的&lt;code&gt;fstab&lt;/code&gt;文件（实际上后缀名不作强制要求）。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir -p /etc/schroot/fstab.d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo vim /etc/schroot/fstab.d/bookworm-arm64-build.fstab&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;填入以下内容，其中有一部分内容可以直接照搬&lt;code&gt;/etc/schroot/default/fstab&lt;/code&gt;：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# Note that the mount point will be prefixed by the chroot path&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# (CHROOT_PATH)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;#&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# &amp;lt;file system&amp;gt; &amp;lt;mount point&amp;gt;    &amp;lt;type&amp;gt;  &amp;lt;options&amp;gt;       &amp;lt;dump&amp;gt;  &amp;lt;pass&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/proc           /proc            none    rw,bind         0       0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sys            /sys             none    rw,bind         0       0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/dev            /dev             none    rw,bind         0       0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/dev/pts        /dev/pts         none    rw,bind         0       0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/host/example   /chroot/example  none    rw,bind         0       0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;再修改&lt;code&gt;/etc/schroot/chroot.d/bookworm-arm64-build.conf&lt;/code&gt;中的内容，添加一行&lt;code&gt;setup.fstab&lt;/code&gt;，指向刚刚创建的&lt;code&gt;fstab&lt;/code&gt;文件，该路径是相对于&lt;code&gt;/etc/schroot/&lt;/code&gt;而言的。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[bookworm-arm64-build]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;type=directory&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;description=Debian Bookworm arm64 build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;directory=/srv/chroot/bookworm-arm64-build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;aliases=d12arm64&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root-users=root&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gi&#34;&gt;+setup.fstab=fstab.d/bookworm-arm64-build.fstab&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;保存后，还需要在虚拟环境文件系统中创建挂载点：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo mkdir -p /srv/chroot/bookworm-arm64-build/chroot/example&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;重新进入&lt;code&gt;schroot&lt;/code&gt;，就可以在&lt;code&gt;/chroot/example&lt;/code&gt;下见到主机&lt;code&gt;/host/example&lt;/code&gt;中的文件了。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
