LINUX.ORG.RU

Как убедить Debian live, созданную пакетом bootcd из системы, установленной на винчестере, загружаться в RAM полностью?

 , , ,


0

2


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

Расковырял установочный диск, посмотрел на пример инициализации файловой системы:

#!/bin/sh -e
# used for initramfs
export PATH
. /lib/debian-installer/init-debug
debugshell "just booted"

mount /run
mkdir -p /run/lock
mount /proc
mount /sys
/lib/debian-installer/start-udev

init='/bin/busybox init'
for i in $(cat /proc/cmdline); do
	case $i in
		init=/init|init=init)
			# Avoid endless loop
			: ;;
		init=*)
			init=${i#init=} ;;
		noshell)
			sed -i '/^tty[23]/s/^/#/' /etc/inittab ;;
	esac
done
debugshell "before init"
exec $init

на конфигурацию загрузчика GRUB

set loopback="findiso=${iso_path}"
export loopback
fi

menuentry "Debian GNU/Linux Live (kernel 5.10.0-20-amd64)" {
  linux  /live/vmlinuz-5.10.0-20-amd64 boot=live components splash quiet "${loopback}"
  initrd /live/initrd.img-5.10.0-20-amd64
}

Пока появилась только одна совершенно бездарная мысль, подсунуть вместо debian-live-11.6.0-amd64-standard/live/filesystem.squashfs свою систему. Но там предыдущая версия ядра (5.10.0-20).

Ваш метод не раз встречал в процессе поиска решения. Если это не слишком долго по времени, не могли бы выложить единой инструкцией применительно к текущему дистрибутиву? Уверен, много людей скажут Вам спасибо. Может отдельной темой на том или ином форуме. Оно того точно стоит.

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

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

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

Грузит в RAM только диск начальной инициализации. Возможно еще ядро. Всю систему точно не грузит.

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

Хорошо. Прописал вообще везде, где нужно и не нужно. И вот нет.

Жесткий диск:

/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet toram"
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.

df -h, после добавления toram

Файловая система Размер Использовано  Дост Использовано% Cмонтировано в
udev               5,6G            0  5,6G            0% /dev
tmpfs              1,2G         8,7M  1,2G            1% /run
/dev/sda1          9,1G         2,2G  6,8G           25% /
tmpfs              5,7G          61M  5,6G            2% /dev/shm
tmpfs              5,0M         4,0K  5,0M            1% /run/lock
tmpfs              1,2G          32K  1,2G            1% /run/user/1000

Флеш-накопитель:

/etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet toram"
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
/isolinux/isolinux.cfg

default linux
timeout 50
prompt 1
# KERNEL: /boot/vmlinuz-5.10.0-21-amd64 /boot/initrd.img-5.10.0-21-amd64
label linux
  kernel /isolinux/vmlinuz
  append initrd=/isolinux/initrd root=auto bootcd=bootcd toram
label hda
  kernel /isolinux/vmlinuz
  append initrd=/isolinux/initrd root=/dev/hda bootcd=bootcd toram
label hdb
  kernel /isolinux/vmlinuz
  append initrd=/isolinux/initrd root=/dev/hdb bootcd=bootcd toram
label hdc
  kernel /isolinux/vmlinuz
  append initrd=/isolinux/initrd root=/dev/hdc bootcd=bootcd toram
label hdd
  kernel /isolinux/vmlinuz
  append initrd=/isolinux/initrd root=/dev/hdd bootcd=bootcd toram
label sr0
  kernel /isolinux/vmlinuz
  append initrd=/isolinux/initrd root=/dev/sr0 bootcd=bootcd toram
label sr1
  kernel /isolinux/vmlinuz
  append initrd=/isolinux/initrd root=/dev/sr1 bootcd=bootcd toram

df -h, после добавления toram

