不使用 initramfs,如何启动 Linux - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
station
V2EX    Linux

不使用 initramfs,如何启动 Linux

  •  
  •   station 2018-10-28 19:43:50 +08:00 6157 次点击
    这是一个创建于 2554 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我之前问题帖子有人说到来了无 initramfs/initrd

    受启发我找到了 https://www.zhihu.com/question/30599860/answer/49143877

    我用 efi-stub 代替 grub

    裁剪的内核基础驱动(硬盘驱动,文件系统)和一些硬件驱动都编译进内核了

    我也知道是错误问题是 root device,但找不到头绪

    igCz5Q.png

    55 条回复    2018-10-30 22:51:21 +08:00
    Osk
        1
    Osk  
       2018-10-28 19:57:48 +08:00 via Android
    要使用 uuid5 来指定根,恐怕 initramfs 少不了,印象中这是 initramfs 里的用户空间程序识别的,不使用 initramds 只有指定 /dev/sdxy 这种了,或者试试 /dev/disk/by-uuid/xxxxx 这种?
    choury
        2
    choury  
       2018-10-28 19:58:40 +08:00
    它下面不是列出了识别出来的分区 UUID 了吗,没有你指定的那个,要么你指定的 UUID 所需要的驱动没有,所以没找到,要么你指定的 UUID 是错的,你看它列出来的 ID 哪个是你的 root 分区,改成那个
    rock6y
        3
    rock6y  
       2018-10-28 20:01:13 +08:00 via Android
    编译内核把驱动加进去
    cattyhouse
        4
    cattyhouse  
       2018-10-28 20:34:12 +08:00 via iPhone
    启动 linux 连 bootloader 都可以不要,直接 UEFI Shell
    station
        5
    station  
    OP
       2018-10-28 20:58:10 +08:00
    station
        6
    station  
    OP
       2018-10-28 21:03:52 +08:00
    @Osk root device 可以了 但现在又卡住了,看上一楼回复图片
    henglinli
        7
    henglinli  
       2018-10-28 21:05:37 +08:00
    root 分区所使用的文件系统一定要 builtin,否则得用 initramfs。
    使用内核参数 root=PARTUUID=更好,兼容 @cattyhouse 说的那种。使用 blkid | grep sda2 获取。
    bootload 建议用 systemd-boot。多数系统都使用 systemd 了,估计也会自带 systemd-boot。
    我的 /etc/kernel/cmdline
    root=PARTUUID=f0db77e4-6f83-4c85-b6d7-135c9b0582c9 rw rootfstype=btrfs rootflags=subvol=exherbo,autodefrag,compress=lzo init=/usr/lib/systemd/systemd
    choury
        8
    choury  
       2018-10-28 21:12:06 +08:00
    @station #5 把 init 换成 sh 启动试下吧,不知道是不是 init 卡住了
    likuku
        9
    likuku  
       2018-10-28 21:33:46 +08:00
    想起以前玩 gentoo 时候的经验了,也是不用 EFI,不用 UUID

    确保:
    内核里 把正确的硬盘控制器编进去 y 而非 m,
    内核里 把 kernel 和 root 所在分区的文件系统编进去 y 而非 m

    引导工具 (不确定你使用 grub ) 里,所在的分区要写对,
    假若是 GRUB 里是这么写: kernel(hd0,0) 代表 sda1 # 设备和分区都从 0 开始,告诉 GRUB kernel 所在的分区
    kernel 后面的 root=/dev/sda1 这么写,是让 kernel 完成加载后,传递给 kernel 的参数,让 kernel 找到 /

    若以上都可以正常工作,那么 / 已经就可以载入了。

    最后,选择性可以把 /etc/fstab 里其它分区也都按 /dev/sda1 / 类似的格式写,不要用 UUID
    station
        10
    station  
    OP
       2018-10-28 22:13:32 +08:00
    @choury 还在试

    接这张图真费劲 https://s1.ax1x.com/2018/10/28/igeQHI.png
    choury
        11
    choury  
       2018-10-28 22:21:56 +08:00
    @station #10 确定下 /usr/lib/systemd/systemd 是否存在吧,error -2 的意思是文件不存在
    station
        12
    station  
    OP
       2018-10-28 22:27:21 +08:00
    @choury 存在是肯定的
    station
        13
    station  
    OP
       2018-10-28 22:34:08 +08:00
    @choury 换成 sh 也是同样的问题,估计是挂载问题吧
    station
        14
    station  
    OP
       2018-10-28 22:34:44 +08:00
    @henglinli /usr/lib/systemd/systemd 提示找不到文件,看 10 楼图
    station
        15
    station  
    OP
       2018-10-28 22:36:12 +08:00
    @likuku 最后,选择性可以把 /etc/fstab 里其它分区也都按 /dev/sda1 / 类似的格式写 这个怎么讲
    henglinli
        16
    henglinli  
       2018-10-28 22:42:44 +08:00
    @station 这是我的例子啊。你的 init 是什么要看发行版或者管理员原配置。一般情况下不指定 init 或者使用 /sbin/init。
    发现你使用的是 xfs,已经挂载上了。这个搞定之后,建议你在折腾下安全启动,给 bootloader kernel 都签下名。
    xivisi
        17
    xivisi  
       2018-10-28 22:42:56 +08:00
    我目前就没有用 initramfs
    gentoo
    station
        18
    station  
    OP
       2018-10-28 22:47:27 +08:00
    @henglinli 应该无关签名和安全启动,之前编译的使用了 initramfs 和 efi-stub 的都能启动
    henglinli
        19
    henglinli  
       2018-10-28 22:49:26 +08:00
    @xivisi 我也没用 initramfs 而且所有模块 builtin,包括网卡和蓝牙的固件。
    可惜前不久电脑意外断电就再也不行了。
    henglinli
        20
    henglinli  
       2018-10-28 22:53:19 +08:00
    @station 没说有关啊。给他进一步折腾找个新路。也可以装下黑苹果。
    station
        21
    station  
    OP
       2018-10-28 23:00:18 +08:00
    @henglinli 看来是卡在 init 上。。。。
    xivisi
        22
    xivisi  
       2018-10-28 23:07:34 +08:00
    @station 如果用的 systemd 需要在启动时,配置内核参数,init 路径
    flynaj
        23
    flynaj  
       2018-10-28 23:29:05 +08:00 via Android
    自己编译本机内核就行,openwrt 一直就没有 initramfs
    likuku
        24
    likuku  
       2018-10-28 23:34:53 +08:00
    @station [最后,选择性可以把 /etc/fstab 里其它分区也都按 /dev/sda1 / 类似的格式]

    既然 kernel 已经直接用了 root=/dev/sda1 之类,
    那么 /etc/fstab 里也要用类似写法替换掉原有的 UUID / Labe 命名方式

    若所有分区都加载正常,那么无视之。
    henglinli
        25
    henglinli  
       2018-10-28 23:35:00 +08:00
    @station 估计他把我给的例子直接照搬了。

    @station 解释下 /etc/kernel/cmdline,这些都是 kernel 的参数,不是 initramfs 的参数。多数 bootloader bootmanager 把这二者的参数放到一个配置项目中,比如 systemd-boot 的 option 项。把该 cmdline 配置到 linux 内核里面就可以不经过 bootloader 而是由 uefi 固件直接引导 linux 内核。编译安装 linux 内核的时候的 make install 以及 dracut 都会用到它。

    root=PARTUUID=f0db77e4-6f83-4c85-b6d7-135c9b0582c9 指定根文件系统类型。

    rw 默认是文件系统以 r 只读形式挂载,设置成 rw 就可以不用配置 /etc/fstab 以及更为现代的 systemd 的.mount 了。
    我配置成 rw 是认为这样要快一点,而且我使用的 btrfs 更本不需要启动时候 fsck,没必要设置成只读。

    rootfstype=btrfs 指定文件系统类型,如果不设置内核会自己尝试支持的文件系统。

    rootflags=subvol=exherbo,autodefrag,compress=lzo 我只在过用 zfs 和 btrfs 时候会配置这个参数。

    init=/usr/lib/systemd/systemd 我的 rootfs 是 btrfs 的一个子卷,我觉得不用 /sbin/init 这个软连接,而直接使用 /usr/lib/systemd/systemd 要快一点。而且我使用的发现版他就是把 systemd 放到这个位置,而不是 gentoo 的 /usr/sbin/systemd (没记错的话)。我估计其他发现版本都会有 /sbin/init 这个软链接或者其他 init 系统的拷贝。
    wwhc
        26
    wwhc  
       2018-10-29 00:05:37 +08:00
    如果楼主用 Gentoo,建议不要使用 systemd,Gentoo 有更好的选择:OpenRC
    station
        27
    station  
    OP
       2018-10-29 07:13:01 +08:00 via iPhone
    @likuku 我想我应该理解你的意思了:

    现在提示我找不到 init: /usr/lib/systemd/systemd,我想应该是其他分区没挂载

    正如 @henglinli l 说的 partuuid 兼容性更好,而 fstab 默认是 uuid,而一楼说了 uuid 是由 initramfs 中的用户空间识别

    我想在的环境是 centos/fedora,编译的内核是采用 CONFIG_CMDLINE 来传递参数

    晚上试试
    likuku
        28
    likuku  
       2018-10-29 10:55:49 +08:00
    @station fstab 默认是 UUID ... 三十年河东,三十年河西... 变化真得大。的确 UUID 很方便,尤其弄个 U 盘上跑的系统。
    station
        29
    station  
    OP
       2018-10-29 17:08:55 +08:00 via iPhone
    @cattyhouse 给个关键词呗
    henglinli
        30
    henglinli  
       2018-10-29 17:48:44 +08:00 via iPhone
    @likuku fstab 没有默认选项,那是发行版自动识别出添加的。变化大的事启动挂在文件系统时 systemd.mount 取代了 fstab。之所以 fstab 配置能起作用,是因为 systemd.mount 会读取并转换它。当然 mount 任然在使用 fstab。system 做了太多,所以有人开始害怕它,于是出现了 devuan without-systemd.org
    station
        31
    station  
    OP
       2018-10-29 18:06:21 +08:00 via iPhone
    @henglinli 感谢科普
    likuku
        32
    likuku  
       2018-10-29 20:04:00 +08:00
    @henglinli systemd 流行起来也没多少年,就这么快遭人害怕了...
    station
        33
    station  
    OP
       2018-10-29 20:19:37 +08:00
    @henglinli @likuku @flynaj 要死啦

    我一直卡在这
    centos,标准分区,对比了下其他内核启动是快速闪过的画面,似乎是其他分区没挂在?
    https://s1.ax1x.com/2018/10/29/i28DDf.png
    station
        34
    station  
    OP
       2018-10-29 20:22:28 +08:00
    google 也没有找到相关的,还是我的关键词不对?加了金不国的 QQ,在等回复
    henglinli
        35
    henglinli  
       2018-10-29 20:38:00 +08:00
    @station 你先确定下你使用的 CentOS 版本是否使用了 systemd。一般情况下不需要指定 init。默认 init 是 /sbin/init,我猜测任何发型版本都会有这个文件,叛徒 Android 除外,它是 /init。
    station
        36
    station  
    OP
       2018-10-29 20:45:20 +08:00
    @henglinli centos 7 默认 init 是 systemd 啊,/sbin/init 也试过也是卡在这边。。。。。。。
    henglinli
        37
    henglinli  
       2018-10-29 20:48:31 +08:00
    @likuku 我可能说过了,应该说担心吧。
    henglinli
        38
    henglinli  
       2018-10-29 20:54:24 +08:00
    @station 提供更多信息。包括并不限于 bootloader 配置,cmdline .config。然后 google 一下有 error 的那一句。很少有人碰到别人没有碰到的问题。
    station
        39
    station  
    OP
       2018-10-29 21:36:32 +08:00
    @henglinli 首先感谢你这么不厌其烦的帮助我这个菜鸟,直接把.config 发你吧

    https://pan.baidu.com/s/1-XThPssbBv3jl-GXpojEmw
    station
        40
    station  
    OP
       2018-10-29 21:46:35 +08:00
    那句话,Google 了下没看到希望,,应了你那叫:很少有人碰到别人没有碰到的问题
    henglinli
        41
    henglinli  
       2018-10-30 00:12:30 +08:00 via iPhone
    @station 就差一点了。看图片应该时 init 找不到。你可以 mount 到另外的虚拟机上看看 init 究竟是在什么位置?我当年装 gentoo 时候可是把 gentoo.org 上到安装相关文档都读了的,要有耐心。没有百度账号不能下载百度云盘的文件,最近百度才改的。/sbin/init 也不行的原因可能是这是个符号链接,能确定 /usr 和 /是同一个分区吗?
    wwhc
        42
    wwhc  
       2018-10-30 04:24:28 +08:00
    楼主用其它系统挂载后查看硬盘分区到底是怎么回事:
    lsblk -o +fstype,label,uuid,partuuid
    station
        43
    station  
    OP
       2018-10-30 06:12:55 +08:00
    @henglinli /usr 和 /都是单独的分区
    station
        44
    station  
    OP
       2018-10-30 06:17:48 +08:00
    lrwxrwxrwx. 1 root root 22 10 月 20 08:56 /sbin/init -> ../lib/systemd/systemd

    .. 这是?
    station
        45
    station  
    OP
       2018-10-30 06:20:02 +08:00
    ‘".. " 这是?
    station
        46
    station  
    OP
       2018-10-30 06:36:54 +08:00
    CONFIG_CMDLINE="root=PARTUUID=c0fb10a1-884b-412a-a5ee-198e7ff9d157 rootfstype=xfs rw LANG=zh_CN.UTF-8 init=/usr/lib/systemd/systemd
    station
        47
    station  
    OP
       2018-10-30 06:39:05 +08:00
    内核配置文件 https://send.firefox.com/download/69e20fcbcd/#BQff_c-3IsvbuGoq-CBSZA

    46 楼的回复,之前用过,不行
    likuku
        48
    likuku  
       2018-10-30 17:44:05 +08:00
    @henglinli Gentoo 嘛...想起来当年刚参加工作,上工第二天,对口同事就手把手教我如何快速安装(现成 gentoo 用 tar 打的包,自带内核源码),简单直接粗暴,10 分钟装完,然后启动时让前辈尴尬了...找不到硬盘控制器。好在一起合作 livecd 下重编了内核,把硬盘控制器驱动加进去就 OK 了,还是蛮顺利的。那时还是 2007 年,systemd 似乎还没有。
    likuku
        49
    likuku  
       2018-10-30 17:47:08 +08:00
    @station

    [CONFIG_CMDLINE="root=PARTUUID=c0fb10a1-884b-412a-a5ee-198e7ff9d157 ] 这段试试改成 /dev/sda1 之类风格的吧。

    死马当活马医:/etc/fstab 也编辑下,改为 /dev/sdaNumber /mountPoint 这样类似 风格的吧。
    henglinli
        50
    henglinli  
       2018-10-30 18:01:12 +08:00 via iPhone
    @station 首先挂在其他分区是由 systemd 执行的,所以要确保更分区下有 systemd 能顺利执行的所有文件资源,万一 systemd 需要 /usr 呢?






    (然后我觉得得自己确认下。我估计引导一个..都不明白的有点新手的方式应该再浅显一定,就找到了这个 https://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken/
    。我没有看完,但是看标题我知道你应该把 /usr 和 /合并,即使不能解决你当前这个问题。)


    既然觉得自己不需要 initramfs,它做了什么想必你也知道些。说一下我对分区的认识。很久以前磁盘空间是很小的,以至于一个 /下面需要很多磁盘。分区组织的由管理员规划,/usr 一个盘、/硬盘。万一需要 1 万个呢?管理员这么玩估计有点慌,在他慌之前就应该有 lvm 了,现在是 lvm2,估计没 lvm3 了。因为已经有支持分卷功能的文件系统。比如 btrfs,磁盘空间不够了,你给再他加一个盘就完了。后面的事它会处理。
    这也是我喜欢 btrfs 的原因之一。最后,磁盘空间不够的情况下再考虑分区,做到用户 /home 和系统 /分区就够了。
    henglinli
        51
    henglinli  
       2018-10-30 18:08:56 +08:00 via iPhone
    @likuku 我用了很久,不喜欢他一点是,如果 portage 出问题还得会 python,很无助 google 后“重装”了好几次。当然 gentoo 的重装有点不一样。
    henglinli
        52
    henglinli  
       2018-10-30 18:12:51 +08:00 via iPhone
    #50 补充,有没有 lvm1,其实我也不知道。接触到过这玩艺儿,但是没有实质去了解过。lvm2 万一是 lvmm 的意思我就尴尬了。特此补充。
    likuku
        53
    likuku  
       2018-10-30 18:38:00 +08:00
    @henglinli 独立 / 分区,和其它 /home /usr /var 什么 分开,个人用户其实无所谓,大不了 liveCD 或者拆硬盘去修,
    服务器就比较麻烦,只用一个 / 的话,有可能突发暴增的 log 阿,core dump 什么 直接爆破 / ,
    然后系统就死了,远程修起来就很烦了。

    gentoo 也滚死过好几次,portage 也搞死过,有次是直接从官网的 stage3 里 /其它同版本还在跑的服务器上 提取的,直接在线 复制替代,lib 什么搞的灾难不够猛时,这么救还是很大机会可以救回来。LiveCD 搭配 tar 自己作包,来快速安装,会玩之后,应对几乎所有 Linux 发行版都 OK。

    btrfs 这个真得踩坑好几次,至今还是有些怕。
    station
        54
    station  
    OP
       2018-10-30 22:40:14 +08:00
    @likuku
    @henglinli
    关于没有挂载其他分区,这点之前从启动所提示的信息上我也想过,今天看到你们的回复,我重做系统和分区,将 /和 /usr 还是有其余必要的挂载点分在一个分区了,编译后成功启动了,这次踩坑虽然消耗较多的时间与精力但增加了我的知识积累,还是有所值

    https://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken 这个有空细细读下

    不知道 gentoo 是怎么做的,分区这块
    station
        55
    station  
    OP
       2018-10-30 22:51:21 +08:00
    非常感谢二位 @likuku @henglinli
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1018 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 23:40 PVG 07:40 LAX 16:40 JFK 19:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86