Damus
linux_privacy · 1w
Tails на телефоне. Создаем зашифрованную мобильную ОС, которая будет терять все данные после перезагрузки. Сна...
linux_privacy profile picture
затем устанавливаем свой вариант overlayroot в initramfs для работы в RAM и потере данных при перезагрузке из режима overlayroot:

sudo tee /etc/initramfs-tools/scripts/init-bottom/overlayroot >/dev/null <<EOF
#!/bin/sh
# Overlayroot initramfs hook для Debian/Mobian

case "$1" in
prereqs)
echo ""
exit 0
;;
esac

. /scripts/functions

PATH=/usr/sbin:/usr/bin:/sbin:/bin
MYTAG="overlayroot"

# === НАСТРОЙКИ ===
root_rw=/media/root-rw
root_ro=/media/root-ro
NEWROOT="${rootmnt:-/root}"
OVERLAYROOT_DEBUG=1

# === ЛОГИРОВАНИЕ ===
log() {
"log_${1}_msg" "$MYTAG: $2"
_debug "[$1]:" "$2"
}
log_fail() { log failure "$*"; }
log_success() { log success "$*"; }
log_warn() { log warning "$*"; }
fail() {
[ $# -eq 0 ] || log_fail "$@"
exit 0
}

_debug() {
if [ "${DEBUG_BUSTED:-0}" = "0" ]; then
{ echo "$@" >> "/dev/.initramfs/${MYTAG}.log"; } 2>/dev/null ||
{ DEBUG_BUSTED=1; logwarn "debug is busted"; }
fi
}

debug() {
_debug "$@"
[ "${OVERLAYROOT_DEBUG:-0}" = "0" ] && return
echo "$MYTAG:" "$@"
}

# === ПАРСИНГ КОМАНДНОЙ СТРОКИ ЯДРА ===
# Читаем /proc/cmdline и ищем параметры overlayroot*
parse_cmdline() {
local cmdline=""
read cmdline < /proc/cmdline || return 1

OVERLAY_MODE=""
OVERLAY_CHROOT=0

for tok in $cmdline; do
case "$tok" in
overlayroot=off)
OVERLAY_MODE="disabled"
;;
overlayroot=chroot)
OVERLAY_CHROOT=1
;;
overlayroot=tmpfs)
OVERLAY_MODE="tmpfs"
;;
overlayroot=*)
OVERLAY_MODE="${tok#overlayroot=}"
;;
esac
done
}

# === ПРОВЕРКА ФЛАГОВ В ОРИГИНАЛЬНОМ КОРНЕ ===
check_disable_flags() {
# Проверяем флаг-файл в оригинальном корне (до overlay)
if [ -f "$NEWROOT/.overlayroot-disable" ]; then
log_success "found .overlayroot-disable flag, disabling overlay"
rm -f "$NEWROOT/.overlayroot-disable"
return 0
fi

# Проверяем флаг-файл для одноразового chroot
if [ -f "$NEWROOT/.overlayroot-chroot" ]; then
log_success "found .overlayroot-chroot flag, enabling chroot mode"
OVERLAY_CHROOT=1
rm -f "$NEWROOT/.overlayroot-chroot"
return 1
fi

return 1
}

# === МОНТИРОВАНИЕ TMPFS ДЛЯ OVERLAY ===
mount_overlay_tmpfs() {
local size="${1:-50%}"

mkdir -p "$root_rw" || fail "failed to create $root_rw"
mount -t tmpfs -o mode=0755,size=80% tmpfs-root "$root_rw" ||
fail "failed to mount tmpfs on $root_rw"

mkdir -p "$root_rw/overlay" "$root_rw/work" ||
fail "failed to create overlay dirs on tmpfs"
}

