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)

отформатировал в NTFS.

Рекомендую всем

4.2. Куда смотрит администрация!?

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

зачем NVMe, если ОС быстрее всех работает в памяти.

данный скрипт собирает initramfs, содержимое которого: несколько утилит из вашей родной ОС (копируются бинарники с зависимостями библиотек через ldd) и корень новой ОС пожатый в squashfs. и создаётся /init, который этот squashfs в будущем монтирует и switch_root'ается туда.

можно загнать вообще любой дистрибутив tmpfs. без заморочек.

на выходе имеем initramfs. у него есть четыре варианта использования:

1) прямо здесь и сейчас через kexec загрузить его вместе с ядром, что приведено в примере.

2) положить в /boot и загружать ОС в tmpfs каждый раз при загрузке хоста.

3) отдавать vmlinuz вместе с этим initramfs через PXE.

4) положить его на флешку. и двумя командами grub-install и grub-mkconfig сделать fat32-флешку загрузочной со своим дистрибутивом. любым. при этом вы сможете продолжать пользоваться флешкой как обычной флешкой.

на ваш выбор.

собрали себе дистрибутив и отныне всегда грузитесь в tmpfs. в этом же дистрибутиве собрали новый chroot, обновили его, перезаписали на флешку новый образ сделанный этим скриптом, и тем самым обновили систему.

https://files.catbox.moe/09kyyn.png

я сейчас фигачу на VDS по кругу kexec -l /vmlinuz --initrd=/initrd && kexec -e и система загружается в tmpfs, со всеми настройками. что будет, когда VDS взломают? я просто залью туда исправленный initrd образ и снова буду фигачить её по кругу. =)

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

цена вопроса 200мб оперативной памяти под squashfs.

Spoofing ★★★★★
() автор топика

Лучше бы автор

сделал диалоги настройки локали, сети, выбора зеркала, конфигурации fstab, USE флагов, а наэмержить пакеты потом и самому из консоли можно.

torvn77 ★★★★★
()
Ответ на: Лучше бы автор от torvn77

Re:Лучше бы автор

# patch << EOF
@@ -1 +1 @@
-сделал диалоги настройки локали, сети, выбора зеркала, конфигурации fstab, USE флагов, а наэмержить пакеты потом и самому из консоли можно.
+девушку себе нашёл.
EOF
Spoofing ★★★★★
() автор топика
Ответ на: комментарий от torvn77

А так по факту твой скрипт в таком виде не нужен.

я бы тоже так сказал, после того как схоронил его себе.

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

Лично меня из него только опции к tar интересуют, остальное я сделаю и так, ну может его как шпаргалку открою.

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

А я не оправдываюсь.
К стати скрипт у тебя весьма путанный, так что скорее всего даже как шпаргалку использовать не буду.
(Но всё равно спасибо, как справочник по командам и TODO сойдёт)

torvn77 ★★★★★
()
Последнее исправление: torvn77 (всего исправлений: 1)
Ответ на: комментарий от Spoofing

на выходе имеем initramfs.

На твоём месте я бы сделал обычный ext2 образ который бы через initrd командой cat накатывал на zram, получив этим экономию ОЗУ и более быструю загрузку при использовании крупных образов, да и всяких секюрных фишек на полноценной ext2 будет побольше.

torvn77 ★★★★★
()
Последнее исправление: torvn77 (всего исправлений: 2)

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

сегодня не в том терминале набрал 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 ★★★★★
()

эх, надо будет новый репак austrumi сделать, а то давно не было...

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