LINUX.ORG.RU
ФорумTalks

Загрузка любого дистрибутива в RAM

 mkchrootrd,


6

2

Здравствуйте мои юные кали-хакеры и любители оставаться анонимными. С утра, ковыряя 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
★★★★★

Последнее исправление: Spoofing (всего исправлений: 1)

[история узбека]

сегодня не в том терминале набрал poweroff, «я случайно вдс».

как уже известно, на /dev/vda я ничего не оставил. а чтобы место даром не пропадало, сделал mkswap /dev/vda.

пришлось установить любую ось (ubuntu 16.04) из готового образа, что предлагает хостер. а затем просто залить туда новые vmlinuz, initrd, и выполнить kexec -l /vmlinuz --initrd=/initrd

при kexec -e он почему-то падал в kernel panic.

сделал systemctl kexec, тогда успешно загрузился initrd обратно в tmpfs и тогда я снова снёс систему mkswap /dev/vda.

это успех, ящитаю, когда свою готовую конфигурацию ты можешь развернуть на любом вдс в считанные минуты. по сути даже автоматизировать этот процесс, по ssh.

Spoofing ★★★★★
() автор топика
Ответ на: [история узбека] от Spoofing

это успех, ящитаю, когда свою готовую конфигурацию ты можешь развернуть на любом вдс в считанные минуты. по сути даже автоматизировать этот процесс, по ssh.

О господи, да это же ничего нового! Ценой всего-то кучи RAM!

Самокритичный тег хорош.

t184256 ★★★★★
()
Ответ на: комментарий от t184256

ничего нового

тогда почему я должен быть первооткрывателем.

почему начинающие пользователи впервые столкнувшись с миром Linux, читают какие-то обосанные статьи на хабре и ЛОРе, предлагающие делать бэкапы не менее обоссанными скриптами на баше rsync tar и прочими инструментами которые совсем не про то. бэкап системы больше не нужен, покуда она поднимается в три секунды, уже настроенная и готовая к работе. на локалхосте у себя собрал образы для всех хостов, оттестил в qemu и вперёд, грузи, по pxe или по ssh удалённо kexec выполняй.

я прежде всего делаю эти открытия для самого себя и спешу ими поделиться.

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от Spoofing

почему начинающие пользователи впервые столкнувшись с миром Linux, читают какие-то обосанные статьи на хабре и ЛОРе

У тебя ложная предпосылка.

t184256 ★★★★★
()
Ответ на: [история узбека] от Spoofing

сделал mkswap /dev/vda

Вот это гениально! Загружать систему в RAM, чтобы потом подключать swap с хдд!

По сабжу - интересно, схороню на всякий случай.

TheAnonymous ★★★★★
()
Ответ на: комментарий от TheAnonymous

Загружать систему в RAM, чтобы потом подключать swap с хдд!

к сожалению не все могут себе позволить хотя бы 4гб для комфортной жизни в tmpfs. лучше пусть tmpfs начнёт свопиться на диск, чем система раком встанет.

в этом и различия между tmpfs и ramfs, что tmpfs будет свопиться при заполнении, а ramfs — нет.

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от Spoofing

Но тогда же теряется вся суть затеи? Хотя подключить своп, так сказать, как last resort, может и хорошая идея.
Однако, когда система уходит в своп, она же всё равно встаёт раком - через какое-то время может и отвиснет, но работать так не дело

TheAnonymous ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.