8 Commits
2 changed files with 56 additions and 9 deletions
+1
View File
@@ -70,3 +70,4 @@ This script uses:
* **lsblk** and **sfdisk** from [util-linux](https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/)
* [**ms-sys**](http://ms-sys.sourceforge.net/) for native Windows 7 MBR and NTFS bootloaders
* [**p7zip**](https://www.7-zip.org/) for ISO extraction
* [**autofsync**](https://github.com/i-rinat/autofsync/) to prevent filesystem bufferbloat and properly show copying progress (AppImage only)
+55 -9
View File
@@ -1,4 +1,4 @@
#!/bin/bash
#!/usr/bin/env bash
set -e # errexit
set -f # noglob
set +o braceexpand # disable braceexpand
@@ -24,6 +24,20 @@ function check_requirements() {
done
}
function check_iso_and_device() {
if [ ! -f "$1" ]
then
echo "${bold} == ERROR: ISO file not found! ==${normal}"
exit 106
fi
if [ ! -b "$2" ]
then
echo "${bold} == ERROR: Device file not found! ==${normal}"
exit 107
fi
}
function list_removable_drives() {
lsblk -d -I 8 -o RM,NAME,SIZE,MODEL | \
awk '($1 == 1) {print "/dev/" substr($0, index($0, $2))}'
@@ -39,13 +53,17 @@ function format_drive() {
fi
}
function get_iso_name() {
7z l "$1" | awk '/Comment = / {print $3; exit 0}'
}
function check_installwim_gt4gib() {
7z l "$1" | awk '($6 ~ /install.wim/) {if ($4 > 4294967296) {exit 0}; exit 1}'
}
function create_partitions() {
local mbrscript="- - 7 *"
local gptscript="- - U *"
local gptscript="- - EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 *"
local gptntfsscript="- 1MiB U *\n- - EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 *"
if [[ "$1" == "dos" ]] || [[ "$1" == "gpt" ]] || [[ "$1" == "gptntfs" ]];
@@ -89,7 +107,11 @@ function get_dev_partition_num() {
}
function write_uefintfs() {
cat "$dirpath/uefi-ntfs.img" > "$1"
if [ -a "$dirpath/uefi-ntfs.img" ]; then
cat "$dirpath/uefi-ntfs.img" > "$1"
elif [ -a "/usr/share/windows2usb/uefi-ntfs.img" ]; then
cat "/usr/share/windows2usb/uefi-ntfs.img" > "$1"
fi
}
function extract_iso() {
@@ -140,13 +162,28 @@ if [[ "$EUID" == "0" ]];
then
dev="$1"
isopath="$2"
isolabel=""
labeltype="$3"
uefimode=
[[ "$labeltype" == "gpt" ]] && uefimode=1
[[ "$labeltype" == "gptntfs" ]] && uefimode=1
partpath="$(mktemp -d /run/windows2usb.XXXXXXXXXX)"
mountntfs_cmd="mount.ntfs-3g"
if ! command -v "$mountntfs_cmd" > /dev/null;
then
mountntfs_cmd="mount"
fi
check_requirements
check_iso_and_device "$isopath" "$dev"
isolabel="$(get_iso_name "$isopath")"
if [ $? -ne 0 ]
then
isolabel=""
fi
echo "${bold} == Working with ISO $isolabel ==${normal}"
partpath="$(mktemp -d /run/windows2usb.XXXXXXXXXX)"
trap sigint_handler INT EXIT
# MBR
@@ -155,16 +192,19 @@ then
echo "${bold} == Creating new MBR-formatted partition table ==${normal}"
format_drive "dos" "$dev"
echo "${bold} == Waiting 3 seconds to settle new partition layout ==${normal}"
sleep 3
echo "${bold} == Creating NTFS partition ==${normal}"
create_partitions "dos" "$dev"
mkfs.ntfs -f "$(get_dev_partition_num "${dev}" "1")"
mkfs.ntfs -L "$isolabel" -f "$(get_dev_partition_num "${dev}" "1")"
echo "${bold} == Writing bootloader ==${normal}"
ms-sys -7 "${dev}"
ms-sys -n "$(get_dev_partition_num "${dev}" "1")"
echo "${bold} == Mounting data partition ==${normal}"
mount "$(get_dev_partition_num "${dev}" "1")" "$partpath"
"$mountntfs_cmd" "$(get_dev_partition_num "${dev}" "1")" "$partpath"
# GPT
elif [[ "$labeltype" == "gpt" ]];
@@ -180,9 +220,12 @@ then
echo "${bold} == Creating new GPT-formatted partition table ==${normal}"
format_drive "gpt" "$dev"
echo "${bold} == Waiting 3 seconds to settle new partition layout ==${normal}"
sleep 3
echo "${bold} == Creating UEFI FAT partition ==${normal}"
create_partitions "gpt" "$dev"
mkfs.vfat "$(get_dev_partition_num "${dev}" "1")"
mkfs.vfat -n "${isolabel:0:11}" "$(get_dev_partition_num "${dev}" "1")"
echo "${bold} == Mounting data partition ==${normal}"
mount "$(get_dev_partition_num "${dev}" "1")" "$partpath"
@@ -193,13 +236,16 @@ then
echo "${bold} == Creating new GPT-formatted partition table ==${normal}"
format_drive "gpt" "$dev"
echo "${bold} == Waiting 3 seconds to settle new partition layout ==${normal}"
sleep 3
echo "${bold} == Creating UEFI FAT and Microsoft NTFS partitions ==${normal}"
create_partitions "gptntfs" "$dev"
write_uefintfs "$(get_dev_partition_num "${dev}" "1")"
mkfs.ntfs -f "$(get_dev_partition_num "${dev}" "2")"
mkfs.ntfs -L "$isolabel" -f "$(get_dev_partition_num "${dev}" "2")"
echo "${bold} == Mounting data partition ==${normal}"
mount "$(get_dev_partition_num "${dev}" "2")" "$partpath"
"$mountntfs_cmd" "$(get_dev_partition_num "${dev}" "2")" "$partpath"
fi
echo "${bold} == Extracting files from ISO to the partition ==${normal}"