AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1225791
Accepted
nazar2sfive
nazar2sfive
Asked: 2020-04-10 20:51:29 +0800 CST2020-04-10 20:51:29 +0800 CST 2020-04-10 20:51:29 +0800 CST

如何在 ubuntu 20.04 中用引导加载程序“systemd-boot”替换 grub?

  • 772
ubuntu@ubuntu:~$ lsblk -po NAME,SIZE,TYPE,FSTYPE,PARTLABEL
NAME          SIZE TYPE FSTYPE   PARTLABEL
/dev/loop0    1.9G loop squashfs 
/dev/loop1   27.1M loop squashfs 
/dev/loop2     55M loop squashfs 
/dev/loop3  240.8M loop squashfs 
/dev/loop4   62.1M loop squashfs 
/dev/loop5   49.8M loop squashfs 
/dev/sda    465.8G disk          
├─/dev/sda1   292M part vfat     CLR_BOOT
├─/dev/sda2   512M part swap     CLR_SWAP
├─/dev/sda3 108.6G part ext4     CLR_ROOT
├─/dev/sda4    16M part          Microsoft reserved partition
├─/dev/sda5    79G part ntfs     Basic data partition
└─/dev/sda6 277.4G part ntfs     Basic data partition
/dev/sdb     30.2G disk iso9660  
├─/dev/sdb1   2.5G part iso9660  
├─/dev/sdb2   3.9M part vfat     
└─/dev/sdb3  27.7G part ext4     
/dev/sr0     1024M rom           
ubuntu@ubuntu:~$ 
uefi
  • 1 1 个回答
  • 9827 Views

