如何使用 bash 脚本重新启动 USB 驱动器

如何使用 bash 脚本重新启动 USB 驱动器

在运行 bash 脚本时,我想以编程方式从 USB 启动。BIOS 设置为从 HD 启动。这可能吗?有什么提示吗?

我为什么要这样做???我正在全国各地远程安装的一百多台机器上更新到 Ubuntu 20.04。我必须导出数据库,然后在更新后导入。整个过程需要几个小时才能完成。我希望整个过程自动进行,这样升级人员就不必照看了。


感谢您的慷慨回复。我可以提供更多详细信息:BIOS 设置为从我的硬盘启动。然后 Grub2 启动正常操作系统。

如果我插入 USB 拇指驱动器,我可以通过按 F11 键并选择 USB 拇指驱动器来从中启动 Ubuntu。因此,我在想,如果我执行 sudo update-grub,它应该会在拇指驱动器上找到操作系统并将其放入 grub 列表中。

以下是 grub.cfg 中的菜单项

dfr@m9kmission:~$ grep -i "menuentry '" /boot/grub/grub.cfg 
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-59e8ab4e-1d3d-4a1b-b97b-ec10766929e6' {
    menuentry 'Ubuntu, with Linux 4.15.0-112-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-112-generic-advanced-59e8ab4e-1d3d-4a1b-b97b-ec10766929e6' {
    menuentry 'Ubuntu, with Linux 4.15.0-112-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-112-generic-recovery-59e8ab4e-1d3d-4a1b-b97b-ec10766929e6' {
    menuentry 'Ubuntu, with Linux 4.15.0-106-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-106-generic-advanced-59e8ab4e-1d3d-4a1b-b97b-ec10766929e6' {
    menuentry 'Ubuntu, with Linux 4.15.0-106-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-106-generic-recovery-59e8ab4e-1d3d-4a1b-b97b-ec10766929e6' {

在我运行 sudo update-grub 后,菜单项相同,但 U 盘上的操作系统未添加。可能是操作系统探测器认为它不应该为可移动驱动器添加条目?我认为,如果我可以让 update-grub 为 U 盘上的操作系统添加菜单项,我就可以运行 sudo grub-reboot,然后当我重新启动计算机时,它将从 U 盘启动。下次重新启动将返回到正常操作系统。

问题:

  1. 我的想法正确吗?
  2. 我怎样才能让 update-grub 为我的拇指驱动器上的操作系统创建一个条目?
  3. 如果我不能,我应该将自己的条目插入到 /boot/grub/grub.cfg 中吗?

常规操作系统菜单项如下。也许我可以仿照它来设计我的新菜单项:(不过它看起来相当吓人。)

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-59e8ab4e-1d3d-4a1b-b97b-ec10766929e6' {
recordfail
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_msdos
insmod ext2
set root='hd1,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1  59e8ab4e-1d3d-4a1b-b97b-ec10766929e6
else
  search --no-floppy --fs-uuid --set=root 59e8ab4e-1d3d-4a1b-b97b-ec10766929e6
fi
    linux   /boot/vmlinuz-4.15.0-112-generic root=UUID=59e8ab4e-1d3d-4a1b-b97b-ec10766929e6 ro  
initrd  /boot/initrd.img-4.15.0-112-generic

}

The normal os is on sdb1.  The thumb drive is sdc1.
    dfr@m9kmission:~$ blkid
    /dev/sda1: UUID="d210d958-9eea-4786-9d9f-8311f852b9df" TYPE="ext4" PARTUUID="98f91627-01"
    /dev/sdb1: UUID="59e8ab4e-1d3d-4a1b-b97b-ec10766929e6" TYPE="ext4" PARTUUID="4c6a03f4-01"
    /dev/sdb2: UUID="32251f52-55d0-4c14-8746-bbf48a3984c0" TYPE="ext4" PARTUUID="4c6a03f4-02"
    /dev/sdc1: LABEL="UBUNTU 18_0" UUID="7EF3-2CBA" TYPE="vfat" PARTUUID="0ba7b71d-01"

这是拇指驱动器上的目录树。

dfr@m9kmission:~$ tree -d /media/dfr/UBUNTU\ 18_0/
/media/dfr/UBUNTU 18_0/
├── boot
│   └── grub
│       └── x86_64-efi
├── casper
├── dists
│   └── bionic
│       ├── main
│       │   ├── binary-amd64
│       │   ├── binary-i386
│       │   └── source
│       └── restricted
│           ├── binary-amd64
│           ├── binary-i386
│           └── source
├── EFI
│   └── BOOT
├── install
├── isolinux
├── pics
├── pool
│   ├── main
│   │   ├── b
│   │   │   ├── b43-fwcutter
│   │   │   └── build-essential
│   │   ├── d
│   │   │   ├── dkms
│   │   │   └── dpkg
│   │   ├── f
│   │   │   └── fakeroot
│   │   ├── g
│   │   │   ├── gcc-7
│   │   │   ├── gcc-8
│   │   │   ├── gcc-defaults
│   │   │   ├── glibc
│   │   │   ├── grub2
│   │   │   └── grub2-signed
│   │   ├── l
│   │   │   ├── linux
│   │   │   └── lupin
│   │   ├── liba
│   │   │   ├── libalgorithm-diff-perl
│   │   │   ├── libalgorithm-diff-xs-perl
│   │   │   └── libalgorithm-merge-perl
│   │   ├── m
│   │   │   ├── make-dfsg
│   │   │   ├── manpages
│   │   │   └── mouseemu
│   │   ├── s
│   │   │   ├── setserial
│   │   │   ├── shim
│   │   │   └── shim-signed
│   │   └── u
│   │       ├── ubiquity
│   │       ├── ubiquity-slideshow-ubuntu
│   │       └── user-setup
│   └── restricted
│       └── b
│           └── bcmwl
├── preseed
└── System Volume Information

Linux 文件似乎位于 Casper 文件夹中:

dfr@m9kmission:~$ ll /media/dfr/UBUNTU\ 18_0/casper/
total 2121880
drwxr-xr-x  2 dfr dfr       8192 Jul 24 07:14 ./
drwxr-xr-x 13 dfr dfr       8192 Dec 31  1969 ../
-rw-r--r--  1 dfr dfr      56234 Jul 24 07:14 filesystem.manifest
-rw-r--r--  1 dfr dfr        767 Jul 24 07:14 filesystem.manifest-minimal-remove
-rw-r--r--  1 dfr dfr       3309 Jul 24 07:14 filesystem.manifest-remove
-rw-r--r--  1 dfr dfr         10 Jul 24 07:14 filesystem.size
-rw-r--r--  1 dfr dfr 2094698496 Jul 24 07:15 filesystem.squashfs
-rw-r--r--  1 dfr dfr   68622117 Jul 24 07:23 initrd
-rw-r--r--  1 dfr dfr    9371904 Jul 24 07:24 vmlinuz

也许我可以像这样编辑新的菜单项:

menuentry 'Ubuntu-rescue' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-7EF3-2CBA' {
    recordfail
    load_video
    gfxmode $linux_gfx_mode
    insmod gzio
    if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
    insmod part_msdos
    insmod squashfs
    set root='hd3,msdos1'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd3,msdos1 --hint-efi=hd3,msdos1 --hint-baremetal=ahci1,msdos1  7EF3-2CBA
    else
      search --no-floppy --fs-uuid --set=root 7EF3-2CBA
    fi
        linux   /casper/vmlinuz root=UUID=7EF3-2CBA ro  
    initrd  /casper/initrd
}

经过上述编辑,Ubuntu-rescue 将在 grub 菜单中提供。当我启动它时,我收到一条消息,内容为:

error: file `boot/grub/i386-pc/squashfs.mod' not found

我注意到拇指驱动器上有一个文件:

./boot/grub/x86_64-efi/squash4.mod

如果我可以让 grub 在那里寻找文件,它可能就接近了。

有任何想法吗???

谢谢!

答案1

成功了!如果我把这个作为第一个菜单项放入 /boot/grub/grub.cfg 中,计算机就会从拇指驱动器启动:(当然,您必须用拇指驱动器的真实 UUID 替换 DRIVE_UUID。)

menuentry "Boot from LIVE USB Drive" {
   search --set=root --fs-uuid DRIVE_UUID
   linux ($root)/casper/vmlinuz boot=casper quiet splash --
   initrd ($root)/casper/initrd.lz
}

在我的例子中,DRIVE_UUID 是 7EF3-2CBA

dfr@ubuntu:~$ blkid /dev/sda1: UUID="d210d958-9eea-4786-9d9f-8311f852b9df" TYPE="ext4" PARTUUID="98f91627-01" /dev/sdb1: UUID="59e8ab4e-1d3d-4a1b-b97b-ec10766929e6" TYPE="ext4" PARTUUID="4c6a03f4-01" /dev/sdb2: UUID="32251f52-55d0-4c14-8746-bbf48a3984c0" TYPE="ext4" PARTUUID="4c6a03f4-02" /dev/sdc1: LABEL="usi-utility" UUID="E2F2EA5AF2EA3309" TYPE="ntfs" PARTLABEL="我的护照" PARTUUID="a01d9bcb-63db-4837-a4b0-5bdde565421e" /dev/sdd1:LABEL="UBUNTU 18_0"UUID="7EF3-2CBA“类型=”vfat“PARTUUID=”0ba7b71d-01“

答案来自这篇文章: 如何添加 GRUB2 菜单项以启动 USB 驱动器上安装的 Ubuntu?

使用拇指驱动器启动后,我将 grub.cfg 恢复到原来的状态,以便计算机能够以正常操作系统重新启动。

相关内容