# === МОНТИРОВАНИЕ ОРИГИНАЛЬНОГО КОРНЯ ===
mount_original_root() {
mkdir -p "$root_ro" || fail "failed to create $root_ro"

# Если корень уже примонтирован в NEWROOT — биндим его
if [ -d "$NEWROOT/bin" ]; then
mount --bind "$NEWROOT" "$root_ro" ||
fail "failed to bind $NEWROOT to $root_ro"
else
fail "$NEWROOT is not mounted"
fi
}

# === МОНТИРОВАНИЕ OVERLAY ===
mount_overlay() {
local lowerdir="$1"
local upperdir="$2"
local workdir="$3"
local target="$4"

mkdir -p "$target" || fail "failed to create $target"

# Проверяем версию ядра для workdir
local mount_opts="lowerdir=$lowerdir,upperdir=$upperdir"
case "$(uname -r)" in
2*|3.1[01234567]*|3.[0-9].*)
# Старые ядра не требуют workdir
;;
*)
mount_opts="$mount_opts,workdir=$workdir"
;;
esac

mount -t overlay -o "$mount_opts" overlayroot "$target" ||
fail "failed to mount overlay on $target"
}

# === ПЕРЕМЕЩЕНИЕ MOUNTPOINT'ОВ ===
move_mounts() {
local source="$1"
local dest="$2"

# Переносим все дочерние mountpoint'ы (кроме самого source)
local mounts=""
mounts=$(awk -v mnt="$source" '$2 ~ "^"mnt && $2 != mnt {print $2}' /proc/mounts | sort)

for mp in $mounts; do
local rel="${mp#$source}"
[ -z "$rel" ] && continue

mkdir -p "$dest$rel" || log_warn "failed to create $dest$rel"
mount --move "$mp" "$dest$rel" ||
log_warn "failed to move $mp to $dest$rel"
done
}

# === ОБНОВЛЕНИЕ FSTAB ===
update_fstab() {
local root_ro="$1"
local root_rw="$2"

[ -f "${NEWROOT}/etc/fstab" ] || return 0

# Сохраняем оригинальный fstab
cp "${NEWROOT}/etc/fstab" "${NEWROOT}/etc/fstab.orig" 2>/dev/null || true

cat <<EOF >"${NEWROOT}/etc/fstab"
# This fstab is in an overlayfs.
# The real one can be found at ${root_ro}/etc/fstab
# To permanently modify files, chroot into writable view:
# sudo mount -o remount,rw ${root_ro}
# sudo chroot ${root_ro}
#
EOF

# Копируем оригинальные записи с изменёнными путями
while read spec file vfstype opts pass freq; do
# Пропускаем комментарии и пустые строки
case "$spec" in
\#*|""|swap) continue ;;
esac

# Корневую ФС заменяем на overlay
if [ "$file" = "/" ]; then
echo "overlayroot / overlay defaults 0 0"
echo "${root_ro} ${root_ro} none bind,ro 0 0"
echo "${root_rw} ${root_rw} none bind,rw 0 0"
continue
fi

# Виртуальные ФС пропускаем
case "$vfstype" in
proc|sys|tmpfs|devtmpfs|devpts|overlay) continue ;;
esac

# Остальные монтируем в ro-слой
echo "$spec ${root_ro}${file} $vfstype ro,$opts $pass $freq"
done < "${NEWROOT}/etc/fstab.orig" >> "${NEWROOT}/etc/fstab"
}

# === СОЗДАНИЕ ТОЧЕК ДОСТУПА /live/* ===
create_live_access() {
local root_ro="$1"
local root_rw="$2"

# Создаём /live/image (доступ к оригинальному ro корню)
mkdir -p "${NEWROOT}/live/image" || log_warn "failed to create /live/image"
mount --bind "$root_ro" "${NEWROOT}/live/image" ||
log_warn "failed to bind $root_ro to /live/image"

# Создаём /live/cow (доступ к rw слою)
mkdir -p "${NEWROOT}/live/cow" || log_warn "failed to create /live/cow"
mount --bind "$root_rw" "${NEWROOT}/live/cow" ||
log_warn "failed to bind $root_rw to /live/cow"
}

