Last active
June 14, 2021 00:44
-
-
Save nanpuyue/d0e7313b7696a971e9ce2d4466d7993f to your computer and use it in GitHub Desktop.
Generate the initrd for Debian/Deepin/Ubuntu Live that supported boot from iso on an exfat partition, then you can generate the new iso by “ISO Master”. Tested for Deepin 15.3, Debian 8.5 & Ubuntu 16.04.1.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# (c) 2016 nanpuyue <[email protected]> | |
# usage:sudo ./live_initrd_on_exfat.sh deepin-15.3-amd64.iso | |
NAMESERVER="1.2.4.8" | |
EXFAT_BIN="sbin/mount.exfat" | |
FILE_LIST="sbin/mount.exfat sbin/mount.exfat-fuse lib/x86_64-linux-gnu/libfuse.so.*" | |
ISO=$(readlink -f "$1") | |
OUTPUT_DIR=$(pwd) | |
TMP_DIR=$(mktemp -d) && echo $TMP_DIR | |
mount_fs(){ | |
echo "mount filesystem" | |
cd "$TMP_DIR" | |
mkdir iso initrd squashfs | |
if [ -f "$ISO" ];then | |
mount -o loop "$ISO" iso | |
for LIVE in live casper;do | |
if [ -f iso/$LIVE/filesystem.squashfs ];then | |
mount -t squashfs -o loop iso/$LIVE/filesystem.squashfs squashfs | |
break 1 | |
fi | |
done | |
else | |
echo "no such file:$ISO" && exit 1 | |
fi | |
} | |
extract_initrd(){ | |
echo "extract initrd" | |
cd "$TMP_DIR/initrd" | |
for EXT in img gz lz;do | |
if [ -f ../iso/$LIVE/initrd.$EXT ];then | |
COMPRESS=$(file -b --mime-type ../iso/$LIVE/initrd.$EXT | grep -Eo "(gzip|lzma)$") && echo compress:$COMPRESS || { | |
echo "can't extract initrd" && exit 1 | |
} | |
eval $COMPRESS -dcS $EXT ../iso/$LIVE/initrd.$EXT | cpio -id | |
break 1 | |
fi | |
done | |
} | |
install_exfat_fuse(){ | |
echo "install exfat-fuse" | |
cd "$TMP_DIR" | |
mkdir overlay work rootfs | |
mount -t overlay overlay -o lowerdir=squashfs,upperdir=overlay,workdir=work rootfs | |
cat > rootfs/install_exfat_fuse.sh << EOF | |
#!/bin/bash | |
export LC_ALL=C | |
echo "nameserver $NAMESERVER" > /etc/resolv.conf | |
lsb_release -d | grep Ubuntu && add-apt-repository universe | |
apt-get update | |
apt-get -y install exfat-fuse | |
EOF | |
bash -c "chroot rootfs /bin/bash /install_exfat_fuse.sh" | |
} | |
copy_files_from(){ | |
cd "$TMP_DIR/initrd" | |
for file in $FILE_LIST;do | |
cp -avf "$1"/$file ./$(dirname $file) | |
done | |
} | |
copy_files(){ | |
if [ -f "$TMP_DIR/squashfs/$EXFAT_BIN" ];then | |
copy_files_from "$TMP_DIR/squashfs" | |
else | |
install_exfat_fuse && copy_files_from "$TMP_DIR/rootfs" | |
umount "$TMP_DIR/rootfs" | |
fi | |
} | |
patch_scripts(){ | |
cd "$TMP_DIR/initrd" | |
if [ -f ./bin/boot/9990-misc-helpers.sh ];then | |
patch -p0 --no-backup-if-mismatch << "EOF" | |
--- ./bin/boot/9990-misc-helpers.sh 2016-09-08 22:24:25.582875865 +0800 | |
+++ ./bin/boot/9990-misc-helpers.sh 2016-09-08 22:27:23.765579826 +0800 | |
@@ -420,6 +420,14 @@ | |
return 1 | |
fi | |
+ # exfat support | |
+ if [ "${fstype}" = "exfat" ] | |
+ then | |
+ modprobe -q -b fuse | |
+ alias mount='mount.util-linux' | |
+ return 0 | |
+ fi | |
+ | |
# Try to look if it is already supported by the kernel | |
if grep -q ${fstype} /proc/filesystems | |
then | |
EOF | |
cp -avf ./bin/boot/9990-misc-helpers.sh ./lib/live/boot/9990-misc-helpers.sh | |
elif [ -f ./scripts/casper-helpers ];then | |
patch -p0 --no-backup-if-mismatch << "EOF" | |
--- ./scripts/casper-helpers 2016-09-09 22:18:34.223899178 +0800 | |
+++ ./scripts/casper-helpers 2016-09-09 22:33:46.964777273 +0800 | |
@@ -31,7 +31,7 @@ | |
# FIXME: do something better like the scan of supported filesystems | |
fstype="${1}" | |
case ${fstype} in | |
- vfat|iso9660|udf|ext2|ext3|ext4|btrfs|ntfs) | |
+ vfat|iso9660|udf|ext2|ext3|ext4|btrfs|ntfs|exfat) | |
return 0 | |
;; | |
esac | |
--- ./scripts/lupin-helpers 2016-09-09 23:30:26.822777653 +0800 | |
+++ ./scripts/lupin-helpers 2016-09-09 23:32:52.033543153 +0800 | |
@@ -3,7 +3,7 @@ | |
is_supported_fs(){ | |
[ -z "${1}" ] && return 1 | |
case ${1} in | |
- ext2|ext3|ext4|xfs|jfs|reiserfs|vfat|ntfs|iso9660|btrfs) | |
+ ext2|ext3|ext4|xfs|jfs|reiserfs|vfat|ntfs|exfat|iso9660|btrfs) | |
return 0 | |
;; | |
esac | |
EOF | |
else | |
echo "no file to patch" | |
fi | |
} | |
compress_initrd(){ | |
echo "compress initrd ..." | |
cd "$TMP_DIR/initrd" | |
find . | cpio --quiet -o -H newc | eval $COMPRESS $([ $COMPRESS = "gzip" ] && echo "--rsyncable") > "$OUTPUT_DIR/initrd.$EXT" | |
} | |
clear_up(){ | |
echo "clear up" | |
umount "$TMP_DIR/squashfs" && umount "$TMP_DIR/iso" | |
cd / && rm -rf "$TMP_DIR" | |
} | |
mount_fs | |
extract_initrd | |
copy_files | |
patch_scripts | |
compress_initrd | |
clear_up | |
echo "done" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
run this script in ubuntu-16.04.7-desktop-amd64 and get the below errors:, did not get the initrd.
wwww@M6100T:~/exfat$ sudo ./live_initrd_on_exfat.sh ./ubuntu-16.04.7-desktop-amd64.iso
[sudo] password for wwww:
/tmp/tmp.NRkylkfOo5
mount filesystem
mount: /dev/loop0 is write-protected, mounting read-only
extract initrd
install exfat-fuse
Description: Ubuntu 16.04.7 LTS
'universe' distribution component enabled for all sources.
Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [109 kB]
Get:2 http://security.ubuntu.com/ubuntu xenial-security/main amd64 Packages [1648 kB]
Get:3 http://security.ubuntu.com/ubuntu xenial-security/main Translation-en [380 kB]
Get:4 http://security.ubuntu.com/ubuntu xenial-security/main amd64 DEP-11 Metadata [93.7 kB]
Get:5 http://security.ubuntu.com/ubuntu xenial-security/main DEP-11 64x64 Icons [111 kB]
Get:6 http://security.ubuntu.com/ubuntu xenial-security/restricted amd64 Packages [9824 B]
Get:7 http://security.ubuntu.com/ubuntu xenial-security/universe amd64 Packages [785 kB]
Get:8 http://security.ubuntu.com/ubuntu xenial-security/universe Translation-en [225 kB]
Get:9 http://security.ubuntu.com/ubuntu xenial-security/universe amd64 DEP-11 Metadata [130 kB]
Get:10 http://security.ubuntu.com/ubuntu xenial-security/universe DEP-11 64x64 Icons [206 kB]
Hit:11 http://archive.ubuntu.com/ubuntu xenial InRelease
Get:12 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [109 kB]
Get:13 http://archive.ubuntu.com/ubuntu xenial/universe amd64 Packages [7532 kB]
Get:14 http://archive.ubuntu.com/ubuntu xenial/universe Translation-en [4354 kB]
Get:15 http://archive.ubuntu.com/ubuntu xenial/universe amd64 DEP-11 Metadata [3410 kB]
Get:16 http://archive.ubuntu.com/ubuntu xenial/universe DEP-11 64x64 Icons [7448 kB]
Get:17 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 Packages [2049 kB]
Get:18 http://archive.ubuntu.com/ubuntu xenial-updates/main Translation-en [482 kB]
Get:19 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 DEP-11 Metadata [326 kB]
Get:20 http://archive.ubuntu.com/ubuntu xenial-updates/main DEP-11 64x64 Icons [252 kB]
Get:21 http://archive.ubuntu.com/ubuntu xenial-updates/restricted amd64 Packages [10.2 kB]
Get:22 http://archive.ubuntu.com/ubuntu xenial-updates/universe amd64 Packages [1219 kB]
Get:23 http://archive.ubuntu.com/ubuntu xenial-updates/universe Translation-en [358 kB]
Get:24 http://archive.ubuntu.com/ubuntu xenial-updates/universe amd64 DEP-11 Metadata [281 kB]
Get:25 http://archive.ubuntu.com/ubuntu xenial-updates/universe DEP-11 64x64 Icons [437 kB]
Fetched 32.0 MB in 18s (1744 kB/s)
** (appstreamcli:2703): CRITICAL **: Error while moving old database out of the way.
AppStream cache update failed.
Reading package lists... Done
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
exfat-utils
The following NEW packages will be installed:
exfat-fuse exfat-utils
0 upgraded, 2 newly installed, 0 to remove and 200 not upgraded.
Need to get 64.9 kB of archives.
After this operation, 281 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu xenial/universe amd64 exfat-fuse amd64 1.2.3-1 [24.8 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial/universe amd64 exfat-utils amd64 1.2.3-1 [40.1 kB]
Fetched 64.9 kB in 7s (8548 B/s)
E: Can not write log (Is /dev/pts mounted?) - posix_openpt (2: No such file or directory)
Selecting previously unselected package exfat-fuse.
(Reading database ... 196344 files and directories currently installed.)
Preparing to unpack .../exfat-fuse_1.2.3-1_amd64.deb ...
Unpacking exfat-fuse (1.2.3-1) ...
Selecting previously unselected package exfat-utils.
Preparing to unpack .../exfat-utils_1.2.3-1_amd64.deb ...
Unpacking exfat-utils (1.2.3-1) ...
Processing triggers for man-db (2.7.5-1) ...
Setting up exfat-fuse (1.2.3-1) ...
Setting up exfat-utils (1.2.3-1) ...
'/tmp/tmp.NRkylkfOo5/rootfs/sbin/mount.exfat' -> './sbin'
'/tmp/tmp.NRkylkfOo5/rootfs/sbin/mount.exfat-fuse' -> './sbin'
cp: not writing through dangling symlink './sbin'
cp: target './lib/x86_64-linux-gnu' is not a directory
no file to patch
compress initrd ...
./live_initrd_on_exfat.sh: line 133: [: =: unary operator expected
clear up
done
wwww@M6100T:
/exfat$ uname -a16.04.1-Ubuntu SMP Fri Jul 10 04:37:08 UTC 2020 x86_64 x86_64 x86_64 GNU/LinuxLinux M6100T 4.15.0-112-generic #113
wwww@M6100T:~/exfat$