# linux_system_build **Repository Path**: li-tuo/linux_system_build ## Basic Information - **Project Name**: linux_system_build - **Description**: 构建一个可以正常使用的嵌入式linux完整系统(u-boot \linux-kernel \rootfs) - **Primary Language**: C - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-01-27 - **Last Updated**: 2021-01-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # linux_system_build #### 介绍 构建一个可以正常使用的嵌入式linux完整系统(u-boot \linux-kernel \rootfs) #### 软件架构 软件架构说明 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### u-boot说明 1. xxxx 2. xxxx 3. xxxx #### linux-kernel说明 1. xxxx 2. xxxx 3. xxxx #### rootfs说明 1. 使用Busybox来制作我们的rootfs,其官网为: [https://busybox.net/](https://busybox.net/) 2. 这里使用的Busybox版本是1.29.0版本,busybox-1.29.0.tar.bz2 3. 注意:在Linux驱动开发的时候都是通过nfs来挂在根文件系统的,产品最终上市销售的时候才会将根文件系统烧写到EMMC/NAND中 ##### rootfs制作步骤 1. 下载Busybox源码包并解压 `tar -vxjf busybox-1.29.0 tar.bz2` 2. 修改Makefile,添加平台架构与编译器 `ARCH ?= arm` `CROSS_COMPILE ?= /user/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-` 上面CROSS_COMPILE使用的绝对路径!防止编译出错 3. Busybox中文字符支持 4. 配置Busybox 5. 编译Busybox,并指定编译结果的存放目录 `make install CONFIG_PREFIX=/home/lituo/linux/nfs/rootfs`,这样编译结束之后会将busybox的所有工具和文件保存在rootfs中 6. 向根文件系统添加lib库 7. 创建其他文件夹:在根文件中创建其他文件夹,eg:dev、proc、mnt、sys、tmp、root等 8. 根文件系统初步测试:测试方法就是使用NFS挂载,这时候uboot里面的bootarg环境变量会设置“root”的值,所以我们将root的值改为NFS挂载即可,在linux内核源码里面有相应的文档讲解如何设置, 文档为 Documentation/filesystems/nfs/nfsroot.txt, 对应格式如下: root=/dev/nfs nfsroot=[:][,] ip=:::::::: 详情如下: :服务器 IP 地址,也就是存放根文件系统主机的 IP 地址,那就是Ubuntu的IP地址,比如我的Ubuntu主机 IP 地址为 192.168.0.211 :根文件系统的存放路径,比如我的就是/home/lituo/linux/nfs/rootfs :NFS 的其他可选选项,一般不设置 :客户端 IP 地址,也就是我们开发板的 IP 地址,Linux内核启动以后就会使用此 IP 地址来配置开发板。此地址一定要和 Ubuntu 主机在同一个网段内,并且没有被其他的设 备使用,在 Ubuntu 中使用 ping 命令 ping 一下就知道要设置的 IP 地址有没有被使用,如果不能 ping 通就说明没有被使用,那么就可以设置为开发板的 IP 地址,比如我就可以设置为 192.168.0.250 : 服务器 IP 地址,前面已经说了。 : 网关地址,我的就是 192.168.0.1。 :子网掩码,我的就是 255.255.255.0。 :客户机的名字,一般不设置,此值可以空着。 : 设备名,也就是网卡名,一般是 eth0, eth1….,作者的开 发板的 ENET2 为 eth0, ENET1 为 eth1。 如果你的电脑只有一个网卡,那么基本只能是 eth0。 这里我们使用 ENET2,所以网卡名就是 eth0。 : 自动配置,一般不使用,所以设置为 off。 : DNS0 服务器 IP 地址,不使用。 : DNS1 服务器 IP 地址,不使用。 由上面的格式分析bootargs环境变量的 root值为: root=/dev/nfs/ rw nfsroot=192.168.1.250:/home/lituo/linux/nfs/rootfs ip=192.168.0.211:192.168.0.250:192.168.0.1:255.255.255.0::eth0:off 9. 完善根文件系统之创建/etc/init.d/rcS文件,rcS本质是一个shell脚本,用来指定Linux内核启动以后需要启动的一些服务。 10. 完善根文件系统之创建/etc/fstab文件,在上面的rcS这个shell脚本中,有一个“mount -a”,其是自动读取并挂载 /etc/fstab 里面的东西。/etc/fsatb 定义了该挂在哪些文件。 在rootfs中创建/etc/fstab文件,fsatab在Linux开机以后自动配置哪些需要自动挂载的分区,如下格式: :要挂载的特殊的设备,也可以是块设备,比如/dev/sda 等等。 :挂载点。 :文件系统类型,比如 ext2、 ext3、 proc、 romfs、 tmpfs 等等。 :挂载选项,在 Ubuntu 中输入“man mount”命令可以查看具体的选项。一般使用 defaults,也就是默认选项,defaults包含了rw、suid、dev、exec、auto、nouser、async。 :为 1 的话表示允许备份,为 0 不备份,一般不备份,因此设置为 0。 :磁盘检查设置,为 0 表示不检查。根目录‘/’设置为 1,其他的都不能设置为 1,其他的分区从 2 开始。一般不在 fstab 中挂载根目录,因此这里一般设置为 0。 由上面的格式分析fstab文件内容如下: # proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 11. 完善根文件系统之创建/etc/inittab文件,init程序会读取/etc/inittab这个文件。 ::: :每个指令的标识符,不能重复。但是对于busybox的init来说,有着特殊意义。对于busybox而言用来指定启动进程的控制tty,一般我们将串口或者LCD屏幕设置为控制tty。 : 对 busybox 来说此项完全没用,所以空着。 :动作,用于指定可能用到的动作。 动作 描述 sysinit 在系统初始化的时候 process 才会执行一次。 respawn 当 process 终止以后马上启动一个新的。 askfirst 和 respawn 类似,在运行 process 之前在控制台上显示“Please press Enter to activate this console.”。只要用户按下“Enter”键以后才会执行 process。 wait 告诉 init,要等待相应的进程执行完以后才能继续执行。 once 仅执行一次,而且不会等待 process 执行完成。 restart 当 init 重启的时候才会执行 procee。 ctrlaltdel 当按下 ctrl+alt+del 组合键才会执行 process。 shutdown 关机的时候执行 process。 : 具体的动作,比如程序、脚本或命令等。 init程序相关参考:https://www.cnblogs.com/yizhangheka/p/12526671.html 12. 配置域名解析服务器的地址 在rootfs中新建/etc/resolv.conf,输入下面内容: nameserver 114.114.114.114 nameserver 192.168.0.1 设置完成后,ping ww.baidu.com 来测试。 Linux配置/etc/resolv.conf详解请参考:https://www.cnblogs.com/yuhaohao/p/13889240.html #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)