[arch-releng] [PATCH 1/1] allow to grow devices

Christian Hesse list at eworm.de
Fri Aug 30 17:36:52 EDT 2013


Gerardo Exequiel Pozzi <vmlinuz386 at yahoo.com.ar> on Fri, 2013/08/30 13:01:
> On 08/30/2013 06:12 AM, Christian Hesse wrote:
> > Gerardo Exequiel Pozzi <vmlinuz386 at yahoo.com.ar> on Thu, 2013/08/29 20:01:
> >> Ignore me, was a bad smart answer, since you want to increse the size of
> >> the device!
> >>
> >> In any case, the semantics of cowfile_size should not be changed. You
> >> can add another parameter like grow_ro_dev_size=,
> > 
> > I add a use case for what was completely useless before. (In fact the cow
> > files got bigger, but the resulting device size stayed the same.) Do you
> > really want an new parameter for that?
> > I do not mind, I can change that if desired.
> 
> Yes using a new parameter should be more clear.

Done.
This parameter only takes affect with values greater than 100.

> >> also should be ensure
> >> the proper device shutdown and persistence.
> > 
> > systemd should disassemble the devices, no? What is needed more?
> 
> No, systemd can not stop this complex setup, indeed we can not use the
> provided shutdown script by mkinitcpio, we are using a own shutdown script.

Ah, looks like I missed to add a file to used_block_devices. Is it ok now?
Hope so... Otherwise I have to take a deeper look at the shutdown script.

> > And what do you refer with persistance? Everything should work just fine
> > given a persistant system is booted with the same parameters.
> 
> cow_persistent=P | cow_persistent=N
> 
> For this extension, should not use the same directory.
> 
> Of course, this "extension" file act as ro-device, will never be
> modified during runtime.

I create a directory /run/archiso/growspace. cowspace is not touched by my
code. Is that ok?

> >> We are reaching 3.11 and still no "overlayfs" :( (was promised for 3.10,
> >> 3.2, ...)
> > 
> > Well, yes...
> > On the other hand I really like the idea to solve this with device
> > mapper. ;)
> 
> If at some point linux implements an overlayfs, and I still alive ;), I
> want to move back to filesystem solution instead of block-based like now.

I am fine with that as long as it is upstream linux. ;)

> > Just thinking about how to integrate the userspace tools and handling for
> > this. I would like to add a new hook that adds the binary files
> > (resize2fs, xfs_growfs, btrfs), so anybody can decide whether or not to
> > include. But where do we call this?
> 
> I did not see any real usage of this "extension" inside official image.
> If you are building a custom image build, why not just create a big
> filesystem from the start?

Because bigger filesystem has more metadata. Image size would increase for a
use case I need only very seldom.
I perfer to add some lines of code, having the possibility to grow device and
filesystem when needed.

Here is my new patch, this also has some code to actually grow the filesystem.

From 7609b2ba1b3b876efc4199d9653b389303cd980a Mon Sep 17 00:00:00 2001
From: Christian Hesse <mail at eworm.de>
Date: Fri, 30 Aug 2013 21:10:44 +0200
Subject: [PATCH 1/1] support growing devices and filesystems

---
 archiso/initcpio/hooks/archiso          | 59
++++++++++++++++++++++++++++++++- archiso/initcpio/install/archiso_growfs |
9 +++++ 2 files changed, 67 insertions(+), 1 deletion(-)
 create mode 100644 archiso/initcpio/install/archiso_growfs

