Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
No build reason found for 15.7:ppc64le
SUSE:SLE-12-SP1:GA
rear116
adaptions_for_btrfs_for_SLE12.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File adaptions_for_btrfs_for_SLE12.diff of Package rear116
--- usr/share/rear/layout/save/GNU/Linux/23_filesystem_layout.sh.orig 2014-01-20 09:43:46.000000000 +0100 +++ usr/share/rear/layout/save/GNU/Linux/23_filesystem_layout.sh 2014-06-18 11:19:56.000000000 +0200 @@ -94,8 +94,178 @@ Log "Saving Filesystem layout." # in case of btrfs we could deal with subvolumes - subvol option needed or not? case "$fstype" in btrfs) - subvol=$(btrfs subvolume show $mountpoint | grep "Name:" | awk '{print $2}') - [[ ! -z "$subvol" ]] && options="$options,subvol=$subvol" + # The below two commands seems to be made for Fedora 19 (cf. https://github.com/rear/rear/issues/233) + # but they do not work for SUSE SLE12 so that the following two commands are hereby disabled: + #subvol=$(btrfs subvolume show $mountpoint | grep "Name:" | awk '{print $2}') + #[[ ! -z "$subvol" ]] && options="$options,subvol=$subvol" + # Instead commands that work for SUSE SLE12 are run: + # Let's see what the SLE12 installer does when installing the original system + # when installing a SLE12 default system on one harddisk with btrfs + # (see https://bugzilla.novell.com/show_bug.cgi?id=879111): + # ---------------------------------------------------------------------------------------------------------------------------- + # root@sle12 # grep -o 'Executing:"/sbin/btrfs.*' /var/log/YaST2/y2log-1 + # Executing:"/sbin/btrfs filesystem show" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-IoBzwl/@'" + # Executing:"/sbin/btrfs subvolume list '/tmp/libstorage-9vKYd4/tmp-mp-IoBzwl'" + # Executing:"/sbin/btrfs subvolume set-default 257 '/tmp/libstorage-9vKYd4/tmp-mp-IoBzwl'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/boot/grub2/i386-pc'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/boot/grub2/x86_64-efi'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/home'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/opt'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/srv'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/tmp'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/usr/local'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/var/crash'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/var/lib/mailman'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/var/lib/named'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/var/lib/pgsql'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/var/log'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/var/opt'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/var/spool'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/var/tmp'" + # ---------------------------------------------------------------------------------------------------------------------------- + # root@sle12 # btrfs subvolume list -a / + # ID 257 gen 387 top level 5 path <FS_TREE>/@ + # ID 258 gen 235 top level 257 path @/boot/grub2/i386-pc + # ID 259 gen 49 top level 257 path @/boot/grub2/x86_64-efi + # ID 260 gen 238 top level 257 path @/home + # ID 261 gen 30 top level 257 path @/opt + # ID 262 gen 238 top level 257 path @/srv + # ID 263 gen 390 top level 257 path @/tmp + # ID 264 gen 238 top level 257 path @/usr/local + # ID 265 gen 49 top level 257 path @/var/crash + # ID 266 gen 49 top level 257 path @/var/lib/mailman + # ID 267 gen 49 top level 257 path @/var/lib/named + # ID 268 gen 49 top level 257 path @/var/lib/pgsql + # ID 269 gen 391 top level 257 path @/var/log + # ID 270 gen 49 top level 257 path @/var/opt + # ID 271 gen 392 top level 257 path @/var/spool + # ID 272 gen 313 top level 257 path @/var/tmp + # ID 275 gen 376 top level 257 path @/.snapshots + # ID 276 gen 59 top level 275 path <FS_TREE>/@/.snapshots/1/snapshot + # ID 277 gen 121 top level 275 path <FS_TREE>/@/.snapshots/2/snapshot + # ID 278 gen 183 top level 275 path <FS_TREE>/@/.snapshots/3/snapshot + # ---------------------------------------------------------------------------------------------------------------------------- + # root@sle12 # btrfs subvolume get-default / + # ID 257 gen 588 top level 5 path @ + # ---------------------------------------------------------------------------------------------------------------------------- + # root@sle12 # grep btrfs /etc/fstab + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 / btrfs defaults 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /boot/grub2/i386-pc btrfs subvol=@/boot/grub2/i386-pc 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /boot/grub2/x86_64-efi btrfs subvol=@/boot/grub2/x86_64-efi 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /home btrfs subvol=@/home 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /opt btrfs subvol=@/opt 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /srv btrfs subvol=@/srv 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /tmp btrfs subvol=@/tmp 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /usr/local btrfs subvol=@/usr/local 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /var/crash btrfs subvol=@/var/crash 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /var/lib/mailman btrfs subvol=@/var/lib/mailman 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /var/lib/named btrfs subvol=@/var/lib/named 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /var/lib/pgsql btrfs subvol=@/var/lib/pgsql 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /var/log btrfs subvol=@/var/log 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /var/opt btrfs subvol=@/var/opt 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /var/spool btrfs subvol=@/var/spool 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /var/tmp btrfs subvol=@/var/tmp 0 0 + # UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /.snapshots btrfs subvol=@/.snapshots 0 0 + # ---------------------------------------------------------------------------------------------------------------------------- + # root@sle12 # mount | grep btrfs + # /dev/sda2 on / type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /.snapshots type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /var/tmp type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /var/opt type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /var/spool type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /var/log type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /var/lib/mailman type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /var/lib/pgsql type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /var/lib/named type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /var/crash type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /usr/local type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /opt type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /srv type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /home type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /tmp type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /boot/grub2/x86_64-efi type btrfs (rw,relatime,space_cache) + # /dev/sda2 on /boot/grub2/i386-pc type btrfs (rw,relatime,space_cache) + # ---------------------------------------------------------------------------------------------------------------------------- + # Note that for SLE12 there is a somewhat hidden '/@' btrfs subvolume created + # (/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-IoBzwl/@') + # that is then made the default btrfs subvolume + # (/sbin/btrfs subvolume set-default 257 '/tmp/libstorage-9vKYd4/tmp-mp-IoBzwl') + # which results that a plain "btrfs subvolume list /" hides the '/@' in its output + # so that one must use "btrfs subvolume list -a /" plus "btrfs subvolume get-default /" + # to find out this hidden special '/@' btrfs subvolume. + # The default btrfs subvolume gets mounted when no subvolume is specified for the mount comand. + # This means the entry "UUID=7ab751c6-b075-4066-9403-c225fdda91d6 / btrfs defaults 0 0" in /etc/fstab + # belongs to the default btrfs subvolume '/@' that is mounted at the mount point '/'. + # According to https://btrfs.wiki.kernel.org/index.php/UseCases + # --------------------------------------------------------------------------------------------------------------------- + # How do I mount the real root of the filesystem once I've made another subvolume the default? + # mount -o subvolid=0 <filesystem> <mount-point> + # With kernel 3.2 and newer you can specify subvol=/some/PATH for the subvolume to mount + # mount -o subvol=/path/to/subvol /dev/sdx /mnt + # The PATH is always relative to the toplevel subvolume, ie. independent of currently set default subvolume. + # --------------------------------------------------------------------------------------------------------------------- + # the other entries in /etc/fstab like "UUID=7ab751c6-b075-4066-9403-c225fdda91d6 /home btrfs subvol=@/home 0 0" + # mount the btrfs subvolume '@/home' (relative to the toplevel subvolume) at the mount point '/home' + # where in case of btrfs the mount point '/home' is relative to '/' which is relative to the default subvolume. + # Because at '/' the default btrfs subvolume '/@' is already mounted it results in the end that + # the btrfs subvolume '@/home' gets mounted at the btrfs filesystem's absolute path '/@/home' + # where "the btrfs filesystem's absolute path" means the path from the btrfs filesystem toplevel point of view + # asshown in the following example (on a SLE12 default installation): + # ---------------------------------------------------------------------------------------------------------------------------- + # root@sle12 # ls / + # bin boot dev etc home lib lib64 media mnt opt proc root run sbin selinux .snapshots srv sys tmp usr var + # + # root@sle12 # mkdir /tmp/btrfs-filesystem-toplevel + # + # root@sle12 # mount -t btrfs -o subvolid=0 /dev/sda2 /tmp/btrfs-filesystem-toplevel + # + # root@sle12 # ls /tmp/btrfs-filesystem-toplevel + # @ + # + # root@sle12 # ls /tmp/btrfs-filesystem-toplevel/@ + # bin boot dev etc home lib lib64 media mnt opt proc root run sbin selinux .snapshots srv sys tmp usr var + # + # root@sle12 # ls /home + # johannes + # + # root@sle12 # ls /tmp/btrfs-filesystem-toplevel/home + # ls: cannot access /tmp/btrfs-filesystem-toplevel/home: No such file or directory + # + # root@sle12 # ls /tmp/btrfs-filesystem-toplevel/@/home + # johannes + # ---------------------------------------------------------------------------------------------------------------------------- + # This hidden '/@' btrfs subvolume and filesystem toplevel directory is specific for SLE12 (it is not in openSUSE 13.1). + # The following code works only for SLE12 because it uses the '@' as delimiter: + allsubvolumes=$( btrfs subvolume list -a $mountpoint | grep -o 'path [^ ]*' | cut -s -d '@' -f2 ) + snapshotsubvolumes=$( btrfs subvolume list -as $mountpoint | grep -o 'path [^ ]*' | cut -s -d '@' -f2 ) + # btrfs subvolumes can be nested, for example btrfs subvolumes could be like + # /normalsubvolume + # /snapshotsubvolume + # /basesubvolume + # /basesubvolume/subsubvolume + # /basesubvolume/subsnapshotsubvolume + # Therefore careful testing whether or not a subvolume is a "normal" subvolume or a snapshot subvolume + # is required to exclude snapshot subvolumes from being recreated because it is currently not possible + # to recreate btrfs snapshot subvolumes as snapshot subvolumes containing files with the content + # from the time when the original btrfs snapshot subvolumes have been created on the original system. + # Do not "optimize" the below simple and (hopefully) failsafe code unless you know exactly what you do: + for subvolume in $allsubvolumes + do for snapshot in $snapshotsubvolumes + do if test "$subvolume" = "$snapshot" + then subvolume="" + fi + done + if test -n "$subvolume" + then if test -z "$normalsubvolumes" + then normalsubvolumes="$subvolume" + else normalsubvolumes="$normalsubvolumes;$subvolume" + fi + fi + done + if test -n "$normalsubvolumes" + then options="$options,normalsubvolumes=$normalsubvolumes" + fi ;; esac echo -n " options=$options" --- usr/share/rear/layout/prepare/GNU/Linux/13_include_filesystem_code.sh.orig 2013-12-20 15:51:30.000000000 +0100 +++ usr/share/rear/layout/prepare/GNU/Linux/13_include_filesystem_code.sh 2014-06-18 15:36:07.000000000 +0200 @@ -91,10 +91,18 @@ EOF fi ;; btrfs) + if test "/" != "$mp" + then + LogPrint "Skipping creating $fstype filesystem on $device because mountpoint $mp is not / (for SLE12 btrfs is only supported for /)" + else cat >> $LAYOUT_CODE <<EOF LogPrint "Creating $fstype-filesystem $mp on $device" # if $device is already mounted, skip -mount | grep -q $device || mkfs -t $fstype $device +# mkfs.btrfs needs an explicit '-f' (same as mkfs.xfs) to +# force overwrite when an existing filesystem is detected +# otherwise "rear recover" fails here with an error +# see https://bugzilla.novell.com/show_bug.cgi?id=878870 +mount | grep -q $device || mkfs -t $fstype -f $device EOF if [ -n "$label" ] ; then echo "mount | grep -q $device || btrfs filesystem label $device $label >&2" >> $LAYOUT_CODE @@ -121,7 +129,8 @@ EOF fi # end of [ "$uuid" != "\$new_uuid" ] EOF fi - ;; + fi + ;; vfat) cat >> $LAYOUT_CODE <<EOF LogPrint "Creating $fstype-filesystem $mp on $device" @@ -170,33 +179,122 @@ EOF case $fstype in btrfs) - # check the $value for subvols (other then root) - subvol=$(echo $value | awk -F, '/subvol=/ { print $NF}') # empty or something like 'subvol=root' - if [ -z "$subvol" ]; then - echo "mkdir -p /mnt/local$mp" >> $LAYOUT_CODE - echo "mount$mountopts $device /mnt/local$mp" >> $LAYOUT_CODE - elif [ "$subvol" = "subvol=root" ]; then - echo "# btrfs subvolume 'root' is a special case" >> $LAYOUT_CODE - echo "# before we can create subvolumes we must mount a btrfs device on /mnt" >> $LAYOUT_CODE - echo "mount | grep btrfs | grep -q '/mnt' || mount $device /mnt" >> $LAYOUT_CODE - echo "# create the root btrfs subvolume" >> $LAYOUT_CODE - echo "btrfs subvolume create /mnt/root" >> $LAYOUT_CODE - echo "mkdir -p /mnt/local$mp" >> $LAYOUT_CODE - echo "# umount subvol 0 as it will be remounted as /mnt/local" >> $LAYOUT_CODE - echo "umount /mnt" >> $LAYOUT_CODE - echo "mount$mountopts $device /mnt/local$mp" >> $LAYOUT_CODE - else - echo "# btrfs subvolume creates sub-directory itself" >> $LAYOUT_CODE - echo "btrfs subvolume create /mnt/local$mp" >> $LAYOUT_CODE - # just mounting it with subvol=xxx will probably fail with an cryptic error: - # mount: mount(2) failed: No such file or directory - # we need to mount it with its subvol-id - not a joke - # even its not yet mounted we can view it - see http://www.funtoo.org/BTRFS_Fun - echo "btrfs_id=\$(btrfs subvolume list /mnt/local$mp | tail -1 | awk '{print \$2}')" >> $LAYOUT_CODE - echo "mountopts=\" -o subvolid=\${btrfs_id}\"" >> $LAYOUT_CODE - echo "mount\$mountopts $device /mnt/local$mp" >> $LAYOUT_CODE + if test "/" != "$mp" + then + LogPrint "Skipping creating $fstype filesystem on $device because mountpoint $mp is not / (for SLE12 btrfs is only supported for /)" + else + # The below commands seems to be made for Fedora 19 (cf. https://github.com/rear/rear/issues/233) + # but they do not work for SUSE SLE12 so that the following commands are hereby disabled: + ## check the $value for subvols (other then root) + #subvol=$(echo $value | awk -F, '/subvol=/ { print $NF}') # empty or something like 'subvol=root' + #if [ -z "$subvol" ]; then + # echo "mkdir -p /mnt/local$mp" >> $LAYOUT_CODE + # echo "mount$mountopts $device /mnt/local$mp" >> $LAYOUT_CODE + #elif [ "$subvol" = "subvol=root" ]; then + # echo "# btrfs subvolume 'root' is a special case" >> $LAYOUT_CODE + # echo "# before we can create subvolumes we must mount a btrfs device on /mnt" >> $LAYOUT_CODE + # echo "mount | grep btrfs | grep -q '/mnt' || mount $device /mnt" >> $LAYOUT_CODE + # echo "# create the root btrfs subvolume" >> $LAYOUT_CODE + # echo "btrfs subvolume create /mnt/root" >> $LAYOUT_CODE + # echo "mkdir -p /mnt/local$mp" >> $LAYOUT_CODE + # echo "# umount subvol 0 as it will be remounted as /mnt/local" >> $LAYOUT_CODE + # echo "umount /mnt" >> $LAYOUT_CODE + # echo "mount$mountopts $device /mnt/local$mp" >> $LAYOUT_CODE + #else + # echo "# btrfs subvolume creates sub-directory itself" >> $LAYOUT_CODE + # echo "btrfs subvolume create /mnt/local$mp" >> $LAYOUT_CODE + # # just mounting it with subvol=xxx will probably fail with an cryptic error: + # # mount: mount(2) failed: No such file or directory + # # we need to mount it with its subvol-id - not a joke + # # even its not yet mounted we can view it - see http://www.funtoo.org/BTRFS_Fun + # echo "btrfs_id=\$(btrfs subvolume list /mnt/local$mp | tail -1 | awk '{print \$2}')" >> $LAYOUT_CODE + # echo "mountopts=\" -o subvolid=\${btrfs_id}\"" >> $LAYOUT_CODE + # echo "mount\$mountopts $device /mnt/local$mp" >> $LAYOUT_CODE + #fi + # Instead commands that work for SUSE SLE12 are run: + # When there are btrfs subvolumes $mountopts contains them in the form (cf. the example below) without the ': + # ' -o rw,relatime,space_cache,normalsubvolumes=/normalsubvolume;/basesubvolume;/basesubvolume/subsubvolume' + # so that the btrfs subvolumes must be removed from $mountopts: + realmountopts=$( echo $mountopts | sed -e 's/,normalsubvolumes=[^,]*//' ) + # In the example realmountopts is now '-o rw,relatime,space_cache' (no longer with a leading ' '). + # The following two commands are basically the same (realmountopts versus mountopts) as in the default/fallback case: + echo "mkdir -p /mnt/local$mp" >> $LAYOUT_CODE + echo "mount -t btrfs $realmountopts $device /mnt/local$mp" >> $LAYOUT_CODE + # Remember what the SLE12 installer does when installing the original system + # when installing a SLE12 default system on one harddisk with btrfs + # (see the comment in usr/share/rear/layout/save/GNU/Linux/23_filesystem_layout.sh): + # ------------------------------------------------------------------------------------------------------- + # # grep -o 'Executing:"/sbin/btrfs.*' /var/log/YaST2/y2log-1 + # Executing:"/sbin/btrfs filesystem show" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-IoBzwl/@'" + # Executing:"/sbin/btrfs subvolume list '/tmp/libstorage-9vKYd4/tmp-mp-IoBzwl'" + # Executing:"/sbin/btrfs subvolume set-default 257 '/tmp/libstorage-9vKYd4/tmp-mp-IoBzwl'" + # Executing:"/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-YH5GVp/@/boot/grub2/i386-pc'" + # ... + # ------------------------------------------------------------------------------------------------------- + # This means that for SLE12 there is a mysterious '/@' btrfs subvolume created + # (/sbin/btrfs subvolume create '/tmp/libstorage-9vKYd4/tmp-mp-IoBzwl/@') + # that is then made the default btrfs subvolume + # (/sbin/btrfs subvolume set-default 257 '/tmp/libstorage-9vKYd4/tmp-mp-IoBzwl'). + # This hidden '/@' btrfs subvolume is specific for SLE12 (it is not in openSUSE 13.1). + # Therefore the following code works only for SLE12: + echo "# Creating SLE12 specific '/@' btrfs subvolume" >> $LAYOUT_CODE + echo "btrfs subvolume create /mnt/local/@" >> $LAYOUT_CODE + echo "# Making the '/@' subvolume the default subvolume" >> $LAYOUT_CODE + echo "# The '/@' subvolume is currently the only subvolume" >> $LAYOUT_CODE + echo "# Get the ID of the '/@' subvolume to set it as default subvolume" >> $LAYOUT_CODE + echo "subvolumeID=\$( btrfs subvolume list /mnt/local | head -n1 | cut -d ' ' -f2 )" >> $LAYOUT_CODE + echo "# Set the '/@' subvolume as default subvolume using its subvolume ID" >> $LAYOUT_CODE + echo "btrfs subvolume set-default \$subvolumeID /mnt/local" >> $LAYOUT_CODE + # After the '/@' subvolume was set as default subvolume, + # remount the btrfs filesystem where currently the filesystem toplevel is mounted at /mnt/local/ + # but now the '/@' default subvolume must be mounted at /mnt/local/: + echo "# Remount the '/@' default subvolume at /mnt/local/" >> $LAYOUT_CODE + echo "umount /mnt/local$mp" >> $LAYOUT_CODE + echo "mount -t btrfs $realmountopts $device /mnt/local$mp" >> $LAYOUT_CODE + # Recreate "normal" btrfs subvolumes (btrfs snapshot subvolumes have been excluded): + # btrfs subvolumes can be nested, for example btrfs subvolumes could be like + # /subvolume + # /basesubvolume + # /basesubvolume/subsubvolume + # The subvolumes in the above example would be provided as an option in $value of the form + # this=foo,normalsubvolumes=/subvolume;/basesubvolume;/basesubvolume/subsubvolume,that=bar + # options in $value are separated by ',' and the subvolumes are separated by '=' and ';' + # which will fail when there are subvolumes with ',' or '=' or ';' in its name + # so that admins who use such characters for their subvolume names get hereby + # an exercise in using failsafe names and/or how to fix quick and dirty code ;-) + # The sorting makes sure that /basesubvolume comes before /basesubvolume/subsubvolume + # so that /basesubvolume gets created before /basesubvolume/subsubvolume: + normalsubvolumes=$( echo $value | grep -o 'normalsubvolumes=[^,]*' | cut -d '=' -f2 | tr ';' '\n' | sort ) + # In the example normalsubvolumes contains now "/basesubvolume\n/basesubvolume/subsubvolume\n/subvolume" + if test -n "$normalsubvolumes" + then echo "# Begin creating and mounting normal btrfs subvolumes..." >> $LAYOUT_CODE + for subvolume in $normalsubvolumes + do if test -n "$subvolume" + then + # e.g. for "btrfs subvolume create /foo/bar/baz" /foo/bar/ must exist + # but "baz" must not exist because btrfs subvolume creates "baz" itself + # when "baz" already exists, it fails with "ERROR: '/foo/bar/baz' exists". + subvolumepath=${subvolume%/*} + if test -n "$subvolumepath" + then echo "# Creating '$subvolumepath' directory" >> $LAYOUT_CODE + echo "mkdir -p /mnt/local/$subvolumepath" >> $LAYOUT_CODE + fi + echo "# btrfs subvolume creates last (sub-)directory in '$subvolume' itself" >> $LAYOUT_CODE + echo "# Creating btrfs subvolume '$subvolume' as '@$subvolume'" >> $LAYOUT_CODE + echo "btrfs subvolume create /mnt/local/$subvolume" >> $LAYOUT_CODE + echo "# Creating '$subvolume' mountpoint" >> $LAYOUT_CODE + echo "mkdir -p /mnt/local/$subvolume" >> $LAYOUT_CODE + echo "# Mounting btrfs subvolume '@$subvolume' at '$subvolume' mountpoint" >> $LAYOUT_CODE + # Note that the subvolume path for the subvol mount option is relative to the toplevel subvolume + # and the toplevel subvolume is the default subvolume that was above set to /mnt/local: + echo "mount -t btrfs -o subvol=@$subvolume $realmountopts $device /mnt/local$subvolume" >> $LAYOUT_CODE + fi + done + echo "# End creating and mounting normal btrfs subvolumes." >> $LAYOUT_CODE fi - ;; + fi + ;; *) echo "mkdir -p /mnt/local$mp" >> $LAYOUT_CODE echo "mount$mountopts $device /mnt/local$mp" >> $LAYOUT_CODE --- usr/share/rear/layout/prepare/default/61_exclude_from_restore.sh.orig 2012-02-23 16:57:55.000000000 +0100 +++ usr/share/rear/layout/prepare/default/61_exclude_from_restore.sh 2014-07-04 11:50:40.000000000 +0200 @@ -5,6 +5,55 @@ : > $TMP_DIR/restore-exclude-list.txt for component in "${EXCLUDE_RECREATE[@]}" ; do + if test "fs" = ${component%%:*} + then # Skip filesystem components that are btrfs subvolumes from being + # automatically added to restore-exclude-list.txt + # because btrfs subvolumes should be listed in EXCLUDE_RECREATE + # to avoid that "rear recover" is 'Creating btrfs-filesystem' + # by default also for every mounted btrfs subvolume + # see https://bugzilla.novell.com/show_bug.cgi?id=885698 + # For SLE12 by default EXCLUDE_RECREATE should contain that components: + # fs:/.snapshots fs:/var/tmp fs:/var/spool fs:/var/opt fs:/var/log + # fs:/var/lib/pgsql fs:/var/lib/mailman fs:/var/lib/named fs:/usr/local + # fs:/tmp fs:/srv fs:/var/crash fs:/boot/grub2/x86_64-efi fs:/opt + # fs:/home fs:/boot/grub2/i386-pc + # Because that script is run in the rear recovery system the recreated system + # and in particular the recreated btrfs subvolumes are under /mnt/local/ + # But e.g. "btrfs subvolume show /mnt/local/.snapshots" cannot be used + # to find out whether or not /mnt/local/.snapshots is a recreated btrfs subvolume + # because when e.g. "btrfs subvolume show /mnt/local/.snapshots" is run it results + # ERROR: finding real path for '/mnt/local//.snapshots', No such file or directory + # because at the time when this script runs in the rear recovery system the + # real path '/mnt/local//.snapshots' (the duplicate '//' does not matter) + # does really not (yet) exist because this script runs before the partitions + # and filesystems and btrfs subvolumes are created by "rear recover". + # Instead of checking for btrfs subvolumes a more generic check is done that + # matches the special /etc/rear/local.conf for SLE12 with btrfs where + # files in btrfs subvolumes are excluded by 'tar --one-file-system' + # so that such files must be explictly included to be in the backup via + # BACKUP_PROG_INCLUDE that should for SLE12 contain something like such entries: + # /var/spool/* /var/opt/* /var/log/* /var/lib/pgsql/* /var/lib/mailman/* + # /var/lib/named/* /usr/local/* /srv/* /boot/grub2/x86_64-efi/* /opt/* + # /home/* /boot/grub2/i386-pc/* + # Accordingly the more generic check is to skip filesystem components + # in EXCLUDE_RECREATE that have a matching entry in BACKUP_PROG_INCLUDE + # from being automatically added to restore-exclude-list.txt + component_directory="${component#*:}" + for backup_directory in "${BACKUP_PROG_INCLUDE[@]}" + do # For example a component_directory like /var/spool or /var/spool/ should match + # a backup_directory like /var/spool or /var/spool/ or /var/spool/* + # but it should not get mixed up with /var or /var/ or /var/* + backup_directory_without_trailing_asterisk="${backup_directory%\*}" + backup_directory_without_trailing_slash="${backup_directory_without_trailing_asterisk%/}" + backup_directory_plain="$backup_directory_without_trailing_slash" + component_directory_without_trailing_slash="${component_directory%/}" + component_directory_plain="$component_directory_without_trailing_slash" + if test "$component_directory_plain" = "$backup_directory_plain" + then # Continue the outer loop (i.e. contune with the next component in EXCLUDE_RECREATE): + continue 2 + fi + done + fi if ! IsInArray "$component" "${EXCLUDE_RESTORE}" ; then EXCLUDE_RESTORE=( "${EXCLUDE_RESTORE[@]}" "$component" ) fi
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor