Буває страшно тиснути Enter на черговому apt upgrade? Давайте зробимо безпечний пісочний майданчик: змонтуємо систему через overlayfs, зайдемо у неї через chroot, протестуємо оновлення, а потім просто приберемо шар змін. Ніяких ризиків для вашої основної системи — і всі експерименти з apt командами під контролем. Це один із моїх улюблених трюків Linux 🚀

Коротко: що таке overlayfs і навіщо chroot

overlayfs накладає "верхній" шар (upperdir) змін на "нижній" шар (lowerdir) у режимі лише читання. Ви бачите об’єднане дерево файлів, але всі записи йдуть у upperdir. chroot переключає корінь процесу в інший каталог, щоб програми думали, що це — ціла система. Разом це дозволяє симулювати оновлення Linux і інсталяції так, ніби все відбувається в реальній системі, хоча насправді зміни зберігаються лише у верхньому шарі.

Підготовка sandbox на основі вашої системи

Вам знадобиться сучасне ядро з підтримкою overlayfs, права sudo і трохи сміливості в термінал Linux ⚠️ Перед початком закрийте зайві застосунки і впевніться, що маєте вільне місце на диску.

Крок 0. Перевірка підтримки overlayfs

sudo modprobe overlay
lsmod | grep overlay || echo "overlayfs модуль підвантажено"

Крок 1. Створюємо каталоги та робимо нижній шар лише для читання

sudo mkdir -p /sandbox/{lower,upper,work,root}
# Створюємо read-only відображення вашого / як нижній шар
a) sudo mount --bind / /sandbox/lower
b) sudo mount -o remount,ro,bind /sandbox/lower

Такий read-only bind гарантує, що нижній шар стабільний і ми нічого не змінюємо у хості.

Крок 2. Монтуємо overlay і готуємо chroot

# Монтуємо overlay
sudo mount -t overlay overlay \
  -o lowerdir=/sandbox/lower,upperdir=/sandbox/upper,workdir=/sandbox/work \
  /sandbox/root

# Підключаємо необхідні псевдо-ФС для коректної роботи apt і dpkg
for d in proc sys dev run; do sudo mount --bind /$d /sandbox/root/$d; done
sudo mount --bind /tmp /sandbox/root/tmp

# DNS у chroot (зв'язок з інтернетом для apt)
sudo cp -L /etc/resolv.conf /sandbox/root/etc/resolv.conf

# Додатковий захист від змін у NVRAM/EFI під час оновлень загрузчика
sudo mkdir -p /sandbox/empty
sudo mount --bind /sandbox/empty /sandbox/root/sys/firmware || true

Крок 3. Заходимо у sandbox і тестуємо оновлення

sudo chroot /sandbox/root /bin/bash

# Ми вже всередині sandbox
apt update
apt -s upgrade        # симуляція оновлення (dry-run)
apt upgrade           # реальне оновлення, але лише у верхній шар overlay

# Додатково: встановіть або видаліть пакети для тесту
# apt install <pkg>  / apt remove <pkg>

exit

Усі зміни потрапили в /sandbox/upper, ваш хост не змінено. Ось така магія apt команд у безпечному середовищі.

Крок 4. Відкат у нуль: розмонтування та прибирання

# Порядок розмонтувань важливий
sudo umount -l /sandbox/root/sys/firmware || true
for d in tmp run dev sys proc; do sudo umount -l /sandbox/root/$d; done
sudo umount -l /sandbox/root
sudo umount -l /sandbox/lower

# Повний відкат: просто видаляємо "upper" і "work"
sudo rm -rf /sandbox

Як зберегти корисні зміни

Якщо хочете перенести результати експерименту на хост, вручну виберіть і скопіюйте потрібні файли з /sandbox/upper. Наприклад, глянути, що саме змінилось:

sudo du -sh /sandbox/upper
sudo find /sandbox/upper -type f | sed 's#^/sandbox/upper##' | sort | less

Автоматизація: міні bash-скрипт

Щоб не набирати все щоразу, тримайте невеликий скрипт. Це справжнісінькі трюки Linux для щоденної практики.

#!/usr/bin/env bash
set -euo pipefail
SANDBOX=/sandbox

prep() {
  sudo modprobe overlay || true
  sudo mkdir -p "$SANDBOX"/{lower,upper,work,root,empty}
  sudo mount --bind / "$SANDBOX"/lower || true
  sudo mount -o remount,ro,bind "$SANDBOX"/lower
  sudo mount -t overlay overlay \
    -o lowerdir="$SANDBOX"/lower,upperdir="$SANDBOX"/upper,workdir="$SANDBOX"/work \
    "$SANDBOX"/root
  for d in proc sys dev run; do sudo mount --bind /$d "$SANDBOX"/root/$d; done
  sudo mount --bind /tmp "$SANDBOX"/root/tmp
  sudo cp -L /etc/resolv.conf "$SANDBOX"/root/etc/resolv.conf
  sudo mount --bind "$SANDBOX"/empty "$SANDBOX"/root/sys/firmware || true
}

