在 mkusb 中创建 usbboot 分区和安装 grub 用什么脚本

在 mkusb 中创建 usbboot 分区和安装 grub 用什么脚本

在 mkusb 中创建分区 3(usbboot)和安装 grub 用什么脚本。

我正在尝试回答 ASK 中有关从头开始构建多启动 USB 的问题,但是在安装 grub2 和启动分区及 grub 文件夹时遇到了障碍。

我在 Ask 中找到的有关安装 grub 的大多数答案都是指旧版 grub 而不是 grub2。

我尝试查看 mkusb 的源代码,但我看到的只是一片模糊。

如果能提供 shellscript 的链接我将非常感激。

答案1

简短回答

在 mkusb 中,我使用 shellscriptdus-persistent创建持久实时系统。它由几个函数组成,特别是grub_n_iso创建分区并将内容放入其中的函数。(该名称继承自旧系统,其中使用了 iso 文件。)

较长的答案

如果你已经已安装 mkusbdus-persistent,您可以使用less或使用您最喜欢的文本编辑器阅读该文件。

less /usr/sbin/dus-persistent

如果你还没有安装,你可以通过以下链接阅读,

phillw.net/isos/linux-tools/mkusb/dus-persistent

详细解答

但我认为您想要更详细的信息,显示详细信息,其中usbboot创建了第三个分区并填充了内容(grub)。

1.从功能上grub_n_iso

echo "item 30"
echo "30
# make partitions: preparing $part" >> "$tailfile"

if $grubimg
then
 /bin/echo -e "$inversvid using grub.img: keeping file system of $part: $resetvid "
else
 echo "preparing $part  ------------------------------------------------"
 dd if=/dev/zero of="$part" bs=1024 count=1024 2>&1
 sync
 umount  "$part" 2>&1
 sync
 sleep 1
 mkfs.vfat -v -F 32 "$part"
 echo " "
 sync
 sleep 0.5
fi

在安装多个版本的 Ubuntu 时,很难为“其他”启动模式创建 grub,尤其是在 UEFI 模式下启动时为 BIOS 模式创建 grub。为此,可以grub.img使用一个如下所述准备的映像。

当合适时,将使用 来创建分区mkfs.vfat,并将其标记为usbboot

label="usbboot"
dosfslabel "$part" "$label"

2.从功能上grub_n_iso

echo "item 70"
echo "70
# installing bootloaders" >> "$tailfile"

if [ "$distr" == "opensuse" ]
then
 grub_inst=grub2-install
else
 grub_inst=grub-install
fi

if $grubimg
then
 /bin/echo -ne "$inversvid UEFI Bootloader: $resetvid "
 $grub_inst --force --removable --no-floppy --boot-directory="$targ1"/boot \
 --efi-directory="$targ1"/EFI/BOOT "$2" 2>&1
fi

if $biosbl
then
 /bin/echo -ne "$inversvid UEFI Bootloader: $resetvid "
 $grub_inst --force --removable --no-floppy --boot-directory="$targ1"/boot \
 --efi-directory="$targ1"/EFI/BOOT "$2" 2>&1
elif ! test -f "$looper"/boot/grub/grub.cfg
then
 if test -f "$mkusb_sdir"/usb-pack_efi.tar.gz
 then
  if ! $upefi
  then
   echo "$inversvid Select 'upefi' to use 'usb-pack-efi' $resetvid"
  fi
 else
  /bin/echo -e "$inversvid No 'grub.cfg' for the UEFI Bootloader found in the iso file $resetvid
${version% *} needs the package 'usb-pack-efi' with the file
'usb-pack_efi.tar.gz' to make a persistent live system with
this iso file boot in UEFI mode."
  if test -f /usr/bin/apt-get
  then
   echo "You can use the following command lines in a terminal window.

sudo add-apt-repository ppa:mkusb/ppa
sudo apt-get update
sudo apt-get install usb-pack-efi"
  else
   echo "
Use search string 'ubuntu dus-plus' for the tarball 'dus-plus' which contains
'usb-pack-efi'. Be prepared to tweak the system manually afterwards. It may be
difficult to create a persistent live system in your linux distro."
   echo "$separator"
  fi
 fi
 if $grubimg
 then
  /bin/echo -e "$inversvid BIOS Bootloader via 'grub.img': $resetvid "
 else
  /bin/echo -ne "$inversvid BIOS Bootloader: $resetvid "
  $grub_inst --force --removable --no-floppy --boot-directory="$targ1"/boot "$2" 2>&1
 fi
fi
  • 该命令已使用(在 Ubuntu 和 Debian 中)。它使用UEFI 引导加载程序的grub-install选项。--efi-directory

  • 如果选择了或需要设置“upefi”(usb-pack-efi),它将被提取。

  • 该命令grub-install再次被使用。出于显而易见的原因,它确实不是--efi-directory使用BIOS 引导加载程序的选项。

