linux kernel 为什么需要initrd

简介: 今天看了一本书, linux内核技术手册, 很多东西豁然开朗, 里面有一些东西写点总结给大家看一下 其实我还挺喜欢看手册之类的书, 因为看完之后, 可以对某个工具的所有功能有个大概的了解, 比如Makefile手册, vim手册, gcc手册. 虽然所有的用法不会都去尝试一遍, 但是知道了有这个东西, 哪天用得时候就会想起来, 不然的话, 需要解决一个问题的时候, 都不知道有这个东西的存在,

今天看了一本书, linux内核技术手册, 很多东西豁然开朗, 里面有一些东西写点总结给大家看一下

其实我还挺喜欢看手册之类的书, 因为看完之后, 可以对某个工具的所有功能有个大概的了解, 比如Makefile手册, vim手册, gcc手册. 虽然所有的用法不会都去尝试一遍, 但是知道了有这个东西, 哪天用得时候就会想起来, 不然的话, 需要解决一个问题的时候, 都不知道有这个东西的存在, 然后就是漫天满地的找

其实大家关于linux的知识都是遇到什么问题, 网上看什么问题, 都比较零碎. 对于老手来说, 零碎的东西一看就知道了, 但是对于初学者来说, 零碎的东西还是比较难以理解.

看完之后, 把多年的一些问题想明白了.

之前一直不是很明白为什么需要initrd, 原来是为了驱动root fs, 那为了驱动root fs, 把对应的驱动编译进vmlinux里面也没什么问题, 根本的问题是在编译vmlinux的时候, 不知道root fs是什么驱动, 那不是要把所有的驱动都编译进vmlinux, 那这样内核就会变得很大, 但是对于一个确定的硬件, 可以只把需要的驱动编译进vmlinux, 就不存在内核太大的问题了.

在一般用qemu来启动系统的情况下, 如果使用initrd的情况下, 要先编译bzImage, 然后要编译modules, 然后modules_install, 然后install生成initrd, 耗时太久, 如果bzImage包含了root fs的驱动的话, 只需要bzImage, qemu就可以直接启动了, 省去了很多步骤和时间

比如说我都是这样启动vm的

sudo qemu-system-x86_64 -vnc :11 -enable-kvm -drive file=centos7.vhd,if=virtio -serial mon:stdio -smp 1 -m 10240 -redir tcp:1011::22 -s -append "root=/dev/vda1 console=ttyS0" -kernel /home/shidao.ytt/alikernel/7u/arch/x86/boot/bzImage

想启动什么内核就启动什么内核, 如果每次都要把bzImage都拷进vm disk里面的话, 很容易搞错版本, 因为中间增加了一个信息传递的过程

下面就是如何把rootfs的驱动编译进内核里面

首先查看是什么文件系统, 这个很容易理解

/dev/root / ext4 rw,relatime,data=ordered 0 0

文件系统是ext4, 所以先把ext4编译进内核

CONFIG_EXT4_FS=y

然后再看磁盘驱动

cd /sys/block/vda/device/
ls -l
lrwxrwxrwx 1 root root 0 Jun 17 09:42 driver -> ../../../../bus/virtio/drivers/virtio_blk

可以看到驱动是virtio_blk和virtio

CONFIG_VIRTIO_BLK=y
CONFIG_VIRTIO_PCI=y

为什么是这2个我就不赘述了, 可以看书里面有很详细的描述

这样编译出来的bzImage就可以用qemu直接启动了, 启动命令还是和上面一样

可能大家会说, 一开始传递的就是 -drive file=centos7.vhd,if=virtio, 当然知道是virtio了, 那一开始不知道是virtio, 系统都启动不了, 怎么进入系统找驱动, 其实这个问题可以先用发行版的bzImage和initrd先启动系统来找出驱动是什么, qemu的参数就是-kernel xxx -initrd xxx

目录
相关文章
|
7月前
|
Linux 调度 Android开发
【系统启动】Kernel怎么跳转到Android:linux与安卓的交界
【系统启动】Kernel怎么跳转到Android:linux与安卓的交界
105 0
|
7月前
|
Linux C语言
Linux内核学习(七):linux kernel内核启动(一):概述篇
Linux内核学习(七):linux kernel内核启动(一):概述篇
118 0
|
安全 Ubuntu Linux
Linux Kernel 权限提升漏洞 (CVE-2023-32233)
Linux Netfilter 是一个在 Linux 内核中的网络数据包处理框架,也称作 iptables,它可以通过各种规则和过滤器,基于数据包的来源、目标地址、协议类型、端口号等信息,控制网络流量和数据包的转发和处理,是 Linux 系统网络安全性和可靠性的重要组成部分
259 1
Linux Kernel 权限提升漏洞 (CVE-2023-32233)
|
安全 Ubuntu Linux
Linux Kernel openvswitch模块权限提升漏洞(CVE-2022-2639)
Linux 内核模块Open vSwitch 存在越界写入漏洞,在足够多actions情况下,在为新的flow的新的action拷贝和预留内存时,如果next_offset比MAX_ACTIONS_BUFSIZE大,reserve_sfa_size并不会如期返回 -EMSGSIZE,此时会产生越界写入漏洞。攻击者可以利用该漏洞将普通权限提升至ROOT权限。
118 1
|
7月前
|
Linux 芯片
Linux内核学习(六):linux kernel的Kconfig分析
Linux内核学习(六):linux kernel的Kconfig分析
577 0
|
Ubuntu Linux 开发工具
嵌入式Linux系列第4篇:Kernel编译下载
嵌入式Linux系列第4篇:Kernel编译下载
|
3月前
|
存储 缓存 编译器
Linux kernel memory barriers 【ChatGPT】
Linux kernel memory barriers 【ChatGPT】
56 11
|
4月前
|
Linux 网络安全 开发工具
内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
本文介绍了如何基于Linux Kernel 5.15.102版本和BusyBox创建一个自定义的迷你Linux ARM系统,并使用QEMU进行启动和调试,包括内核和BusyBox的编译配置、根文件系统的制作以及运行QEMU时的命令和参数设置。
313 0
内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
|
7月前
|
存储 Linux Android开发
RK3568 Android/Linux 系统动态更换 U-Boot/Kernel Logo
RK3568 Android/Linux 系统动态更换 U-Boot/Kernel Logo
874 0
|
7月前
|
算法 Linux API
一文聊聊Linux Kernel的加密子系统【Crypto Subsystem】
一文聊聊Linux Kernel的加密子系统【Crypto Subsystem】
468 1