使用initramfs启动Linux成功,再次总结一下

本文详细总结了从RAM盘根文件系统启动Linux的实验过程,并介绍了使用initramfs替代initrd的技术优势。重点阐述了内核配置、根文件系统制作以及启动过程中的关键步骤与问题解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://arm9home.net/read.php?tid=5645


前天做了个从ramdisk根文件系统启动Linux的实验,写了个帖子。经总版主kasim大侠的提携,得知现在基于Linux的发行版通常采用initramfs代替initrd,架构更简单,应用也更灵活一些。正好今天晚上没事,就做了一下使用initramfs启动Linux,写个帖子总结一下。
这个帖子不会详述具体的每一个步骤,仅仅说明它和使用ramdisk启动系统时所需要做的步骤的区别。事实上我也是在前天配置编译内核使用ramdisk启动系统的步骤的基础上改的。这里只总结使用initramfs和使用ramdisk各自配置内核选项的主要区别和遇到的一些问题。

参照我的另一个帖子《从ramdisk根文件系统启动Linux成功,总结一下》
http://www.arm9home.net/read.php?tid-5610.html


开发环境:Fedora 9
交叉编译工具链:arm-linux-gcc 4.3.2 with EABI
嵌入式Linux内核版本:2.6.29.4-FriendlyARM。本文就是友善之臂的2.6.29.4-FriendlyARM的那个版本config_mini2440_t35的内核的基础上改的。其它版本的应该也类似,仅供参考。
开发板:mini2440-128M Nand Flash
Bootloader:u-boot-2009.11


主要的不同点:
步骤2.修改内核配置选项
进入内核源码目录linux-2.6.29目录
#cp config_mini2440_t35 .config
#make menuconfig ARCH=arm
打开配置菜单,配置使用ramdisk启动系统时需要设置两个选项,这里只需要配置一个配置项:
General setup-->选择 Initial RAM filesystem and RAM disk...... 项

原因很简单,我们使用的是initramfs,而不是ramdisk,所以不用配置ramdisk的驱动支持项Device Drivers-->Block devices-->RAM block device support 项。相应的之后的(4096)Default RAM disk size kbytes等相关默认配置选项就不会再出现了。

另外initramfs技术和ramdisk技术的另一个重要的区别就是initramfs并不是在内存中模拟出一个磁盘,所以也就不在需要ramdisk中所需的ext2驱动支持。所以,File systems菜单下的ext2文件系统支持< > Second extended fs support选项就可以取消了。

在这一步还有一个重要的区别就是需要在General setup-->Initial RAM filesystem and RAM disk...... 项的相关项(/work/rootfs) Initramfs source file(s)中填写你要制作成initramfs格式的根文件系统目录,在这里我要做的根文件系统的目录是/work/rootfs。

步骤6.制作initramfs根文件系统
h)制作initramfs根文件系统镜像

制作最小系统根文件系统的步骤和以前制作ramdisk根文件系统的步骤基本一致,这里只说明最后一步有何不同。
因为initramfs根文件系统启动时执行的第一个程序是init,而不是linuxrc,所以在此,我们制作的根文件系统需要添加一个init文件,相应的linuxrc文件就不再需要了。
按照如下方式修改根文件系统
#cd /work/rootfs
#ln -s bin/busybox init 
这样就为busybox创建了一个软链接init,这个文件就是我们要创建的init文件。

另外就是我们制作ramdisk根文件系统镜像的时候使用的是genext2fs工具,在此我们制作initramfs根文件系统镜像时,并不需要额外的步骤,而是在你编译Linux内核的时候就自动生成了。自动生成的initramfs根文件系统镜像在Linux源码树的usr目录下。名字叫initramfs_data.cpio.gz,它是gz格式的压缩文件。

这样就有一个问题,在编译可以使用initramfs启动的内核的时候,它的配置选项有一个相关项,就是要在(/work/rootfs) Initramfs source file(s)中填写你要制作成initramfs格式的根文件系统目录。这样就要求我们在编译内核的时候,首先先把根文件系统做好。值得注意的是我们按照这个方法制作出来的内核镜像实际上比原来的大了许多,这是因为我们在做这一步的时候,实际上是将initramfs根文件系统直接合并到内核镜像里边了。这样,合二为一的镜像就不再需要单独烧写根文件系统镜像了,相应的,启动内核时的参数就不需要添加initrd=……来指定initramfs的位置了。当然如果你不想将initramfs合并到内核中,直接用配置ramdisk的内核来启动系统即可,不过这时你就必须使用initrd=……来指定initramfs的位置了,并且第二个参数initramfs根文件系统映像的大小必须指定为实际大小,否则提示映像校验错误,无法启动系统。

其它的就没有区别了。

-------------------------------------------------------------------
一切工作做好了,uImage和initramfs_data.cpio.gz都已经编译出来了。
用u-boot下载内核镜像和initramfs根文件系统镜像,此时启动系统,最终内核恐慌kernel panic启动失败。
在超级终端的最后一行显示错误如下:
Unpacking initramfs...<0>Kernel panic - not syncing: bad gzip magic numbers

上网查阅了相关的错误,解决方案如下:
  “这个问题已经解决; 


  是因为,我在u-boot传递给内核的initrd=bufptr,size; 
  size这个参数中,大小比实际的initramfs的大小还大; 
  导致unpack_to_rootfs在调用gunzip进行initramfs压缩包进行解压时,gunzip无法判断到initramfs压缩包的结束地址;进行重复的解  压导致的;(gunzip这个东东真不智能啊,呵呵) 

  将size设置和initramfs压缩包的大小一致就OK了;”

如法炮制,系统启动成功。

### Linux initramfs 错误原因及解决方案 #### 错误原因分析 当Linux系统启动时遇到`initramfs`错误,通常是由于以下几个原因之一引起的: 1. **文件系统损坏** 文件系统可能存在未修复的错误,导致根文件系统无法被正确挂载[^2]。 2. **驱动程序缺失或不兼容** `initramfs`是一个临时的根文件系统,用于加载必要的模块以便访问实际的根文件系统。如果某些关键设备驱动(如硬盘控制器驱动)未能正确加载,则可能导致失败[^4]。 3. **硬件故障** 硬件问题也可能引发此错误,例如硬盘坏道、内存条松动或其他存储介质异常。 4. **配置错误** `/etc/fstab`文件中的配置不当,或者引导装载器(GRUB/LILO)设置错误,都可能阻止系统正常挂载根分区[^2]。 5. **更新中断** 如果在执行内核升级或`update-initramfs`命令期间发生了意外终止(比如断电),则新生成的`initramfs`镜像可能处于不完整状态,从而引起启动失败[^3]。 --- #### 解决方案详解 以下是针对不同情况的具体解决方法: 1. **尝试退出initramfs环境** 在出现`(initramfs)`提示符下直接键入以下命令来测试是否能简单解决问题: ```bash exit ``` 这一动作会告知shell结束当前session并返回控制权给父进程;有时仅需这一简单的步骤即可恢复正常启动流程。 2. **检查与修复磁盘** 若上述方法无效,则需要进一步诊断潜在的磁盘问题。利用`blkid`工具定位目标分区后再借助`fsck`实用程序扫描并修正任何发现的问题。 - 查看所有可用块设备及其属性信息: ```bash blkid ``` - 假设检测到的目标分区为`/dev/sda1`且其类型为`ext4`,那么可运行如下命令来进行一致性检查: ```bash fsck -t ext4 /dev/sda1 ``` 对于弹出的所有询问均回应“yes”,即同意自动更正所报告的各项缺陷。 3. **重建initramfs映像** 当怀疑现有`initramfs`存在结构性破坏时,应当重新创建一个新的版本覆盖旧有的那个。可以通过指定特定内核版本号的形式调用相应脚本来达成目的。例如,对于名为`linux-image-5.x.y-zz-generic`的包关联的内核而言,应采用下列方式之一刷新对应的初始化RAM磁盘内容: ```bash sudo update-initramfs -c -k 5.x.y-zz-generic ``` 此外还需注意监控整个进程中是否有足够的剩余空间可供操作完成,因为缺乏必要资源同样会造成任务中途崩溃的情况发生[^3]。 4. **验证grub配置准确性** 确认引导管理器指向的是有效的kernel image以及正确的root parameter设定值。编辑位于`/boot/grub/grub.cfg`内的相关记录项确保它们反映最新的实际情况并且语法无误[^2]。 5. **最后手段——重装软件包** 如果常规途径皆告失效的话,不妨考虑卸载再安装涉及的核心组件试试运气。具体做法包括但不限于移除然后再次引入`initramfs-tools`这个负责维护初始RAMFS结构的关键套件实例: ```bash sudo apt-get remove --purge initramfs-tools && sudo apt-get install initramfs-tools ``` 上述序列旨在彻底清理残留数据之后按照官方仓库定义的标准重新部署一套干净副本下来替代原先受损的部分[^3]。 --- ### 注意事项 在整个排查和修理的过程中务必保持谨慎态度以免造成额外损害扩大事态恶化程度。另外建议提前做好重要资料备份以防万一不得不采取极端措施诸如全新格式化安装之类的激进策略应对棘手局面的时候不至于措手不及后悔莫及[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值