Файловая система Размер Использовано  Дост Использовано% Cмонтировано в
udev               5,6G            0  5,6G            0% /dev
tmpfs              1,2G         8,8M  1,2G            1% /run
/dev/sdb           981M         981M     0          100% /mnt/bootcd.lower
tmpfs              5,7G          29M  5,6G            1% /mnt/bootcd.upper
overlay            5,7G          29M  5,6G            1% /
tmpfs              5,7G          47M  5,6G            1% /dev/shm
tmpfs              5,0M         4,0K  5,0M            1% /run/lock
tmpfs              1,2G          24K  1,2G            1% /run/user/1000
sesshin
() автор топика
Ответ на: комментарий от sesshin

для жесткого диска это работать не будет, что и видно по выхлопу df. Во втором выхлопе видно, что скорее всего работает. Используется overlay, upper смонтирован в tmpfs(ram).

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

На жестком диске показал постольку, поскольку он является базой для cdimage.iso, который создается через sudo bootcdwrite.

sesshin
() автор топика

Как убедить Debian live, созданную пакетом bootcd из системы, установленной на винчестере, загружаться в RAM полностью?

пихнуть iso в memdisk не варик?

kindof
()
Ответ на: комментарий от sesshin

Да, я тупанул. Во втором варианте это стандартная загрузка для live дисков. В выхлопе должен быть - /dev/loop, как пример:

tmpfs           3.9G     0  3.9G   0% /run
/dev/loop0      2.5G  2.5G     0 100% /ro
overlay         3.9G  1.5G  2.5G  38% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
tmpfs           3.9G     0  3.9G   0% /tmp
tmpfs           789M   12K  789M   1% /run/user/1000
wncpw
()
Ответ на: комментарий от kindof

Честно, пока не знаю. Я не могу понять как так могло случиться, что этого нет в конфиге. Или, еще раз, есть но не вижу?

sesshin
() автор топика

/etc/bootcd/bootcdwrite.conf

# vim: set filetype=sh :
#        file: bootcdwrite.conf
#   copyright: Bernd Schumacher <bernd.schumacher@hpe.com> (2001-2020)
#     license: GNU General Public License, version 3
# description: bootcdwrite.conf - default config for bootcdwrite
#
# SRCDISK
#
#   The Variables SRCDISK defines the root of the files
#   that will be copied.
#
#   For example, to build an image from a remote system,
#   export root-directory with nfs,
#   mount it locally to </mnt/remote> and add::
#
#     SRCDISK=/mnt/remote
#
#   It is added as prefix to KERNEL, INITRD, DISABLE_CRON and NOT_TO_CD,
#   if this are relativ paths (without starting "/")
#
#   Default::
#
#     SRCDISK=/
#
SRCDISK="/"
#
# KERNEL
#
#   This defines the kernel which is used.
#   More kernels can be defined with KERNEL<number>
#   The numbers have to start with 1 and can continue with 2, 3, 4 ... ::
#
#     KERNEL1=/boot/vmlinuz-2.6.18-3-686-bigmem
#     KERNEL2=/boot/vmlinuz-4.19.0-5-amd64
#
#   Default::
#
#     KERNEL=vmlinuz
#
KERNEL="/vmlinuz"
#
# APPEND
#
#   This can be used to define additional options for the kernel
#   For more kernels APPEND<number> can be defined::
#
#     APPEND1="vga=normal nomodeset"
#     APPEND2=""
#
#   Default::
#
#     APPEND=""
#
APPEND=""
#
# INITRD
#
#   This defines the path to initrd.
#   For more kernels INITRD<number> can be defined::
#
#     INITRD1=/boot/initrd.img-2.6.18-3-686-bigmem
#     INITRD2="initrd.img"
#
#   Default::
#
#     INITRD="initrd.img"
#
INITRD="/initrd.img"
#
# KLABEL
#
#   This defines a label for the kernel to be choosen when booting from bootcd.
#   Can defines multiple kernels with <KERNEL<number>> and label <KLABEL<number>>::
#
#     KLABEL1=686-3
#     KERNEL1=/boot/vmlinuz-2.6.18-3-686-bigmem
#     INITRD1=/boot/initrd.img-2.6.18-3-686-bigmem
#     APPEND1=
#
#   Default::
#
#     KLABEL=linux
#
KLABEL="linux"
#
# DISPLAY
#
#   Text files to display at boottime (see syslinux doku)
#   When pressing F1 at boot time the file defined by <DISPLAY> is shown.
#   F2 will show the file defined by <DISPLAY2> and F3
#   will show the file defined by <DISPLAY3>
#   F10 lists all people mentioned in <changelog>.
#
#   The text file <kernelinfo> is replaced with a file which includes kernelinfo.
#
#   Default::
#
#     DISPLAY="/usr/share/bootcd/default.txt"
#     DISPLAY2="kernelinfo"
#
DISPLAY="/usr/share/bootcd/default.txt"
#
# TYP
#
#   TYP can be defined as CD or DVD to get a warning if the size of
#   the image will be larger as the specified medium.
#
#   Default::
#
#     TYP=DVD
#
TYP="DVD"
#
# CDDEV
#
#   Specifies one or more CD devices to boot from. The first one is the default.
#   auto tries to find the bootcd on all SCSI and IDE CDROMS
#
#   Default::
#
#     CDDEV="auto /dev/hda /dev/hdb /dev/hdc /dev/hdd /dev/sr0 /dev/sr1"
#
CDDEV="auto /dev/hda /dev/hdb /dev/hdc /dev/hdd /dev/sr0 /dev/sr1"
#
# DO_CHECK
#
#   Enables some checks or not.
#   To check for possible problems can take a long time, but it is recommended to do the checks.
#
#   Default::
#
#     DO_CHECK=yes
#
DO_CHECK="yes"
#
# NOT_TO_CD
#
#   Add directories which should be excluded from bootcd.
#   Directories are separated by spaces.
#   SRCDISK will be automatically added to each path that does not start with "/".
#
#   Default::
#
#     NOT_TO_CD=""
#
NOT_TO_CD=""
#
# SSHHOSTKEY
#
#   If using ssh it is helpful to have a unique ssh hostkey for each CD.
#   To be generated at burntime::
#   Default::
#
#     SSHHOSTKEY=yes
#
SSHHOSTKEY="yes"
#
# UDEV_FIXNET
#
#   If the network interfaces are hardwired in
#   /etc/udev/rules.d/xx_persistent-net.rules
#   they can removed on bootcd, with:
#   Default::
#
#     UDEV_FIXNET="yes"
#
UDEV_FIXNET="yes"
#
# VAR
#
#   This defines the directoy where the image resists after build.
#   Default::
#
#     VAR=/var/spool/bootcd
#
VAR="/var/spool/bootcd"
#
# FLOPPY_RUNTIME_DEV
#
#   When you booting from cd changes will be read from this device.
#   Without a floppy::
#
#     FLOPPY_RUNTIME_DEV=""
#
#   Default::
#
#     FLOPPY_RUNTIME_DEV=/dev/fd0
#
FLOPPY_RUNTIME_DEV="/dev/fd0"
#
# BOOTCDFLOPPY
#
#   If the system should boot the kernel from floppy.
#   This reduces space on floppy used by bootcdflopcp.
#   For this to work FLOPPY_CREATE_DEV has to be specified::
#
#     BOOTFLOPPY=yes|no
#
#   Default::
#
#     BOOTFLOPPY=no
#
BOOTCDFLOPPY=""
#
sesshin
() автор топика
#
# BOOT_ONLY_WITH_FLOPPY
#
#   If you several machines will be booted from the same bootcd, you must have
#   each one can hav separat configuraiton (exp: /etc/network/interfaces) on floppy.
#   If the floppy can not be mounted, it may be a good idea to stop booting with::
#
#     BOOT_ONLY_WITH_FLOPPY=yes
#
#   Default::
#
#     BOOT_ONLY_WITH_FLOPPY=no
#
BOOT_ONLY_WITH_FLOPPY="no"
#
# CLEAN_VAR
#
#   delete some chached files in /var with:
#   Default::
#
#     CLEAN_VAR=yes
#
CLEAN_VAR="yes"
#
# TO_FSTAB
#
#   To add addiditionel entries to fstab. Use for example::
#
#     TO_FSTAB="/dev/hdc1 /home ext3 defaults 1 1
#
#   Default::
#
#     TO_FSTAB=""
#
TO_FSTAB=""
#
# NOTCOMPRESSED
#
#   Files or Directory-Trees that should never be compressed on CD can be listed here.
#   This can be used for documentation which should be visible without installing the bootcd.
#   Default::
#
#     NOTCOMPRESSED=""
#
NOTCOMPRESSED="/home"
#
# DISABLE_CRON
#
#   Files listed will be on the cdrom with a .no_run_on_bootcd suffix so run-parts won't execute them.
#   The original file will be a link to /bin/true.
#   This is meant for cron maintenance scripts which are useless on a static cdrom.
#   The default is to disable the daily find, standard and security scripts.
#   With bootcd2disk this files will be reactivated again.
#
#   Default::
#
#     DISABLE_CRON="etc/cron.daily/find etc/cron.daily/standard etc/cron.daily/security"
#
DISABLE_CRON="/etc/cron.daily/find /etc/cron.daily/standard /etc/cron.daily/security"
#
# MKISOFS_CHNG
#
#   With this variable some options given to mkisofs by bootcdwrite can be changed.
#
#   Example: To use <-opt1> and <-opt2 <value>> and
#   to not use any previous <-opt1 [<value>...]>, <-opt2 [<value...>]> and
#   <-opt3 [<value>...]> and to leave any other options as defined::
#
#     MKISOFS_CHNG="-opt1 -opt2 <value> !-opt3"
#
#   Default::
#
#     MKISOFS_CHNG=""
#
MKISOFS_CHNG=""
#
# extra_changes()
#
#   It is possible to define a function called extra_changes to have some
#   files modified on the ISO image. Here is an example::
#
#     extra_changes() {
#       bootcd_global VAR
#
#       echo "noname" >$VAR/changes/etc/hostname
#
#       mkdir -p $VAR/changes/etc/network
#       ( echo "auto lo"
#         echo "iface lo inet loopback"
#         echo "" echo "auto eth0"
#         echo "iface eth0 inet static"
#         echo "       address 0.0.0.0"
#         echo "       netmask 255.255.255.0"
#       ) >$VAR/changes/etc/network/interfaces
#
#       echo "127.0.0.1 localhost noname" >$VAR/changes/etc/hosts
#
#       cat $SRCDISK/etc/passwd |
#       grep -v -e "^bs:" -e "^bianca:" -e "^tim:" >$VAR/changes/etc/passwd
#
#       cat $SRCDISK/etc/shadow |
#       grep -v -e "^bs:" -e "^bianca:" -e "^tim:" >$VAR/changes/etc/shadow
#
#       cat $SRCDISK/etc/group |
#       grep -v -e "^bs:" -e "^bianca:" -e "^tim:" >$VAR/changes/etc/group
#     }
#
#   Default::
#
#     # make sure the function is not defined
#     unset -f extra_changes
#
extra_changes() { :; }
#
# BOOTCDMODPROBE
#
#   If booted from initrd bootcd has to load the necessary modules.
#   If only modules provided by initramfs-tools are needed you can
#   specify "standard" here::
#
#     BOOTCDMODPROBE=standard
#
#   If bootcd should try extra hard to load
#   neccessary modules you can specify "bootcd" here.
#   Bootcd will use discover for this purpose. So discover has to be installed::
#
#     BOOTCDMODPROBE=bootcd
#
#   If you specify auto, bootcd will check if discover is installed.
#   If it is installed BOOTCDMODPROBE=bootcd will be set, if not
#   BOOTCDMODPROBE=standard will be set.
#   Be aware that people have reported, that sometimes BOOTCDMODPROBE=bootcd
#   may not work but sometimes it is needed.
#   Default::
#
#     BOOTCDMODPROBE=auto
#
BOOTCDMODPROBE="auto"
#
sesshin
() автор топика