diff --git a/archiso/initcpio/hooks/archiso b/archiso/initcpio/hooks/archiso
index 66a6273..76dcb6e 100644
--- a/archiso/initcpio/hooks/archiso
+++ b/archiso/initcpio/hooks/archiso
@@ -6,11 +6,27 @@ _mnt_fs() {
     local img_fullname="${img##*/}";
     local img_name="${img_fullname%%.*}"
     local dm_snap_name="${dm_snap_prefix}_${img_name}"
-    local ro_dev ro_dev_size rw_dev
+    local ro_dev ro_dev_size rw_dev rw_dev_size pad_dev pad_dev_size
 
     ro_dev=$(losetup --find --show --read-only "${img}")
     echo ${ro_dev} >> /run/archiso/used_block_devices
     ro_dev_size=$(blockdev --getsz ${ro_dev})
+
+    if [[ "${grow_ro_dev_size}" -gt 100 ]]; then
+        pad_dev_size=$((ro_dev_size/100*grow_ro_dev_size - ro_dev_size))
+        dd of="/run/archiso/growspace/${img_name}.pad" count=0
seek=${pad_dev_size} &> /dev/null
+        pad_dev=$(losetup --find --show --read-only
"/run/archiso/growspace/${img_name}.pad")
+        echo ${pad_dev} >> /run/archiso/used_block_devices
+        echo -e "0 ${ro_dev_size} linear ${ro_dev} 0\n${ro_dev_size}
${pad_dev_size} linear ${pad_dev} 0" | dmsetup create "ro_${dm_snap_name}"
+        echo $(readlink -f /dev/mapper/${dm_snap_name})
>> /run/archiso/used_block_devices +
+        ro_dev="/dev/mapper/ro_${dm_snap_name}"
+        ro_dev_size="$((ro_dev_size + pad_dev_size))"
+        rw_dev_size="${ro_dev_size}"
+
+        msg ":: Device ${dm_snap_name} has been grown, remember to grow your
filesystem!"
+    fi
+
     if [[ "${cowfile_size}" == "100" ]]; then
         rw_dev_size=${ro_dev_size}
     else
@@ -43,6 +59,40 @@ _mnt_fs() {
     echo $(readlink -f /dev/mapper/${dm_snap_name})
>> /run/archiso/used_block_devices }
 
+# args: name, fs_type
+_grow_fs() {
+    local name="${1}"
+    local fs_type="${2}"
+    local device="/dev/mapper/${dm_snap_prefix}_${name}"
+
+    case ${aitab_fs_type} in
+        ext*)
+            if [[ -x /usr/bin/resize2fs ]]; then
+                msg ":: Growing ${fs_type} filesystem for ${name}"
+                resize2fs "${device}" >/dev/null
+            else
+                msg ":: Not growing ${name}, userspace tools not available."
+            fi
+            ;;
+        xfs)
+            if [[ -x /usr/bin/xfs_growfs ]]; then
+                msg ":: Growing ${fs_type} filesystem for ${name}"
+                xfs_growfs "${device}" >/dev/null
+            else
+                msg ":: Not growing ${name}, userspace tools not available."
+            fi
+            ;;
+        btrfs)
+            if [[ -x /usr/bin/btrfs ]]; then
+                msg ":: Growing ${fs_type} filesystem for ${name}"
+                btrfs resize max "${device}" >/dev/null
+            else
+                msg ":: Not growing ${name}, userspace tools not available."
+            fi
+            ;;
+    esac
+}
+
 # args: /path/to/image_file, mountpoint
 _mnt_sfs() {
     local img="${1}"
@@ -112,6 +163,7 @@ run_hook() {
     else
         cowfile_size=${cowfile_size/%}
     fi
+    [[ -z "${grow_ro_dev_size}" ]] && grow_ro_dev_size="100"
 
     if [[ -z "${aitab}" ]]; then
         aitab="/run/archiso/bootmnt/${archisobasedir}/aitab"
@@ -188,6 +240,10 @@ archiso_mount_handler() {
     fi
     mkdir -p "/run/archiso/cowspace/${cow_directory}"
 
+    if [[ "${grow_ro_dev_size}" -gt 100 ]]; then
+        mkdir -p /run/archiso/growspace
+    fi
+
     local aitab_img aitab_mnt aitab_arch aitab_sfs_comp aitab_fs_type
aitab_fs_size while read aitab_img aitab_mnt aitab_arch aitab_sfs_comp
aitab_fs_type aitab_fs_size; do [[ "${aitab_img#\#}" != "${aitab_img}" ]] &&
continue @@ -195,6 +251,7 @@ archiso_mount_handler() {
         if [[ "${aitab_fs_type}" != "none" ]]; then
             _mnt_sfs
"/run/archiso/bootmnt/${archisobasedir}/${aitab_arch}/${aitab_img}.fs.sfs"
"/run/archiso/sfs/${aitab_img}" _mnt_fs
"/run/archiso/sfs/${aitab_img}/${aitab_img}.fs" "${newroot}" "${aitab_mnt}"
+            [[ "${grow_ro_dev_size}" -gt 100 ]] && _grow_fs "${aitab_img}"
"${aitab_fs_type}" else
             _mnt_sfs
"/run/archiso/bootmnt/${archisobasedir}/${aitab_arch}/${aitab_img}.sfs"
"${newroot}${aitab_mnt}" fi diff --git
a/archiso/initcpio/install/archiso_growfs
b/archiso/initcpio/install/archiso_growfs new file mode 100644 index
0000000..6334a3c --- /dev/null
+++ b/archiso/initcpio/install/archiso_growfs
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+build() {
+    add_binary btrfs
+    add_binary resize2fs
+    add_binary xfs_growfs
+}
+
+# vim: set ft=sh ts=4 sw=4 et:
-- 
main(a){char*c=/*    Schoene Gruesse                         */"B?IJj;MEH"
"CX:;",b;for(a/*    Chris           get my mail address:    */=0;b=c[a++];)
putchar(b-1/(/*               gcc -o sig sig.c && ./sig    */b/42*2-3)*42);}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 490 bytes
Desc: not available
URL: <http://mailman.archlinux.org/pipermail/arch-releng/attachments/20130830/c718970c/attachment-0001.asc>


More information about the arch-releng mailing list