使 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
我知道我这里还有更多问题:
最好的是:
A。 进入终端启动我的脚本菜单?
b. 单独的系统启动来克隆分区?
如何添加进入 TTY 来加载 bash 脚本的 grub 条目?
或者我如何构建自定义内核(如果这是一个正确的选择)在没有桌面的情况下启动我在另一个分区上安装的相同程序并将此条目添加到启动中。
我在 Help Ubuntu 上找到的信息建议了一种方式使用 dd 备份我的系统。我正在寻找一些已经可用、小型且可通过 bash 命令行访问的东西。
我希望获得 make 命令的帮助,以便获得适合我的目的构建的正确配置。
或者
我希望获得帮助,以添加一个 grub 条目,使用我当前的系统 TTY 在启动时加载菜单 bash。
有没有什么办法可以做到这些?
我找到了一个很好的例子:高清 Clonezilla
我将其添加到 /etc/grub.d/40_customGrub 定制器按照说明进行操作:
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,然后删除了命令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 分钟。现在我仍在寻找如何制作一个菜单,让用户在备份或仅恢复之间进行选择,并且始终使用相同的源和目标。我认为这一定是可能的,所以我继续研究。
答案1
我按照程序在硬盘上安装 Clonezilla并成功从 grub 菜单启动它。
我必须提取下载此 zip 文件Clonezilla 并将其提取到我的分区中。
我必须识别磁盘的 UUID 和分区号,我只需打开 gnome-disk-utility 即可。
我比较了我的默认 grub 系统条目和 Clonezilla 默认提供的条目之间的差异,并根据我识别的磁盘和分区对其进行了调整。(详情请参阅问题)
我保存了对 grub 的更改并对其进行了更新
sudo update-grub
,然后重新启动了系统。我已将包含我的系统的分区备份到我的 Intel RAID 上的映像中,该映像可以通过我的 Windows 制作的 NTFS 数据分区自动识别。
我测试了 Nvidia 的一个属性驱动程序,它导致我的内核崩溃。这给了我一个测试恢复的好理由,而且已经成功完成了:
通过这个,我找到了使用 Clonezilla 在启动时创建恢复菜单项的正确答案。现在我可以选择保存或恢复我想要的分区。