Cразу грузить в ram (с диска) не вариант?, вот скрипт: https://www.linux.org.ru/forum/linux-install/10519442#comments

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

Ну по факту, нужно переписать логику этого сценария:

/usr/share/initramfs-tools/scripts/local-bottom/bootcdoverlayfs

вместо монтирования «флешки» как bootcd.lower, перенести содержимое в RAM (диск | squashfs)

#!/bin/sh
[ -f /scripts/functions ] && . /scripts/functions

PREREQ=""
prereqs()
{
    echo "$PREREQ"
}

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

# chkerr <EXIT CODE> <action performed>
chkerr()
{
    e=$1
    shift
    if [ $e -ne 0 ]; then
      echo "bootcdoverlayfs: ERROR $e while running: $*"
      echo "try to fix and exit"
      /bin/sh
    fi
}

getiso()
{
  sed -n "s/^.*\<root=iso:\([^ :]*\):\([^ ]*\)\>.*$/\2/p"
}

modprobe aufs || true
modprobe overlay || true

if [ "$(grep "\<bootcd=" /proc/cmdline)" ]; then
    echo "bootcdoverlayfs rootmnt=<$rootmnt>"

    iso="$(cat /proc/cmdline | getiso)"
    if [ "$iso" ]; then
      mkdir /bootcd.disk_with_iso
      mount -o move ${rootmnt} /bootcd.disk_with_iso
      chkerr $? "mount -o move ${rootmnt} /bootcd.disk_with_iso"

      modprobe loop
      mount -o loop -t iso9660 /bootcd.disk_with_iso/${iso} ${rootmnt}
      chkerr $? "mount -o loop -t iso9660 /bootcd.disk_with_iso/${iso} ${rootmnt}"
    fi

    mkdir /bootcd.upper
    mount -t tmpfs tmpfs /bootcd.upper
    chkerr $? "mount -t tmpfs tmpfs /bootcd.upper"

    mkdir /bootcd.lower
    mount -o move ${rootmnt} /bootcd.lower
    chkerr $? "mount -o move ${rootmnt} /bootcd.lower"

    mkdir /overlayfs

    if [ "$(cat /proc/filesystems | grep "\<aufs\>")" ]; then
      mount -t aufs -o dirs=/bootcd.upper:/bootcd.lower=ro aufs /overlayfs
      chkerr $? "mount -t aufs -o dirs=/bootcd.upper:/bootcd.lower=ro aufs /overlayfs"

    elif [ "$(cat /proc/filesystems | grep "\<overlay\>")" ]; then
      mkdir /bootcd.upper/upper
      mkdir /bootcd.upper/work
      mount -t overlay -o lowerdir=/bootcd.lower,upperdir=/bootcd.upper/upper,workdir=/bootcd.upper/work overlay /overlayfs
      chkerr $? "mount -t overlay -o lowerdir=/bootcd.lower,upperdir=/bootcd.upper/upper,workdir=/bootcd.upper/work overlay /overlayfs"

    else
      chkerr 1 "no aufs and no overlay in /proc/filesystems"
    fi

    mkdir -p /overlayfs/mnt/bootcd.lower
    mount -o move /bootcd.lower /overlayfs/mnt/bootcd.lower
    chkerr $? "mount -o move /bootcd /overlayfs/mnt/bootcd.lower"

    if [ "$iso" ]; then
      mkdir -p /overlayfs/mnt/bootcd.disk_with_iso
      mount -o move /bootcd.disk_with_iso /overlayfs/mnt/bootcd.disk_with_iso
      chkerr $? "mount -o move /bootcd.disk_with_iso /overlayfs/mnt/bootcd.disk_with_iso"
    fi

    mkdir -p /overlayfs/mnt/bootcd.upper
    mount -o move /bootcd.upper /overlayfs/mnt/bootcd.upper
    chkerr $? "mount -o move /bootcd.upper /overlayfs/mnt/bootcd.upper"

    mount -o move /overlayfs ${rootmnt}
    chkerr $? "mount -o move /overlayfs ${rootmnt}"
fi

exit 0

Сижу уже второй день с этим скриптом и Гуглом в обнимку.

sesshin
() автор топика

Сделал в итоге через Linux Live Kit. Так удобнее всего сохранять изменения.

sesshin
() автор топика

Попутно нашел несколько интересных вариантов, сложу сюда, чтобы не потерять, ну и может понадобится когда кому.

sesshin
() автор топика

Script to toggle overlayfs for rootfs in Debian https://gist.github.com/jfernandz/bfb1285114c136ac2b86320cb06c3904

#!/bin/sh
# Part of raspi-config https://github.com/RPi-Distro/raspi-config
#
# See LICENSE file for copyright and license details


INTERACTIVE=True
ASK_TO_REBOOT=0

get_overlay_now() {
  grep -q "boot=overlay" /proc/cmdline
}

get_overlay_conf() {
  grep -q "boot=overlay" /boot/grub/grub.cfg
}

get_bootro_now() {
 findmnt /boot | grep -q " ro,"
}

get_bootro_conf() {
  grep /boot /etc/fstab | grep -q "defaults.*,ro"
}

enable_overlayfs() {
  KERN=$(uname -r)
  INITRD=initrd.img-"$KERN"-overlay

  # mount the boot partition as writable if it isn't already
  if get_bootro_now ; then
    if ! mount -o remount,rw /boot 2>/dev/null ; then
      echo "Unable to mount boot partition as writable - cannot enable"
      return 1
    fi
    BOOTRO=yes
  else
    BOOTRO=no
  fi

  cat > /etc/initramfs-tools/scripts/overlay << 'EOF'
# Local filesystem mounting			-*- shell-script -*-

#
# This script overrides local_mount_root() in /scripts/local
# and mounts root as a read-only filesystem with a temporary (rw)
# overlay filesystem.
#

. /scripts/local

local_mount_root()
{
	local_top
	local_device_setup "${ROOT}" "root file system"
	ROOT="${DEV}"

	# Get the root filesystem type if not set
	if [ -z "${ROOTFSTYPE}" ]; then
		FSTYPE=$(get_fstype "${ROOT}")
	else
		FSTYPE=${ROOTFSTYPE}
	fi

	local_premount

	# CHANGES TO THE ORIGINAL FUNCTION BEGIN HERE
	# N.B. this code still lacks error checking

	modprobe ${FSTYPE}
	checkfs ${ROOT} root "${FSTYPE}"

	# Create directories for root and the overlay
	mkdir /lower /upper

	# Mount read-only root to /lower
	if [ "${FSTYPE}" != "unknown" ]; then
		mount -r -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} /lower
	else
		mount -r ${ROOTFLAGS} ${ROOT} /lower
	fi

	modprobe overlay || insmod "/lower/lib/modules/$(uname -r)/kernel/fs/overlayfs/overlay.ko"

	# Mount a tmpfs for the overlay in /upper
	mount -t tmpfs tmpfs /upper
	mkdir /upper/data /upper/work

	# Mount the final overlay-root in $rootmnt
	mount -t overlay \
	    -olowerdir=/lower,upperdir=/upper/data,workdir=/upper/work \
	    overlay ${rootmnt}
}
EOF

  # add the overlay to the list of modules
  if ! grep overlay /etc/initramfs-tools/modules > /dev/null; then
    echo overlay >> /etc/initramfs-tools/modules
  fi

  # build the new initramfs
  update-initramfs -c -k "$KERN"

  # rename it so we know it has overlay added
  mv /boot/initrd.img-"$KERN" /boot/"$INITRD"

  # there is now a modified initramfs ready for use...

  # modify initrd in /boot/grub/grub.conf
  sed -i /boot/grub/grub.cfg -e 's/initrd\.img-'"$KERN"'/'"$INITRD"'/'

  # modify command line
  if ! grep -q "boot=overlay" /boot/grub/grub.cfg ; then
      sed -i '/vmlinuz-'"$KERN"'/ s/$/ boot=overlay/' /boot/grub/grub.cfg
  fi

  if [ "$BOOTRO" = "yes" ] ; then
    if ! mount -o remount,ro /boot 2>/dev/null ; then
        echo "Unable to remount boot partition as read-only"
    fi
  fi
}