1 个回答

  • Voted
  1. Best Answer
    nazar2sfive
    2020-04-26T19:42:39+08:002020-04-26T19:42:39+08:00

    在关注https://blobfolio.com/2018/06/replace-grub2-with-systemd-boot-on-ubuntu-18-04/之后

    # Everything in this tutorial should be done as root:
    sudo -i
    
    # Now hop on into the EFI partition root.
    cd /boot/efi
    
    # Configuration files will go here:
    mkdir -p loader/entries
    
    # And kernels will go here:
    mkdir ubuntu
    

    将以下内容放入/boot/efi/loader/loader.conf(将超时值更改为您喜欢的值)

    default ubuntu
    timeout 1
    editor 0
    

    放入以下内容以/etc/kernel/postinst.d/zz-update-systemd-boot 确保更改 CHANGEME。

    #!/bin/bash
    #
    # This is a simple kernel hook to populate the systemd-boot entries
    # whenever kernels are added or removed.
    #
           
    # The UUID of your disk.
    UUID="CHANGEME"
    
    # The LUKS volume slug you want to use, which will result in the
    # partition being mounted to /dev/mapper/CHANGEME.
    VOLUME="CHANGEME"
    
    # Any rootflags you wish to set.
    ROOTFLAGS="CHANGEME"    
    
    # Our kernels.
    KERNELS=()
    FIND="find /boot -maxdepth 1 -name 'vmlinuz-*' -type f -print0 | sort -rz"
    while IFS= read -r -u3 -d $'\0' LINE; do
        KERNEL=$(basename "${LINE}")
        KERNELS+=("${KERNEL:8}")
    done 3< <(eval "${FIND}")
    
    # There has to be at least one kernel.
    if [ ${#KERNELS[@]} -lt 1 ]; then
        echo -e "\e[2msystemd-boot\e[0m \e[1;31mNo kernels found.\e[0m"
        exit 1
    fi
           
    # Perform a nuclear clean to ensure everything is always in perfect
    # sync.
    rm /boot/efi/loader/entries/*.conf
    rm -rf /boot/efi/ubuntu
    mkdir /boot/efi/ubuntu
          
    # Copy the latest kernel files to a consistent place so we can keep
    # using the same loader configuration.
    LATEST="${KERNELS[@]:0:1}"
    echo -e "\e[2msystemd-boot\e[0m \e[1;32m${LATEST}\e[0m"
    for FILE in config initrd.img System.map vmlinuz; do
        cp "/boot/${FILE}-${LATEST}" "/boot/efi/ubuntu/${FILE}"
        cat << EOF > /boot/efi/loader/entries/ubuntu.conf
    title   Ubuntu GNOME
    linux   /ubuntu/vmlinuz
    initrd  /ubuntu/initrd.img
    options cryptdevice=UUID=${UUID}:${VOLUME} root=/dev/mapper/${VOLUME} ro rootflags=${ROOTFLAGS}
    EOF
    done
        
    # Copy any legacy kernels over too, but maintain their version-based
    # names to avoid collisions.
    if [ ${#KERNELS[@]} -gt 1 ]; then
        LEGACY=("${KERNELS[@]:1}")
        for VERSION in "${LEGACY[@]}"; do
            echo -e "\e[2msystemd-boot\e[0m \e[1;32m${VERSION}\e[0m"
            for FILE in config initrd.img System.map vmlinuz; do
                cp "/boot/${FILE}-${VERSION}" "/boot/efi/ubuntu/${FILE}-${VERSION}"
                cat << EOF > /boot/efi/loader/entries/ubuntu-${VERSION}.conf
    title   Ubuntu GNOME ${VERSION}
    linux   /ubuntu/vmlinuz-${VERSION}
    initrd  /ubuntu/initrd.img-${VERSION}
    options cryptdevice=UUID=${UUID}:${VOLUME} root=/dev/mapper/${VOLUME} ro rootflags=${ROOTFLAGS}
    EOF
            done
        done
    fi
    
    # Success!
    exit 0
    

    如果您的设置很简单,您可以不使用任何 ROOTFLAGS 和 VOLUME,并且脚本中的相应行可能如下所示:options root=UUID=${UUID} ro

    注意权限:

    chown root: /etc/kernel/postinst.d/zz-update-systemd-boot
    chmod 0755 /etc/kernel/postinst.d/zz-update-systemd-bootcd 
    /etc/kernel/postrm.d/ && ln -s ../postinst.d/zz-update-systemd-boot zz-update-systemd-boot
    [ -d "/etc/initramfs/post-update.d" ] || mkdir -p /etc/initramfs/post-update.d
    cd /etc/initramfs/post-update.d/ && ln -s ../../kernel/postinst.d/zz-update-systemd-boot zz-update-systemd-boot
    

    然后您/boot/efi/loader/entries/ubuntu.conf应该看起来像这样(显然,您需要更改 UUID):

    title   Ubuntu GNOME
    linux   /ubuntu/vmlinuz
    initrd  /ubuntu/initrd.img
    options root=UUID=81c4bc1c-1a7e-4822-acae-220bbe572240 ro
    

    查看 UUID

    ubuntu@ubuntu:~$ lsblk -f
    名称 FSTYPE 标签 UUID FSAVAIL FSUSE% MOUNTPOINT
    循环0 squashfs 0 100% /rofs
    循环1 squashfs 0 100% /snap/snapd/7264
    loop2 squashfs 0 100% /snap/core18/1705
    loop3 squashfs 0 100% /snap/gnome-3-34-1804/24
    loop4 squashfs 0 100% /snap/gtk-common-themes/1
    loop5 squashfs 0 100% /snap/snap-store/433
    sda                                                                                        
    ├─sda1 vfat 1A74-A270 113.2M 61% /media/ubuntu/1A74-A270
    ├─sda2交换10842320-1286-413f-bf08-3e0ca76bcf2f [交换]
    ├─sda3 ext4 81c4bc1c-1a7e-4822-acae-220bbe572240 87.6G 13% /media/ubuntu/81c4bc1c-1a
    ├─sda4                                                                                     
    ├─sda5 ntfs 80D47B63D47B59FC                                    
    └─sda6 ntfs router_data 4416017316016770                                    
    sdb iso9660 Ubuntu 20.04 LTS amd64 2020-04-23-07-51-42-00                              
    ├─sdb1 iso9660 Ubuntu 20.04 LTS amd64 2020-04-23-07-51-42-00 0 100% /cdrom
    ├─sdb2 vfat 1AC3-20ED                                           
    └─sdb3 ext4 可写 b8474e17-164a-4fb3-94ff-d4e68f2e1548 25.7G 0% /var/crash
    sr0

    查找您当前的内核并重新安装它以触发您刚刚创建的挂钩:sudo apt install --reinstall linux-image-5.13.0-22-generic.

    实际安装 systemd-boot 对于大多数人来说,安装由一个命令组成:

    同样,这应该转到 EFI 分区:

    bootctl install --path=/boot/efi
    

    要验证系统上安装的引导加载程序及其顺序,请运行:

    efibootmgr
    
    reboot
    

    一旦一切正常,您就可以删除系统中 grub 的存在

    # Purge the packages.
    apt-get purge grub*
    
    # Purge any obsolete dependencies.
    apt-get autoremove --purge
    
    • 1

相关问题

  • 是否有替代 rEFIt 的方法?

  • 如何让我的 Mac Mini 无头启动?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve