制作 grub 启动项以加载恢复菜单
使用 Lubuntu 22.04 LTS
我正在尝试添加一个能够加载菜单的 grub 条目。这个菜单应该有 4 个选项:
- 备份sda
dd if=/dev/nvme0n1 of=/mnt/data/backup/nvme0n1.img bs=4M conv=noerror status=progress
- 恢复 sda
dd if=/mnt/data/backup/nvme0n1.img of=/dev/nvme0n1 bs=4M conv=noerror status=progress
- 返回 grub 根菜单
- 重启
我在这里找到了如何制作一个 bash 脚本来制作一个菜单,该菜单将使用 dd 来备份或恢复我的系统磁盘。这是我做的:
#!/bin/sh
show_menu(){
normal=`echo "\033[m"`
menu=`echo "\033[36m"` #Blue
number=`echo "\033[33m"` #yellow
bgred=`echo "\033[41m"`
fgred=`echo "\033[31m"`
printf "\n${menu}*********************************************${normal}\n"
printf "${menu}**${number} 1)${menu} Backup sda ${normal}\n"
printf "${menu}**${number} 2)${menu} Restore sda ${normal}\n"
printf "${menu}**${number} 3)${menu} Restart computer ${normal}\n"
printf "${menu}**${number} 4)${menu} Back to grub ${normal}\n"
printf "${menu}**${number} 5)${menu} Test${normal}\n"
printf "${menu}*********************************************${normal}\n"
printf "Please enter a menu option and enter or ${fgred}x to exit. ${normal}"
read opt
}
option_picked(){
msgcolor=`echo "\033[01;31m"` # bold red
normal=`echo "\033[00;00m"` # normal white
message=${@:-"${normal}Error: No message passed"}
printf "${msgcolor}${message}${normal}\n"
}
clear
show_menu
while [ $opt != '' ]
do
if [ $opt = '' ]; then
exit;
else
case $opt in
1) clear;
option_picked "Option 1 Picked";
dd if=/dev/nvme0n1 of=/mnt/data/backup/nvme0n1.img bs=4M conv=noerror status=progress;
show_menu;
;;
2) clear;
option_picked "Option 2 Picked";
dd if=/mnt/data/backup/nvme0n1.img of=/dev/nvme0n1 bs=4M conv=noerror status=progress;
show_menu;
;;
3) clear;
option_picked "Option 3 Picked";
"back to root menu";
show_menu;
;;
4) clear;
option_picked "Option 4 Picked";
reboot;
show_menu;
;;
x)exit;
;;
\n)exit;
;;
*)clear;
option_picked "Pick an option from the menu";
show_menu;
;;
esac
fi
done
此 bash 脚本在 Ubuntu 服务器上运行的结果: 它可以解决问题,但这并不容易我可能在磁盘和文件位置上犯了错误,因为我的系统无法再启动了。我很适合重新安装它。
我想在我的默认 grub 中加入这样的菜单项。因此,我想我可以在/etc/grub.d/40.custom中添加一个条目
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry 'Lubuntu Root Terminal' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-5bba636c-5b61-4ef9-857b-c5d4bf51c2cd' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
search --no-floppy --fs-uuid --set=root 5bba636c-5b61-4ef9-857b-c5d4bf51c2cd
linux /boot/vmlinuz-5.15.0-37-generic root=UUID=5bba636c-5b61-4ef9-857b-c5d4bf51c2cd \ ro init=/bin/bash rw $vt_handoff
initrd /boot/initrd.img-5.15.0-37-generic
}
我还没有通过这个菜单项让系统启动到终端。我可能做错了什么。
我正在寻找如何通过此条目在我的 grub 菜单中添加 TTY 选项,但没有找到确切的方法。例如,我想知道如何以 root 身份安装系统并使用制作的 bash 启动 shell。
Ubuntu 服务器最小化在同一磁盘的一个小分区上。 从那里我将尝试设置 bash 以启动。问题是服务器命令和配置似乎不同。我无法让我的 raid-0 分区工作/映射。所以我无权访问我的文件进行测试。
我试图构建一个自定义内核 ,我在构建后安装这些包时出错了。重点是在不包含 X11 模块的恢复分区上构建内核。对我来说,这似乎是一个复杂的过程。我在证书方面遇到了问题,并且在我的系统上安装了软件包时,一切都崩溃了。
TTS0 grub 条目:我还找到了有关可以添加到 grub 的终端 TTS0 会话的信息。但是当我在启动时选择它时,我就像往常一样进入我的系统。
这是我的自定义 grub 条目 TTYS0:
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
set root='hd0,gpt2'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint='hd0,gpt2' adf801ee-4bd7-4e13-aeef-210e10ef58e8
else
search --no-floppy --fs-uuid --set=root adf801ee-4bd7-4e13-aeef-210e10ef58e8
fi
linux /boot/vmlinuz-5.15.0-25-generic root=UUID=adf801ee-4bd7-4e13-aeef-210e10ef58e8 ro quiet splash $vt_handoff vga=787 console=tty0 console=ttyS0,115200n8
initrd /boot/initrd.img-5.15.0-25-generic
我知道我在这里有更多问题:
什么是最好的:
一个。 一个启动我的脚本菜单的终端?
湾。一个单独的系统引导来克隆分区?
如何添加进入 TTY 的 grub 条目以加载 bash 脚本?
或者我如何构建自定义内核(如果它是正确的替代方案)以在没有桌面的情况下启动我在另一个分区上的相同安装并将此条目添加到启动。
我在 Help Ubuntu 上找到的信息建议了一种使用 dd 备份我的系统的方法。我正在寻找一些已经可用、小型且可通过 bash 命令行访问的东西。
我需要有关 make 命令的帮助,以便为我的目标构建获取正确的配置。
或者
我想在添加 grub 条目的方式上获得帮助,该条目使用我当前的系统 TTY 在启动时加载菜单 bash。
有没有办法做到这些?
我找到了一个很好的例子:Clonezilla on HD
我按照说明使用Grub Customizer将其添加到 /etc/grub.d/40_custom 中:
menuentry "Clonezilla" {
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
set root=(hd0,gpt1)
linux /recovery/vmlinuz boot=live union=overlay username=user config components quiet noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" keyboard-layouts= ocs_live_batch=\"no\" locales= vga=788 ip=frommedia nosplash live-media-path=/recovery bootfrom=/dev/nvme0n1 toram=recovery,syslinux,EFI
initrd /recovery/initrd.img
}
这是Linux系统盘分区信息:
nvme0n1 259:0 0 119.2G 0 disk
├─nvme0n1p1 259:1 0 26.1G 0 part
├─nvme0n1p2 259:2 0 87.9G 0 part /
└─nvme0n1p3 259:3 0 5.3G 0 part /boot/efi
- p1 是恢复分区
- p2 是 lubuntu 根分区
- p3 是 efi-boot 分区
当我尝试启动此引导条目时,它会创建一个新条目。当我尝试新的时,我收到一个错误,它找不到所需的引导文件。
这是我的恢复分区的内容:
ls /mnt/recovery
amd64-release.txt EFI live
boot GPL lost+found
clonezilla-live-20220522-jammy-amd64.zip home syslinux
Clonezilla-Live-Version linux-5.18.4.tar.xz utils
我认为它来自不正确的 grub 入口路径。 我不确定这个值必须填写什么......
bootfrom=/dev/nvme0n1
或者
bootfrom=/dev/nvme0n1p1
我在文件夹名称中发现了错误,应该更改为“live-hd”而不是“live”,并编辑了 grub 条目,如下所示:
我获取了 Lubuntu 的 grub 条目的信息,并根据我在 gnome-disk-utility 中看到的内容更改了磁盘 ID,并删除了 commands recordfail - load_video - gfxmode $linux_gfx_mode
。
menuentry "Clonezilla" {
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
set root=(hd0,gpt1)
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint='hd0,gpt1' 22d397bb-9bf4-4486-a84f-e2b193a49e85
else
search --no-floppy --fs-uuid --set=root 22d397bb-9bf4-4486-a84f-e2b193a49e85
fi
linux /live-hd/vmlinuz boot=live union=overlay username=user config components quiet noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" keyboard-layouts= ocs_live_batch=\"no\" locales= vga=788 ip=frommedia nosplash live-media-path=/live-hd bootfrom=/dev/nvme0n1p1 toram=live-hd,syslinux,EFI
initrd /live-hd/initrd.img
}
之后,我选择了 Clonezilla,它在 grub 菜单中创建了一个具有相同名称的新条目:
所以我尝试在新条目上启动,它运行良好,但为什么它首先进入第二个条目?
关键是它启动了,我可以克隆安装 Clonezilla 的磁盘的系统分区作为恢复分区。
最重要的是,我很高兴 Clonezilla 在没有任何额外设置的情况下检测到我的 FakeRaid 及其上的分区。我可以将图像保存在上面而不会带来不便。
包括验证在内大约需要 10 分钟。现在我仍在寻找如何使其成为仅在备份或还原之间进行选择的菜单,并且始终交替使用相同的源和目标。我想这一定是可能的,所以我继续我的研究。
我按照程序在硬盘驱动器上安装 Clonezilla并成功从 grub 菜单启动它。
我必须解压Clonezilla 的这个 zip 下载并将其解压到我的分区中。
我必须识别 UUID 和我的磁盘的分区号,我通过打开 gnome-disk-utility 来简单地做到这一点。
我比较了我的默认 grub 系统条目和 Clonezilla 默认提供的系统条目之间的差异,并根据我的磁盘和分区进行了调整。(详情见问题)
我保存了对 grub 的更改并更新了它
sudo update-grub
并重新启动了我的系统。我已将包含我的系统的分区备份到我的英特尔 RAID 上的一个映像,该映像由我的 Windows 制作的 NTFS DATA 分区自动识别。
我测试了一个来自 Nvidia 的属性驱动程序,它使我的内核崩溃了。这使我有充分的理由测试恢复,并成功完成:
有了这个,我找到了一个正确的答案,可以使用 Clonezilla 在启动时创建恢复菜单条目。现在我可以选择保存或恢复我想要的分区。
我还在这里找到了使用 Clonezilla 创建和使用脚本的步骤以及此处的脚本示例。