Здравствуйте мои юные кали-хакеры и любители оставаться анонимными. С утра, ковыряя VDS (пользуюсь услугами ру-провайдера), [ДАННЫЕ УДАЛЕНЫ] запрос, и [ДАННЫЕ УДАЛЕНЫ] дамп диска [ДАННЫЕ УДАЛЕНЫ].
А теперь скрипт, который из кастомного, т.е. созданного и настроенного вами chroot'а создаёт initramfs образ, готовый к загрузке и работе в tmpfs.
С ним вы можете на любой системе прямо «на лету» свичнуться в tmpfs, хоть прямо сейчас, на своём компьютере. Предварительно установив в chroot любой дистрибутив по желанию и настроив его под себя. А потом скриптом упаковать его в initramfs образ и свичнуться, да.
Для создания минимального (от слова «маленький», а не «огрызок») образа потребуется squashfs-tools. Чтобы свичнуться «на лету» нужен kexec-tools. Установите их. В ядре должны быть включены опции: CONFIG_OVERLAY_FS=y
, CONFIG_SQUASHFS=y
и CONFIG_SQUASHFS_XZ=y
. [личное мнение: ZSTD получается размером больше, чем XZ]
Например. Хотите генту?
# mkdir gentoo_chroot/
# cd gentoo_chroot/
# wget https://bouncer.gentoo.org/fetch/root/all/releases/amd64/autobuilds/20200519T155804Z/stage3-amd64-20200519T155804Z.tar.xz
# tar xf stage3-amd64-*.tar.xz
# rm stage3-amd64-*.tar.xz
# cd ..
На этом этапе мы получили ванильную генту в gentoo_chroot/. Рекомендую её настроить, хотя бы сделать chroot gentoo_chroot/ /bin/bash
и установить passwd
для root, иначе в систему вы не войдёте. Я не знаю, что это за особенность такая, не давать установить пароль если его нет. В моём CRUX когда пароль на root отсутствует и ты логинишься первый раз (в tty или в ssh по ключу), оно просто предлагает установить пароль. Какая тут может быть дыра в безопасности на свежеустановленной системе? Не знаю...
Предлагаю так же в gentoo_chroot/ скопировать модули и фирмварь для корректной работы текущего ядра и железа.
# cp -a /lib/modules gentoo_chroot/lib/modules
# cp -a /lib/firmware gentoo_chroot/lib/firmware
Ну и создадим образ наконец.
# ./mkchrootrd gentoo_chroot/ ~/gentoo_initrd
Усё. У нас теперь целая настоящая гента в gentoo_initrd файлике упакована. Давайте загрузимся же в неё скорее с текущим ядром.
# eval $(cat /proc/cmdline | cut -f 1 -d \ )
# kexec -l $BOOT_IMAGE --initrd=gentoo_initrd --reuse-cmdline
# kexec -e
Если вы не хотите делать kexec по каким-то причинам, то положите этот же образ в свой /boot, а в параметрах загрузки укажите initrd /gentoo_initrd. Перезагрузитесь и получите тот-же результат.
Ура! Гента загрузилась. Тоже самое можно проделать с любым дистрибутивом, просто установите его, настройте как вам угодно, а затем скриптом создайте initramfs образ. Я уж взял для примера Gentoo, не стал лишний раз приводить в пример CRUX.
Жмём Reset чтобы сбросить всё и загрузиться в свою систему с морально устаревшего M.2 NVMe накопителя обратно.
Перевёл свою VDS на работу в tmpfs. Диск /dev/vda отформатировал в NTFS. Рекомендую всем. 👍👍👍👍👍👍
Скрипт:
#!/bin/bash
#
# Author: Sp00f1ng <sp00f1ng@sp00f1ng.com>
# License: Public Domain
#
################################################################################
#
# mkchrootrd chroot_directory/ [initrd_image]
#
################################################################################
#
# Depends on: squashfs-tools
# Optional: kexec-tools
# Kernel:
#
# File systems --->
# <*> Overlay filesystem support
# [*] Miscellaneous filesystems --->
# <*> SquashFS 4.0 - Squashed file system support
# [*] Include support for XZ compressed file systems
#
################################################################################
#
# Example usage:
#
# mkdir gentoo_chroot/
# cd gentoo_chroot/
# wget https://bouncer.gentoo.org/fetch/root/all/releases/amd64/autobuilds/20200519T155804Z/stage3-amd64-20200519T155804Z.tar.xz
# tar xf stage3-amd64-*.tar.xz
# rm stage3-amd64-*.tar.xz
#
# [.. do something else with gentoo_chroot/ like additional configuration ...]
# [ cp -a /lib/modules ./lib/modules ]
# [ cp -a /lib/firmware ./lib/firmware ]
#
# cd ../
#
# ./mkchrootrd gentoo_chroot/ ~/gentoo_initrd
#
# eval $(cat /proc/cmdline | cut -f 1 -d \ )
# kexec -l $BOOT_IMAGE --initrd=gentoo_initrd --reuse-cmdline
# kexec -e
#
# Have fun and happy hacking day 1 <3 <3 7 !
panic() {
if [ -e "$TMP" ]; then
rm -rf $TMP 2>/dev/null
fi
exit ${1:1}
}
got_help() {
grep ^\# "$0"
}
got_cmdline() {
while [ "$1" ]; do
if [ ! -n "$CHROOT_DIR" ]; then
CHROOT_DIR="$1"
shift
continue
fi
if [ ! -n "$INITRD_IMG" ]; then
INITRD_IMG="$1"
shift
continue
fi
shift
done
}
cp_bin() {
local src="$1"
local dst="$2"
local dep=""
if [ "$dst" = "" ]; then
dst="$src"
fi
if [ -e "$TMP$dst" ]; then
return
fi
install -D -m 0755 "$src" "$TMP$dst"
for dep in $(ldd "$src" 2>/dev/null | grep -o '/.* '); do
cp_bin "$dep"
done
}
mk_env() {
for dir in proc sys dev run mnt overlay; do
install -d $TMP/$dir
done
for dev in console tty tty1 null; do
cp -a "/dev/$dev" "$TMP/dev/$dev"
done
for bin in sh switch_root mount umount mkdir rmdir; do
cp_bin "$(which $bin)"
done
touch $TMP/init
chmod +x $TMP/init
cat > $TMP/init << EOF
#!/bin/sh
mount -t proc none /proc
echo "0" > /proc/sys/kernel/printk
mount -t sysfs none /sys
mount -t devtmpfs devtmpfs /dev
mount -t tmpfs none /run
mount -t tmpfs tmpfs /overlay
lowerdir="/lower"
upperdir="/overlay/upper"
workdir="/overlay/work"
mkdir -p \$lowerdir
mkdir -p \$upperdir
mkdir -p \$workdir
mount -t squashfs -o ro /root.sqfs \$lowerdir
mount -t overlay -o ro,lowerdir="\$lowerdir",upperdir="\$upperdir",workdir="\$workdir" overlay /mnt
umount /proc
umount /sys
umount /dev
umount /run
exec switch_root /mnt /sbin/init
EOF
}
main() {
CHROOT_DIR=""
INITRD_IMG=""
got_cmdline "$@"
if [ ! -n "$CHROOT_DIR" ] || [ ! -n "$INITRD_IMG" ]; then
got_help
panic 0
fi
if [ ! -d "$CHROOT_DIR" ]; then
echo "'$CHROOT_DIR' is not directory."
panic 1
fi
if [ ! -x "$(which mksquashfs)" ]; then
echo "'mksquashfs' squashfs-tools not found."
panic 1
fi
mk_env
mksquashfs $CHROOT_DIR $TMP/root.sqfs \
-b 1048576 -comp xz -Xdict-size 100%
cd $TMP
echo "Building Initial RAM Disk [$INITRD_IMG]"
find . -print0 | cpio --null --create --format=newc --verbose > "$INITRD_IMG"
echo "Done [$INITRD_IMG]"
}
trap "panic" INT HUP QUIT TERM EXIT
readonly MKCHROOTRD_COMMAND="$0"
readonly MKCHROOTRD_VERSION="1.0"
TMP=$(mktemp -d)
main "$@"
# EOF