summaryrefslogblamecommitdiffstats
path: root/builder/dnbd3-rootfs/hooks/pre-mount/prepare-root-partition.sh
blob: 95ee8fd173665a632351e1c4790bb0ab0c39e15d (plain) (tree)
1
2
3
4
5
6
7
8
9
                          
 
                                                                      





                                                 


                                                                               





                                    
                                                                                                                                    


                                    
                            
                                                                  
                                   
                                                                              
                                   

                                                
                                                                         
             
                                          
                                     

                                

                                                              
                                                     
                  
  

                                                                 
                   
                    
                                                                
                                                                                             
                                                       
source "/usr/lib/utils.sh"

# Close previous connections to be able to run this script many times.
dnbd3-client --device "$SLX_DNBD3_DEVICE" --close
local IFS_backup="$IFS"
IFS=","
local host
for host in ${SLX_DNBD3_SERVERS}; do
    info "Trying host \"$host\"."
    systemd-preserve-process-marker dnbd3-client --host "$host" --image \
        "${SLX_SERVER_BASE#/}${SLX_DNBD3_IMAGE}" --device "$SLX_DNBD3_DEVICE" \
        --rid "$SLX_DNBD3_RID"
    local return_code="$?"
    [[ $return_code == 0 ]] && break
    continue
done
IFS="$IFS_backup"
if [[ $return_code != 0 ]]; then
    warn "Failed to connect \"${SLX_SERVER_BASE#/}${SLX_DNBD3_IMAGE}\" from one of \"$SLX_DNBD3_SERVERS\" to \"$SLX_DNBD3_DEVICE\"."
    emergency_shell -n "Error in $0"
    return 1
fi
local nbd_device='/dev/nbd0'
systemd-preserve-process-marker qemu-nbd --connect="$nbd_device" \
    "$SLX_DNBD3_DEVICE" --read-only
local read_only_partition="$(utils_create_partition_via_offset "$nbd_device" \
    "$SLX_SYSTEM_PARTITION_LABEL")"
# Make read-only partition writable.
# TODO implement persistent available indicator.
local persistent="N" # 'P' for persistent storage, 'N' for not persistent
if true; then
    modprobe brd max_part=1 rd_size=524288
    local writable_device="/dev/ram0"
else
    # Use next free loop device.
    local writable_device="$(losetup -f)"
    dd if=/dev/zero of=persistent_storage.img bs=1k count=1000
    losetup "$writable_device" persistent_storage.img
    persistent="P"
fi
local partition_size="$(blockdev --getsz "$read_only_partition")"
local writable_partition_name="root"
local chunksize="1"
modprobe dm_snapshot
dmsetup create "$writable_partition_name" --noudevsync --table \
    "0 $partition_size snapshot $read_only_partition $writable_device $persistent $chunksize"
dmsetup mknodes --noudevsync "$writable_partition_name"