Browse Source

Make tool ready for handling input images containing 3 partitions

Main aim is to handle Yocto generated image for x86-64 architecure.
Such an image contains boot, filesystem and swap partition.

Issues: MEN-2207

Changelog: Title

Signed-off-by: Adam Podogrocki <a.podogrocki@gmail.com>
1.1.x
Adam Podogrocki 6 years ago
parent
commit
fcd0d78cd9
  1. 127
      mender-convert-functions.sh
  2. 2
      rpi3-convert-stage-5.sh

127
mender-convert-functions.sh

@ -13,8 +13,9 @@ declare -i -r heads=255
# Number of required sectors in a final image.
declare -i -r sectors=63
declare -a mender_disk_partitions=("boot" "primary" "secondary" "data")
declare -a raw_disk_partitions=("boot" "rootfs")
declare -a mender_partitions_regular=('boot' 'primary' 'secondary' 'data')
declare -a mender_partitions_extended=('boot' 'primary' 'secondary' 'n/a' 'data' 'swap')
declare -a raw_disk_partitions=('boot' 'rootfs')
declare -A raw_disk_sizes
declare -A mender_disk_sizes
@ -144,7 +145,7 @@ get_raw_disk_sizes() {
local lparts=($(echo "${lfdisk}" | grep "^${lsubname}" | cut -d' ' -f1))
local lcount=${#lparts[@]}
if [[ $lcount -gt 2 ]]; then
if [[ $lcount -gt 3 ]]; then
log "\tError: invalid/unsupported raw disk image. Aborting."
return 1
fi
@ -162,6 +163,12 @@ get_raw_disk_sizes() {
eval $rvar_array[prootfs_size]="'$(echo "${lsecondpartinfo}" | tr -s ' ' | cut -d' ' -f${idx_size})'"
fi
if [[ $lcount -gt 2 ]]; then
local lthirdpartinfo="$(echo "${lfdisk}" | grep "^${lparts[2]}")"
eval $rvar_array[pswap_start]="'$(echo "${lthirdpartinfo}" | tr -s ' ' | cut -d' ' -f${idx_start})'"
eval $rvar_array[pswap_size]="'$(echo "${lthirdpartinfo}" | tr -s ' ' | cut -d' ' -f${idx_size})'"
fi
# Check is first partition is marked as bootable.
if [[ "$lfirstpartinfo" =~ .*\*.* ]]; then
((idx_start+=1))
@ -332,6 +339,13 @@ set_mender_disk_sizes() {
eval $rvar_array[pboot_size]="'$bootsize'"
eval $rvar_array[prootfs_size]="'$rootfssize'"
eval $rvar_array[pdata_size]="'$datasize'"
if [[ $count -eq 3 ]]; then
# Add space for Swap partition.
local swapsize=${raw_sizes[pswap_size]}
align_partition_size swapsize $sectorsize
eval $rvar_array[pswap_size]="'$swapsize'"
fi
}
# Takes following arguments:
@ -353,6 +367,14 @@ calculate_mender_disk_size() {
2 * ${mender_sizes[prootfs_size]} + \
${mender_sizes[pdata_size]}) * $1 ))
if [ -v mender_sizes[pswap_size] ]; then
log "\tSwap partition found."
# Add size of the swap partition to the total size.
sdimgsize=$(( $sdimgsize + (${mender_sizes[pswap_size]} * $1) ))
# Add alignment used as swap partition offset.
sdimgsize=$(( $sdimgsize + 2 * ${2} ))
fi
eval $rvar_sdimgsize="'$sdimgsize'"
}
@ -421,6 +443,17 @@ format_mender_disk() {
pdata_size=${mender_sizes[pdata_size]}
pdata_end=$((${pdata_start} + ${pdata_size} - 1))
if [ -v mender_sizes[pswap_size] ]; then
local pextended_start=$((${prootfsb_end} + 1))
pdata_start=$(($pextended_start + ${alignment}))
pdata_end=$((${pdata_start} + ${pdata_size} - 1))
local pswap_start=$((${pdata_end} + ${alignment} + 1))
local pswap_size=${mender_sizes[pswap_size]}
local pswap_end=$((${pswap_start} + ${pswap_size} - 1))
fi
sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | sudo fdisk ${lfile} &> /dev/null
o # clear the in memory partition table
x
@ -441,9 +474,17 @@ EOF
sudo parted -s ${lfile} set 1 boot on || rc=$?
sudo parted -s ${lfile} -- unit s mkpart primary ext4 ${prootfsa_start} ${prootfsa_end} || rc=$?
sudo parted -s ${lfile} -- unit s mkpart primary ext4 ${prootfsb_start} ${prootfsb_end} || rc=$?
sudo parted -s ${lfile} -- unit s mkpart primary ext4 ${pdata_start} ${pdata_end} || rc=$?
if [ -v mender_sizes[pswap_size] ]; then
log "\tAdding swap partition."
sudo parted -s ${lfile} -- unit s mkpart extended ${pextended_start} 100% || rc=$?
sudo parted -s ${lfile} -- unit s mkpart logical ext4 ${pdata_start} ${pdata_end} || rc=$?
sudo parted -s ${lfile} -- unit s mkpart logical linux-swap ${pswap_start} ${pswap_end} || rc=$?
eval $rvar_counts="'6'"
else
sudo parted -s ${lfile} -- unit s mkpart primary ext4 ${pdata_start} ${pdata_end} || rc=$?
eval $rvar_counts="'4'"
fi
[[ $rc -eq 0 ]] && { log "\tChanges in partition table applied."; }
@ -515,23 +556,52 @@ detach_device_maps() {
# Takes following arguments:
#
# $1 - partition mappings holder
#
make_mender_disk_filesystem() {
local mappings=($@)
local counts=${#mappings[@]}
if [ $counts -eq 4 ]; then
local labels=(${mender_partitions_regular[@]})
elif [ $counts -eq 6 ]; then
local labels=(${mender_partitions_extended[@]})
fi
for mapping in ${mappings[@]}
do
map_dev=/dev/mapper/"$mapping"
part_no=$(get_part_number_from_device $map_dev)
label=${labels[${part_no} - 1]}
label=${mender_disk_partitions[${part_no} - 1]}
if [[ part_no -eq 1 ]]; then
case ${part_no} in
1)
log "\tCreating MS-DOS filesystem for '$label' partition."
sudo mkfs.vfat -n ${label} $map_dev >> "$build_log" 2>&1
else
;;
2|3)
log "\tCreating ext4 filesystem for '$label' partition."
sudo mkfs.ext4 -L ${label} $map_dev >> "$build_log" 2>&1
;;
4)
if [ $counts -eq 4 ]; then
log "\tCreating ext4 filesystem for '$label' partition."
sudo mkfs.ext4 -L ${label} $map_dev >> "$build_log" 2>&1
else
continue
fi
;;
5)
log "\tCreating ext4 filesystem for '$label' partition."
sudo mkfs.ext4 -L ${label} $map_dev >> "$build_log" 2>&1
;;
6)
log "\tCreating swap area for '$label' partition."
sudo mkswap -L ${label} $map_dev >> "$build_log" 2>&1
;;
*)
break
;;
esac
done
}
@ -562,13 +632,44 @@ mount_raw_disk() {
# $1 - partition mappings holder
mount_mender_disk() {
local mappings=($@)
local counts=${#mappings[@]}
if [ $counts -eq 4 ]; then
local labels=(${mender_partitions_regular[@]})
elif [ $counts -eq 6 ]; then
local labels=(${mender_partitions_extended[@]})
fi
for mapping in ${mappings[@]}
do
local part_no=${mapping#*p*p}
local path=$sdimg_base_dir/${mender_disk_partitions[${part_no} - 1]}
local path=$sdimg_base_dir/${labels[${part_no} - 1]}
mkdir -p $path
case ${part_no} in
1|2|3)
sudo mount /dev/mapper/"${mapping}" $path 2>&1 >/dev/null
;;
4)
if [ $counts -eq 4 ]; then
sudo mount /dev/mapper/"${mapping}" $path 2>&1 >/dev/null
else
# Skip extended partition.
continue
fi
;;
5)
sudo mount /dev/mapper/"${mapping}" $path 2>&1 >/dev/null
;;
6)
# Skip swap partition.
continue
;;
*)
break
;;
esac
done
}
@ -577,6 +678,8 @@ mount_mender_disk() {
# $1 - device type
set_fstab() {
local mountpoint=
local blk_device=
local data_id=4
local device_type=$1
local sysconfdir="$sdimg_primary_dir/etc"
@ -588,9 +691,11 @@ set_fstab() {
case "$device_type" in
"beaglebone")
mountpoint="/boot/efi"
blk_device=mmcblk0p
;;
"raspberrypi3")
mountpoint="/uboot"
blk_device=mmcblk0p
;;
esac
@ -608,8 +713,8 @@ set_fstab() {
#/dev/mmcblk0p1 /media/card auto defaults,sync,noauto 0 0
# Where the U-Boot environment resides; for devices with SD card support ONLY!
/dev/mmcblk0p1 $mountpoint auto defaults,sync 0 0
/dev/mmcblk0p4 /data auto defaults 0 0
/dev/${blk_device}1 $mountpoint auto defaults,sync 0 0
/dev/${blk_device}${data_id} /data auto defaults 0 0
EOF"
log "\tDone."

2
rpi3-convert-stage-5.sh

@ -25,7 +25,7 @@ GCC_VERSION="6.3.1"
build_log=${output_dir}/build.log
declare -a mender_disk_mappings
declare -a mender_disk_partitions=("boot" "primary" "secondary" "data")
declare -a mender_partitions_regular=("boot" "primary" "secondary" "data")
version() {
echo "$@" | awk -F. '{ printf("%d%03d%03d\n", $1,$2,$3); }'

Loading…
Cancel
Save