3.从功能上grub_n_iso

echo "item 80"
echo "80
# copying files ..." >> "$tailfile"

error=""

# start copy/extract boot files (not upefi) ----------------------------

if ! $upefi && test -f "$looper"/boot/grub/grub.cfg
then

# copy the boot files from the iso file

/bin/echo -e "$inversvid 64-bit bootloader: copy the boot files from the iso file $resetvid"
echo "looper=$looper"
echo "targ1=$targ1"

rsync -Ha --exclude=filesystem.squashfs "$looper/" "$targ1"
symlink_error_comment="rsync:$inversvid  don't worry, $resetvid symlink errors are *expected*
because of the target file system."
/bin/echo -e "$symlink_error_comment"
#if [ "$disk_name_type" == "debian" ] && [ "$release" == "stretch" ]
#then
# mount -o loop "$looper"/boot/grub/efi.img "$loopefi"
# rsync -Ha "$loopefi/efi" "$targ1"
# umount  "$loopefi"
# ls -l "$targ1"|grep ^d    ###
# find "$targ1/efi"         ###
# read -p "after rsync efi" ###
#fi

is_file "$targ1"/boot/grub/grub.cfg
if [ $? -ne 0 ]
then
 echo "'$targ1/boot/grub/grub.cfg': file not found"
 echo "This way to use ${version% *} needs 'grub.cfg' from the source iso file,"
 echo "and it is available in Debian and Ubuntu family *amd64* iso files"
 clear_grn "$pid" "$looper" "$targ1" "$tailfile" "$usbdata"
 exit
fi

# tweak 1 grub.cfg

sed "$targ1"/boot/grub/grub.cfg \
-e '/menuentry/a \ set root=(hd0,4)' \
-e '/linux/s#/#($root)/#' \
-e '/initrd/s#/#($root)/#' \
> "$targ1"/boot/grub/grub.cfg0
sync
menu_entry_1 "$targ1"/boot/grub/grub.cfg0 "$targ1"/boot/grub/grub.cfg
if [ $? -ne 0 ]
then
 error="$error - menu_entry_1: tweaking grub.cfg"
fi
rm "$targ1"/boot/grub/grub.cfg0

else  # ... copy/extract boot files (upefi) ----------------------------

# extract files originally from Andre's zip-file (except grub.cfg grub4dos/ ini/)

if $grubimg
then
 /bin/echo -e "$inversvid Bootloaders via 'grub.img', skipping 'usb-pack_efi': $resetvid "
 rm "$targ1"/boot/grub/grub.cfg
else
 if test -f "$mkusb_sdir"/usb-pack_efi.tar.gz
 then
  echo "using usb-pack_efi.tar.gz"
  tar -xvzf "$mkusb_sdir"/usb-pack_efi.tar.gz --directory "$targ1"
  if [ $? -ne 0 ]
  then
   error="- tar: extracting usb-pack_efi"
  fi
 fi
fi

# tweak 2 grub.cfg

if ! test -f "$targ1"/boot/grub/grub.cfg
then
 < "$mkusb_sdir"/grub.cfg sed '2'q > "$targ1"/boot/grub/grub.cfg  # copy two first lines
 if [ $? -ne 0 ]
 then
  error="$error - sed: copying start of grub.cfg"
 fi
fi
sync
sleep 0.5
cat "$targ1"/boot/grub/grub.cfg

# append the rest of the file (after two first lines)

menu_name

< "$mkusb_sdir"/grub.cfg sed -e '1,2'd \
-e '/menuentry "ubuntu/a \ set root=(hd0,4)' \
-e '/menuentry "memtest/a \  set root=(hd0,3)' \
-e '/loopback/d' -e 's#iso-scan/filename=/ubuntu.iso ##' \
-e 's/loop/$root/' \
-e "s%ubuntu.iso%$menuname%g" \
-e "s/vmlinuz/$vmlinuz/" \
-e "s/casper/$persist/g" \
-e "s/initrd.lz/$initrd/" \
-e '/menuentry/s/"./\U&/' \
>> "$targ1"/boot/grub/grub.cfg

#read -p "at 'append the rest of the file (after two first lines)'
#disk_name_type=$disk_name_type"

if [ "$disk_name_type" == "debian" ] \
|| [ "$disk_name_type" == "torios-debian" ] \
|| [ "$disk_name_type" == "9w-debian-wheezy" ]
then
 sed -i 's/persistent --/persistence --/' "$targ1"/boot/grub/grub.cfg
fi

if [ $? -ne 0 ]
then
 error="$error - sed: appending grub.cfg"
fi

fi  # end copy/extract boot files --------------------------------------

我现在不添加更详细的解释。如果您需要更多详细信息,请具体说明需要解释的内容。

相关内容