is_uname_current() {
  test -d "/lib/modules/$(uname -r)"
  return $?
}

disable_overlayfs() {
  KERN=$(uname -r)
  INITRD=initrd.img-"$KERN"-overlay
  # mount the boot partition as writable if it isn't already
  if get_bootro_now ; then
    if ! mount -o remount,rw /boot 2>/dev/null ; then
      echo "Unable to mount boot partition as writable - cannot disable"
      return 1
    fi
    BOOTRO=yes
  else
    BOOTRO=no
  fi

  # remove the overlay to the list of modules
  if grep -q "overlay" /etc/initramfs-tools/modules ; then
    sed -i /etc/initramfs-tools/modules -e '/overlay/d'
  fi
  if update-initramfs -c -k "${KERN}" ; then
    update-initramfs -d -k "${KERN}-overlay"
  fi

  # modify the initrd in /boot/grub/grub.cfg
  sed -i /boot/grub/grub.cfg -e 's/'"$INITRD"'/initrd\.img-'"$KERN"'/'

  # modify command line
  sed -i '/vmlinuz-'"$KERN"'/ s/ boot=overlay//' /boot/grub/grub.cfg

  if [ "$BOOTRO" = "yes" ] ; then
    if ! mount -o remount,ro /boot 2>/dev/null ; then
        echo "Unable to remount boot partition as read-only"
    fi
  fi
}