# === ОСНОВНАЯ ЛОГИКА ===

# 1. Парсим командную строку ядра
parse_cmdline

# 2. Проверяем флаги отключения
check_disable_flags
if [ $? -eq 0 ]; then
OVERLAY_MODE="disabled"
fi

# 3. Если overlay отключён — выходим
case "${OVERLAY_MODE:-enabled}" in
disabled|off|no)
log_success "overlayroot disabled, booting normal root"
exit 0
;;
esac

# 4. Проверяем что корень смонтирован
if [ ! -d "$NEWROOT/bin" ]; then
log_fail "$NEWROOT is not mounted"
exit 0
fi

# 5. Создаём временные директории в RAM
mkdir -p /run/overlay
mount -t tmpfs -o mode=0755,size=100% tmpfs /run/overlay ||
fail "failed to mount tmpfs on /run/overlay"

# 6. Монтируем оригинальный корень в ro-слой
mount_original_root

# 7. Монтируем tmpfs для rw-слоя
mount_overlay_tmpfs

# 8. Если запрошен chroot-режим — монтируем overlay отдельно
if [ "$OVERLAY_CHROOT" = "1" ]; then
log_warn "chroot mode requested, overlay will be available at /overlay"

# Монтируем overlay в /overlay внутри нового корня
mkdir -p "${NEWROOT}/overlay"
mount_overlay "$root_ro" "$root_rw/overlay" "$root_rw/work" "${NEWROOT}/overlay"

# Создаём точки доступа
create_live_access "$root_ro" "$root_rw"

# Переносим дочерние mountpoint'ы
move_mounts "$NEWROOT" "${NEWROOT}/overlay"

# Обновляем fstab
update_fstab "$root_ro" "$root_rw"

log_success "chroot overlay configured at /overlay"
exit 0
fi

# 9. Обычный режим: перемещаем корень в ro-слой, монтируем overlay на его место
# Перемещаем оригинальный корень
mount --move "$NEWROOT" "$root_ro" ||
fail "failed to move $NEWROOT to $root_ro"

# Монтируем overlay на место оригинального корня
mount_overlay "$root_ro" "$root_rw/overlay" "$root_rw/work" "$NEWROOT"

# 10. Переносим mountpoint'ы внутрь overlay
move_mounts "$root_ro" "$NEWROOT"

# 11. Перемещаем ro и rw слои внутрь overlay (чтобы были доступны из системы)
mkdir -p "${NEWROOT}${root_ro}" "${NEWROOT}${root_rw}"
mount --move "$root_ro" "${NEWROOT}${root_ro}" ||
log_warn "failed to move $root_ro into overlay"
mount --move "$root_rw" "${NEWROOT}${root_rw}" ||
log_warn "failed to move $root_rw into overlay"

# 12. Создаём точки доступа /live/*
create_live_access "${NEWROOT}${root_ro}" "${NEWROOT}${root_rw}"

# 13. Обновляем fstab
update_fstab "$root_ro" "$root_rw"

# 14. Если ядро просило ro — перемонтируем
read cmdline < /proc/cmdline
case " $cmdline " in
*\ ro\ *)
mount -o remount,ro "$NEWROOT" ||
log_warn "failed to remount overlay read-only"
;;
esac

log_success "overlayroot configured with /live/image and /live/cow access"
exit 0
EOF

sudo chmod 755 /etc/initramfs-tools/scripts/init-bottom/overlayroot

echo "overlay" | sudo tee -a /etc/initramfs-tools/modules

sudo update-initramfs -u -k all

sudo dpkg-reconfigure linux-image-$(uname -r)
1
linux_privacy · 1w
создаем команды для запуска и деактивации overlayroot для выхода из overlayroot создайте в /usr/local/bin/stop-overlay: #!/bin/sh sudo mount -o remount,rw /live/image sudo touch /live/image/ sudo mount -o remount,ro /live/image sudo reboot и...