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

不使用 initramfs,如何启动 Linux

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

    我之前问题帖子有人说到来了无 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   ·   实用小工具   ·   1472 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:16 · PVG 01:16 · LAX 09:16 · JFK 12:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.