enable_bootro() {
  if get_overlay_now ; then
    echo "Overlay in use; cannot update fstab"
    return 1
  fi
  sed -i /etc/fstab -e "s/\(.*\/boot.*\)defaults\(.*\)/\1defaults,ro\2/"
}

disable_bootro() {
  if get_overlay_now ; then
    echo "Overlay in use; cannot update fstab"
    return 1
  fi
  sed -i /etc/fstab -e "s/\(.*\/boot.*\)defaults,ro\(.*\)/\1defaults\2/"
}

do_finish() {
  if [ $ASK_TO_REBOOT -eq 1 ]; then
    whiptail --yesno "Would you like to reboot now?" 20 60 2
    if [ $? -eq 0 ]; then # yes
      sync
      reboot
    fi
  fi
  exit 0
}

do_overlayfs() {
  DEFAULT=--defaultno
  CURRENT=0
  STATUS="disabled"

  if [ "$INTERACTIVE" = True ] && ! is_uname_current; then
    whiptail --msgbox "Could not find modules for the running kernel ($(uname -r))." 20 60 1
    return 1
  fi

  if get_overlay_conf; then
    DEFAULT=
    CURRENT=1
    STATUS="enabled"
  fi
  if [ "$INTERACTIVE" = True ]; then
    whiptail --yesno "Would you like the overlay file system to be enabled?" $DEFAULT 20 60 2
    RET=$?
  else
    RET=$1
  fi
  if [ $RET -eq $CURRENT ]; then
    if [ $RET -eq 0 ]; then
      if enable_overlayfs; then
        STATUS="enabled"
        ASK_TO_REBOOT=1
      else
        STATUS="unchanged"
      fi
    elif [ $RET -eq 1 ]; then
      if disable_overlayfs; then
        STATUS="disabled"
        ASK_TO_REBOOT=1
      else
        STATUS="unchanged"
      fi
    else
      return $RET
    fi
  fi
  if [ "$INTERACTIVE" = True ]; then
    whiptail --msgbox "The overlay file system is $STATUS." 20 60 1
  fi
  if get_overlay_now ; then
    if get_bootro_conf; then
      BPRO="read-only"
    else
      BPRO="writable"
    fi
    whiptail --msgbox "The boot partition is currently $BPRO. This cannot be changed while an overlay file system is enabled." 20 60 1
  else
    DEFAULT=--defaultno
    CURRENT=0
    STATUS="writable"
    if get_bootro_conf; then
      DEFAULT=
      CURRENT=1
      STATUS="read-only"
    fi
    if [ "$INTERACTIVE" = True ]; then
      whiptail --yesno "Would you like the boot partition to be write-protected?" $DEFAULT 20 60 2
      RET=$?
    else
      RET=$1
    fi
    if [ $RET -eq $CURRENT ]; then
      if [ $RET -eq 0 ]; then
        if enable_bootro; then
          STATUS="read-only"
          ASK_TO_REBOOT=1
        else
          STATUS="unchanged"
        fi
      elif [ $RET -eq 1 ]; then
        if disable_bootro; then
          STATUS="writable"
          ASK_TO_REBOOT=1
        else
          STATUS="unchanged"
        fi
      else
        return $RET
      fi
    fi
    if [ "$INTERACTIVE" = True ]; then
      whiptail --msgbox "The boot partition is $STATUS." 20 60 1
    fi
  fi
  do_finish
}