enter() {
  sudo chroot "$SANDBOX"/root /bin/bash
}

clean() {
  sudo umount -l "$SANDBOX"/root/sys/firmware || true
  for d in tmp run dev sys proc; do sudo umount -l "$SANDBOX"/root/$d || true; done
  sudo umount -l "$SANDBOX"/root || true
  sudo umount -l "$SANDBOX"/lower || true
}

wipe() {
  clean || true
  sudo rm -rf "$SANDBOX"
}

case "${1:-}" in
  prep) prep;;
  enter) enter;;
  clean) clean;;
  wipe) wipe;;
  *) echo "Usage: $0 {prep|enter|clean|wipe}"; exit 1;;
 esac

Альтернативні способи

  • Швидка симуляція без sandbox: apt -s upgrade і apt-get --just-print install pkg показують план дій без змін.
  • Знімки файлової системи: Btrfs/LVM snapshot перед оновленням — моментальний відкат у випадку проблем.
  • Окреме кореневе дерево: debootstrap створює чистий Debian/Ubuntu rootfs; далі chroot або systemd-nspawn для тестів.
  • Контейнери: Docker/Podman для ізоляції, але це вже не ваш системний root, а образ; зручно для перевірки пакетів, що не торкаються ядра/завантажувача.

GUI-спосіб: Timeshift для швидкого відкату

Якщо хочете більше графіки, використайте Timeshift. Це не overlayfs, але дуже зручно для безпечних оновлень:

  1. Встановіть Timeshift:
sudo apt update && sudo apt install timeshift
  1. Запустіть Timeshift (GUI), виберіть тип знімків (Btrfs або RSYNC), диск і натисніть Create.
  2. Виконайте ваші оновлення через apt у терміналі.
  3. Якщо щось пішло не так — відкрийте Timeshift і відновіться з останнього snapshot.

FAQ

Чи безпечно використовувати lowerdir з кореня системи?

Так, якщо ви монтуєте його як read-only bind, як у кроках вище. Усі записи підуть у верхній шар, а хост лишиться не зміненим.

Служби намагаються стартувати під час оновлення в chroot. Що робити?

Заблокуйте автозапуск служб у sandbox за допомогою policy-rc.d:

echo -e '#!/bin/sh\nexit 101' | sudo tee /sandbox/root/usr/sbin/policy-rc.d >/dev/null
sudo chmod +x /sandbox/root/usr/sbin/policy-rc.d

Це збереже спокій під час оновлення пакунків у chroot.

DNS не працює в chroot

Переконайтеся, що /etc/resolv.conf скопійовано або змонтовано. Просте рішення — як у гайді: cp -L /etc/resolv.conf /sandbox/root/etc/resolv.conf.

Помилка під час монтування overlayfs з lowerdir=/

Використайте схему з read-only bind в окрему теку (ми так і робимо: /sandbox/lower). Це обхід типових обмежень overlayfs щодо прямих монтувань з /.

Чи може оновлення зіпсувати завантажувач або EFI?

Малоймовірно у такому sandbox, бо файли пишуться в upperdir. Але щоб виключити зміни NVRAM/efivars, ми "маскуємо" /sys/firmware через порожню теку. Додатково не зайвим буде policy-rc.d, щоб не стартували служби.

Де зберігаються всі зміни і як очистити місце?

Усі зміни — в /sandbox/upper. Щоб прибрати все, розмонтуйте й видаліть /sandbox. Перевірити зайнятий простір можна через du -sh /sandbox/upper.

Порада від Kernelka

  • Комбінуйте: спочатку apt -s upgrade для прогона плану, потім — overlayfs+chroot для реального тесту.
  • Для складних апгрейдів ядра або grub краще мати свіжий Timeshift snapshot або btrfs/lvm знімок — подвійна страховка.
  • Зберігайте журнал: script -c "apt upgrade" /tmp/apt.log у sandbox — легше аналізувати проблеми.
  • Не забувайте, що це саме sandbox: не зберігайте у ньому секрети й ключі; усе потрібне — переносіть вибірково з upperdir.

Підсумок

  • overlayfs + chroot дозволяють безпечно тестувати оновлення та інсталяції apt без ризику для хоста.
  • Усі зміни ізолюються в upperdir і миттєво відкидаються простим видаленням sandbox.
  • Додатковий захист: policy-rc.d, маскування /sys/firmware та read-only lowerdir.
  • Альтернатива для GUI — Timeshift для швидкого відкату.
  • Це практичні apt команди у поєднанні з потужними можливостями терміналу Linux — безпечно і гнучко.