学习主要参考https://rocketboards.org/foswiki/Documentation/EmbeddedLinuxBeginnerSGuide
1根文件系统定义
这根文件系统是文件系统包含在同一个划分在这上面根目录位于,它是所有其他文件系统所在的文件系统安装好的(即逻辑上连接到系统)因为系统是启动(即启动)。分区是硬盘驱动器(HDD)中逻辑上独立的部分。文件系统是目录的层次结构(也称为目录树)用于组织计算机系统上的文件。在Linux操作系统和其他类Unix 操作系统目录从根目录开始,根目录包含一系列子目录,每个子目录又包含更多的子目录,等等。此定义的一个变体是位于单个分区或磁盘上的整个目录层次结构(即目录树)的一部分。根文件系统的确切内容因计算机而异,但它们将包括引导系统和使系统达到可以挂载其他文件系统的状态所必需的文件,以及用于修复损坏的系统和从备份中恢复丢失文件的工具。内容将包括根目录以及一个最小的子目录和文件集,包括 /boot, /dev, /etc, /bin, /sbin and sometimes /tmp (for temporary files).
当系统在中启动时,只有根文件系统可用单用户模式。单用户模式是引导能力非常有限的受损系统的一种方式,以便对其进行修复。修复完成后,位于不同分区或不同介质上的其他文件系统就可以安装好的以便恢复全部系统功能。装载它们的目录称为挂载点。根文件系统通常应该很小,因为它包含关键文件,并且不经常修改的小文件系统更有可能不被损坏。损坏的根文件系统通常意味着系统变得无法登录(即,不可启动)并且必须通过特殊方式(例如,从引导软盘).文件系统可以安装在目录树中的任何位置;它不一定需要安装在根文件系统上。例如,有可能(并且非常常见)在根文件系统的一个挂载点上挂载一个文件系统,而在该文件系统包含的一个挂载点上挂载另一个文件系统。
参考链接http://www.linfo.org/root_filesystem.html
根文件系统必备内容:
- 一个初始化系统。这个程序将是内核启动后运行的第一个应用程序。它负责建立用户空间和启动所有其他用户应用程序(比如登录提示和shell)。
- 保存设备节点的“/dev”目录。在黑暗的日子里(在2.6内核之前),每个设备都有一个与之相关联的设备文件,需要使用创建静态设备节点命令。如今,这个过程通过各种系统中的一个(我们将选择一个)为我们实现了自动化。(设备文件是表示连接到内核的设备的文件。这只是用户空间与内核空间交互和传递数据的一种方式。检验本页了解更多信息)。
- 任何可加载的内核模块。如果您在配置内核时将任何驱动程序设置为“可加载模块”,那么它们需要放在这个根文件系统中。通常,这些文件放在“/lib/modules//".
2.Buildroot自动化创建根文件系统
2.1.下载Buildroot
执行如下命令可以克隆buildroot
git clone http://git.buildroot.net/git/buildroot.git
但是这个方法下载不成功。可以直接进入官网下载最新的。
https://git.busybox.net/buildroot/
https://git.busybox.net/buildroot/snapshot/buildroot-2022.02.tar.bz2
https://git.busybox.net/buildroot/snapshot/buildroot-2015.08.1.tar.bz2
2.2.配置Buildroot
这里使用2022.02版本的
进入下载的buildroot目录下,输入如下指令:以进行平台与交叉编译工具的配置
make RCH=ARM BR2_TOOLCHAIN_EXTERNAL_PATH=/home/dyq/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux nconfig
也可以使用2015.08.1的版本,直接跟着官方做即可。
https://rocketboards.org/foswiki/Documentation/EmbeddedLinuxBeginnerSGuide
可以在终端显示出一个GUI界面。
/home/dyq/software/buildroot-2022.02/.config - Buildroot 2022.02 Configuration
┌── Buildroot 2022.02 Configuration ─────────────────────────────────────────┐
│ │
│ Target options ---> │
│ Build options ---> │
│ Toolchain ---> │
│ System configuration ---> │
│ Kernel ---> │
│ Target packages ---> │
│ Filesystem images ---> │
│ Bootloaders ---> │
│ Host utilities ---> │
│ Legacy config options ---> │
│ │
│ │
│ │
│ │
│ │
└F1Help─F2SymInfo─F3Help 2─F4ShowAll─F5Back─F6Save─F7Load─F8SymSearch─F9Exit─┘
-
进入"Target options→Target Architecture",然后选择 “ARM (little endian)”。
-
“Target Architecture Variant” 选择 “cortex-A9”。
-
“Target ABI” 选择 “EABIhf” (这将支持硬浮点处理)。
-
勾选Enable NEON SIMD extension support(NEON是许多ARM内核中的单指令/多数据引擎)。
-
最后设置“Floating point strategy” 为 “NEON” 来使用我们刚刚启用的“NEON”引擎。剩余配置保持不变。
设置结果如下:
/home/dyq/software/buildroot-2022.02/.config - Buildroot 2022.02 Configuration
┌── Target options ──────────────────────────────────────────────────────────┐
│ │
│ Target Architecture (ARM (little endian)) ---> │
│ Target Binary Format (ELF) ---> │
│ Target Architecture Variant (cortex-A9) ---> │
│ [*] Enable NEON SIMD extension support │
│ [ ] Enable VFP extension support (NEW) │
│ Target ABI (EABI) ---> │
│ Floating point strategy (NEON) ---> │
│ ARM instruction set (ARM) ---> │
│ │
│ │
└F1Help─F2SymInfo─F3Help 2─F4ShowAll─F5Back─F6Save─F7Load─F8SymSearch─F9Exit─┘
- 按F5退回到菜单界面。进入 “Toolchain”, 在“Toolchain type” 选择“External toolchain”.
- 将Toolchain设置为Custom toolchain
- “Toolchain origin”设置为“Pre-installed toolchain”,指定已经安装了,不让buildroot去网上下载了。
- toolchain path这一项可以忽视掉,因为在前面启动该GUI时已经指定过了。
- 使能“copy gdb server to the Target选项。
以下参考https://www.cnblogs.com/sky-heaven/p/13513198.html
- External toolchain gcc version选择自己的工具链的gcc版本,这里选择4.9.x。剩下默认
- 进入“System configuration” 按如下设置。
/home/dyq/software/buildroot-2022.02/.config - Buildroot 2022.02 Configuration
┌── System configuration ────────────────────────────────────────────────────┐
│ │
│ Root FS skeleton (default target skeleton) ---> │
│ (dyq) System hostname │
│ (Welcome to Buildroot) System banner (NEW) │
│ Passwords encoding (sha-256) ---> │
│ Init system (BusyBox) ---> │
│ /dev management (Dynamic using devtmpfs only) ---> │
│ (system/device_table.txt) Path to the permission tables (NEW) │
│ [ ] support extended attributes in device tables (NEW) │
│ [ ] Use symlinks to /usr for /bin, /sbin and /lib (NEW) │
│ [*] Enable root login with password (NEW) │
│ (123456) Root password │
│ /bin/sh (busybox' default shell) ---> │
│ [*] Run a getty (login prompt) after boot ---> │
│ [*] remount root filesystem read-write during boot (NEW) │
│ () Network interface to configure through DHCP (NEW) │
│ (/bin:/sbin:/usr/bin:/usr/sbin) Set the system's default PATH (NEW) │
│ [*] Purge unwanted locales (NEW) │
│ (C en_US) Locales to keep (NEW) │
│ *** NLS support needs a toolchain w/ wchar, dynamic library *** │
│ [ ] Install timezone info (NEW) │
│ () Path to the users tables (NEW) │
│ () Root filesystem overlay directories (NEW) │
│ () Custom scripts to run before commencing the build (NEW) │
│ () Custom scripts to run before creating filesystem images (NEW) │
│ () Custom scripts to run inside the fakeroot environment (NEW) │
│ () Custom scripts to run after creating filesystem images (NEW) │
│ │
└F1Help─F2SymInfo─F3Help 2─F4ShowAll─F5Back─F6Save─F7Load─F8SymSearch─F9Exit─
-
回到主菜单,进入“Kernel”;不要选择 [ ] Linux Kernel (NEW) ,因为已经生成了Linux内核。
-
退出进入 “Target packages”,这是生成大部分根文件系统的地方。
-
“Filesystem images”是设置如何生成根文件系统的,默认配置为生成一个tar文件。
-
按F6保存,esc退出。
2.3.配置busybox
输入以下指令打开GUI界面。
make busybox-menuconfig
对于每个选项的设置及其意义,可以将光标放到对应位置,然后在键盘上打出"?"即可自动显示解释。
这里直接默认配置不进行改动。
make BR2_TOOLCHAIN_EXTERNAL_PATH=/home/dyq/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux all
最后会生成一个tar文件,其位置在/output/images/rootfs.tar
3.下载zImge和根文件系统到SD卡
首先确认自己的sdcard。
dyq@ubuntu:~/software/buildroot-2015.08.1$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 1 7.3G 0 disk
├─sdb2 8:18 1 254M 0 part /media/dyq/42867f78-0b58-4fbb-918c-8d4a106ef64e
├─sdb3 8:19 1 1M 0 part
└─sdb1 8:17 1 256M 0 part /media/dyq/1E69-3F5E
sr0 11:0 1 1024M 0 rom
sda 8:0 0 20G 0 disk
├─sda2 8:2 0 1K 0 part
├─sda5 8:5 0 975M 0 part [SWAP]
└─sda1 8:1 0 19G 0 part /
发现fat分区为sdb1,其路径为/media/dyq/1E69-3F5E
,ext4分区为sdb2,其路径为/media/dyq/42867f78-0b58-4fbb-918c-8d4a106ef64e
。
拷贝Linux映像文件到fat分区:
sudo cp /{your path}/linux-socfpga/arch/arm/boot/zImage /media/dyq/1E69-3F5E
拷贝根文件系统到ext4分区:
sudo tar -xvf /{your path}/buildroot-2015.08.1/output/images/rootfs.tar -C /media/dyq/42867f78-0b58-4fbb-918c-8d4a106ef64e
最后插到开发板即可运行。如果出现以下问题,一般是根文件系统没有被识别出来,这个一般可能与你的SD卡读卡器有关。建议:换个好点的SD卡读卡器,郁闷了一整天
Kernel panic - not syncing: No working init found. Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance