<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>系统构建 on Yun 的个人博客</title><link>https://yun7211.github.io/tags/%E7%B3%BB%E7%BB%9F%E6%9E%84%E5%BB%BA/</link><description>Recent content in 系统构建 on Yun 的个人博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 18 May 2026 10:20:00 +0800</lastBuildDate><atom:link href="https://yun7211.github.io/tags/%E7%B3%BB%E7%BB%9F%E6%9E%84%E5%BB%BA/index.xml" rel="self" type="application/rss+xml"/><item><title>根文件系统构建笔记</title><link>https://yun7211.github.io/embedded-linux/boot-system/rootfs-build-notes/</link><pubDate>Mon, 18 May 2026 10:20:00 +0800</pubDate><guid>https://yun7211.github.io/embedded-linux/boot-system/rootfs-build-notes/</guid><description>&lt;h2 id="根文件系统承担什么"&gt;根文件系统承担什么
&lt;/h2&gt;&lt;p&gt;Kernel 启动后需要挂载根文件系统，并运行第一个用户态进程。根文件系统里至少要有基础目录、初始化程序、命令工具、动态库、配置文件和设备节点。&lt;/p&gt;
&lt;p&gt;最小系统常见目录包括：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/sbin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/lib
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/proc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/sys
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/var
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="init"&gt;init
&lt;/h2&gt;&lt;p&gt;Kernel 默认会尝试运行 &lt;code&gt;/sbin/init&lt;/code&gt;、&lt;code&gt;/etc/init&lt;/code&gt;、&lt;code&gt;/bin/init&lt;/code&gt; 或 &lt;code&gt;/bin/sh&lt;/code&gt;。如果这些路径都不存在，系统会 panic。&lt;/p&gt;
&lt;p&gt;调试时可以临时在 &lt;code&gt;bootargs&lt;/code&gt; 里指定：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;init=/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样能绕过复杂启动脚本，先确认根文件系统能否进入用户态。&lt;/p&gt;
&lt;h2 id="动态库"&gt;动态库
&lt;/h2&gt;&lt;p&gt;如果应用或 BusyBox 是动态链接，需要把对应 C 运行库和动态加载器放进根文件系统。缺库时，常见现象是文件明明存在，却提示 &lt;code&gt;not found&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;可以用交叉工具链的 &lt;code&gt;readelf&lt;/code&gt; 或 &lt;code&gt;ldd&lt;/code&gt; 替代方案检查依赖。&lt;/p&gt;
&lt;h2 id="虚拟文件系统"&gt;虚拟文件系统
&lt;/h2&gt;&lt;p&gt;启动脚本通常需要挂载：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -t proc proc /proc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -t sysfs sysfs /sys
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -t devtmpfs devtmpfs /dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;缺少这些挂载会影响进程信息、设备节点和驱动状态查看。&lt;/p&gt;
&lt;h2 id="小结"&gt;小结
&lt;/h2&gt;&lt;p&gt;根文件系统问题要从两个角度看：Kernel 是否成功挂载它，用户态程序是否能在里面正常运行。先确认最小 shell 可用，再逐步恢复完整启动脚本。&lt;/p&gt;</description></item></channel></rss>