Duální prostředí

Pokud dojde k nějakému fatálnímu porušení aktuálního prostředí, záchranou bývá pouze obnova ze zálohy, použití Restore CD nebo nějakého jiného média s live systémem. Tohle vše mne vedlo k tomu vytvořit na systémech dvě prostředí, jedno pro vlastní práci, druhé pro obnovu, jako záložní, případně pro cross kompilaci a upgrade z i386 na amd64 a podobně. Jak na to?

Tabulka rozdělení pevného disku má vytvořeny dvě identické 32GB partition, na které se později vytvoří svazky. Konfigurace PTT vypadá následovně:
Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
   start 63, size 67103442 (32765 Meg), flag 80 (active)
      beg: cyl 0/ head 1/ sector 1;
      end: cyl 1023/ head 254/ sector 63
The data for partition 2 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
   start 67103505, size 67103505 (32765 Meg), flag 0
      beg: cyl 1023/ head 255/ sector 63;
      end: cyl 1023/ head 254/ sector 63


Následovně jsou vytvořeny svazky na prvni a druhé partition podle následujícího klíče:
Svazek Velikost Souborový systém Poznámky
/ 16GB UFS2+S /dev/[disk]s1a
swap 4GB swap /dev/[disk]s1b
/tmp 4GB UFS2+S /dev/[disk]s1d
/var 8GB UFS2+S /dev/[disk]s1e
/.alt 16GB UFS2+S /dev/[disk]s2a
swap 4GB swap /dev/[disk]s2b
/.alt/tmp 4GB UFS2+S /dev/[disk]s2d
/.alt/var 8GB UFS2+S /dev/[disk]s2e

Nasledně jsou vytvořeny dva soubory, /etc/fstab a /etc/fstab.alt. Ty se liší pouze prohozením první a druhé partition, jednotlivé volumes zůstávají se stejnou identifikací (přiložen je primární fstab, u fstab.alt by se při startu připojily disky z druhé partition).
Device Mountpoint FSType Options Dump Pass#
/dev/[dev]s1a / ufs rw 1 1
/dev/[dev]s1b none swap sw 0 0
/dev/[dev]s1d /tmp ufs rw 2 2
/dev/[dev]s1e /var ufs rw 2 2
/dev/[dev]s2a /.alt ufs rw,noauto 0 0
/dev/[dev]s2b none swap sw 0 0
/dev/[dev]s2d /.alt/tmp ufs rw,noauto 0 0
/dev/[dev]s2e /.alt/var ufs rw,noauto 0 0
proc /proc procfs rw 0 0
/dev/cd0 /cdrom cd9660 ro,noauto 0 0

Dalším krokem je script použitý pro zálohu aktivního prostředí na záložní (druhou partition) - make.alt.bootenvironment . Script je zobrazen zde:

#!/bin/sh
# Create empty filesystem
echo Create script for cleaning filesystem ...
/bin/cat /etc/fstab | /usr/bin/grep /.alt | /usr/bin/awk '{print "/sbin/newfs -O2 -U "$1}' >/tmp/vmf_make.sh
/bin/chmod 700 /tmp/vmf_make.sh
/tmp/vmf_make.sh
/bin/rm /tmp/vmf_make.sh
# Mount and backup alternate root
echo Mounting and restore new root
/sbin/mount /.alt
cd /.alt
/sbin/dump -0uL -f - / | /sbin/restore rf -
# Mount and backup alternate tmp, var
echo Mounting and restore new /tmp /var
/sbin/mount /.alt/tmp
/sbin/mount /.alt/var
cd /.alt/tmp
/sbin/dump -0uL -f - /tmp | /sbin/restore rf -
cd /.alt/var
/sbin/dump -0uL -f - /var | /sbin/restore rf -
# Copy mountpoints
echo Copying mountpoints
/bin/cp /etc/fstab.alt /.alt/etc/fstab
/bin/cp /etc/fstab /.alt/etc/fstab.alt
# Unmount filesystem to avoid corruption
echo Dismounting part of alternate boot environment
cd /.alt
/sbin/umount /.alt/tmp
/sbin/umount /.alt/var
cd /
echo Generating GRUB scripts
/usr/local/sbin/grub-mkconfig --output=/boot/grub/grub.`/bin/date "+%Y%m%d"`
cp /boot/grub/grub.`/bin/date "+%Y%m%d"` /.alt/boot/grub/grub.`/bin/date "+%Y%m%d"`
echo Dismounting rest of alternate boot environment
/sbin/umount /.alt
echo Creating script to activate boot environment
#/bin/cat /etc/fstab | /usr/bin/grep /.alt | /usr/bin/tr "/" " " | /usr/bin/awk '{print "/sbin/glabel label "$2"-"$4" /"$1"/"$2}' | /usr/bin/sed -e 's/ufs/root/g' >/tmp/vmf_label.sh
#/usr/bin/head -n 1 /tmp/vmf_label.sh | /usr/bin/tr "/" " " | /usr/bin/sed -e 's/\(.*\)[a-f]/\1 /g' | /usr/bin/awk '{print "/sbin/bsdlabel -B /"$5"/"$6}' >>/tmp/vmf_label.sh
#/usr/bin/head -n 1 /tmp/vmf_label.sh | /usr/bin/tr "/" " " | /usr/bin/sed -e 's/s[0-9][a-f]/ /g' | /usr/bin/awk '{print "/sbin/fdisk -B /"$5"/"$6}' >>/tmp/vmf_label.sh
#/bin/chmod 700 /tmp/vmf_label.sh
#/tmp/vmf_label.sh
#/bin/rm /tmp/vmf_label.sh


