一. 简介
根文件系统里面就是一堆的可执行文件和其他文件组成的?难道我们得一个一个的从网上去下载这些文件?显然这是不现实的!那么有没有人或者组织专门干这个事呢? 他们负责"收集"这些文件,然后将其打包,像我们这样的开发者可以直接拿来用。答案是有 的,它就叫做 BusyBox !
根文件系统制作除了使用 busybox 来制作外,还有很多成熟化的根文件系统构建方式,例如buildroot,yocto。
BusyBox 是一个集成了大量的 Linux 命令和工具的软件,像 ls、mv、ifconfig 等命令 BusyBox 都会提供。BusyBox 就是一 个大的工具箱,这个工具箱里面集成了 Linux 的许多工具和命令。一般下载 BusyBox 的源码, 然后配置 BusyBox,选择自己想要的功能,最后编译即可。
二. busybox 构建根文件系统
这里我们使用 busybox 打包制作根文件系统。构建的根文件系统调试,我们通过 nfs 网络挂载,也就是将根文件系统存放到 ubuntu系统下,开发板启动以后,通过 nfs服务使用ubuntu下的根文件系统。
1. 下载 busybox源码
BusyBox 可以在其官网下载到,官网地址为:
https://busybox.net/
打开官网后,如下打开 "Download Source" 选项,如下:
可以看出,目前最新的 BusyBox 版本是 1.36.1 。
不过正点原子的左神建议大家,使用我们开 发板光盘里面提供的 1.29.0 版本的 BusyBox 。因为左神说他测试 1.29.0 版本目前还没有出现任何问 题。
正点原子提供的 busybox源码包的路径为: 例程源码 -> BusyBox 源码->busybox-1.29.0.tar.bz2
2. 打开 busybox的中文支持
将正点原子提供的 busybox源码包拷贝到 ubuntu系统下,并加压源码包。之后通过 vscode打开 busybox源码。
如果默认直接编译 busybox 的话,在使用 SecureCRT 的时候中文字符是显示不正常的,中文字符会显示为**"** ? " ,例如,你的中文目录,中文文件都显示为**"** ? "。不知道从哪个版本开始 busybox 中的 shell 命令对中文输入即显示做了限制,即使内核支持中文但在 shell 下也依然无法正确显 示。
所以我们需要修改 busybox 源码,取消 busybox 对中文显示的限制。
更改分两个部分:printable_string.c 与 unicode.c 更改。
打开文件 busybox-1.29.0/libbb/printable_string.c,找到 printable_string() 函数,屏蔽或更改后代码如下:
const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str)
{
char *dst;
const char *s;
s = str;
while (1) {
...................................
/* 注释掉下面这个两行代码 */
/* if (c >= 0x7f)
break; */
s++;
}
#if ENABLE_UNICODE_SUPPORT
dst = unicode_conv_to_printable(stats, str);
#else
{
...................................
/* 修改下面代码 */
/* if (c < ' ' || c >= 0x7f) */
if(c < ' ')
*d = '?';
d++;
}
if (stats) {
stats->byte_count = (d - dst);
stats->unicode_count = (d - dst);
stats->unicode_width = (d - dst);
}
}
#endif
return auto_string(dst);
}
可以看出,屏蔽了 第10~11行的代码:即当字符大于 0X7F 以后就跳出去了。
去掉了第 21行关于当字符大于 0X7F 的判断。
接着打开文件 busybox-1.29.0/libbb/unicode.c,找到unicode_conv_to_printable2函数,更改后的代码如下:
static char* FAST_FUNC unicode_conv_to_printable2(uni_stat_t *stats, const char *src, unsigned width, int flags)
{
char *dst;
unsigned dst_len;
unsigned uni_count;
unsigned uni_width;
if (unicode_status != UNICODE_ON) {
char *d;
if (flags & UNI_FLAG_PAD) {
d = dst = xmalloc(width + 1);
while ((int)--width >= 0) {
............................................
/* 修改下面一行代码 */
/* *d++ = (c >= ' ' && c < 0x7f) ? c : '?'; */
*d++ = (c >= ' ') ? c : '?';
src++;
}
*d = '\0';
} else {
d = dst = xstrndup(src, width);
while (*d) {
unsigned char c = *d;
/* 修改下面一行代码 */
/*if (c < ' ' || c >= 0x7f) */
if(c < ' ')
*d = '?';
d++;
}
.............................................
}
可以看出,第 15行,当字符大于 0X7F 以后,*d++就为'?'。将这一行进行更改。
第 25 行,,当字符大于 0X7F 以后,*d 也为'?'。 也更改这一行判断。
busybox 中文字符支持跟代码修改有关的就改好了,最后还需要配置 busybox来使能 unicode 码,这个稍后我们配置 busybox 的时候在设置。