diff options
-rw-r--r-- | LICENSE | 19 | ||||
-rw-r--r-- | README | 21 | ||||
-rwxr-xr-x | comp_bench | 21 |
3 files changed, 50 insertions, 11 deletions
@@ -0,0 +1,19 @@ +The file gen_init_cpio.c is from the Linux kernel source file +usr/gen_init_cpio.c. It was released under the GNU General Public License, +version 2, and is redistributed under those terms. + +Other files are subject to the following copyright: + +Copyright 2020 Alex Xu. + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License, version 3, as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +A copy of the GNU General Public License, version 3 can be found in +gpl-3.0.txt. It can also be obtained from <http://www.gnu.org/licenses/>. @@ -6,11 +6,13 @@ You need something else? Patch it, it's only 117 lines. Features: +- uses existing system tools, no compilation necessary - password LUKS unlock - SSH remote unlock -- firmware loading +- firmware loading (trivial, done by kernel) - extremely fast initramfs creation: compression off: ~70ms cold cache, ~30ms warm; lz4 --best: 1.6s +- no temporary files during creation - extremely fast initramfs runtime: ~zero overhead compared to direct kernel loading - minimal code: 117 SLOC total (init + make + Makefile + unlock) @@ -18,6 +20,7 @@ Features: Drawbacks: +- uses existing system tools, no compilation possible - no modprobe support. custom kernel is required to use myinitramfs. if you want configurability, probably better to use mkinitcpio or dracut. - pure POSIX shell + POSIX Makefile @@ -26,21 +29,23 @@ Usage: 0. Read (skim) https://wiki.gentoo.org/wiki/Custom_Initramfs. -1. Install busybox, dropbear, e2fsprogs (if you use ext4). +1. Install busybox, dropbear, e2fsprogs if you use ext4, and C toolchain for + building gen_init_cpio. 2. Adjust ./init as required: a) Adjust networking as required (e.g. maybe static IP instead of DHCP, or - you don't use eth0) - b) Adjust UUID (probably yours is not the same as mine) - c) Adjust fsck as needed (if you are not using ext4) - d) Put whatever you want: + you don't use eth0, but remember that myinitramfs has no udev, so no + predictable interface names) + b) Adjust UUID (most likely yours is not the same as mine) + c) Change or remove fsck for non-ext4 roots + d) Put whatever you want: usr mount, NFS root, whatever. 3. Adjust ./make as required: a) Put your needed commands in gen_cpio_list. b) Select your desired compressor at the end. Try make comp_bench for a comparison. summary: lz4 is usually best, xz if storage is important above all (saves a few MB but adds ~0.5s to boot), gzip is mediocre on both size and - speed, lzo is almost always worse than lz4, never use bzip2 or lzma. + speed, lzo is usually worse than gzip, never use bzip2 or lzma. 4. Customize cpio_list.txt with your required files. Remember that commands must go in ./make (for library detection), and device files except @@ -54,3 +59,5 @@ Usage: 7. sudo make install 8. Configure your boot loader/boot manager to use initramfs.img. + +9. Use as usual. For remote unlock, SSH to port 2222 and "exec unlock". @@ -1,18 +1,31 @@ #!/bin/sh +[ "$1" = -v ] && verbose=1 + set -e +do_time() { + exec 3>&1 + (time "$@") 2>&1 >&3 | grep . >&2 +} + do_bench() { tmpfile=$(mktemp) - trap 'rm -f "$tmpfile"' EXIT - compressor=cat outfile=/proc/self/fd/1 ./make | "$@" -c < initramfs.img > "$tmpfile" - printf '%s: %s bytes\n' "$1" "$(wc -c < "$tmpfile")" - time $1 -dc < "$tmpfile" >/dev/null + trap 'rm -f "$tmpfile"' HUP INT QUIT TERM EXIT + [ -z "$verbose" ] || printf '%s compression:\n' "$1" + ${verbose+do_time} "$@" -c <initramfs.img >"$tmpfile" + printf '%s size: %s bytes\n' "$1" "$(wc -c < "$tmpfile")" + printf '%s decompression:\n' "$1" + do_time "$1" -dc <"$tmpfile" >/dev/null rm "$tmpfile" trap '' EXIT echo } +if [ -e initramfs.img ] && [ "$(file -b initramfs.img)" != "ASCII cpio archive (SVR4 with no CRC)" ]; then + echo "warning: overwriting initramfs.img" >&2 + compressor=cat ./make > initramfs.img +fi do_bench gzip -9 do_bench bzip2 -9 do_bench lzma -9e --check=crc32 |