Tím jsou vytvořeny dvě paralelní boot prostředí. Je možné použít standardní boot loader nebo GRUB, v tomto směru jsem dal přednost využití GRUB. Konfigurační soubor pro GRUB je zde.
#
# sysctl kern.geom.debugflags=16 before grub
# sysctl kern.geom.debugflags=0 after grub
#
default=0
timeout=10
color light-blue/blue gray/blue
password password
splashimage=(hd0,0,a)/boot/grub/splashimage.xpm.gz
title FreeBSD, primary boot environment
     root (hd0,0,a)
     kernel /boot/loader
     boot
title FreeBSD, primary boot environment, old system
     root (hd0,0,a)
     kernel /boot/loader.old
     boot
title FreeBSD, alternate boot environment
     root (hd0,1,a)
     kernel /boot/loader
     boot
title FreeBSD, alternate boot environment, old system
     root (hd0,1,a)
     kernel /boot/loader.old
     boot
title FreeBSD CD-ROM
     root (cd0)
     boot
     chainloader /boot/cdboot


Konfigurační soubor pro GRUB2 je zde. Jednotlivé UFSID je možné zjistit pomocí příkazu glabel status device.
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by /usr/local/sbin/grub-mkconfig using templates
# from /usr/local/etc/grub.d and settings from /usr/local/etc/default/grub
#
### BEGIN /usr/local/etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
  load_env
fi
set default="0"
if [ ${prev_saved_entry} ]; then
  set saved_entry=${prev_saved_entry}
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z ${boot_once} ]; then
    saved_entry=${chosen}
    save_env saved_entry
  fi
}
insmod ufs2
set root='(/dev/hd0,1,a)'
search --no-floppy --fs-uuid --set 4dea43017116cdff
set locale_dir=($root)/boot/grub/locale
set lang=
insmod gettext
set timeout=5
### END /usr/local/etc/grub.d/00_header ###
### BEGIN /usr/local/etc/grub.d/10_kfreebsd ###
menuentry "FreeBSD, Primary Boot Environment kernel" --class freebsd --class bsd --class os {
      insmod ufs2
      set root='(/dev/hd0,1,a)'
      search --no-floppy --fs-uuid --set 4dea43017116cdff
      echo Loading kernel of FreeBSD kernel ...
      kfreebsd /boot/loader
}
### END /usr/local/etc/grub.d/10_kfreebsd ###
### BEGIN /usr/local/etc/grub.d/11_kfreebsd ###
menuentry "FreeBSD, Secondary Boot Environment kernel" --class freebsd --class bsd --class os {
      insmod ufs2
      set root='(/dev/hd0,2,a)'
      search --no-floppy --fs-uuid --set 4e5b1fe80370f824
      echo Loading kernel of FreeBSD kernel ...
      kfreebsd /boot/loader
}
### END /usr/local/etc/grub.d/11_kfreebsd ###
### BEGIN /usr/local/etc/grub.d/15_kfreebsd ###
menuentry "FreeBSD, Primary Boot Environment, Direct method kernel" --class freebsd --class bsd --class os {
      insmod ufs2
      set root='(/dev/hd1,1,a)'
      search --no-floppy --fs-uuid --set 4dea43017116cdff
      echo Loading kernel of FreeBSD kernel ...
      kfreebsd /boot/kernel/kernel
      kfreebsd_loadenv /boot/device.hints
      kfreebsd_module_elf /boot/kernel/acpi.ko
      set kFreeBSD.vfs.root.mountfrom=ufs:/dev/da0s1a
      set kFreeBSD.vfs.root.mountfrom.options=rw
}
### END /usr/local/etc/grub.d/15_kfreebsd ###
### BEGIN /usr/local/etc/grub.d/16_kfreebsd ###
menuentry "FreeBSD, Secondary Boot Environment, Direct method kernel" --class freebsd --class bsd --class os {
      insmod ufs2
      set root='(/dev/hd1,2,a)'
      search --no-floppy --fs-uuid --set 4e5b1fe80370f824
      echo Loading kernel of FreeBSD kernel ...
      kfreebsd /boot/kernel/kernel
      kfreebsd_loadenv /boot/device.hints
      kfreebsd_module_elf /boot/kernel/acpi.ko
      set kFreeBSD.vfs.root.mountfrom=ufs:/dev/da0s2a
      set kFreeBSD.vfs.root.mountfrom.options=rw
}
### END /usr/local/etc/grub.d/16_kfreebsd ###

Protože se konfigurační soubor /boot/grub/grub.cfg z GRUB2 nemodifukuje přímo ale pomocí scriptů, tento seznam slouží pouze jako ukázka.

Powered by Drupal - Design by artinet