Я пытаюсь ответить на вопрос в ASK относительно создания мультиначальной загрузки USB с нуля, но врезаться в стену с установкой grub2 и папка личинки и раздел начальной загрузки.
Большинство ответов, в которых я могу найти, Просит, чтобы касающаяся личинка установки относилась к личинке прежней версии не grub2.
Я пытался смотреть на исходный код mkusb, но все, что я видел, было туманом.
Ссылка на сценарий оболочки высоко ценилась бы.
В mkusb я использую сценарий оболочки dus-persistent
для создания персистентной живой системы. Это состоит из нескольких функций и конкретно функции grub_n_iso
, чтобы создать разделы и поместить вещи в них. (Имя наследовано от старая система , где файлы ISO использовались.)
, Если Вы уже имеете установленный mkusb, можно считать файл dus-persistent
с less
или с любимым текстовым редактором.
less /usr/sbin/dus-persistent
, Если Вы еще не установили его, можно считать его через следующую ссылку,
phillw.net/isos/linux-tools/mkusb/dus-persistent
, Но я думаю, что Вы хотите более подробную информацию, которая показывает детали, где третий раздел usbboot
создается и заполняется содержанием (grub
).
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 при установке трудно создать личинку для 'другого' режима начальной загрузки, особенно создать личинку для режима BIOS при начальной загрузке в режиме UEFI. Поэтому существует изображение grub.img
, подготовлено как описанный ниже, который может использоваться.
, Когда подходящий, раздел создается с [1 113], и это будет маркировано usbboot
.
label="usbboot"
dosfslabel "$part" "$label"
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
команда grub-install
используется (в Ubuntu и Debian). Это использует опцию --efi-directory
для загрузчика UEFI.
, Если установка 'upefi' (usb-pack-efi) выбрана или необходима, она будет извлечена.
команда grub-install
используется снова. По очевидным причинам это делает не , используют опцию --efi-directory
для загрузчика BIOS.
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 --------------------------------------
я не добавляю более подробные объяснения теперь. Укажите точно, какие потребности быть объясненным, если Вы хотите больше деталей.