do_overlayfs

sesshin
() автор топика

Booting Debian from a RAM disk http://reboot.pro/topic/14547-linux-load-your-root-partition-to-ram-and-boot-it/ https://gist.github.com/avinash-oza/9791c4edd78a03540dc69d6fbf21bd9c


# Booting Debian from a RAM disk #
This guide is adapted from http://reboot.pro/topic/14547-linux-load-your-root-partition-to-ram-and-boot-it/

What you need:
* lots of RAM
* Debian based distribution or any that supports booting from initramfs
* mkinitramfs or a tool to build a new initramfs
* some linux knowledge
* no need to create an image
* no need for Grub4Dos
* no need for a "special driver"

Step 1:
Choose a distribution thats supports booting from initramfs. (like ubuntu)

Step 2:
Install to harddisk. Make sure you split it into multiple partitions (/, /boot, /home, swap, ...).

Step 3:
Boot your new system, install updates, drivers if neccessary (this will improve performance), strip it down to the minimum. Every file will be loaded to RAM ! A fresh install uses about 2 GB auf harddisk-space.

Step 4:
modify `/etc/fstab` :

`cp /etc/fstab /etc/fstab.bak` find the line specifing the root partition and change it in:
none / tmpfs defaults 0 0* save

Step 5:
edit the local script in your initramfs:
cd /usr/share/initramfs-tools/scripts/* make a backup of /usr/share/initramfs-tools/scripts/local
cp local local.bak* modify local, find this line:
```
# FIXME This has no error checking

# Mount root

mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt}
```
change it to:
```
# FIXME This has no error checking

# Mount root

#mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt}

mkdir /ramboottmp

mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} /ramboottmp

mount -t tmpfs -o size=100% none ${rootmnt}

cd ${rootmnt}

cp -rfa /ramboottmp/* ${rootmnt}

umount /ramboottmp
```
* save
* execute, or rebuild initramfs
mkinitramfs -o /boot/initrd.img-ramboot* replace modified local with original file
cp -f local.bak localStep 6:
* modify this file (needs a better solution)
/boot/grub/grub.cfg* copy the first boot entry and replace the /initrd line with this:
/initrd /boot/initrd.img-ramboot* label the new entry as RAMBOOT
This will boot our generated initramfs instead the original one.
Step 7:
* reboot
* choose standart boot (no ramdisk)
* choose RAMBOOT and all your files on the root partition will be loaded to a tmpfs

https://gist.github.com/avinash-oza/9791c4edd78a03540dc69d6fbf21bd9c?permalin...

For me—running Debian 11 (bullseye)—this line:

/initrd /initrd.img-ramboot

should be:

/initrd /boot/initrd.img-ramboot

Otherwise, it works perfectly on my machine.
sesshin
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.