Start | Kontakt |
Goal is to convert an existing system to have the root and swap partition of Debian encrypted with LUKS.
On power-up/reboot the root partition is unlocked via an SSH session by an administrator and Debian continues to boot normally.
The SSH session and unlock functionality will be provided by the InitRAMFS on boot.
The conversion process is also working on a remote server with SSH access only.
First a temporary Mini-Debian is created inside the existing swap partition to have free access onto the root partition.
Then the existing root partition is reduced in size, to generate free space for a temporary partition, which will temporary hold the files of the root partition.
An unencrypted boot partition is needed to hold the InitRAMFS.
If a boot partition is not available or too small (<100MB), then the old root partition is deleted and a new boot plus root partition are created.
The root partition is then encrypted with LUKS and all files are copied back from the temporary exchange.
After this the temporary partition is deleted and the root partition is resized to its maximum extend.
To decrypt the root partition via an SSH session the init ramdisk is extended with a DropBear script, which also provides a simple unlock script.
Note that the boot partition has to be (or stay) unencrypted.
After a successful boot with the encrypted root partition the Mini-Debian is removed and an encrypted swap partition is established.
The normal init ramdisk is regenerated too, so that kernel and ramdisk updates just work like normal.
A fallback boot option is always during the creation process.
During the setup process Grub's savedefault feature is used to get the system back to it's previous state after another reboot.
Tested with the following Debian releases:
Make up your mind how the new partitioning should look like.
This includes partition sizes, positions, mount points and which partitions will be encrypted.
Typical options are separate home (/home) and var (/var) partitions.
These can be created after completion of the encrypted root partition.
Of course empty space has to be left for them, or handle them when copying data from the temporary file system during the process.
Separate partitions for /var, /home, etc. are not part of this guide.
If using MBR partions then use an extended partition to have more than 4 primary partitions.
Additionally re-partioning allows the re-alignment to 1MB for hard disks with physical sectors greater than 512 bytes. Re-aligning existing partitions like /boot are not part of this guide.
If LVM is already used, then thoroughly plan all movements of logical volumes between physical volumes.
This scenario is not supported by this guide.
An LVM setup can be very complicated (multiple pvs/devs in one vg, multiple vgs on one dev, and normally all with different sizes).
Lots of manual steps will be necessary that cannot be explained here.
The main concept is to shrink all filesystems of the logical volumes inside the volume group where the root filesystems resides, then shrink the logical volumes (with some buffer) via lvresize.
The swap volume can be disabled and removed (also from /etc/fstab) to get some more free space to work with.
After that defrag/rearrange physical volumes via pvdisplay & pvmove before shrinking them (again with some buffer) via pvresize, then shrink the devices of the physical volumes (again with some buffer).
Create a new partition at the end of the drive with roughly 3 GiB for a LVM physical volume to hold the mini Debian system via fdisk/gdisk & pvcreate.
Add the physical volume to the existing volume group via vgextend, create a logical volume of 2.5 GiB on the new physical volume.
Check it and otherwise pvmove it to the new physical volume.
After Mini-Debian runs shrink all filesystems of the logical volumes on the old physical volume, then defrag/rearrange the old physical volume to finally shrink it and its sub devices.
After that create again a new partition at the end of the drive for a LVM physical volume to hold the logical volumes from the old physical volume via fdisk/gdisk & pvcreate.
Now comes the advantage of LVM: no need to copy the files with cp, just pvmove the logical volumes from the old physical volume to the new temporary one.
Remove the old physical volume via vgreduce & pvremove, create a LUKS volume on its sub devices, create again a physical volume on them, add to the volume group and move logical volumes back again.
Destroy the temporary physical volume and extend the old one as far as possible.
Get the old system running, then destroy the Mini-Debian physical volume and extend the old physical volume further.
Take extra caution with the swap partition.
The swap partition size is typically 1.3x of the RAM size.
If the machine shall be put to standyby mode S4 (=suspend to disk) then the encryption key for the swap partition has to be static. The swap partition must be able to hold at least the whole RAM, so take planned or possible upcoming RAM enhancements into account.
Otherwise disable resume in GRUB and /etc/initramfs-tools/conf.d/resume, then it is even possible to use a random key for the swap partition.
With a typical LVM on LUKS setup (LUKS+LVM) there are no issues as the swap data itself is not encrypted, just the underlying LVM physical volume.
Note that the keyscript option in /etc/crypttab is not supported with systemd init system which came with Debian 8.0 "Jessie", e.g. for /lib/cryptsetup/scripts/decrypt_* scripts (see Jessie Ugrade Notes 5.6 and https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=618862#124).
Instead use an explicit key file on the enrypted root partition, e.g. /etc/luks.key created via /lib/cryptsetup/scripts/decrypt_derived md1_crypt >/etc/luks.key, and specify the key file in /etc/crypttab:
md2_crypt UUID=... /etc/luks.key luks
Read this guide thoroughly and several times.
Look out for special cases that apply to the actual situation of the target system.
Adopt this guide to the wanted partition scheme and actual devices (/dev/sda or /dev/hda) and create a text file with all necessary commands.
Prepare a Virtual Machine with the current setup of the real target machine, create a snapshot and repeat this process until it is 100% working and documented.
Take care about some specialities when using Debian in a Virtual Machine.
On questions checkout the man pages, if still in doubt then search the net, if that fails contact me.
Continue to do this on the target system at your own risk.
Notes:
With direct access to the hardware the easiest way to resize, move, delete and create partitions is to use a live boot cd from GParted.
An additional hard disk (e.g. via USB) can be used for the temporary space to avoid extra partioning steps.
This allows to directly create the final new partioning scheme without in-between steps.
df -h / # example result: # Filesystem Size Used Avail Use% Mounted on # /dev/sda3 140.0G 17G 113G 11% /
lvs --units m # example result: # LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert # rootfs debian-test -wi-ao---- 38144.00m # swap_1 debian-test -wi-ao---- 12068.00m mount | grep -e '^/dev/' # example result: #/dev/mapper/debian--test-rootfs on / type ext4 (rw,relatime,errors=remount-ro,data=ordered) df -h / # example result: # Filesystem Size Used Avail Use% Mounted on # /dev/dm-0 37G 1.1G 34G 3% / vgs --units m # example result: # VG #PV #LV #SN Attr VSize VFree # debian-test 1 2 0 wz--n- 50212.00m 0m pvs --units m # example result: # PV VG Fmt Attr PSize PFree # /dev/md1 debian-test lvm2 a-- 50212.00m 0m
[ -d /root/bin ] || { install -v -d /root/bin; echo 'Log out, then back in' ; printf '\a' ; } echo "${PATH}" | grep -q -F -e '/root/bin' && echo '/root/bin present in PATH' || { echo 'Check that you are root, if so then check .profile, .bash_profile, .bashrc and similar. Maybe adopt/update them from /etc/skel.' ; printf '\a' ; }
Make sure the target system runs with the latest packages.
DEBVERSION="$( cut -f 1 -d '.' /etc/debian_version )" echo "Debian version is ${DEBVERSION}" # check /etc/apt/sources.list and source.list.d/* that all entries are present and complete (e.g. component non-free for firmware) cat /etc/apt/sources.list /etc/apt/sources.list.d/* apt-get update apt-get install debian-archive-keyring ; # especially important for archived releases, e.g. etch, lenny, etc apt-get update apt-get safe-upgrade || apt-get upgrade apt-get dist-upgrade reboot ; # only necessary if any packages were upgraded # enable en_US.UTF-8 locale for correct parsing, also most help pages are in English sed -i -e "s/[[:space:]]*#[[:space:]]*\(en_US\.UTF-8\)/\1/" /etc/locale.gen locale-gen
DEBVERSION="$( cut -f 1 -d '.' /etc/debian_version )" ; \ echo "Debian version is ${DEBVERSION}" [ "${DEBVERSION}" -le 5 ] && { pkg='lsb-release' apt-get install ${pkg} } DEBRELEASE="$( lsb_release -c -s )" ; \ [ -n "${DEBRELEASE}" ] && echo "Debian release is ${DEBRELEASE}" || { echo 'Please set DEBRELEASE manually (e.g. woody, stable, testing, unstable, etc.)' ; printf '\a' ; } unset DEBLINUX ; \ if [ "${DEBVERSION}" -le 6 ] ; then DEBLINUX="linux-image-$( uname -r | sed -e 's#\([^.]*.[^.]*\).*-\([^-]*\)$#\1-\2#' )" else DEBLINUX="linux-image-$( uname -r | grep -o -e '[^-]*$' )" fi ; \ [ -n "${DEBLINUX}" ] && echo "Debian Linux Image is ${DEBLINUX}" || { echo 'Please set DEBLINUX manually (check dpkg -l | linux-image)' ; printf '\a' ; } cat > /root/bin/luks_debian.inc << __EOF echo 'Setting Debian vars...' 1>&2 DEBVERSION='${DEBVERSION}' DEBRELEASE='${DEBRELEASE}' DEBLINUX='${DEBLINUX}' FDISKCPARM='$( [ "${DEBVERSION}" -ge 6 ] && echo '-c' )' DEBOOTSTRAPOPTS='$( [ "${DEBVERSION}" -ge 5 ] && echo '--components=main,contrib,non-free' )' CALL_ENV='env LANG=en_US.UTF-8 LANGUAGE=en_US.UTF-8' __EOF chmod ug=rw,o= /root/bin/luks_*.inc
The InitRAMFS tools are necessary to create or update an InitRAMFS.
The small SSH server DropBear allows to log into the system while the InitRAMFS is waiting for the root partition to be unlocked.
Note that DropBear before Debian 5.0 Lenny did not use /dev/urandom, which was an issue when used in an InitRAMFS.
So on Debian 4.0 "Etch", 3.1 "Sarge", 3.0 "Woody" or earlier DropBear has to be compiled from modified source.
Busybox provides a small shell environment to run scripts and provide a shell for login.
Cryptsetup provides all tools for managing encrypted partitions and unlocking them from an InitRAMFS.
LVM2 provides all tools for LVM management and MDAdm all tools for software RAID management.
Util-linux provides fdisk for DOS/MBR partioning, while PartEd supports both DOS/MBR and GPT partioning, but PartEd is not recommended (see above). gdisk supports only GPT partitioning.
Psmisc provides some shell tools that are needed for several tasks.
Screen allows to run the shell separately from your direct login, so that a network breakdown will not stop the commands you issued, therefore reducing the risk of creating inconsistent states.
Additionally the tool script from the BSDUtils package logs all the console input and output, so that the complete process is protocolled and helps in solving issues.
Sed is used to change config files via commands to reduce manual errors (typos, etc.).
LSB is used to determine the Debian release.
Last but not least DeBootStrap allows to setup a Debian system in another directory, needed for creating the temporary boot system in the existing swap partition.
Busybox, DropBear and Cryptsetup will trigger an update of the InitRAMFS.
Debian 6.0 "Squeeze" will create new server SSH keys for the InitRAMFS, so the private key of the real system will be on the encrypted root partition only.
Additionally a private and public SSH key is generated for the root user in /etc/dropbear-initramfs (since Debian 9.0 Stretch; previously /etc/initramfs-tools/root/.ssh).
If you want to use this extra key, then copy it to your PC.
Maintain authorized_keys to your liking, e.g. remove the line for that generated root user key and/or add lines for other keys that shall be allowed to access the InitRAMFS.
If authorized_keys is deleted, then updating the InitRAMFS will recreate a new key pair for the root user of the InitRAMFS.
Update the InitRAMFS to include all changes and look for errors.
On Debian 5.0 "Lenny " and earlier we will mimic the same behaviour manually.
# create backup of initramdisk cp -av /boot/initrd.img-$(uname -r) /boot/initrd.img-$(uname -r).oldroot.org for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done ## check /etc/apt/sources.list and source.list.d/* that all entries are present and complete (e.g. component non-free for firmware) pkg='cryptsetup mdadm lvm2 initramfs-tools os-prober psmisc busybox util-linux parted lsb-base lsb-release screen bsdutils sed debootstrap' ; \ [ "${DEBVERSION}" -ge 5 ] && pkg="${pkg:+${pkg} }dropbear" ; : \ ## before Debian 5.0 "Lenny" DropBear has to be build with a small change ; \ [ "${DEBVERSION}" -ge 7 ] && pkg="${pkg:+${pkg} }gdisk" ; \ echo "${pkg}" apt-get install ${pkg} for PACKAGE in ${pkg} do dpkg-query -s "${PACKAGE}" 1>/dev/null 2>&1 DOINSTALL=$? [ "${DOINSTALL}" -ne 0 ] && break done ; \ [ "${DOINSTALL}" -ne 0 ] && { echo 'Not all packages got installed. Check APT setup and retry.' ; printf '\a' ; } ## build DropBear for Debian 4.0 or earlier - part 1 "download" [ "${DEBVERSION}" -le 4 ] && { pkg='devscripts build-essential' apt-get install ${pkg} : for PACKAGE in ${pkg} do dpkg-query -s "${PACKAGE}" 1>/dev/null 2>&1 DOINSTALL=$? [ "${DOINSTALL}" -ne 0 ] && break done [ "${DOINSTALL}" -ne 0 ] && { echo 'Not all packages got installed. Check APT setup and retry.' ; printf '\a' ; } } [ "${DEBVERSION}" -le 4 ] && { nano /etc/apt/sources.list cd /var/tmp apt-get build-dep dropbear : apt-get source dropbear nano /etc/apt/sources.list } ## build DropBear for Debian 4.0 or earlier - part 2 "build" [ "${DEBVERSION}" -le 4 ] && { cd /var/tmp cd dropbear-*/ grep -n -e '/dev/[u]*random' options.h : \ ## expected result: ; \ : \ ## 152:/* If you are lacking entropy on the system then using /dev/urandom ; \ : \ ## 157:#define DROPBEAR_RANDOM_DEV "/dev/random" ; \ sed -i -e 's|#define DROPBEAR_RANDOM_DEV "/dev/random"|#define DROPBEAR_RANDOM_DEV "/dev/urandom"|' options.h grep -n -e '/dev/[u]*random' options.h : \ ## expected result: ; \ : \ ## 152:/* If you are lacking entropy on the system then using /dev/urandom ; \ : \ ## 157:#define DROPBEAR_RANDOM_DEV "/dev/urandom" ; \ cd ~ } [ "${DEBVERSION}" -le 4 ] && { cd /var/tmp cd dropbear-*/ debuild -us -uc cd ~ } ## build DropBear for Debian 4.0 or earlier - part 3 "install" [ "${DEBVERSION}" -le 4 ] && { cd /var/tmp dpkg -i /var/tmp/dropbear_*.deb cd ~ } [ "${DEBVERSION}" -le 4 ] && { echo 'ATTENTION! Remember these holds when upgrading in the future' ; printf '\a' echo "dropbear hold" | dpkg --set-selections aptitude hold dropbear echo 'ATTENTION! Remember these holds when upgrading in the future' ; printf '\a' }Now upload (or copy) files depending on release.
[ "${DEBVERSION}" -le 5 ] && install -v -d /usr/local/share/initramfs-tools/hooks /usr/local/share/initramfs-tools/hooks/dropbear (v1.0.2 or later, original from http://gpl.coulmann.de/ssh_luks_unlock.html) /root/cryptroot_remote_fix.debian4.patchDebian 6.0 and earlier:
/etc/network/if-pre-up.d/set-dhclient-hostnameDebian 6.0 to 8.0:
/etc/initramfs-tools/hooks/cryptroot_remote_unlock.sh /etc/initramfs-tools/scripts/local-bottom/dropbear_kill_clients.sh /root/cryptroot_remote_fix.debian7.patch /root/cryptroot_remote_fix.debian8.patchDebian 6.0 and later (verified up to 9.0):
/etc/initramfs-tools/conf.d/network /etc/initramfs-tools/hooks/set_hostname_in_network_configThen continue on the shell:
which dropbear 1>/dev/null || { echo 'Check that dropbear is installed.' ; printf '\a' ; } for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done if [ "${DEBVERSION}" -le 8 ] ; then AUTHKEYDIR='/etc/initramfs-tools/root/.ssh' else AUTHKEYDIR='/etc/dropbear-initramfs' fi # add existing SSH public keys for root user to InitRAMFS [ -d "${AUTHKEYDIR}" ] || install -v -d "${AUTHKEYDIR}" ; \ [ -s /root/.ssh/authorized_keys ] && cat /root/.ssh/authorized_keys > "${AUTHKEYDIR}/authorized_keys" # mimic Debian 6.0 behaviour for earlier releases [ "${DEBVERSION}" -le 5 ] && { echo 'Creating separate DropBear server keys for initrd, to not expose the real server keys in the unencrypted initrd' [ -d /etc/initramfs-tools/etc/dropbear ] || install -v -d /etc/initramfs-tools/etc/dropbear [ ! -s /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key ] && dropbearkey -t rsa -s 4096 -f /etc/initramfs-tools/etc/dropbear/dropbear_rsa_host_key [ ! -s /etc/initramfs-tools/etc/dropbear/dropbear_dss_host_key ] && dropbearkey -t dss -s 1024 -f /etc/initramfs-tools/etc/dropbear/dropbear_dss_host_key : chmod -R go= /etc/initramfs-tools/root [ ! -s "${AUTHKEYDIR}/authorized_keys" ] && { echo 'Creating separate dropbear client keys for root in initrd' dropbearkey -t rsa -s 4096 -f "${AUTHKEYDIR}/id_rsa.dropbear" dropbearkey -y -f "${AUTHKEYDIR}/id_rsa.dropbear" | grep -e '^ssh-rsa ' > "${AUTHKEYDIR}/id_rsa.pub" cat "${AUTHKEYDIR}/id_rsa.pub" > "${AUTHKEYDIR}/authorized_keys" } } # optional: to set/change password of initramfs ssh private key # Dropbear doesn't support passwords for ssh key files, therefore convert to OpenSSH format, set password and clear/wipe unencrypted Dropbear/OpenSSH key files [ -s "${AUTHKEYDIR}/id_rsa.dropbear" ] && { /usr/lib/dropbear/dropbearconvert dropbear openssh "${AUTHKEYDIR}/id_rsa.dropbear" "${AUTHKEYDIR}/id_rsa" ssh-keygen -p -f "${AUTHKEYDIR}/id_rsa" >"${AUTHKEYDIR}/id_rsa.protected" && shred -z -n 0 --remove "${AUTHKEYDIR}/id_rsa" shred -z -n 0 --remove "${AUTHKEYDIR}/id_rsa.dropbear" } # make scripts executable if [ "${DEBVERSION}" -le 6 ] ; then chmod u=rwx,go=rx /etc/network/if-pre-up.d/set-dhclient-hostname fi if [ "${DEBVERSION}" -le 5 ] ; then chmod u=rwx,go=rx /usr/local/share/initramfs-tools/hooks/dropbear [ -s "/root/cryptroot_remote_fix.debian${DEBVERSION}.patch" ] && { cp /usr/share/initramfs-tools/scripts/local-top/cryptroot "/root/cryptroot.debian${DEBVERSION}.org.$(date +%Y%m%d_%H%M%S)" patch -d/ -r - -N -p0 -i "/root/cryptroot_remote_fix.debian${DEBVERSION}.patch" } elif [ "${DEBVERSION}" -le 8 ] ; then chmod u=rwx,go=rx /etc/initramfs-tools/hooks/cryptroot_remote_unlock.sh chmod u=rwx,go=rx /etc/initramfs-tools/scripts/local-bottom/dropbear_kill_clients.sh [ -s "/root/cryptroot_remote_fix.debian${DEBVERSION}.patch" ] && { cp /usr/share/initramfs-tools/scripts/local-top/cryptroot "/root/cryptroot.debian${DEBVERSION}.org.$(date +%Y%m%d_%H%M%S)" patch -d/ -r - -N -p0 -i "/root/cryptroot_remote_fix.debian${DEBVERSION}.patch" } chmod u=rw,go=r /etc/initramfs-tools/conf.d/network chmod u=rwx,go=rx /etc/initramfs-tools/hooks/set_hostname_in_network_config fi [ "${DEBVERSION}" -le 5 ] && { cp -av /usr/local/share/initramfs-tools/hooks/dropbear /etc/initramfs-tools/hooks/ chmod u=rwx,go=rx /etc/initramfs-tools/hooks/dropbear echo 'DROPBEAR=n' > /etc/initramfs-tools/conf.d/dropbear : : \ ## FIXME: adapt copy root password to InitRAMFS \('CHECK HERE' in line 219\) ; \ : \ ## FIXME: adapt network settings for the system \('CHECK HERE' in line 340\) ; \ : \ ## FIXME: enable strace debugging if wanted \('CHECK HERE' in line 350\) ; \ : \ ## FIXME: disable password logins if wanted \('CHECK HERE' in line 363\) ; \ : \ ## CTRL+- \<line number\> ; \ nano /etc/initramfs-tools/hooks/dropbear : \ ## edit ifconfig and route accordingly or use DHCP via dhclient ; \ : \ ## ifconfig, route, dhclient ; \ : \ ## Example: ; \ : \ ## ifconfig eth0 10.0.2.15 netmask 255.255.255.0 ; \ : \ ## route add default gw 10.0.2.2 ; \ } update-initramfs -u -k all # if any initrd update fails, just create a new one from scratch IVERSION="$(uname -r)" ; # FIXME: set to problematic initramfs version rm -f /boot/initrd.img-${IVERSION} ; update-initramfs -c -k ${IVERSION} reboot ; # CRITICAL, if boot fails restore backup of initramdisk /boot/initrd.img-$(uname -r).oldroot.org and fix issue cp -av /boot/initrd.img-$(uname -r) /boot/initrd.img-$(uname -r).oldroot ; \ rm -vf /boot/initrd.img-$(uname -r).oldroot.org
/root/bin/mount_sys.sh /root/bin/mount_mini-debian.sh /root/bin/mount_newroot.sh /root/bin/mount_oldroot.sh /root/bin/mount_tempex.sh /root/bin/umount_sys.sh /root/bin/umount_mini-debian.sh /root/bin/umount_newroot.sh /root/bin/umount_oldroot.sh /root/bin/umount_tempex.sh /root/bin/luks_functions_analysis.inc /root/bin/luks_functions_help.inc /root/bin/custom_functions.incFor GRUB 1, Debian 5.0 "Lenny" and earlier:
/root/bin/grub1_mini-debian.shFor GRUB 2, Debian 6.0 "Squeeze":
/root/bin/grub2_mini-debian.shMake them executable:
chmod ug=rwx,o= /root/bin/mount_*.sh ; \ chmod ug=rwx,o= /root/bin/umount_*.sh ; \ chmod ug=rwx,o= /root/bin/grub*_mini-debian.sh ; \ chmod ug=rw,o= /root/bin/luks_*.inc ; \ chmod ug=rw,o= /root/bin/custom_*.inc
df -BM / # example result: # Filesystem Size Used Available Use% Mounted on # /dev/sda3 5195M 1099M 3833M 23% /Set the necessary space to hold all data in MiB, keep a little buffer of at least 100 MB. Remember that ext systems need +5% extra free space. Make sure to stay below 45% of the current partition size and that the size fits the target partioning scheme.
OLDROOTSIZEMIN=5000 ; # FIXME: set to correct value in MiB, see info above
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done OLDROOTMOUNT="$( mount | grep -F -e ' / ' | cut -d' ' -f1 )" ; \ echo "count is $( echo "${OLDROOTMOUNT}" | wc -w ): ${OLDROOTMOUNT}" # FIXME: correct if necessary determine_subdevs OLDROOT "${OLDROOTMOUNT}" "${OLDROOTSIZEMIN}" > /root/bin/luks_OLDROOT.inc ; \ chmod ug=rw,o= /root/bin/luks_*.inc # check if already encrypted for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done OLDROOTCHECK="$( print_subdevs_value OLDROOT 'TYPE' 'luks' )" ; \ [ -n "${OLDROOTCHECK}" ] && { printf '\a' echo "WARNING! ROOT file system is already encrypted via ${OLDROOTCHECK}." if [ "${DEBVERSION}" -le 5 ] ; then echo 'To enable remote SSH unlock just enable DropBear in /etc/initramfs-tools/conf.d/dropbear.' echo 'Then update InitRAMFS.' echo ' rm -vf /etc/initramfs-tools/conf.d/dropbear' echo ' update-initramfs -u -k all' echo ' # if any initrd update fails, just create a new one from scratch' echo ' IVERSION="$(uname -r)" ; # FIXME: set to problematic initramfs version' echo ' rm -f /boot/initrd.img-${IVERSION} ; update-initramfs -c -k ${IVERSION}' echo ' #' else echo 'Remote SSH unlock should be now enabled.' fi echo ' reboot' echo '' echo 'If the file system setup will be rearranged, then this scenario is not supported by this guide.' echo 'Thoroughly plan all changes and movements of the devices.' echo 'Lots of manual steps will be necessary that cannot be explained here.' echo 'Good luck!' printf '\a' } ; \ unset OLDROOTCHECK
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done OLDBOOTMOUNT="$( mount | grep -F -e ' /boot ' | cut -d' ' -f1 )" ; \ echo "count is $( echo "${OLDBOOTMOUNT}" | wc -w ): ${OLDBOOTMOUNT}" # FIXME: correct if necessary determine_subdevs OLDBOOT "${OLDBOOTMOUNT}" > /root/bin/luks_OLDBOOT.inc ; \ chmod ug=rw,o= /root/bin/luks_*.inc
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done OLDSWAPMOUNT="$( swapon -s | grep -F -e 'partition' | cut -d' ' -f1 )" ; \ echo "count is $( echo "${OLDSWAPMOUNT}" | wc -w ): ${OLDSWAPMOUNT}" # FIXME: correct if necessary OLDSWAPSIZEMIN="$(( $( swapon -s | grep -e "${OLDSWAPMOUNT}" | sed -e 's#[[:space:]]\+# #g' | cut -d' ' -f3 ) / 1024 ))" ; \ echo "size is ${OLDSWAPSIZEMIN}" # FIXME: correct if necessary determine_subdevs OLDSWAP "${OLDSWAPMOUNT}" "${OLDSWAPSIZEMIN}" > /root/bin/luks_OLDSWAP.inc ; \ chmod ug=rw,o= /root/bin/luks_*.inc
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done GRUBVERSION="$( grub-install --version | sed -n -e 's#[^(]*[(]*[^0-9]*\([0-9]*\).*#\1#p' )" ; \ [ "${GRUBVERSION}" -eq 0 ] && GRUBRELEASE=1 || GRUBRELEASE=2 ; \ echo "GRUB version ${GRUBVERSION}.x is release ${GRUBRELEASE}" OLDGRUB="$( [ -n "${OLDBOOT}" ] && echo 'OLDBOOT' || echo 'OLDROOT' )" unset OLDGRUBNOWRITE OLDGRUBNOBOOT ; \ OLDGRUBCHECK="$( print_subdevs_value "${OLDGRUB}" 'TYPE' 'mdadm|lvm' )" ; \ [ -n "${OLDGRUBCHECK}" ] && { if [ "${GRUBRELEASE}" -eq 1 ] ; then for TYPE in ${OLDGRUBCHECK} ; do case "${TYPE}" in (mdadm) TYPE="$( print_subdevs_value "${OLDGRUB}" 'RLEVEL' 'mdadm' )" if [ "${TYPE}" != 'raid1' ] ; then OLDGRUBNOWRITE="${OLDGRUBNOWRITE:+${OLDGRUBNOWRITE}, or }non-level 1 mdadm raid" OLDGRUBNOBOOT="${OLDGRUBNOBOOT:+${OLDGRUBNOBOOT}, or }non-level 1 mdadm raid" else TYPE="$( print_subdevs_value "${OLDGRUB}" 'METADATA' 'mdadm' )" [ "${TYPE}" = '0.90' -o "${TYPE}" = '1.0' ] && { OLDGRUBNOBOOT="${OLDGRUBNOBOOT:+${OLDGRUBNOBOOT}, or }level 1 mdadm raid with super block of version ${TYPE} which is located at the end of its subdevices" } fi ;; (lvm) OLDGRUBNOWRITE="${OLDGRUBNOWRITE:+${OLDGRUBNOWRITE}, or }lvm volume" OLDGRUBNOBOOT="${OLDGRUBNOBOOT:+${OLDGRUBNOBOOT}, or }lvm volume" ;; esac done unset TYPE elif [ "${GRUBRELEASE}" -ge 2 ] ; then OLDGRUBNOWRITE="${OLDGRUBNOWRITE:+${OLDGRUBNOWRITE}, or }those devices" fi } OLDGRUBROOTDEVS="$( print_subdevs_value "${OLDGRUB}" SUBDEVS 'mbr|gpt' )" ; \ echo "GRUB is (or should be) installed on ${OLDGRUBROOTDEVS}"Create again a simple script to keep the determined details:
cat > /root/bin/luks_OLDGRUB.inc << __EOF echo 'Setting OLDGRUB vars...' 1>&2 GRUBVERSION='${GRUBVERSION}' GRUBRELEASE='${GRUBRELEASE}' OLDGRUBROOTDEVS='${OLDGRUBROOTDEVS}' OLDGRUB='${OLDGRUB}' OLDGRUBCHECK='${OLDGRUBCHECK}' OLDGRUBNOWRITE='${OLDGRUBNOWRITE}' OLDGRUBNOBOOT='${OLDGRUBNOBOOT}' __EOFDetermine GRUB 1 default, fallback and saved value: (there can be only one, like 0 - ok, there can be more, then just edit var to the last value)
unset OLDGRUB1DEFAULT OLDGRUB1FALLBACK OLDGRUB1SAVED ; \ [ "${GRUBRELEASE}" -eq 1 ] && { OLDGRUB1DEFAULT="$( sed -n -e 's#^[[:space:]]*default[[:space:]]\+\([^[:space:]]*\).*#\1#p' /boot/grub/menu.lst )" echo "count default is $( echo "${OLDGRUB1DEFAULT}" | wc -w ): ${OLDGRUB1DEFAULT}" OLDGRUB1FALLBACK="$( sed -n -e 's#^[[:space:]]*fallback[[:space:]]\+\([^[:space:]]*\).*#\1#p' /boot/grub/menu.lst )" echo "count fallback is $( echo "${OLDGRUB1FALLBACK}" | wc -w ): ${OLDGRUB1FALLBACK}" OLDGRUB1SAVED="$( head -n 1 /boot/grub/default )" echo "count saved default is $( echo "${OLDGRUB1SAVED}" | wc -l ): ${OLDGRUB1SAVED}" [ "${OLDGRUB1DEFAULT}" = 'saved' -a "${OLDGRUB1SAVED}" = 'default' ] && { echo 'ERROR: GRUB 1 default is set to "saved" and saved value is "default"' ; printf '\a' ; } } [ "${GRUBRELEASE}" -eq 1 ] && { cat > /root/bin/luks_OLDGRUB1.inc << __EOF echo 'Setting OLDGRUB1 vars...' 1>&2 OLDGRUB1DEV='$( sed -n -e '/^### BEGIN AUTOMAGIC KERNELS LIST/,/^### END DEBIAN AUTOMAGIC KERNELS LIST/ { /^[[:space:]]*root[[:space:]]\+/ { s#^[[:space:]]*root[[:space:]]\+(\([^,)]*\).*#\1#p ; q ; } ; }' /boot/grub/menu.lst )' OLDGRUB1PART='$( sed -n -e '/^### BEGIN AUTOMAGIC KERNELS LIST/,/^### END DEBIAN AUTOMAGIC KERNELS LIST/ { /^[[:space:]]*root[[:space:]]\+/ { s#^[[:space:]]*root[[:space:]]\+([^,]*,\([^)]*\).*#\1#p ; q ; } ; }' /boot/grub/menu.lst )' OLDGRUB1DEFAULT='${OLDGRUB1DEFAULT}' OLDGRUB1FALLBACK='${OLDGRUB1FALLBACK}' OLDGRUB1SAVED='${OLDGRUB1SAVED}' OLDGRUB1DEFAULTNUM='$( [ "${OLDGRUB1DEFAULT}" != 'saved' ] && echo "${OLDGRUB1DEFAULT}" || echo "${OLDGRUB1SAVED}" )' OLDGRUB1FEASC='$(( $( sed -n -e '/^[[:space:]]*title[[:space:]]\+/p' -e '/^# Put static boot stanzas before and\/or after AUTOMAGIC KERNEL LIST/q' /boot/grub/menu.lst | wc -l ) ))' # First entry *after* STATIC BOOT COMMENT OLDGRUB1FEAL='$(( $( sed -n -e '/^[[:space:]]*title[[:space:]]\+/p' -e '/^### BEGIN AUTOMAGIC KERNELS LIST/q' /boot/grub/menu.lst | wc -l ) ))' # First entry of AUTOMAGIC LIST OLDGRUB1FEAAL='$(( $( sed -n -e '/^[[:space:]]*title[[:space:]]\+/p' -e '/^### END DEBIAN AUTOMAGIC KERNELS LIST/q' /boot/grub/menu.lst | wc -l ) ))' # First entry *after* AUTOMAGIC LIST __EOF } [ "${GRUBRELEASE}" -eq 1 ] && { for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done : [ "${OLDGRUB1DEFAULT}" = 'saved' -a "${OLDGRUB1SAVED}" = 'default' ] && { echo 'ERROR: GRUB 1 default is set to "saved" and saved value is "default"' ; printf '\a' ; } MINIOLDGRUB1DEFAULT="${OLDGRUB1DEFAULTNUM}" [ "${MINIOLDGRUB1DEFAULT}" -ge "${OLDGRUB1FEASC}" ] && MINIOLDGRUB1DEFAULT="$(( ${MINIOLDGRUB1DEFAULT} + 1 ))" MINIOLDGRUB1FALLBACK="${OLDGRUB1FALLBACK}" [ -n "${MINIOLDGRUB1FALLBACK}" ] && [ "${MINIOLDGRUB1FALLBACK}" -ge "${OLDGRUB1FEASC}" ] && MINIOLDGRUB1FALLBACK="$(( ${MINIOLDGRUB1FALLBACK} + 1 ))" : cat > /root/bin/luks_MINIDEB_grub1.inc << __EOF echo 'Setting MINIGRUB1 vars...' 1>&2 MINIOLDGRUB1DEFAULT='${MINIOLDGRUB1DEFAULT}' MINIOLDGRUB1FALLBACK='${MINIOLDGRUB1FALLBACK}' MINIGRUB1ENTRY='${OLDGRUB1FEASC}' MINIGRUB1FALLBACK='$( echo "${MINIOLDGRUB1DEFAULT}${MINIOLDGRUB1FALLBACK:+ ${MINIOLDGRUB1FALLBACK}}" )' __EOF } chmod ug=rw,o= /root/bin/luks_*.inc
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done check_fs_subdevs OLDROOT '' '_1' OLDROOTCHECK="$( print_subdevs_value OLDROOT 'TYPE' 'lvm' )" ; \ [ -n "${OLDROOTCHECK}" ] && { printf '\a' echo "WARNING! ROOT is installed on block devices that use lvm." echo 'An LVM setup can be very complicated (multiple devs in one vg, multiple vgs on one dev, and normally all with different sizes).' echo 'This scenario is not supported by this guide.' echo 'Thoroughly plan all movements of logical volumes between physical volumes.' echo 'Lots of manual steps will be necessary that cannot be explained here.' echo 'Good luck!' printf '\a' } ; \ unset OLDROOTCHECK [ -n "${OLDGRUBNOBOOT}" -o -n "${OLDGRUBNOWRITE}" ] && { LIVECD=0 printf '\a' echo "WARNING! GRUB is installed on block devices that use ${OLDGRUBCHECK}." : [ -n "${OLDGRUBNOBOOT}" ] && { echo "GRUB may not be able to boot from ${OLDGRUBNOBOOT}." LIVECD=1 } : [ -n "${OLDGRUBNOWRITE}" ] && { echo "GRUB is not able to change variables during the boot phase on ${OLDGRUBNOWRITE}." if [ "${GRUBRELEASE}" -eq 1 ] ; then echo 'Therefore the GRUB command "savedefault" will not work.' elif [ "${GRUBRELEASE}" -ge 2 ] ; then echo 'Therefore the Debian setting GRUB_SAVEDEFAULT and GRUB command "save_env" will not work.' fi LIVECD=1 } : [ "${LIVECD}" -eq 1 ] && { echo 'If anything goes wrong in steps 2 and 4, then access to the machine via a live CD is needed.' echo 'This will allow to mount the root and boot partition, chroot into the system and fix the GRUB environment and/or boot partition.' echo 'TEST NOW!' } : printf '\a' unset LIVECD } [ -z "${OLDSWAP}" ] && { printf '\a' echo 'WARNING! No swap partition named to hold temporary Mini-Debian.' echo 'Please shrink your root partition first to make place for Mini-Debian, see the following steps.' printf '\a' }
ATTENTION!!! Adopt the following tasks to the wanted target partition scheme, which was planned during the preparation phase.
If you have direct access to the system use a GParted Live CD to resize and rearrange the partitions. When LVM is used, then shrink all logical volumes and physical volumes before resizing the partitions.
Due to missing space for the Mini-Debian the root partition has to be resized in advance.
Normally this is done with the Mini-Debian in step 3a.
Use a live CD with parted/GParted to resize it (e.g. PartedMagic allows to SSH into the live system, PM asks for tiny fee that is donated to the included open source projects, last non-free release was 2013_08_01; or GParted directly).
For more details see step 3a.
When LVM is used, then shrink all logical volumes and physical volumes before resizing the partitions.
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done ; \ echo "${OLDROOTMOUNT}" ; printf '\a' ; # note down the value # boot from live system # mount old root within live system (maybe necessary several times during shrink) OLDROOTMOUNT='<OLDROOTMOUNT>' ; #e.g. mount /dev/sda1 /mnt/oldroot [ -d /mnt/oldroot ] || install -v -d /mnt/oldroot ; \ mount "${OLDROOTMOUNT}" /mnt/oldroot ; \ for SRC in /mnt/oldroot/root/bin/luks_*.inc ; do . "${SRC}" ; done umount /mnt/oldroot OLDROOTCHECK="$( print_subdevs_value OLDROOT 'TYPE' 'lvm' )" ; \ [ -n "${OLDROOTCHECK}" ] && { printf '\a' : \ ## check that sizes are correct when lvm is used ; \ nano /root/bin/luks_OLDROOT.inc for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done echo "WARNING! ROOT is installed on block devices that use lvm." echo 'An LVM setup can be very complicated (multiple devs in one vg, multiple vgs on one dev, and normally all with different sizes).' echo 'This scenario is not supported by this guide.' echo 'Thoroughly plan all movements of logical volumes between physical volumes.' echo 'Lots of manual steps will be necessary that cannot be explained here.' echo 'Maybe looking at shrink_fs_subdevs function helps.' echo 'Good luck!' printf '\a' } ; \ unset OLDROOTCHECK start_fs_subdevs OLDROOT check_fs_subdevs OLDROOT ; # TAKES TIME!!! shrink_fs_subdevs OLDROOT reboot ; # normally necessary as `blockdev --rereadpt` mostly fails due to being busy # mount old root within live system (once again) OLDROOTMOUNT='<OLDROOTMOUNT>' ; #e.g. mount /dev/sda1 /mnt/oldroot [ -d /mnt/oldroot ] || install -v -d /mnt/oldroot ; \ mount "${OLDROOTMOUNT}" /mnt/oldroot ; \ for SRC in /mnt/oldroot/root/bin/luks_*.inc ; do . "${SRC}" ; done umount /mnt/oldroot shrink_fs_subdevs OLDROOT start_fs_subdevs OLDROOT check_fs_subdevs OLDROOT '_1' ; # TAKES TIME!!! reboot ; # to normal system again for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done # Mini-Debian until 9.0 does not need more than 2.0G show_temp_suggestions OLDROOT MINIDEB 7 2000 | sed -e 's#storage#mini-debian#g' ${OLDROOT_1VG:+-e "s#${OLDROOT_1VG}#minideb#g"} # create Mini-Debian device(s) as suggested without file system, then set MINIDEB variables # Save vars until next step cat > /root/bin/luks_MINIDEB.inc << __EOF echo 'Setting MINIDEB vars...' 1>&2 MINIDEB='${MINIDEB}' MINIDEB_1TYPE='${MINIDEB_1TYPE}' MINIDEB_1SUBDEVS='${MINIDEB_1SUBDEVS}' __EOF
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done [ -z "${OLDSWAP}" ] && { echo 'Please shrink your root partition first to make place for Mini-Debian' ; printf '\a' ; } # Check what swap partition(s) are used swapon -s # Disable swap partition and check that is not used anymore swapoff "${OLDSWAP_1}" ; \ swapon -s # Disable old swap in /etc/fstab, necessary to avoid being changed to swap partition again sed -i -e "s#^[[:space:]]*\(${OLDSWAP}\|${OLDSWAPMOUNT}\|UUID=${OLDSWAPUUID}\)\([[:space:]]\+\|$\)#\#\1\2#" /etc/fstab ; \ cat /etc/fstab remove_fs_subdevs OLDSWAP # reduce device(s) as suggested, may need several separate steps to process all sub devices # Mini-Debian until 9.0 does not need more than 2.0G show_temp_suggestions OLDSWAP MINIDEB 7 2000 | sed -e 's#storage#mini-debian#g' ${OLDSWAP_1VG:+-e "s#${OLDSWAP_1VG}#minideb#g"} # create Mini-Debian device(s) as suggested without file system, then set MINIDEB variables # Save vars until next step cat > /root/bin/luks_MINIDEB.inc << __EOF echo 'Setting MINIDEB vars...' 1>&2 MINIDEB='${MINIDEB}' MINIDEBSIZEMIN='${MINIDEBSIZEMIN}' MINIDEB_1='${MINIDEB_1}' MINIDEB_1TYPE='${MINIDEB_1TYPE}' MINIDEB_1SUBDEVS='${MINIDEB_1SUBDEVS}' __EOF
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done case "${MINIDEB_1TYPE}" in (mbr) fdisk -u ${FDISKCPARM} -l ${MINIDEB_1SUBDEVS} ;; (gpt) gdisk -l ${MINIDEB_1SUBDEVS} ;; (mdadm) mdadm --detail "${MINIDEB_1}" ;; (luks) cryptsetup status "${MINIDEB_1}" ;; (lvm) lvs --units m "${MINIDEB_1}" ;; (*) echo "ATTENTION: mini-debian via ${MINIDEB_1TYPE}, please handle accordingly" ; printf '\a' ;; esac ; \ echo "mini-debian on ${MINIDEB} via ${MINIDEB_1TYPE}" mkfs.${OLDROOTTYPE} "${MINIDEB_1}" ; printf '\a' ; # TAKES TIME!!! determine_subdevs MINIDEB "${MINIDEB}" "${MINIDEBSIZEMIN}" 'X' > /root/bin/luks_MINIDEB.inc ; \ chmod ug=rw,o= /root/bin/luks_*.inc for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done wait_fs_subdevs MINIDEB ; # TAKES TIME!!!
# maybe do this step in screen, to avoid issues during debootstrap download and/or install screen -h 9999 ; # to get back into the session call 'screen -r', e.g. after a network interruption; access scrollback buffer in copy mode via Ctrl+a then ESC scroll through it with page up/down and or j/k (vi style) for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done [ -d /mnt/mini ] || { install -v -d /mnt/mini ; } ; \ start_fs_subdevs MINIDEB ; \ mount "${MINIDEBMOUNT}" /mnt/mini/ # packages on installer dvd #1 and installed via debootstrap pkg='cryptsetup,mdadm,lvm2,initramfs-tools,psmisc,busybox,util-linux,parted,locales,lsb-base,lsb-release,screen,bsdutils,sed,openssh-server,apt,apt-listchanges,less,man-db' ; \ [ "${DEBVERSION}" -le 5 ] && pkg="${pkg:+${pkg},}grub,console-data" ; : \ ## changed name in Debian 6.0 "Squeeze" ; \ [ "${DEBVERSION}" -ge 6 ] && pkg="${pkg:+${pkg},}grub-pc,acpi,acpid,acpi-support-base,os-prober" ; : \ ## acpi causes hang during debootstrap on Debian 4.0 "Etch" and 5.0 "Lenny" ; \ [ "${DEBVERSION}" -ge 7 ] && pkg="${pkg:+${pkg},}console-setup,kbd" ; : \ ## xkb-data causes failure during debootstrap on Debian 6.0 "Squeeze" ; \ echo "${pkg}" # packages on installer dvd #1, but separately installed via apt (e.g. kernel package) extrapkg="${DEBLINUX}" ; \ [ "${DEBVERSION}" -eq 6 ] && extrapkg="${extrapkg:+${extrapkg},}console-setup,kbd" ; : \ ## xkb-data causes failure during debootstrap on Debian 6.0 "Squeeze" ; \ echo "${extrapkg}" # packages not on installer dvd #1 and/or non-free unset pkgnf ; \ [ "${DEBVERSION}" -eq 5 ] && pkgnf="${pkgnf:+${pkgnf},}os-prober" ; : \ ## Debian 4.0 has issues with os-prober via debootstrap ; \ [ "${DEBVERSION}" -ge 5 ] && pkgnf="${pkgnf:+${pkgnf},}dropbear" ; : \ ## not the build we need on Debian 4.0 "Etch" and also causes hang during debootstrap ; \ [ "${DEBVERSION}" -ge 7 ] && pkgnf="${pkgnf:+${pkgnf},}gdisk" ; \ echo "${pkgnf}" # packages not on installer dvd #1 and/or non-free, but separately installed (e.g. firmware) unset extrapkgnf ; \ [ "${DEBVERSION}" -ge 6 ] && extrapkgnf="${extrapkgnf:+${extrapkgnf},}firmware-linux" ; : \ ## get all firmwares ; \ echo "${extrapkgnf}" # download all Debian packages first, so that following installation does not fail through download issues ### Optional BEGIN: "download" from latest installer DVD to reduce network traffic url='file:///media/cdrom/debian' ; \ DEBOOTSTRAPEXTRAOPTS="$( [ "${DEBVERSION}" -ge 7 ] && echo '--no-check-gpg' )" mount -t auto /dev/sr0 /media/cdrom ; # FIXME: substitute cd/dvd device, e.g. /dev/hdc for IDE on Debian 4.0 debootstrap --download-only --include=${pkg}${extrapkg:+,${extrapkg}} ${DEBOOTSTRAPEXTRAOPTS} ${DEBOOTSTRAPOPTS} ${DEBRELEASE} /mnt/mini ${url} ; printf '\a' ### Optional END # download non-free stuff and latest versions of all packages # another way to reduce network traffic is to set up a local server via apt-proxy grep -e '^[[:space:]]*deb[[:space:]]\+' /etc/apt/sources.list ; \ grep -R -i -e 'Proxy' /etc/apt/ # change url to main mirror from /etc/apt/sources.list (e.g. http://archive.debian.org/debian/ for archived releases like 4.0 "Etch", 5.0 "Lenny", 6.0 "Squeeze") url='http://<proxy>:<port>/ftp.debian.org/debian/' ; # e.g. url='http://192.168.250.1:3142/ftp.debian.org/debian/' url='http://ftp.debian.org/debian/' unset DEBOOTSTRAPEXTRAOPTS debootstrap --download-only --include=${pkg}${pkgnf:+,${pkgnf}}${extrapkg:+,${extrapkg}}${extrapkgnf:+,${extrapkgnf}} ${DEBOOTSTRAPEXTRAOPTS} ${DEBOOTSTRAPOPTS} ${DEBRELEASE} /mnt/mini ${url} ; printf '\a' # TAKES TIME!!! # CHECK LOG!!! On warnings(!) and errors just re-try, e.g. on retrieving warnings # after all packages are downloaded, the Mini-Debian can be installed via debootstrap debootstrap --include=${pkg}${pkgnf:+,${pkgnf}} ${DEBOOTSTRAPEXTRAOPTS} ${DEBOOTSTRAPOPTS} ${DEBRELEASE} /mnt/mini ${url} ; printf '\a' # TAKES TIME!!! # CHECK LOG!!! On warnings(!) and errors just re-try and/or try to fix problems # (?) "Failure while installing base package": # (?) mount_sys.sh /mnt/mini # (?) chroot /mnt/mini # (?) unset LANG # (?) dpkg --configure -a # (?) dpkg-reconfigure sysvinit umount /media/cdrom* # if done in screen, then exit exit for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done start_fs_subdevs MINIDEB ; \ mount "${MINIDEBMOUNT}" /mnt/mini/ # prepare Mini-Debian as far as possible echo 'Mini-Debian' > /mnt/mini/mini-debian ; \ cp -a /etc/network/interfaces /mnt/mini/etc/network/ ; \ [ "${DEBVERSION}" -le 6 ] && cp -a /etc/network/if-pre-up.d/set-dhclient-hostname /mnt/mini/etc/network/if-pre-up.d/ ; \ cp -a /etc/hosts /etc/hostname /etc/locale.gen /etc/timezone /etc/localtime /mnt/mini/etc/ ; \ if [ -h /etc/resolv.conf ] ; then cp -a "$(readlink /etc/resolv.conf)" /mnt/mini/etc/ ; else cp -a /etc/resolv.conf /mnt/mini/etc/ ; fi ; \ cp -a /etc/default/keyboard /etc/default/console-setup /etc/default/locale /etc/default/mdadm /etc/default/cryptdisks /mnt/mini/etc/default/ ; \ cp -a /etc/ssh/ /mnt/mini/etc/ ; \ cp -a /etc/mdadm/ /mnt/mini/etc/ ; \ cp -a /etc/crypttab /mnt/mini/etc/ ; \ [ -d /mnt/mini/root/bin ] || install -v -d /mnt/mini/root/bin ; \ cp -a /root/bin/grub*.sh /mnt/mini/root/bin/ ; \ cp -a /root/bin/luks_*.inc /mnt/mini/root/bin/ ; \ cp -a /root/bin/custom_*.inc /mnt/mini/root/bin/ ; \ cp -a /root/bin/mount_*.sh /mnt/mini/root/bin/ ; \ cp -a /root/bin/umount_*.sh /mnt/mini/root/bin/ ; \ cp -av /etc/profile.d/ /mnt/mini/etc/ ; \ cp -a /root/.profile /root/.bash_profile /root/.bashrc /mnt/mini/root/ ; \ cp -av /root/.ssh/ /mnt/mini/root/ # if root login via SSH is forbidden, then copy the necessary users and setup su/sudo too (su/sudo is up to you) user='<USERNAME>' ; \ [ -d "/mnt/mini/home/${user}" ] || install -v -d "/mnt/mini/home/${user}" ; \ cp -a "/home/${user}/.profile" "/home/${user}/.bashrc" "/mnt/mini/home/${user}/" ; \ cp -av "/home/${user}/.ssh/" "/mnt/mini/home/${user}/" ; \ grep -q -e "^${user}:" /mnt/mini/etc/passwd || grep -e "^${user}:" /etc/passwd >> /mnt/mini/etc/passwd ; \ grep -q -e "^${user}:" /mnt/mini/etc/shadow || grep -e "^${user}:" /etc/shadow >> /mnt/mini/etc/shadow ; \ grep -q -e "^${user}:" /mnt/mini/etc/group || grep -e "^${user}:" /etc/group >> /mnt/mini/etc/group cp -a /etc/fstab /mnt/mini/etc/ ; \ sed -i -e "s#UUID=${OLDROOTUUID}\([[:space:]]\+\|$\)#UUID=${MINIDEBUUID}\1#" -e "s#\(${OLDROOT}\|${OLDROOTMOUNT}\)\([[:space:]]\+\|$\)#${MINIDEBMOUNT}\2#" /mnt/mini/etc/fstab ; \ cat /mnt/mini/etc/fstab [ -d /mnt/mini/media/cdrom0 ] || install -v -d /mnt/mini/media/cdrom0 ; \ ln -s cdrom0 /mnt/mini/media/cdrom ; \ [ "${DEBVERSION}" -le 5 ] && { ln -s media/cdrom /mnt/mini/cdrom } echo 'Mini-Debian Boot' > /mnt/mini/boot/mini-debian # copy APT configuration and cdrom related files cp -av /etc/apt/ /mnt/mini/etc/ ; \ cp -av /var/lib/apt/cdrom* /mnt/mini/var/lib/apt/ ; \ cp -av /var/lib/apt/lists/. /mnt/mini/var/lib/apt/lists/ # copy INITRAMFS/DROPBEAR configuration and related files [ "${DEBVERSION}" -le 4 ] && { cp -av /var/tmp/dropbear_*.deb /mnt/mini/var/tmp/ } cp -av /etc/initramfs-tools/ /mnt/mini/etc/ ; \ if [ "${DEBVERSION}" -le 5 ] ; then [ -d /mnt/mini/usr/local/share/initramfs-tools/hooks ] || install -v -d /mnt/mini/usr/local/share/initramfs-tools/hooks cp -av /usr/local/share/initramfs-tools/hooks/dropbear /mnt/mini/usr/local/share/initramfs-tools/hooks/ if [ "${DEBVERSION}" -le 4 ] ; then cp -av /usr/share/initramfs-tools/scripts/local-top/cryptroot /mnt/mini/usr/share/initramfs-tools/scripts/local-top/ fi fi cp -av /etc/dropbear/ /mnt/mini/etc/ ; \ [ -d /etc/dropbear-initramfs ] && cp -av /etc/dropbear-initramfs/ /mnt/mini/etc/Check if you need other files in the Mini-Debian and copy them accordingly.
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done umount /media/cdrom* start_fs_subdevs MINIDEB ; \ mount_mini-debian.sh noboot chroot /mnt/mini cd ~ for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done if [ "${DEBVERSION}" -le 6 ] ; then rm -f /etc/mtab mount -a -f ; mount -a -f ; # to re-create /etc/mtab, important to install kernel/initrd else [ ! -e /etc/mtab ] && { ln -s /proc/mounts /etc/mtab } fi ; \ cat /etc/mtab locale-gen # if wanted to set a password for root access passwd # update apt lists apt-get update # install missing packages via apt [ "${DEBVERSION}" -le 4 ] && { apt-get install os-prober } ; \ [ "${DEBVERSION}" -eq 6 ] && { apt-get install console-setup kbd } # install kernel apt-get install ${DEBLINUX} # Etch/Lenny: answer create links with "Yes", answer abort initrd image with "No" # Squeeze/Wheezy: ignore "cat: /boot/grub/video.lst: No such file or directory" # install updates (from security, updates/volatile, etc.) apt-get safe-upgrade || apt-get upgrade apt-get dist-upgrade # GRUB/grub-pc: Continue without installing GRUB? → Yes [ "${DEBVERSION}" -le 4 ] && { echo 'ATTENTION! Remember these holds when upgrading in the future' ; printf '\a' dpkg -i /var/tmp/dropbear_*.deb echo "dropbear hold" | dpkg --set-selections aptitude hold dropbear echo 'ATTENTION! Remember these holds when upgrading in the future' ; printf '\a' }Check if you need other packages in the Mini-Debian and install plus configure them accordingly.
# leave chroot exit cp -av /mnt/mini/boot/initrd.img-$(uname -r) /boot/initrd.img-$(uname -r).mini-debian [ -n "${OLDBOOT}" ] && find /mnt/mini/boot -mindepth 1 -maxdepth 1 -exec rm -rfv '{}' \; ; \ echo 'Mini-Debian Boot' > /mnt/mini/boot/mini-debian umount_mini-debian.sh
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done ; \ echo "GRUB version ${GRUBVERSION}.x is release ${GRUBRELEASE}"
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done [ -n "${OLDGRUBNOBOOT}" -o -n "${OLDGRUBNOWRITE}" ] && { LIVECD=0 printf '\a' echo "WARNING! GRUB is installed on block devices that use ${OLDGRUBCHECK}." : [ -n "${OLDGRUBNOBOOT}" ] && { echo "GRUB may not be able to boot from ${OLDGRUBNOBOOT}." LIVECD=1 } : [ -n "${OLDGRUBNOWRITE}" ] && { echo "GRUB is not able to change variables during the boot phase on ${OLDGRUBNOWRITE}." echo 'Therefore the GRUB command "savedefault" will not work.' LIVECD=1 } : [ "${LIVECD}" -eq 1 ] && { echo 'If anything goes wrong, then access to the machine via a live CD is needed.' echo 'This will allow to mount the root and boot partition, chroot into the system and fix the GRUB environment and/or boot partition.' echo 'Hopefully you have TESTED this BEFORE!' } : printf '\a' unset LIVECD } cp -av /boot/grub/menu.lst /boot/grub/menu.lst.oldroot grep -n -e '^[[:space:]]*default[[:space:]]\+' -e '^[[:space:]]*fallback[[:space:]]\+' -e '^#[[:space:]]\+groot=' -e '^#.*[[:space:]]\+AUTOMAGIC[[:space:]]\+' -e '^[[:space:]]*title[[:space:]]\+' -e '^[[:space:]]*savedefault\([[:space:]]\+\|$\)' -e '^[[:space:]]*root[[:space:]]\+' /boot/grub/menu.lst # Example result: # 14:default 0 # 46:# Put static boot stanzas before and/or after AUTOMAGIC KERNEL LIST # 48:### BEGIN AUTOMAGIC KERNELS LIST # 49:## lines between the AUTOMAGIC KERNELS LIST markers will be modified # 66:# groot=(hd0,0) # 118:title Debian GNU/Linux, kernel 2.6.26-2-i386 # 119:root (hd0,0) # 122:savedefault # 124:title Debian GNU/Linux, kernel 2.6.26-2-i386 (single-user mode) # 125:root (hd0,0) # 128:savedefault # 130:### END DEBIAN AUTOMAGIC KERNELS LIST grub1_mini-debian.sh ; \ cat /boot/grub/custom.mini-debian.oldroot.cfg nano /boot/grub/custom.mini-debian.oldroot.cfg # Set savedefault to the previous default, normally this is 0 but moved up to 1 due to new boot entry of Mini-Debian as the very first entry # Set root line to the result of the previous grep, that is the old grub partition, could be even the old root partition # Example: # ### BEGIN grub1_mini-debian.sh ### # title Mini-Debian # # FIXME: set to previous default plus 1 (normally 0 plus 1 = 1) # savedefault 1 # # FIXME: set correct value for /dev/hda1, partition is minus 1 # root (hd0,0) # # FIXME: set correct root value for /dev/hda5, no /boot prefix if separate boot partition # kernel /boot/vmlinuz-2.6.26-2-i386 root=/dev/hda5 # # FIXME: no /boot prefix if separate boot partition # initrd /boot/initrd.img-2.6.26-2-i386.mini-debian # ### END grub1_mini-debian.sh ### sed -i -e '/^[[:space:]]*default[[:space:]]\+/ { /^[[:space:]]*default[[:space:]]\+saved/! s#^\([[:space:]]*default[[:space:]]\+\)\([^[:space:]]*\)#\# default was: \2\n\1saved# ; }' /boot/grub/menu.lst ; \ sed -i -e '/### BEGIN grub1_mini-debian.sh ###/,/### END grub1_mini-debian.sh ###/d' /boot/grub/menu.lst ; \ sed -i -e '/^# Put static boot stanzas before and\/or after AUTOMAGIC KERNEL LIST/r /boot/grub/custom.mini-debian.oldroot.cfg' /boot/grub/menu.lst ; \ sed -i -e '/### BEGIN grub1_mini-debian.sh ###/,/### END grub1_mini-debian.sh ###/! { /^[[:space:]]*savedefault[[:space:]]\+[0-9]\+/d ; }' /boot/grub/menu.lst ; \ if [ -z "${OLDGRUB1FALLBACK}" ] ; then sed -i -e "/^[[:space:]]*default[[:space:]]\+/ { n ; /^# fallback/! { i# fallback added\nfallback\t${MINIGRUB1FALLBACK}`printf '\n ; }'` ; }" /boot/grub/menu.lst else sed -i -e "/^[[:space:]]*fallback[[:space:]]\+/ { /^[[:space:]]*fallback[[:space:]]\+${MINIGRUB1FALLBACK}/! s#^\([[:space:]]*fallback[[:space:]]\+\)\([^[:space:]]*\)#\# fallback was: \2\n\1${MINIGRUB1FALLBACK}# ; }" /boot/grub/menu.lst fi nano /boot/grub/menu.lst # add/set fallback to the previous default entry, normally this is 0 but moved up to 1 due to new boot entry of Mini-Debian, use the savedefault from /boot/grub/custom.mini-debian.oldroot.cfg # place boot entry of Mini-Debian before all others, normally before DEBIAN AUTOMAGIC KERNELS LIST, so it is boot entry number 0 # the fallback entry will also be set as new default when booting Mini-Debian, so if there are problems then on the next start the old system is booted # defaults: default 0, fallback does not exist, saved default is "default" # Example: # ~ default saved # + fallback 1 # (jump to comment to put boot entries before AUTOMAGIC KERNEL LIST, make sure there are no other active boot entries before it) # CTRL+- 46 # (place cursor in the line after "# Put static boot stanzas...", then include the generated sample) # CTRL+r /boot/grub/custom.mini-debian.oldroot.cfg # CTRL+x grep -n -e '^[[:space:]]*default[[:space:]]\+' -e '^[[:space:]]*fallback[[:space:]]\+' -e '^#[[:space:]]\+groot=' -e '^#.*[[:space:]]\+AUTOMAGIC[[:space:]]\+' -e '^[[:space:]]*title[[:space:]]\+' -e '^[[:space:]]*savedefault\([[:space:]]\+\|$\)' -e '^[[:space:]]*root[[:space:]]\+' /boot/grub/menu.lst # check that the root line of Mini-Debian is the same as for the kernels of the AUTOMAGIC KERNELS LIST # Example: # 15:default saved # 17:fallback 1 # 49:# Put static boot stanzas before and/or after AUTOMAGIC KERNEL LIST # 51:title Mini-Debian # 52:savedefault 1 # 55:root (hd0,0) # 62:### BEGIN AUTOMAGIC KERNELS LIST # 63:## lines between the AUTOMAGIC KERNELS LIST markers will be modified # 80:# groot=(hd0,0) # 132:title Debian GNU/Linux, kernel 2.6.26-2-i386 # 133:root (hd0,0) # 136:savedefault # 138:title Debian GNU/Linux, kernel 2.6.26-2-i386 (single-user mode) # 139:root (hd0,0) # 142:savedefault # 144:### END DEBIAN AUTOMAGIC KERNELS LIST cp -av /boot/grub/menu.lst /boot/grub/menu.lst.mini-debian.oldroot grub-set-default "${MINIOLDGRUB1DEFAULT}" ; \ cat /boot/grub/default # prepare menu.lst for booting GRUB from Mini-Debian later [ -z "${OLDBOOT}" ] && mount_mini-debian.sh [ -z "${OLDBOOT}" ] && { [ -d /mnt/mini/boot/grub ] || install -v -d /mnt/mini/boot/grub cp -av /boot/initrd* /mnt/mini/boot/ cp -av /boot/grub/default* /mnt/mini/boot/grub/ cp -av /boot/grub/device* /mnt/mini/boot/grub/ cp -av /boot/grub/menu.lst* /mnt/mini/boot/grub/ grep -e '^#[[:space:]]\+groot=' -e '^[[:space:]]*root[[:space:]]\+' /mnt/mini/boot/grub/menu.lst cat /mnt/mini/boot/grub/device.map } [ -z "${OLDBOOT}" ] && { for MINIGRUBROOTDEV in $( print_subdevs_value MINIDEB 'SUBDEVS' ) do MINIGRUB1DEV="$( sed -n -e "s#^[[:space:]]*(\([^)]*\))[[:space:]]\+${MINIGRUBROOTDEV}.*#\1#p" /mnt/mini/boot/grub/device.map )" break done for MINIGRUB1PART in $( print_subdevs_value MINIDEB 'SUBPART' ) do MINIGRUB1PART="$(( ${MINIGRUB1PART} - 1 ))" break done echo "Mini-Debian GRUB root device ${MINIGRUBROOTDEV} is ${MINIGRUB1DEV} with partition ${MINIGRUB1PART}" sed -i -e '/^[[:space:]]*title[[:space:]]\+Mini-Debian$/ s#$# (direct)#' -e 's#OLDROOT#MINIDEB#' -e "s#(${OLDGRUB1DEV},${OLDGRUB1PART})#(${MINIGRUB1DEV},${MINIGRUB1PART})#" /mnt/mini/boot/grub/menu.lst cp -av /mnt/mini/boot/grub/menu.lst /mnt/mini/boot/grub/menu.lst.mini-debian.mini } [ -z "${OLDBOOT}" ] && umount_mini-debian.sh # Choose Mini-Debian as default for next boot only for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done ; \ grub-set-default "${MINIGRUB1ENTRY}" ; \ cat /boot/grub/default [ -n "${OLDGRUBNOBOOT}" -o -n "${OLDGRUBNOWRITE}" ] && { LIVECD=0 printf '\a' echo "WARNING! GRUB is installed on block devices that use ${OLDGRUBCHECK}." : [ -n "${OLDGRUBNOBOOT}" ] && { echo "GRUB may not be able to boot from ${OLDGRUBNOBOOT}." LIVECD=1 } : [ -n "${OLDGRUBNOWRITE}" ] && { echo "GRUB is not able to change variables during the boot phase on ${OLDGRUBNOWRITE}." echo 'Therefore the GRUB command "savedefault" will not work.' LIVECD=1 } : [ "${LIVECD}" -eq 1 ] && { echo 'If anything goes wrong, then access to the machine via a live CD is needed.' echo 'This will allow to mount the root and boot partition, chroot into the system and fix the GRUB environment and/or boot partition.' echo 'Hopefully you have TESTED this BEFORE!' } : printf '\a' unset LIVECD } reboot # After reboot check for successful start of Mini-Debian, otherwise fix the boot problem [ ! -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this is NOT mini-debian. Please fix/re-try.' ; printf '\a' ; } for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done # Switch to Mini-Debian as default and fallback system sed -i -e '/^[[:space:]]*savedefault\([[:space:]]\+\|$\)/d' -e "s#^\([[:space:]]*fallback[[:space:]]\+\)[^[:space:]]*#\1${MINIGRUB1ENTRY}#" /boot/grub/menu.lst ; \ sed -i -e "/### BEGIN grub1_mini-debian.sh/,/### END grub1_mini-debian.sh/ { /^# FIXME: set to previous default/ { n ; /^savedefault/! { isavedefault`printf '\n ; }'` ; } ; }" /boot/grub/menu.lst ; \ sed -i -e "/### BEGIN AUTOMAGIC KERNELS LIST/,/### END DEBIAN AUTOMAGIC KERNELS LIST/ { /^[[:space:]]*initrd[[:space:]]\+/ { n ; /^savedefault/! { isavedefault\t${MINIGRUB1ENTRY}`printf '\n ; }'` ; } ; }" /boot/grub/menu.lst ; \ cp -a /boot/grub/menu.lst /boot/grub/menu.lst.mini-debian.mini [ -z "${OLDBOOT}" ] && { for DEV in ${OLDGRUBROOTDEVS} ; do { echo "grub-install ${DEV}" ; grub-install --no-floppy ${DEV} ; } ; done } # Choose Mini-Debian as default for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done ; \ grub-set-default "${MINIGRUB1ENTRY}" ; \ cat /boot/grub/default reboot # After reboot check for successful start of Mini-Debian, otherwise fix the boot problem [ ! -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this is NOT mini-debian. Please fix/re-try.' ; printf '\a' ; } reboot ; # try a 2nd time for necessary second check # After reboot check for successful start of Mini-Debian, otherwise fix the boot problem [ ! -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this is NOT mini-debian. Please fix/re-try.' ; printf '\a' ; }
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done [ -n "${OLDGRUBNOBOOT}" -o -n "${OLDGRUBNOWRITE}" ] && { LIVECD=0 printf '\a' echo "WARNING! GRUB is installed on block devices that use ${OLDGRUBCHECK}." : [ -n "${OLDGRUBNOBOOT}" ] && { echo "GRUB may not be able to boot from ${OLDGRUBNOBOOT}." LIVECD=1 } : [ -n "${OLDGRUBNOWRITE}" ] && { echo 'GRUB is not able to change variables during the boot phase on those devices.' echo 'Therefore the Debian setting GRUB_SAVEDEFAULT and GRUB command "save_env" will not work.' LIVECD=1 } : [ "${LIVECD}" -eq 1 ] && { echo 'If anything goes wrong, then access to the machine via a live CD is needed.' echo 'This will allow to mount the root and boot partition, chroot into the system and fix the GRUB environment and/or boot partition.' echo 'Hopefully you have TESTED this BEFORE!' } : printf '\a' unset LIVECD } cp -a /etc/default/grub /etc/default/grub.oldroot.org ; \ cp -a /boot/grub/grub.cfg /boot/grub/grub.cfg.oldroot.org ; \ cp -a /boot/grub/grubenv /boot/grub/grubenv.oldroot.org # in /etc/default/grub check the following... # ...GRUB_DEFAULT is "saved" # ...GRUB_SAVEDEFAULT is missing, outcommented or "false" # ...GRUB_DISABLE_OS_PROBER is "true" sed -i -e '/^[[:space:]]*GRUB_DEFAULT=/ { /^[[:space:]]*GRUB_DEFAULT=saved/! s#^\([[:space:]]*GRUB_DEFAULT=\)\([^[:space:]]*\)#\# GRUB_DEFAULT was: \2\n\1saved# ; }' /etc/default/grub ; \ grep -q -e '^[[:space:]]*GRUB_DEFAULT=' /etc/default/grub || echo 'GRUB_DEFAULT=saved' >> /etc/default/grub ; \ sed -i -e '/^[[:space:]]*GRUB_SAVEDEFAULT=/ { /^[[:space:]]*GRUB_SAVEDEFAULT=false/! s#^\([[:space:]]*GRUB_SAVEDEFAULT=\)\([^[:space:]]*\)#\# GRUB_SAVEDEFAULT was: \2\n\1false# ; }' /etc/default/grub ; \ sed -i -e '/^[[:space:]]*GRUB_DISABLE_OS_PROBER=/ { /^[[:space:]]*GRUB_DISABLE_OS_PROBER=true/! s#^\([[:space:]]*GRUB_DISABLE_OS_PROBER=\)\([^[:space:]]*\)#\# GRUB_DISABLE_OS_PROBER was: \2\n\1true# ; }' /etc/default/grub ; \ grep -q -e '^[[:space:]]*GRUB_DISABLE_OS_PROBER=' /etc/default/grub || echo 'GRUB_DISABLE_OS_PROBER=true' >> /etc/default/grub # recreate GRUB2 configuration update-grub cp -av /boot/grub/grub.cfg /boot/grub/grub.cfg.oldroot.saved [ -z "${OLDBOOT}" ] && { sed -n -e '/^### BEGIN \/etc\/grub\.d\/10_linux ###/,/^### END \/etc\/grub\.d\/10_linux ###/p' /boot/grub/grub.cfg > /boot/grub/custom.cfg sed -i -e "/menuentry/ s#\(menuentry[[:space:]]\+'\)[^',]*#\1old root#" -e "/submenu/ s#\(submenu[[:space:]]\+'\)[^',]*#\1Advanced options for old root#" -e 's#/etc/grub\.d/10_linux#oldroot#' -e "/Loading Linux/ s#\(Loading \)\(Linux\)#\1old root \2#" /boot/grub/custom.cfg cat /boot/grub/custom.cfg cp -av /boot/grub/custom.cfg /boot/grub/custom.oldroot.mini.cfg } # create GRUB custom.cfg for Mini-Debian for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done mount_mini-debian.sh # a) when booted from Mini-Debian grub2_mini-debian.sh mini ; \ cp -av /boot/grub/custom.cfg /boot/grub/custom.mini-debian.mini.cfg ; \ cat /boot/grub/custom.cfg # b) when booted from OLDROOT grub2_mini-debian.sh oldroot ; \ cp -av /boot/grub/custom.cfg /boot/grub/custom.mini-debian.oldroot.cfg ; \ cat /boot/grub/custom.cfg cp -av /etc/default/grub* /mnt/mini/etc/default/ ; \ [ -z "${OLDBOOT}" ] && { cp -av /boot/grub/custom.*.cfg /mnt/mini/boot/grub/ cp -av /boot/initrd.img-$(uname -r).* /mnt/mini/boot/ } umount_mini-debian.sh # Choose Mini-Debian as default for next boot only: grub-set-default 0 ; grub-reboot 'Mini-Debian' ; : \ ## WARNING!!! You need to specify "fallback default" before!!! ; \ cat /boot/grub/grubenv [ -n "${OLDGRUBNOBOOT}" -o -n "${OLDGRUBNOWRITE}" ] && { LIVECD=0 printf '\a' echo "WARNING! GRUB is installed on block devices that use ${OLDGRUBCHECK}." : [ -n "${OLDGRUBNOBOOT}" ] && { echo "GRUB may not be able to boot from ${OLDGRUBNOBOOT}." LIVECD=1 } : [ -n "${OLDGRUBNOWRITE}" ] && { echo "GRUB is not able to change variables during the boot phase on ${OLDGRUBNOWRITE}." echo 'Therefore the Debian setting GRUB_SAVEDEFAULT and GRUB command "save_env" will not work.' LIVECD=1 } : [ "${LIVECD}" -eq 1 ] && { echo 'If anything goes wrong, then access to the machine via a live CD is needed.' echo 'This will allow to mount the root and boot partition, chroot into the system and fix the GRUB environment and/or boot partition.' echo 'Hopefully you have TESTED this BEFORE!' } : printf '\a' unset LIVECD } reboot # After reboot check for successful start of Mini-Debian, otherwise fix the boot problem (e.g. use first entry of /boot/grub/grub.cfg as reference, except for references to old root partion) [ ! -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this is NOT mini-debian. Please fix/re-try.' ; printf '\a' ; } # Re-Install GRUB to always boot from Mini-Debian for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done if [ -z "${OLDBOOT}" ] ; then cp -av /boot/grub/custom.oldroot.mini.cfg /boot/grub/custom.cfg for DEV in ${OLDGRUBROOTDEVS} ; do { echo "grub-install ${DEV}" ; grub-install --no-floppy ${DEV} ; } ; done update-grub grub-set-default 0 else cp -av /boot/grub/custom.mini-debian.mini.cfg /boot/grub/custom.cfg grub-set-default 'Mini-Debian' fi ; \ cat /boot/grub/custom.cfg cat /boot/grub/grubenv reboot # After reboot check for successful start of Mini-Debian, otherwise fix the boot problem [ ! -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this is NOT mini-debian. Please fix/re-try.' ; printf '\a' ; } reboot ; # try a 2nd time for necessary second check # After reboot check for successful start of Mini-Debian, otherwise fix the boot problem [ ! -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this is NOT mini-debian. Please fix/re-try.' ; printf '\a' ; }
For the case that it is needed to revert back to old root later, e.g. after shrinking old root to rearrange Mini-Debian, so that the new root can occupy space where currently Mini-Debian resides.
# Choose old root as default for next boot only for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done ; \ grub-set-default "${MINIOLDGRUB1DEFAULT}" ; \ cat /boot/grub/default reboot [ -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this IS mini-debian. Please fix/re-try.' ; printf '\a' ; } for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done if [ -z "${OLDBOOT}" ] ; then for DEV in ${OLDGRUBROOTDEVS} ; do { echo "grub-install ${DEV}" ; grub-install --no-floppy ${DEV} ; } ; done else cp -av /boot/grub/menu.lst.mini-debian.oldroot /boot/grub/menu.lst fi # Choose old root as default for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done ; \ grub-set-default "${MINIOLDGRUB1DEFAULT}" ; \ cat /boot/grub/default reboot [ -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this IS mini-debian. Please fix/re-try.' ; printf '\a' ; }
# Choose old root as default for next boot only for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done ; \ if [ -z "${OLDBOOT}" ] ; then grub-reboot 'oldroot' else cp -av /boot/grub/custom.mini-debian.oldroot.cfg /boot/grub/custom.cfg grub-set-default 0 fi ; \ cat /boot/grub/custom.cfg ; \ cat /boot/grub/grubenv reboot [ -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this IS mini-debian. Please fix/re-try.' ; printf '\a' ; } for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done [ -z "${OLDBOOT}" ] && { for DEV in ${OLDGRUBROOTDEVS} ; do { echo "grub-install ${DEV}" ; grub-install ${DEV} ; } ; done update-grub } ; \ cat /boot/grub/custom.cfg ; \ cat /boot/grub/grubenv reboot [ -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this IS mini-debian. Please fix/re-try.' ; printf '\a' ; }
[ ! -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this is NOT mini-debian. Please fix/re-try.' ; printf '\a' ; } for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done start_fs_subdevs OLDROOT check_fs_subdevs OLDROOT ; # TAKES TIME!!! shrink_fs_subdevs OLDROOT check_fs_subdevs OLDROOT '_1' ; # TAKES TIME!!!
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done cp -a /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.oldroot ; \ cp -a /etc/crypttab /etc/crypttab.oldroot show_temp_suggestions OLDROOT TEMPEX 6 | sed -e 's#storage#exchange#g' # create tempex device(s) with file system as suggested, then set TEMPEX variables determine_subdevs TEMPEX "${TEMPEX}" "${TEMPEXSIZEMIN}" 'X' > /root/bin/luks_TEMPEX.inc ; \ chmod ug=rw,o= /root/bin/luks_*.inc for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done [ "${TEMPEX_1TYPE}" = 'lvm' -a "${OLDROOT_1TYPE}" = 'lvm' ] && { [ "${TEMPEX_1VG}" != "${OLDROOT_1VG}" ] && { echo "TEMPEX does not share the same volume group as OLDROOT" echo "It is recommended to combine both volume groups via vgmerge to gain the" echo "possibility to move logical volumes between physical volumes via pvmove." echo " lvm vgchange -a n '${TEMPEX_1VG}'" echo " lvm vgmerge '${OLDROOT_1VG}' '${TEMPEX_1VG}'" echo " lvm vgchange -a y '${OLDROOT_1VG}'" echo " TEMPEX='/dev/${OLDROOT_1VG}/${TEMPEX_1LV}'" echo " determine_subdevs TEMPEX \"\${TEMPEX}\" \"\${TEMPEXSIZEMIN}\" 'X' > /root/bin/luks_TEMPEX.inc" echo " for SRC in /root/bin/luks_*.inc ; do . \"\${SRC}\" ; done" } } ### TODO: lvcreate via 100%PVS via show_temp ??? ; \ # Remove dummy temporary LVM volume of 1 extent if existing #[ "${TEMPEX_1TYPE}" = 'lvm' -a -e "${TEMPEX_1}" ] && { # lvm lvremove "${TEMPEX_1}" #} # Check if an LVM move for OLDROOT is possible for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done unset OLDROOTLVMMOVE ; \ [ "${TEMPEX_1TYPE}" = 'lvm' -a "${OLDROOT_1TYPE}" = 'lvm' ] && { [ "${TEMPEX_1VG}" = "${OLDROOT_1VG}" ] && { OLDROOTLVMMOVE='_1' [ -e "${TEMPEX_1}" ] && { lvm lvremove "${TEMPEX_1}" } } } ; \ echo "OLDROOTLVMMOVE='${OLDROOTLVMMOVE}'" > /root/bin/luks_TEMPEX_OLDROOT.inc ; \ chmod ug=rw,o= /root/bin/luks_*.inc # Create a big enough temporary LVM volume if necessary #[ -z "${OLDROOTLVMMOVE}" -a "${TEMPEX_1TYPE}" = 'lvm' -a ! -e "${TEMPEX_1}" ] && { # if [ "${DEBVERSION}" -le 4 ]; then # lvm lvcreate -n "${TEMPEX_1LV}" -L "${TEMPEX_1SIZEMIN}M" "${TEMPEX_1VG}" ${TEMPEX_1SUBDEVS} # else # lvm lvcreate -n "${TEMPEX_1LV}" -l 100%PVS "${TEMPEX_1VG}" ${TEMPEX_1SUBDEVS} # fi # mkfs.${TEMPEXTYPE} "${TEMPEX_1}" ; printf '\a' #}
# Do the actual copying/moving for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done start_fs_subdevs OLDROOT ; \ start_fs_subdevs TEMPEX check_fs_subdevs TEMPEX '' "${OLDROOTLVMMOVE}" ; \ printf '\a' ; # TAKES TIME!!! [ -n "${OLDROOTLVMMOVE}" ] && { echo "Use $(if [ "${DEBVERSION}" -le 4 ]; then echo 'lvdisplay'; else echo 'pvdisplay'; fi) -m and pvmove to transfer logical volume '${OLDROOT_1LV}'" echo "within volume group '${OLDROOT_1VG}' from physical volume(s) ${OLDROOT_1SUBDEVS}" echo "to physical volume(s) ${TEMPEX_1SUBDEVS}," echo 'which can also be done in pieces/chunks.' if [ "${DEBVERSION}" -le 4 ] ; then echo " lvm lvdisplay -v -m ${OLDROOT_1}" fi echo " lvm pvdisplay -v -m ${OLDROOT_1SUBDEVS} ${TEMPEX_1SUBDEVS} || lvm pvs --units m -v --segments ${OLDROOT_1SUBDEVS} ${TEMPEX_1SUBDEVS}" echo " lvm pvmove --alloc anywhere -n '${OLDROOT_1LV}' <olddev>[:<oldstart>+<size>] <tempdev>[:<newstart>+<size>]" echo ' ## re-iterate to check and move other pieces/chunks' echo " TEMPEX='${OLDROOT}'" echo " determine_subdevs TEMPEX \"\${TEMPEX}\" \"\${OLDROOTSIZEMIN}\" 'X' > /root/bin/luks_TEMPEX.inc" echo " for SRC in /root/bin/luks_*.inc ; do . \"\${SRC}\" ; done" } [ -z "${OLDROOTLVMMOVE}" ] && { mount_oldroot.sh mount_tempex.sh } [ -z "${OLDROOTLVMMOVE}" ] && { cp -axv /mnt/oldroot/. /mnt/tempex/ ; printf '\a' } ; # TAKES TIME!!! [ -z "${OLDROOTLVMMOVE}" ] && { umount_oldroot.sh umount_tempex.sh } check_fs_subdevs TEMPEX ; \ printf '\a' ; # TAKES TIME!!!
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done # ATTENTION!!! Get and prepare suggestions, but they will be executed later show_newroot_suggestions OLDROOT # ATTENTION!!! Adopt the suggestions to the wanted target partition scheme, which was planned during the preparation phase. # determine further info before continuing (e.g. mdadm -D) start_fs_subdevs OLDROOT remove_fs_subdevs OLDROOT '' "${OLDROOTLVMMOVE}" "${OLDROOTLVMMOVE:+D}" [ -z "${OLDBOOT}" -a "${GRUBRELEASE}" -ge 2 ] && rm -v /boot/grub/custom.cfg for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done # ATTENTION!!! create new BOOT and root devices with file system as suggested, then set NEWBOOT and NEWROOT variables determine_subdevs NEWBOOT "${NEWBOOT}" "${NEWBOOTSIZEMIN}" 'X' > /root/bin/luks_NEWBOOT.inc ; \ determine_subdevs NEWROOT "${NEWROOT}" "${NEWROOTSIZEMIN}" 'X' > /root/bin/luks_NEWROOT.inc ; \ chmod ug=rw,o= /root/bin/luks_*.inc for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done NEWGRUB="$( [ -n "${NEWBOOT}" ] && echo 'NEWBOOT' || echo 'NEWROOT' )" unset NEWGRUBNOWRITE NEWGRUBNOBOOT ; \ NEWGRUBCHECK="$( print_subdevs_value "${NEWGRUB}" 'TYPE' 'mdadm|lvm' )" ; \ [ -n "${NEWGRUBCHECK}" ] && { if [ "${GRUBRELEASE}" -eq 1 ] ; then for TYPE in ${NEWGRUBCHECK} ; do case "${TYPE}" in (mdadm) TYPE="$( print_subdevs_value "${NEWGRUB}" 'RLEVEL' 'mdadm' )" if [ "${TYPE}" != 'raid1' ] ; then NEWGRUBNOWRITE="${NEWGRUBNOWRITE:+${NEWGRUBNOWRITE}, or }non-level 1 mdadm raid" NEWGRUBNOBOOT="${NEWGRUBNOBOOT:+${NEWGRUBNOBOOT}, or }non-level 1 mdadm raid" else TYPE="$( print_subdevs_value "${NEWGRUB}" 'METADATA' 'mdadm' )" [ "${TYPE}" = '0.90' -o "${TYPE}" = '1.0' ] && { NEWGRUBNOBOOT="${NEWGRUBNOBOOT:+${NEWGRUBNOBOOT}, or }level 1 mdadm raid with super block of version ${TYPE} which is located at the end of its subdevices" } fi ;; (lvm) NEWGRUBNOWRITE="${NEWGRUBNOWRITE:+${NEWGRUBNOWRITE}, or }lvm volume" NEWGRUBNOBOOT="${NEWGRUBNOBOOT:+${NEWGRUBNOBOOT}, or }lvm volume" ;; esac done unset TYPE elif [ "${GRUBRELEASE}" -ge 2 ] ; then NEWGRUBNOWRITE="${NEWGRUBNOWRITE:+${NEWGRUBNOWRITE}, or }those devices" fi } NEWGRUBROOTDEVS="$( print_subdevs_value "${NEWGRUB}" SUBDEVS 'mbr|gpt' )" ; \ echo "GRUB is (or should be) installed on ${NEWGRUBROOTDEVS}"Create again a simple script to keep the determined details:
cat > /root/bin/luks_NEWGRUB.inc << __EOF echo 'Setting NEWGRUB vars...' 1>&2 NEWGRUBROOTDEVS='${NEWGRUBROOTDEVS}' NEWGRUB='${NEWGRUB}' NEWGRUBCHECK='${NEWGRUBCHECK}' NEWGRUBNOWRITE='${NEWGRUBNOWRITE}' NEWGRUBNOBOOT='${NEWGRUBNOBOOT}' __EOF chmod ug=rw,o= /root/bin/luks_*.inc for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done [ "${TEMPEX_1TYPE}" = 'lvm' -a "${NEWROOT_1TYPE}" = 'lvm' ] && { [ "${TEMPEX_1VG}" != "${NEWROOT_1VG}" ] && { echo "TEMPEX does not share the same volume group as NEWROOT" echo "It is recommended to combine both volume groups via vgmerge to gain the" echo "possibility to move logical volumes between physical volumes via pvmove." echo " lvm vgchange -a n '${TEMPEX_1VG}'" echo " lvm vgmerge '${NEWROOT_1VG}' '${TEMPEX_1VG}'" echo " lvm vgchange -a y '${NEWROOT_1VG}'" echo " TEMPEX='/dev/${NEWROOT_1VG}/${TEMPEX_1LV}'" echo " determine_subdevs TEMPEX \"\${TEMPEX}\" \"\${TEMPEXSIZEMIN}\" 'X' > /root/bin/luks_TEMPEX.inc" echo " for SRC in /root/bin/luks_*.inc ; do . \"\${SRC}\" ; done" } } ### TODO: lvcreate via OLDROOTSIZEMIN via show_newroot ??? ; \ # Remove dummy temporary LVM volume of 1 extent if existing [ "${NEWROOT_1TYPE}" = 'lvm' -a -e "${NEWROOT_1}" ] && { dd if=/dev/zero of="${NEWROOT_1}" bs=1024k ; printf '\a' lvm lvremove "${NEWROOT_1}" } # Check if an LVM move for NEWROOT is possible for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done unset NEWROOTLVMMOVE ; \ [ "${TEMPEX_1TYPE}" = 'lvm' -a "${NEWROOT_1TYPE}" = 'lvm' ] && { [ "${TEMPEX_1VG}" = "${NEWROOT_1VG}" ] && { NEWROOTLVMMOVE='_1' } } ; \ echo "NEWROOTLVMMOVE='${NEWROOTLVMMOVE}'" > /root/bin/luks_TEMPEX_NEWROOT.inc ; \ chmod ug=rw,o= /root/bin/luks_*.inc # Create a big enough temporary LVM volume if necessary [ -z "${NEWROOTLVMMOVE}" -a "${NEWROOT_1TYPE}" = 'lvm' ] && { : \ ## NOTE: here the LV name could be switched/changed for the new encrypted root system ; \ NEWROOT_1LV='rootfs' NEWROOT_1="/dev/${NEWROOT_1VG}/${NEWROOT_1LV}" lvm lvcreate -n "${NEWROOT_1LV}" -L "${NEWROOT_1SIZEMIN}M" "${NEWROOT_1VG}" ${NEWROOT_1SUBDEVS} lvm lvchange -a y "${NEWROOT_1}" mkfs.${NEWROOTTYPE} "${NEWROOT_1}" ; printf '\a' determine_subdevs NEWROOT "${NEWROOT_1}" "${NEWROOTSIZEMIN}" 'X' > /root/bin/luks_NEWROOT.inc for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done }
# Do the actual copying/moving for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done start_fs_subdevs TEMPEX ; \ start_fs_subdevs NEWBOOT ; \ start_fs_subdevs NEWROOT [ -z "${OLDBOOT}" ] && check_fs_subdevs NEWBOOT ; \ check_fs_subdevs NEWROOT '' "${NEWROOTLVMMOVE}" ; \ printf '\a' ; # TAKES TIME!!! [ -n "${NEWROOTLVMMOVE}" ] && { echo "Use $(if [ "${DEBVERSION}" -le 4 ]; then echo 'lvdisplay'; else echo 'pvdisplay'; fi) -m and pvmove to transfer logical volume '${TEMPEX_1LV}'" echo "within volume group '${NEWROOT_1VG}' from physical volume(s) ${TEMPEX_1SUBDEVS}" echo "to physical volume(s) ${NEWROOT_1SUBDEVS}" if [ "${DEBVERSION}" -le 4 ] ; then echo " lvm lvdisplay -v -m ${TEMPEX_1}" fi echo " lvm pvdisplay -v -m ${TEMPEX_1SUBDEVS} ${NEWROOT_1SUBDEVS} || lvm pvs --units m -v --segments ${TEMPEX_1SUBDEVS} ${NEWROOT_1SUBDEVS}" echo " lvm pvmove --alloc anywhere -n '${TEMPEX_1LV}' <tempdev>[:<oldstart>+<size>] <newdev>[:<newstart>+<size>]" echo " ## When '${TEMPEX_1LV}' moved to ${NEWROOT_1SUBDEVS}" echo " ## NOTE: here the LV name could be switched/changed for the new encrypted root system" echo " ## via lvm lvrename '${NEWROOT_1VG}' '${TEMPEX_1LV}' '<newname>'" echo " NEWROOT='/dev/${NEWROOT_1VG}/${TEMPEX_1LV}'" echo " determine_subdevs NEWROOT \"\${NEWROOT}\" '${NEWROOTSIZEMIN}' 'X' > /root/bin/luks_NEWROOT.inc" } [ -n "${NEWROOTLVMMOVE}" ] && { : \ ## Add dummy logical volume for determine_subdevs ; \ TEMPEX_1LV='TEMPEX' TEMPEX_1="/dev/${TEMPEX_1VG}/${TEMPEX_1LV}" lvm lvcreate -n "${TEMPEX_1LV}" -L 1024M "${TEMPEX_1VG}" ${TEMPEX_1SUBDEVS} lvm lvchange -a y "${TEMPEX_1}" mkfs.${TEMPEXTYPE} "${TEMPEX_1}" ; printf '\a' determine_subdevs TEMPEX "${TEMPEX_1}" '' 'X' > /root/bin/luks_TEMPEX.inc for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done } [ -z "${NEWROOTLVMMOVE}" ] && mount_tempex.sh ; \ mount_newroot.sh noboot [ -z "${NEWROOTLVMMOVE}" ] && { cp -axv /mnt/tempex/. /mnt/newroot/ ; printf '\a' } ; # TAKES TIME!!!Now handle the new boot partiton:
[ ! -s /root/bin/luks_TEMPEX_NEWBOOT.inc ] && { echo 'unset NEWBOOTMVDONE' > /root/bin/luks_TEMPEX_NEWBOOT.inc } [ -z "${OLDBOOT}" ] && { . /root/bin/luks_TEMPEX_NEWBOOT.inc if [ "${NEWBOOTMVDONE}" = 'DONE' ] ; then echo "ERROR! Copying to new boot partition was already done (NEWBOOTMVDONE=${NEWBOOTMVDONE})" ; printf '\a' elif [ "${NEWBOOTMVDONE}" = 'PREP' ] ; then echo "ERROR! Preparation for copying to new boot partition was already done (NEWBOOTMVDONE=${NEWBOOTMVDONE})" ; printf '\a' elif [ -n "${NEWBOOTMVDONE}" ] ; then echo "ERROR! Something went wrong (NEWBOOTMVDONE=${NEWBOOTMVDONE})" ; printf '\a' else if [ -n "${NEWROOTLVMMOVE}" ] ; then mount_tempex.sh [ -d /mnt/tempex/boot ] || install -v -d /mnt/tempex/boot cp -axv /mnt/newroot/boot/. /mnt/tempex/boot/ && { NEWBOOTMVDONE='PREP' echo "NEWBOOTMVDONE='${NEWBOOTMVDONE}'" > /root/bin/luks_TEMPEX_NEWBOOT.inc } else NEWBOOTMVDONE='PREP' echo "NEWBOOTMVDONE='${NEWBOOTMVDONE}'" > /root/bin/luks_TEMPEX_NEWBOOT.inc fi fi } [ -z "${OLDBOOT}" ] && { . /root/bin/luks_TEMPEX_NEWBOOT.inc if [ "${NEWBOOTMVDONE}" = 'DONE' ] ; then echo "ERROR! Copying to new boot partition was already done (NEWBOOTMVDONE=${NEWBOOTMVDONE})" ; printf '\a' elif [ -z "${NEWBOOTMVDONE}" ] ; then echo "ERROR! Preparation for copying to new boot partition went wrong (NEWBOOTMVDONE=${NEWBOOTMVDONE})" ; printf '\a' elif [ "${NEWBOOTMVDONE}" != 'PREP' ] ; then echo "ERROR! Something went wrong (NEWBOOTMVDONE=${NEWBOOTMVDONE})" ; printf '\a' else find /mnt/newroot/boot -mindepth 1 -maxdepth 1 -exec rm -rf '{}' \; mount_newroot.sh cp -axv /mnt/tempex/boot/. /mnt/newroot/boot/ ; printf '\a' NEWBOOTMVDONE='DONE' echo "NEWBOOTMVDONE='${NEWBOOTMVDONE}'" > /root/bin/luks_TEMPEX_NEWBOOT.inc fi }Clean-up and checks:
[ -z "${NEWROOTLVMMOVE}" -o -z "${OLDBOOT}" ] && umount_tempex.sh ; \ umount_newroot.sh [ -z "${OLDBOOT}" ] && check_fs_subdevs NEWBOOT ; \ check_fs_subdevs NEWROOT ; \ printf '\a' ; # TAKES TIME!!!
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done start_fs_subdevs TEMPEX remove_fs_subdevs TEMPEX rm -rf /mnt/tempex
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done show_clear_suggestions TEMPEX # clear free space on hard disks as suggested rm -f /root/bin/luks_TEMPEX*.inc
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done start_fs_subdevs NEWROOT # ATTENTION!!! Only necessary when using lvm or if it is wanted to already use all available free space for root directly on encrypted partition maximize_fs_subdevs NEWROOT wait_fs_subdevs NEWROOT ; # TAKES TIME!!! mount_newroot.sh df -h /mnt/newroot/ # Example result: # Filesystem Size Used Avail Use% Mounted on # /dev/mapper/root 5.9G 743M 4.8G 14% /mnt/newroot cp -av /root/bin/luks_*.inc /mnt/newroot/root/bin/ ; \ cp -av /etc/mdadm/ /mnt/newroot/etc/ sed -i -e "s#\(${OLDROOT}\|${OLDROOTMOUNT}\|UUID=${OLDROOTUUID}\)\([[:space:]]\+\|$\)#${NEWROOTMOUNT}\2#" /mnt/newroot/etc/fstab ; \ cat /mnt/newroot/etc/fstab cp -av /etc/crypttab /mnt/newroot/etc/ ; \ sed -i -e 's#,noauto##' -e 's/^#[[:space:]]*\(\(md\|sd\|hd\)[^[:space:]]\+_crypt[[:space:]]\+\)/\1/' /mnt/newroot/etc/crypttab ; \ echo 'Activate encrypted device in /mnt/newroot/etc/crypttab' ; \ echo 'by removing the noauto option and/or the comment char at the start of its line' ; \ printf '\a' ; \ cat /mnt/newroot/etc/crypttab nano /mnt/newroot/etc/crypttab umount_newroot.sh # Reboot to be sure that kernel has current device information reboot
[ ! -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this is NOT mini-debian. Please fix/re-try.' ; printf '\a' ; } for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done [ -z "${OLDBOOT}" ] && { [ -d /backup-boot ] || install -v -d /backup-boot : \ ## COPY files to backup, so the Mini-Debian boot installation is still there just in the case something goes wrong or the system shuts down ; \ cp -axv /boot/. /backup-boot/ ; printf '\a' if [ "${DEBVERSION}" -le 5 ] ; then echo "${NEWBOOTMOUNT} /boot ${NEWBOOTTYPE} defaults 0 2" >> /etc/fstab else echo "UUID=${NEWBOOTUUID} /boot ${NEWBOOTTYPE} defaults 0 2" >> /etc/fstab fi mount -a : mount_newroot.sh if [ "${DEBVERSION}" -le 5 ] ; then echo "${NEWBOOTMOUNT} /boot ${NEWBOOTTYPE} defaults 0 2" >> /mnt/newroot/etc/fstab else echo "UUID=${NEWBOOTUUID} /boot ${NEWBOOTTYPE} defaults 0 2" >> /mnt/newroot/etc/fstab fi umount_newroot.sh }
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done ; \ echo "GRUB version ${GRUBVERSION}.x is release ${GRUBRELEASE}"
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done [ -n "${NEWGRUBNOBOOT}" -o -n "${NEWGRUBNOWRITE}" ] && { LIVECD=0 printf '\a' echo "WARNING! GRUB is installed on block devices that use ${NEWGRUBCHECK}." : [ -n "${NEWGRUBNOBOOT}" ] && { echo "GRUB may not be able to boot from ${NEWGRUBNOBOOT}." LIVECD=1 } : [ -n "${NEWGRUBNOWRITE}" ] && { echo "GRUB is not able to change variables during the boot phase on ${NEWGRUBNOWRITE}." echo 'Therefore the GRUB command "savedefault" will not work.' LIVECD=1 } : [ "${LIVECD}" -eq 1 ] && { echo 'If anything goes wrong, then access to the machine via a live CD is needed.' echo 'This will allow to mount the root and boot partition, chroot into the system and fix the GRUB environment and/or boot partition.' echo 'Hopefully you have TESTED this BEFORE!' } : printf '\a' unset LIVECD } # prepare menu.lst for booting Mini-Debian via new boot partition [ -z "${OLDBOOT}" ] && grep -n -e '^[[:space:]]*default[[:space:]]\+' -e '^[[:space:]]*fallback[[:space:]]\+' -e '^#[[:space:]]\+groot=' -e '^#.*[[:space:]]\+AUTOMAGIC[[:space:]]\+' -e '^[[:space:]]*title[[:space:]]\+' -e '^[[:space:]]*savedefault\([[:space:]]\+\|$\)' -e '^[[:space:]]*root[[:space:]]\+' /boot/grub/menu.lst # 15:default saved # 17:fallback 1 # 49:# Put static boot stanzas before and/or after AUTOMAGIC KERNEL LIST # 51:title Mini-Debian # 53:savedefault 1 # 55:root (hd0,0) # 62:### BEGIN AUTOMAGIC KERNELS LIST # 63:## lines between the AUTOMAGIC KERNELS LIST markers will be modified # 80:# groot=(hd0,0) # 132:title Debian GNU/Linux, kernel 2.6.18-6-686 # 133:root (hd0,0) # 136:savedefault # 138:title Debian GNU/Linux, kernel 2.6.18-6-686 (single-user mode) # 139:root (hd0,0) # 142:savedefault # 144:### END DEBIAN AUTOMAGIC KERNELS LIST [ -z "${OLDBOOT}" ] && { for NEWGRUBROOTDEV in ${NEWGRUBROOTDEVS} do NEWGRUB1DEV="$( sed -n -e "s#^[[:space:]]*(\([^)]*\))[[:space:]]\+${NEWGRUBROOTDEV}.*#\1#p" /boot/grub/device.map )" break done for NEWGRUB1PART in $( print_subdevs_value "${NEWGRUB}" 'SUBPART' 'mbr|gpt' ) do NEWGRUB1PART="$(( ${NEWGRUB1PART} - 1 ))" break done echo "New GRUB boot device ${NEWGRUBROOTDEV} is ${NEWGRUB1DEV} with partition ${NEWGRUB1PART}" sed -i -e '/^[[:space:]]*title[[:space:]]\+Mini-Debian$/ s#$# (via boot)#' -e 's#/boot/#/#' -e 's#OLDROOT#NEWBOOT#' -e "s#(${OLDGRUB1DEV},${OLDGRUB1PART})#(${NEWGRUB1DEV},${NEWGRUB1PART})#" /boot/grub/menu.lst sed -i -e '/^[[:space:]]*savedefault\([[:space:]]\+\|$\)/d' -e "s#^\([[:space:]]*fallback[[:space:]]\+\)[^[:space:]]*#\1${MINIGRUB1ENTRY}#" /boot/grub/menu.lst sed -i -e "/### BEGIN grub1_mini-debian.sh/,/### END grub1_mini-debian.sh/ { /^# FIXME: set to previous default/ { n ; /^savedefault/! { isavedefault`printf '\n ; }'` ; } ; }" /boot/grub/menu.lst sed -i -e "/### BEGIN AUTOMAGIC KERNELS LIST/,/### END DEBIAN AUTOMAGIC KERNELS LIST/ { /^[[:space:]]*initrd[[:space:]]\+/ { n ; /^savedefault/! { isavedefault\t${MINIGRUB1ENTRY}`printf '\n ; }'` ; } ; }" /boot/grub/menu.lst cp -av /boot/grub/menu.lst /boot/grub/menu.lst.mini-debian.newboot } [ -z "${OLDBOOT}" ] && { for DEV in ${NEWGRUBROOTDEVS} ; do { echo "grub-install ${DEV}" ; grub-install --no-floppy ${DEV} ; } ; done : \ ## Choose Mini-Debian as default ; \ grub-set-default "${MINIGRUB1ENTRY}" cat /boot/grub/default : [ -n "${NEWGRUBNOBOOT}" -o -n "${NEWGRUBNOWRITE}" ] && { LIVECD=0 printf '\a' echo "WARNING! GRUB is installed on block devices that use ${NEWGRUBCHECK}." : [ -n "${NEWGRUBNOBOOT}" ] && { echo "GRUB may not be able to boot from ${NEWGRUBNOBOOT}." LIVECD=1 } : [ -n "${NEWGRUBNOWRITE}" ] && { echo "GRUB is not able to change variables during the boot phase on ${NEWGRUBNOWRITE}." echo 'Therefore the GRUB command "savedefault" will not work.' LIVECD=1 } : [ "${LIVECD}" -eq 1 ] && { echo 'If anything goes wrong, then access to the machine via a live CD is needed.' echo 'This will allow to mount the root and boot partition, chroot into the system and fix the GRUB environment and/or boot partition.' echo 'Hopefully you have TESTED this BEFORE!' } : printf '\a' unset LIVECD } } [ -z "${OLDBOOT}" ] && reboot # preparing the initrd for the encrypted root [ ! -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this is NOT mini-debian. Please fix/re-try.' ; printf '\a' ; } for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done mount_newroot.sh chroot /mnt/newroot cd ~ for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done if [ "${DEBVERSION}" -le 6 ] ; then rm -f /etc/mtab mount -a -f ; mount -a -f ; : \ ## to re-create /etc/mtab, important to re-install/update GRUB again ; \ else [ ! -e /etc/mtab ] && { ln -s /proc/mounts /etc/mtab } fi ; \ cat /etc/mtab [ "${DEBVERSION}" -le 5 ] && { : \ ## ATTENTION: make sure you have to correct network settings in /etc/initramfs-tools/hooks/dropbear ; \ rm -vf /etc/initramfs-tools/conf.d/dropbear } update-initramfs -u -k all # if any initrd update fails, just create a new one from scratch IVERSION="$(uname -r)" ; # FIXME: set to problematic initramfs version rm -f /boot/initrd.img-${IVERSION} ; update-initramfs -c -k ${IVERSION} # leave chroot exit # preparing GRUB to boot the encrypted root for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done grep -n -e '^#.*[[:space:]]\+AUTOMAGIC[[:space:]]\+' -e "\(${OLDROOT}\|${OLDROOTMOUNT}\|UUID=${OLDROOTUUID}\)" -e '[^g]\+root=' /boot/grub/menu.lst # 45:# kernel /vmlinuz root=/dev/hda2 ro # 49:# Put static boot stanzas before and/or after AUTOMAGIC KERNEL LIST # 57:kernel /vmlinuz-2.6.18-4-amd64 root=/dev/sda3 # 62:### BEGIN AUTOMAGIC KERNELS LIST # 63:## lines between the AUTOMAGIC KERNELS LIST markers will be modified # 73:## e.g. kopt=root=/dev/hda1 ro # 74:## kopt_2_6_8=root=/dev/hdc1 ro # 75:## kopt_2_6_8_2_686=root=/dev/hdc2 ro # 76:# kopt=root=/dev/sda2 ro # 134:kernel /vmlinuz-2.6.18-4-amd64 root=/dev/sda2 ro # 140:kernel /vmlinuz-2.6.18-4-amd64 root=/dev/sda2 ro single # 144:### END DEBIAN AUTOMAGIC KERNELS LIST sed -i -e "s#\(${OLDROOT}\|${OLDROOTMOUNT}\|UUID=${OLDROOTUUID}\)\([[:space:]]\+\|$\)#${NEWROOTMOUNT}\2#" /boot/grub/menu.lst ; \ cp -av /boot/grub/menu.lst /boot/grub/menu.lst.mini-debian.newroot # Choose new root as default for next boot only for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done ; \ grub-set-default "${MINIOLDGRUB1DEFAULT}" ; \ cat /boot/grub/default [ -n "${NEWGRUBNOBOOT}" -o -n "${NEWGRUBNOWRITE}" ] && { LIVECD=0 printf '\a' echo "WARNING! GRUB is installed on block devices that use ${NEWGRUBCHECK}." : [ -n "${NEWGRUBNOBOOT}" ] && { echo "GRUB may not be able to boot from ${NEWGRUBNOBOOT}." LIVECD=1 } : [ -n "${NEWGRUBNOWRITE}" ] && { echo "GRUB is not able to change variables during the boot phase on ${NEWGRUBNOWRITE}." echo 'Therefore the GRUB command "savedefault" will not work.' LIVECD=1 } : [ "${LIVECD}" -eq 1 ] && { echo 'If anything goes wrong, then access to the machine via a live CD is needed.' echo 'This will allow to mount the root and boot partition, chroot into the system and fix the GRUB environment and/or boot partition.' echo 'Hopefully you have TESTED this BEFORE!' } : printf '\a' unset LIVECD } reboot # After reboot check for successful start of new root, otherwise fix the boot problem [ -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this IS mini-debian. Please fix/re-try.' ; printf '\a' ; } # Choose new root as default for next boot only for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done ; \ grub-set-default "${MINIOLDGRUB1DEFAULT}" ; \ cat /boot/grub/default reboot ; # try a 2nd time for necessary second check # After reboot check for successful start of new root, otherwise fix the boot problem [ -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this IS mini-debian. Please fix/re-try.' ; printf '\a' ; } for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done # Switch to new root as default and fallback system sed -i -e '/### BEGIN grub1_mini-debian.sh ###/,/### END grub1_mini-debian.sh ###/d' /boot/grub/menu.lst ; \ sed -i -e "/^# default was: ${OLDGRUB1DEFAULT}/d" -e "s#^\([[:space:]]*default[[:space:]]\+\)saved#\1${OLDGRUB1DEFAULT}#" /boot/grub/menu.lst ; \ if [ -z "${OLDGRUB1FALLBACK}" ] ; then sed -i -e '/^# fallback added/d' -e '/^[[:space:]]*fallback\([[:space:]]\+\|$\)/d' /boot/grub/menu.lst else sed -i -e "/^# fallback was: ${OLDGRUB1FALLBACK}/d" -e "s#^\([[:space:]]*fallback[[:space:]]\+\)${MINIGRUB1ENTRY}#\1${OLDGRUB1FALLBACK}#" /boot/grub/menu.lst fi update-grub cp -av /boot/grub/menu.lst /boot/grub/menu.lst.newroot # Choose new root as default for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done ; \ grub-set-default "${OLDGRUB1SAVED}" ; \ cat /boot/grub/default reboot # After reboot check for successful start of new root, otherwise fix the boot problem [ -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this IS mini-debian. Please fix/re-try.' ; printf '\a' ; } reboot ; # try a 2nd time for necessary second check # After reboot check for successful start of new root, otherwise fix the boot problem [ -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this IS mini-debian. Please fix/re-try.' ; printf '\a' ; }
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done [ -n "${NEWGRUBCHECK}" ] && { printf '\a' echo "WARNING! GRUB is installed on block devices that use ${NEWGRUBCHECK}." echo 'GRUB is not able to change variables during the boot phase on those devices.' echo 'Therefore the Debian setting GRUB_SAVEDEFAULT and GRUB command "save_env" will not work.' echo 'If anything goes wrong then access to the machine via a live CD is needed.' echo 'This will allow to mount the root and boot partition, chroot into the system and fix the GRUB environment variables.' echo 'Hopefully you have TESTED this BEFORE!' printf '\a' } mount_newroot.sh chroot /mnt/newroot cd ~ for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done if [ "${DEBVERSION}" -le 6 ] ; then rm -f /etc/mtab mount -a -f ; mount -a -f ; # to re-create /etc/mtab, important to re-install/update GRUB again else [ ! -e /etc/mtab ] && { ln -s /proc/mounts /etc/mtab } fi cat /etc/mtab [ -z "${OLDBOOT}" ] && for DEV in ${NEWGRUBROOTDEVS} ; do { echo "grub-install ${DEV}" ; grub-install --no-floppy ${DEV} ; } ; done update-grub cp -av /boot/grub/grub.cfg /boot/grub/grub.cfg.newroot update-initramfs -u -k all # if any initrd update fails, just create a new one from scratch IVERSION="$(uname -r)" ; # FIXME: set to problematic initramfs version rm -f /boot/initrd.img-${IVERSION} ; update-initramfs -c -k ${IVERSION} # leave chroot exit umount_newroot.sh for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done [ -z "${OLDBOOT}" ] && { cp -a /boot/grub/custom.mini-debian.mini.cfg /boot/grub/custom.cfg sed -i -e 's#/boot/#/#' -e "/^[[:space:]]*\(set[[:space:]]\+root=\|search[[:space:]]\+\)/ s#${MINIDEBUUID}#${NEWBOOTUUID}#" /boot/grub/custom.cfg NEWGRUB2ROOT="$(sed -n -e '/^### BEGIN \/etc\/grub\.d\/00_header/,/^### END \/etc\/grub\.d\/00_header/ { /^[[:space:]]*set[[:space:]]\+root=/ { s#^[[:space:]]*##p ; } ; }' /boot/grub/grub.cfg | sort -u)" NEWGRUB2SEARCHHINT="$(sed -n -e '/^### BEGIN \/etc\/grub\.d\/00_header/,/^### END \/etc\/grub\.d\/00_header/ { /^[[:space:]]*search[[:space:]]\+.*--set=root[[:space:]]\+.*--hint/ { s#^[[:space:]]*##p ; } ; }' /boot/grub/grub.cfg | sort -u)" sed -i -e "/^[[:space:]]*set[[:space:]]\+root=/ { s#^\([[:space:]]*\).*#\1${NEWGRUB2ROOT}#; }" -e "/^[[:space:]]*search[[:space:]]\+.*--set=root[[:space:]]\+.*--hint/ { s#^\([[:space:]]*\).*#\1${NEWGRUB2SEARCHHINT}#; }" /boot/grub/custom.cfg # check that "set root" is the same as in /boot/grub/grub.cfg grep -e '^[[:space:]]*set[[:space:]]\+root=' -e '^[[:space:]]*search[[:space:]]\+.*--set' /boot/grub/custom.cfg /boot/grub/grub.cfg # otherwise fix manually: nano /boot/grub/custom.cfg } # Choose new root as default for next boot only grub-set-default 'Mini-Debian' ; grub-reboot 0 ; : \ ## WARNING!!! You need to specify "fallback default" before!!! ; \ cat /boot/grub/grubenv reboot # Remember that you have to unlock the root device now before Debian starts # After reboot check for successful start of new root, otherwise fix the boot problem [ -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this IS mini-debian. Please fix/re-try.' ; printf '\a' ; } # try a 2nd time for necessary second check grub-set-default 'Mini-Debian' ; grub-reboot 0 ; : \ ## WARNING!!! You need to specify "fallback default" before!!! ; \ cat /boot/grub/grubenv reboot # After reboot check for successful start of new root, otherwise fix the boot problem [ -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this IS mini-debian. Please fix/re-try.' ; printf '\a' ; } cp -a /etc/default/grub.oldroot.org /etc/default/grub cp -a /boot/grub/grubenv.oldroot.org /boot/grub/grubenv update-grub cat /boot/grub/grubenv reboot # Remember that you have to unlock the root device now before Debian starts # After reboot check for successful start of new root, otherwise fix the boot problem [ -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this IS mini-debian. Please fix/re-try.' ; printf '\a' ; } reboot ; # try a 2nd time for necessary second check # After reboot check for successful start of new root, otherwise fix the boot problem [ -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this IS mini-debian. Please fix/re-try.' ; printf '\a' ; }
rm -fv /boot/grub/custom*.cfg ; \ rm -fv /boot/grub/grub.cfg.* ; \ rm -fv /boot/grub/grubenv.* ; \ rm -fv /boot/grub/menu.lst.* ; \ rm -fv /boot/initrd.img-*.mini-debian ; \ rm -fv /etc/default/grub.* rm -fv /boot/initrd.img-*.oldroot ; \ rm -fv /root/bin/grub*_mini-debian.sh ; \ rm -fv /root/bin/luks_*_grub*.inc ; \ rm -fv /root/bin/*mount_mini-debian.sh ; \ rm -fv /root/bin/*mount_newroot.sh ; \ rm -fv /root/bin/*mount_oldroot.sh ; \ rm -fv /root/bin/*mount_tempex.sh
[ -e /mini-debian ] && { echo 'ERROR!!! Unexpected system, this IS mini-debian. Please fix/re-try.' ; printf '\a' ; } for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done cp -av /etc/fstab /etc/fstab.newroot.noswap case "${NEWROOT_1TYPE}" in (lvm) start_fs_subdevs MINIDEB remove_fs_subdevs MINIDEB ;; (*) echo "ATTENTION: new root via ${NEWROOT_1TYPE}, please handle accordingly, e.g. see 99)" ; printf '\a' ;; esac update-initramfs -u -k all ; # update InitRD with removed raids, etc. # if any initrd update fails, just create a new one from scratch IVERSION="$(uname -r)" ; # FIXME: set to problematic initramfs version rm -f /boot/initrd.img-${IVERSION} ; update-initramfs -c -k ${IVERSION}
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done show_clear_suggestions MINIDEB # clear free space on hard disks as suggested rm -f /root/bin/luks_MINIDEB.inc for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done start_fs_subdevs NEWROOT ; # only necessary when working from Live CD case "${NEWROOT_1TYPE}" in (lvm) maximize_fs_subdevs NEWROOT ;; (*) echo "ATTENTION: new root via ${NEWROOT_1TYPE}, please handle accordingly, e.g. see 99)" ; printf '\a' ;; esac
unset NEWSWAP NEWSWAPSIZEMIN=2048 ; # FIXME: set to wanted size in MiB, should be at least as big as 1.3x RAM size (e.g. for hibernation) NEWSWAP_1TYPE="${NEWROOT_1TYPE}" NEWSWAP_1VG="${NEWROOT_1VG}" NEWSWAP_1LV='swap_1' ; # FIXME: set to wanted name case "${NEWROOT_1TYPE}" in (lvm) lvm lvcreate -n "${NEWSWAP_1LV}" -L ${NEWSWAPSIZEMIN}M ${NEWSWAP_1VG} NEWSWAP_1="/dev/${NEWSWAP_1VG}/${NEWSWAP_1LV}" ;; (*) echo "ATTENTION: new swap via ${NEWSWAP_1TYPE}, please handle accordingly, e.g. see 99)" ; printf '\a' ;; esac mkswap "${NEWSWAP_1}" determine_subdevs NEWSWAP "${NEWSWAP_1}" "${NEWSWAPSIZEMIN}" 'X' > /root/bin/luks_NEWSWAP.inc ; \ chmod ug=rw,o= /root/bin/luks_*.inc for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done [ -n "${OLDSWAP}" ] && sed -i -e "s#^[[:space:]]*[#]*[[:space:]]*\(${OLDSWAP}\|${OLDSWAPMOUNT}\|UUID=${OLDSWAPTUUID}\)\([[:space:]]\+\|$\)#${NEWSWAPMOUNT}\2#" /etc/fstab ; \ grep -q -F -e "${NEWSWAPMOUNT}" /etc/fstab || echo "${NEWSWAPMOUNT} none swap sw 0 0" >> /etc/fstab ; \ cat /etc/fstab swapon -a swapon -s ; # additionally may check with top update-initramfs -u -k all ; # already update InitRD to make it work for an accidential reboot # if any initrd update fails, just create a new one from scratch IVERSION="$(uname -r)" ; # FIXME: set to problematic initramfs version rm -f /boot/initrd.img-${IVERSION} ; update-initramfs -c -k ${IVERSION}
for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done NEWSWAPUSEFORRESUME=1 ; # FIXME: want to use this swap partition for suspend/hibernate echo "swap resume is ${NEWSWAPUSEFORRESUME}" ; \ [ "${NEWSWAPUSEFORRESUME:-0}" -eq 1 ] && { case "${NEWSWAP_1TYPE}" in (lvm) ;; (luks) echo 'WARNING!!! For using an encrypted swap partition for hibernation it has to have a static key, not a random one. Please check.' ; printf '\a' echo "Current key is ${NEWSWAPCRYPTKEY}" ;; (*) echo "ATTENTION: new swap via ${NEWSWAP_1TYPE}, please handle accordingly, e.g. see 99)" ; printf '\a' ;; esac } cat > /root/bin/luks_NEWSWAP_resume.inc << __EOF echo 'Setting NEWSWAP RESUME vars...' 1>&2 NEWSWAPUSEFORRESUME=${NEWSWAPUSEFORRESUME:-0} # NEWSWAPRESUME='$( [ "${NEWSWAPUSEFORRESUME:-0}" -eq 1 ] && echo "${NEWSWAPMOUNT}" )' OLDSWAPRESUME='$( [ -e /etc/initramfs-tools/conf.d/resume ] && sed -n -e 's#^[[:space:]]*RESUME=##p' /etc/initramfs-tools/conf.d/resume )' # GRUBVERSION='$( grub-install --version | sed -n -e 's#[^(]*[(]*[^0-9]*\([0-9]*\).*#\1#p' )' [ \${GRUBVERSION} -eq 0 ] && GRUBRELEASE=1 || GRUBRELEASE=2 __EOF chmod ug=rw,o= /root/bin/luks_*.inc for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done if [ -s /etc/initramfs-tools/conf.d/resume ] ; then [ -n "${OLDSWAP}" ] && sed -i -e "s#RESUME=UUID=${OLDSWAPUUID}#RESUME=${NEWSWAPRESUME}#" -e "s#RESUME=${OLDSWAP}#RESUME=${NEWSWAPRESUME}#" /etc/initramfs-tools/conf.d/resume nano /etc/initramfs-tools/conf.d/resume else echo "RESUME=${NEWSWAPRESUME}" > /etc/initramfs-tools/conf.d/resume fi ; \n cat /etc/initramfs-tools/conf.d/resume if [ "${NEWSWAPUSEFORRESUME:-0}" -eq 1 ] ; then echo "Make sure resume is enabled in boot loader." ; printf '\a' if [ "${GRUBRELEASE}" -eq 1 ] ; then echo 'Enable resume in GRUB 1 (v0.x), by removing noresume from defoptions in /boot/grub/menu.lst if present' elif [ "${GRUBRELEASE}" -ge 2 ] ; then echo 'Enable resume in GRUB 2 (v1.x), by removing noresume from GRUB_CMDLINE_LINUX in /etc/default/grub if present' fi else echo "If partition for hibernation (currently ${NEWSWAPRESUME:-none}) does not exist, then disable resume in boot loader." ; printf '\a' if [ "${GRUBRELEASE}" -eq 1 ] ; then echo 'Disable resume in GRUB 1 (v0.x), by adding noresume to defoptions in /boot/grub/menu.lst when missing' elif [ "${GRUBRELEASE}" -ge 2 ] ; then echo 'Disable resume in GRUB 2 (v1.x), by adding noresume to GRUB_CMDLINE_LINUX in /etc/default/grub when missing' fi fi update-initramfs -u -k all # if any initrd update fails, just create a new one from scratch IVERSION="$(uname -r)" ; # FIXME: set to problematic initramfs version rm -f /boot/initrd.img-${IVERSION} ; update-initramfs -c -k ${IVERSION} update-grub ; # to remove old entries from Mini-Debian if still present (normally GRUB2 only) and to add changes to GRUB configuration reboot
swapon -s ; # additionally may check with top # Testing hibernation/suspend screen ; # open a virtual console by hitting space for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done ; \ [ "${NEWSWAPUSEFORRESUME:-0}" -eq 1 ] && { echo 'disk' > /sys/power/state # reboot machine after it went to sleep } # restart machine screen -r ; # reconnect to virtual console, the previous content should be displayed exit ; # leave screen
rm -fv /etc/fstab.newroot.* ; \ rm -fv /root/bin/luks_*.inc rm -fv /root/bin/custom_functions.inc ; \ rm -fv /root/bin/*mount_sys.sh
cryptsetup luksDump /dev/sda3 cryptsetup luksAddKey /dev/sda3 [<key file>] cryptsetup luksRemoveKey /dev/sda3 cryptsetup luksDump /dev/sda3
There are several guides to protect and/or monitor the unencrypted boot partition:
It is recommended to also use LVM for the swap partition, there are no extra steps to take care for keeping UUID and/or supporting hibernation.
Plus all advantages of LVM can be used.
The following steps haven't been checked against the latest versions of my scripts.
# ATTENTION!!! execute 5a before this step to release hard disk space occupied by Mini-Debian for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done show_clear_suggestions MINIDEB # clear free space on hard disks as suggested # FIXME: choose if swap partition is encrypted with a random key or unlocked with a passphrase or the root partition key NEWSWAPCRYPTKEY='/dev/urandom' ; # random key, no resume possible NEWSWAPCRYPTKEY='/dev/random' ; # random key, no resume possible NEWSWAPCRYPTKEY='none' ; # static passphrase NEWSWAPCRYPTKEY='md1_crypt' ; # key from existing encrypted device (normally root on luks partition) echo "swap key is ${NEWSWAPCRYPTKEY}" ; printf '\a' show_newswap_suggestions MINIDEB "${NEWSWAPCRYPTKEY}" # ATTENTION!!! create new swap devices as suggested, then set NEWSWAP variables and create info script chmod ug=rw,o= /root/bin/luks_*.inc for SRC in /root/bin/luks_*.inc ; do . "${SRC}" ; done [ -n "${OLDSWAP}" ] && sed -i -e "s#^[[:space:]]*[#]*[[:space:]]*\(${OLDSWAP}\|${OLDSWAPMOUNT}\|UUID=${OLDSWAPTUUID}\)\([[:space:]]\+\|$\)#${NEWSWAPMOUNT}\2#" /etc/fstab ; \ grep -q -F -e "${NEWSWAPMOUNT}" /etc/fstab || { echo "${NEWSWAPMOUNT} none swap sw 0 0" >> /etc/fstab } ; \ cat /etc/fstab swapon -a swapon -s ; # additionally may check with top update-initramfs -u -k all ; # already update InitRD to make it work for an accidential reboot # if any initrd update fails, just create a new one from scratch IVERSION="$(uname -r)" ; # FIXME: set to problematic initramfs version rm -f /boot/initrd.img-${IVERSION} ; update-initramfs -c -k ${IVERSION}Continue with step 5d for hibernation and final clean up.
Top | Start | Kontakt |