Browse Source

Merge pull request #26 from apodogrocki/MEN-2172

Make output more user-friendly
1.0.x
Adam Podogrocki 6 years ago
committed by GitHub
parent
commit
9a3afa361c
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 11
      bbb-convert-stage-2.sh
  2. 6
      bbb-convert-stage-3.sh
  3. 65
      bbb-convert-stage-5.sh
  4. 34
      convert-stage-4.sh
  5. 241
      mender-convert
  6. 87
      mender-convert-functions.sh
  7. 11
      rpi3-convert-stage-2.sh
  8. 7
      rpi3-convert-stage-3.sh
  9. 45
      rpi3-convert-stage-5.sh

11
bbb-convert-stage-2.sh

@ -4,15 +4,12 @@ sdimg_boot_dir=$1
embedded_rootfs_dir=$2
uboot_backup_dir=${embedded_rootfs_dir}/opt/backup/uboot
echo $sdimg_boot_dir
echo $embedded_rootfs_dir
[ ! -d "${sdimg_boot_dir}" ] && \
{ echo "Error: boot location not mounted."; exit 1; }
{ log "Error: boot location not mounted."; exit 1; }
[ ! -d "${embedded_rootfs_dir}" ] && \
{ echo "Error: embedded content not mounted."; exit 1; }
{ log "Error: embedded content not mounted."; exit 1; }
[[ ! -f $uboot_backup_dir/MLO || ! -f $uboot_backup_dir/u-boot.img ]] && \
{ echo "Error: cannot find U-Boot related files."; exit 1; }
{ log "Error: cannot find U-Boot related files."; exit 1; }
set_uenv() {
cat <<- 'EOF' | sudo tee --append $sdimg_boot_dir/uEnv.txt 2>&1 >/dev/null
@ -45,6 +42,6 @@ sudo cp ${uboot_backup_dir}/u-boot.img ${sdimg_boot_dir}
# Create U-Boot purposed uEnv.txt file.
set_uenv
echo -e "\nStage done."
log "\tDone."
exit 0

6
bbb-convert-stage-3.sh

@ -4,9 +4,9 @@ sdimg_primary_dir=$1
embedded_rootfs_dir=$2
[ ! -d "${sdimg_primary_dir}" ] && \
{ echo "Error: rootfs location not mounted."; exit 1; }
{ log "Error: rootfs location not mounted."; exit 1; }
[ ! -d "${embedded_rootfs_dir}" ] && \
{ echo "Error: embedded content not mounted."; exit 1; }
{ log "Error: embedded content not mounted."; exit 1; }
# Copy rootfs partition.
sudo cp -ar ${embedded_rootfs_dir}/* ${sdimg_primary_dir}
@ -15,6 +15,6 @@ sudo cp -ar ${embedded_rootfs_dir}/* ${sdimg_primary_dir}
sudo install -d -m 755 ${sdimg_primary_dir}/boot/efi
sudo install -d -m 755 ${sdimg_primary_dir}/data
echo -e "\nStage done."
log "\tDone."
exit 0

65
bbb-convert-stage-5.sh

@ -44,6 +44,7 @@ device_type=
keep=0
efi_boot=EFI/BOOT
EFI_STUB_VER="4.12.0"
build_log=$output_dir/build.log
declare -a mender_disk_mappings
@ -68,13 +69,14 @@ get_kernel_version() {
#
# $1 - linux kernel version
build_env_lock_boot_files() {
log "\tBuilding boot scripts and tools."
local grubenv_repo_vc_dir=$grubenv_dir/.git
local grubenv_build_dir=$grubenv_dir/build
mkdir -p $grubenv_dir
if [ ! -d $grubenv_repo_vc_dir ]; then
git clone https://github.com/mendersoftware/grub-mender-grubenv.git $grubenv_dir
git clone https://github.com/mendersoftware/grub-mender-grubenv.git $grubenv_dir >> "$build_log" 2>&1
fi
cd $grubenv_dir
@ -90,8 +92,8 @@ build_env_lock_boot_files() {
sed -i '/^kernel_imagetype/s/=.*$/='${kernel_imagetype}'/' mender_grubenv_defines
sed -i '/^kernel_devicetree/s/=.*$/='${kernel_devicetree//\//\\/}'/' mender_grubenv_defines
make --quiet
make --quiet DESTDIR=$grubenv_build_dir install
make --quiet >> "$build_log" 2>&1
make --quiet DESTDIR=$grubenv_build_dir install >> "$build_log" 2>&1
cd $output_dir
}
@ -99,6 +101,8 @@ build_env_lock_boot_files() {
#
# $1 - linux kernel version
build_grub_efi() {
log "\tBuilding GRUB efi file."
local grub_build_dir=$grub_dir/build
local grub_arm_dir=$grub_build_dir/arm
local host=$(uname -m)
@ -109,16 +113,16 @@ build_grub_efi() {
# Build grub modules for arm platform and executables for the host.
if [ ! -d $grub_repo_vc_dir ]; then
git clone git://git.savannah.gnu.org/grub.git $grub_dir
git clone git://git.savannah.gnu.org/grub.git $grub_dir >> "$build_log" 2>&1
fi
cd $grub_dir
make --quiet distclean
make --quiet distclean >> "$build_log" 2>&1
if [ $(version $version) -lt $(version $EFI_STUB_VER) ]; then
# To avoid error message: "plain image kernel not supported - rebuild
# with CONFIG_(U)EFI_STUB enabled" - use a specific commit.
git checkout 9b37229f0
git checkout 9b37229f0 >> "$build_log" 2>&1
fi
mkdir -p $grub_arm_dir
@ -127,27 +131,27 @@ build_grub_efi() {
local cores=$(nproc)
# First build host tools.
./autogen.sh > /dev/null
./configure --quiet CC=gcc --target=${host} --with-platform=efi --prefix=$grub_host_dir
make --quiet -j$cores
make --quiet install
./autogen.sh >> "$build_log" 2>&1
./configure --quiet CC=gcc --target=${host} --with-platform=efi --prefix=$grub_host_dir >> "$build_log" 2>&1
make --quiet -j$cores >> "$build_log" 2>&1
make --quiet install >> "$build_log" 2>&1
# Clean workspace.
make --quiet clean
make --quiet distclean
make --quiet clean >> "$build_log" 2>&1
make --quiet distclean >> "$build_log" 2>&1
# Now build ARM modules.
./configure --quiet --host=$bootloader_toolchain --with-platform=efi \
--prefix=$grub_arm_dir CFLAGS="-Os -march=armv7-a" \
CCASFLAGS="-march=armv7-a" --disable-werror
make --quiet -j$cores
make --quiet install
CCASFLAGS="-march=armv7-a" --disable-werror >> "$build_log" 2>&1
make --quiet -j$cores >> "$build_log" 2>&1
make --quiet install >> "$build_log" 2>&1
# Build GRUB EFI image.
${grub_host_dir}/bin/grub-mkimage -v -p /$efi_boot -o grub.efi --format=arm-efi \
-d $grub_arm_dir/lib/grub/arm-efi/ boot linux ext2 fat serial part_msdos \
part_gpt normal efi_gop iso9660 configfile search loadenv test cat echo \
gcry_sha256 halt hashsum loadenv reboot &> /dev/null
gcry_sha256 halt hashsum loadenv reboot >> "$build_log" 2>&1
rc=$?
@ -179,7 +183,7 @@ set_uenv() {
# $1 - boot partition mountpoint
# $2 - primary partition mountpoint
install_files() {
echo "Installing GRUB files..."
log "\tInstalling GRUB files."
local boot_dir=$1
local rootfs_dir=$2
@ -194,7 +198,7 @@ install_files() {
# Make sure env, lock, lock.sha256sum files exists in working directory.
[[ ! -d $grubenv_efi_boot_dir/mender_grubenv1 || \
! -d $grubenv_efi_boot_dir/mender_grubenv2 ]] && \
{ echo "Error: cannot find mender grub related files."; return 1; }
{ log "Error: cannot find mender grub related files."; return 1; }
sudo install -d -m 755 $efi_boot_dir
@ -215,30 +219,28 @@ install_files() {
}
do_install_bootloader() {
echo "Setting bootloader..."
if [ -z "${mender_disk_image}" ]; then
echo "Mender raw disk image not set. Aborting."
log "Mender raw disk image not set. Aborting."
exit 1
fi
if [ -z "${bootloader_toolchain}" ]; then
echo "ARM GCC toolchain not set. Aborting."
log "ARM GCC toolchain not set. Aborting."
exit 1
fi
if [ -z "${device_type}" ]; then
echo "Target device type name not set. Aborting."
log "Target device type name not set. Aborting."
exit 1
fi
if [[ $(which ${bootloader_toolchain}-gcc) = 1 ]]; then
echo "Error: ARM GCC not found in PATH. Aborting."
if ! [ -x "$(command -v ${bootloader_toolchain}-gcc)" ]; then
log "Error: ARM GCC not found in PATH. Aborting."
exit 1
fi
[ ! -f $mender_disk_image ] && \
{ echo "$mender_disk_image - file not found. Aborting."; exit 1; }
{ log "$mender_disk_image - file not found. Aborting."; exit 1; }
# Map & mount Mender compliant image.
create_device_maps $mender_disk_image mender_disk_mappings
@ -257,15 +259,15 @@ do_install_bootloader() {
sudo mount ${map_primary} ${path_primary}
get_kernel_version ${path_primary} kernel_version
echo -e "\nKernel version: $kernel_version"
log "\tFound kernel version: $kernel_version"
build_env_lock_boot_files $kernel_version
build_grub_efi $kernel_version
rc=$?
[[ $rc -ne 0 ]] && { echo "Error: grub.efi building failure. Aborting."; } \
|| { echo "Successful grub.efi building."; \
[[ $rc -ne 0 ]] && { log "\tBuilding grub.efi failed. Aborting."; } \
|| { log "\tBuilding grub.efi succeeded."; \
install_files ${path_boot} ${path_primary}; }
# Back to working directory.
@ -276,8 +278,7 @@ do_install_bootloader() {
rm -rf $output_dir/sdimg
[[ $keep -eq 0 ]] && { rm -rf $grubenv_dir $grub_dir; }
[[ $rc -ne 0 ]] && { echo -e "\nStage failure."; exit 1; } \
|| { echo -e "\nStage done."; }
[[ $rc -ne 0 ]] && { exit 1; } || { log "\tDone."; }
}
PARAMS=""
@ -309,7 +310,7 @@ while (( "$#" )); do
break
;;
-*)
echo "Error: unsupported option $1" >&2
log "Error: unsupported option $1"
exit 1
;;
*)

34
convert-stage-4.sh

@ -121,7 +121,7 @@ get_mender_files_from_upstream() {
mkdir -p $mender_dir
echo -e "Downloading inventory & identity scripts..."
log "\tDownloading inventory & identity scripts."
wget -nc -q -O $mender_dir/mender-device-identity \
$mender_client_repo/$mender_client_revision/support/mender-device-identity
@ -152,6 +152,8 @@ install_files() {
dataconfdir="mender"
databootdir="u-boot"
log "\tInstalling files."
# Prepare 'data' partition
sudo install -d -m 755 ${data_dir}/${dataconfdir}
sudo install -d -m 755 ${data_dir}/${databootdir}
@ -163,18 +165,18 @@ install_files() {
# Prepare 'primary' partition
[ ! -d "$primary_dir/data" ] && \
{ echo "'data' mountpoint missing. Adding"; \
{ log "\t'data' mountpoint missing. Adding"; \
sudo install -d -m 755 ${primary_dir}/data; }
case "$device_type" in
"beaglebone")
[ ! -d "$primary_dir/boot/efi" ] && \
{ echo "'/boot/efi' mountpoint missing. Adding"; \
{ log "\t'/boot/efi' mountpoint missing. Adding"; \
sudo install -d -m 755 ${primary_dir}/boot/efi; }
;;
"raspberrypi3")
[ ! -d "$primary_dir/uboot" ] && \
{ echo "'/boot/efi' mountpoint missing. Adding"; \
{ log "\t'/boot/efi' mountpoint missing. Adding"; \
sudo install -d -m 755 ${primary_dir}/uboot; }
;;
esac
@ -184,7 +186,7 @@ install_files() {
sudo install -d ${primary_dir}/${sysconfdir}
sudo install -d ${primary_dir}/${sysconfdir}/scripts
sudo ln -s /data/${dataconfdir} ${primary_dir}/${localstatedir}
sudo ln -sf /data/${dataconfdir} ${primary_dir}/${localstatedir}
sudo install -m 0755 ${mender_client} ${primary_dir}/${bindir}/mender
@ -197,7 +199,7 @@ install_files() {
sudo install -m 0644 ${mender_dir}/mender.service ${primary_dir}/${systemd_unitdir}
# Enable menderd service starting on boot.
sudo ln -s /lib/systemd/system/mender.service \
sudo ln -sf /lib/systemd/system/mender.service \
${primary_dir}/etc/systemd/system/multi-user.target.wants/mender.service
sudo install -m 0644 ${mender_dir}/mender.conf ${primary_dir}/${sysconfdir}
@ -209,7 +211,7 @@ install_files() {
sudo install -m 0644 ${mender_dir}/version ${primary_dir}/${sysconfdir}/scripts
if [ -n "${demo_host_ip}" ]; then
echo "$demo_host_ip docker.mender.io s3.docker.mender.io" | sudo tee -a $primary_dir/etc/hosts
sudo sh -c -e "echo '$demo_host_ip docker.mender.io s3.docker.mender.io' >> $primary_dir/etc/hosts";
fi
if [ -n "${server_cert}" ]; then
@ -219,33 +221,33 @@ install_files() {
do_install_mender() {
if [ -z "${mender_disk_image}" ]; then
echo "Mender raw disk image not set. Aborting."
log "Mender raw disk image not set. Aborting."
show_help
fi
if [ -z "${mender_client}" ]; then
echo "Mender client binary not set. Aborting."
log "Mender client binary not set. Aborting."
show_help
fi
if [ -z "${device_type}" ]; then
echo "Target device type name not set. Aborting."
log "Target device type name not set. Aborting."
show_help
fi
if [ -z "${artifact_name}" ]; then
echo "Artifact info not set. Aborting."
log "Artifact info not set. Aborting."
show_help
fi
if [ -z "${server_url}" ] && [ -z "${demo_host_ip}" ] && \
[ -z "${tenant_token}" ]; then
echo "No server type specified. Aborting."
log "No server type specified. Aborting."
show_help
fi
if [ -n "${server_url}" ] && [ -n "${demo_host_ip}" ]; then
echo "Incompatible server type choice. Aborting."
log "Incompatible server type choice. Aborting."
show_help
fi
@ -260,7 +262,7 @@ do_install_mender() {
fi
[ ! -f $mender_disk_image ] && \
{ echo "$mender_disk_image - file not found. Aborting."; exit 1; }
{ log "$mender_disk_image - file not found. Aborting."; exit 1; }
# Mount rootfs partition A.
create_device_maps $mender_disk_image mender_disk_mappings
@ -295,6 +297,8 @@ do_install_mender() {
detach_device_maps ${mender_disk_mappings[@]}
rm -rf $output_dir/sdimg
[[ $keep -eq 0 ]] && { rm -rf $mender_dir; }
log "\tDone."
}
PARAMS=""
@ -345,7 +349,7 @@ while (( "$#" )); do
break
;;
-*)
echo "Error: unsupported option $1" >&2
log "Error: unsupported option $1"
exit 1
;;
*)

241
mender-convert

@ -157,10 +157,10 @@ prootfs_size=
mender_disk_image=
raw_disk_image=
device_type=
partitions_number=
mender_disk_counts=
artifact_name=
rootfs_partition_id=
image_type=
raw_disk_counts=
mender_client=
# Mender production certificate.
server_cert=
@ -171,6 +171,10 @@ demo_host_ip=
# Mender hosted token.
tenant_token=
# Conversion progress.
declare -i step=1
declare -i total=
declare -a rootfs_partition_ids=("primary" "secondary")
declare -a mender_disk_mappings
declare -a raw_disk_mappings
@ -178,9 +182,11 @@ declare -a raw_disk_mappings
declare -a supported_devices=("beaglebone" "raspberrypi3")
do_raw_disk_image_shrink_rootfs() {
log "$step/$total Shrinking raw disk image root filesystem..."
((step++))
if [ -z "${raw_disk_image}" ]; then
echo "Raw disk image not set. Aborting."
exit 1
log "Raw disk image not set. Aborting."
return 1
fi
local count=
@ -196,7 +202,7 @@ do_raw_disk_image_shrink_rootfs() {
# Find first available loopback device.
loopdevice=($(losetup -f))
[ $? -ne 0 ] && { echo "Error: inaccesible loopback device"; return 1; }
[ $? -ne 0 ] && { log "Error: inaccesible loopback device"; return 1; }
# Mount appropriate partition.
if [[ $count -eq 1 ]]; then
@ -204,7 +210,7 @@ do_raw_disk_image_shrink_rootfs() {
elif [[ $count -eq 2 ]]; then
sudo losetup $loopdevice $raw_disk_image -o $(($rootfsstart * $sector_size))
else
echo "Error: invalid/unsupported embedded raw disk image. Aborting."
log "Error: invalid/unsupported embedded raw disk image. Aborting."
return 1
fi
@ -214,14 +220,14 @@ do_raw_disk_image_shrink_rootfs() {
new_size_sectors=$(( $min_size_blocks * $block_size / $sector_size ))
align_partition_size new_size_sectors $sector_size
echo -e "Root filesystem size:"
echo -e "\nminimal: $(( $min_size_blocks * $block_size ))"
echo -e "\naligned: $(( $new_size_sectors * $sector_size ))"
echo -e "\nsectors: $new_size_sectors"
log "\tRoot filesystem size:\
\n\tminimal: $(( $min_size_blocks * $block_size )) \
\n\taligned: $(( $new_size_sectors * $sector_size ))\
\n\tsectors: $new_size_sectors"
sudo e2fsck -y -f $loopdevice
sudo resize2fs -p $loopdevice ${new_size_sectors}s
sudo e2fsck -y -f $loopdevice
sudo e2fsck -y -f $loopdevice >> "$build_log" 2>&1
sudo resize2fs -p $loopdevice ${new_size_sectors}s >> "$build_log" 2>&1
sudo e2fsck -y -f $loopdevice >> "$build_log" 2>&1
sudo losetup -d $loopdevice
sudo losetup $loopdevice $raw_disk_image
@ -229,7 +235,6 @@ do_raw_disk_image_shrink_rootfs() {
if [[ $count -eq 1 ]]; then
create_single_disk_partition_table $loopdevice $bootstart $new_size_sectors
elif [[ $count -eq 2 ]]; then
echo
create_double_disk_partition_table $loopdevice $rootfsstart $new_size_sectors
fi
@ -237,29 +242,32 @@ do_raw_disk_image_shrink_rootfs() {
endsector=($(sudo parted $loopdevice -ms unit s print | grep "^$count" | cut -f3 -d: | sed 's/[^0-9]*//g'))
sudo losetup -d $loopdevice
echo "Image new endsector: $endsector"
log "\tRaw disk image new endsector: $endsector"
truncate -s $((($endsector+1) * $sector_size)) $raw_disk_image
echo "Root filesystem size (sectors): $new_size_sectors"
log "\tNew root filesystem size (sectors): $new_size_sectors"
return 0
}
do_raw_disk_image_create_partitions() {
log "$step/$total Repartitioning raw disk image..."
((step++))
if [ -z "$raw_disk_image" ] || [ -z "$device_type" ] || \
[ -z "$artifact_name" ]; then
show_help
exit 1
return 1
fi
if [[ ! -f ${raw_disk_image} ]]; then
echo "Raw disk image not found. Aborting."
exit 1
log "Raw disk image not found. Aborting."
return 1
fi
local supported=$(echo ${supported_devices[@]} | grep -o $device_type | wc -w)
[[ $supported -eq 0 ]] && \
{ echo "Error: incorrect device type. Aborting."; return 1; }
{ log "Error: incorrect device type. Aborting."; return 1; }
mkdir -p $output_dir && cd $output_dir
@ -279,20 +287,22 @@ do_raw_disk_image_create_partitions() {
fi
analyse_raw_disk_image ${raw_disk_image} pboot_start pboot_size prootfs_size \
sector_size image_type
sector_size raw_disk_counts
[ -z "${prootfs_size}" ] && \
{ echo "root filesystem size not set. Aborting."; return 1; }
{ log "root filesystem size not set. Aborting."; return 1; }
log "\tDetected raw disk image with $raw_disk_counts partition(s)."
local mender_disk_image_size=
calculate_mender_disk_size $pboot_start $pboot_size \
$prootfs_size $data_part_size_mb \
$sector_size pdata_size mender_disk_image_size
echo -e "Creating Mender disk image:\
\nimage size: ${mender_disk_image_size} bytes\
\nroot filesystem size: ${prootfs_size} sectors\
\ndata partition size: $pdata_size sectors\n"
log "\tCreating Mender disk image:\
\n\t\timage size: ${mender_disk_image_size} bytes\
\n\t\troot filesystem size: $((${prootfs_size} * $sector_size)) bytes\
\n\t\tdata partition size: $(($pdata_size * $sector_size)) bytes"
create_test_config_file $device_type $partition_alignment $vfat_storage_offset \
$pboot_size $prootfs_size $pdata_size $mender_disk_image_size \
@ -301,9 +311,12 @@ do_raw_disk_image_create_partitions() {
create_mender_disk $mender_disk_image $mender_disk_image_size
format_mender_disk $mender_disk_image $mender_disk_image_size $pboot_start \
$pboot_size $prootfs_size $pdata_size $sector_size
verify_mender_disk $mender_disk_image partitions_number
verify_mender_disk $mender_disk_image mender_disk_counts
create_device_maps $mender_disk_image mender_disk_mappings
log "$step/$total Formatting repartitioned raw disk image..."
((step++))
make_mender_disk_filesystem ${mender_disk_mappings[@]}
case "$device_type" in
@ -317,7 +330,8 @@ do_raw_disk_image_create_partitions() {
rc=$?
echo -e "\nCleaning..."
log "$step/$total Cleaning intermediate files..."
((step++))
# Clean and detach.
detach_device_maps ${mender_disk_mappings[@]}
detach_device_maps ${raw_disk_mappings[@]}
@ -325,8 +339,7 @@ do_raw_disk_image_create_partitions() {
rm -rf $embedded_base_dir
rm -rf $sdimg_base_dir
[ $rc -eq 0 ] && { echo -e "\n$mender_disk_image image created."; } \
|| { echo -e "\n$mender_disk_image image composing failure."; }
[ $rc -eq 0 ] || { log "\nRepartitioning of $raw_disk_image image failed."; }
return $rc
}
@ -339,49 +352,57 @@ do_make_sdimg_beaglebone() {
mount_mender_disk ${mender_disk_mappings[@]}
mount_raw_disk ${raw_disk_mappings[@]}
echo -e "\nSetting boot partition..."
log "$step/$total Setting boot partition..."
((step++))
stage_2_args="$sdimg_boot_dir $embedded_rootfs_dir"
${tool_dir}/bbb-convert-stage-2.sh ${stage_2_args} || ret=$?
[[ $ret -ne 0 ]] && { echo "Aborting."; return $ret; }
[[ $ret -ne 0 ]] && { log "Aborting."; return $ret; }
echo -e "\nSetting root filesystem..."
log "$step/$total Setting root filesystem partition..."
((step++))
stage_3_args="$sdimg_primary_dir $embedded_rootfs_dir"
${tool_dir}/bbb-convert-stage-3.sh ${stage_3_args} || ret=$?
[[ $ret -ne 0 ]] && { echo "Aborting."; return $ret; }
[[ $ret -ne 0 ]] && { log "Aborting."; return $ret; }
log "$step/$total Setting file system table..."
((step++))
set_fstab $device_type
return $ret
}
do_make_sdimg_raspberrypi3() {
log "$step/$total Setting boot partition..."
((step++))
image_boot_part=$(fdisk -l ${raw_disk_image} | grep FAT32)
boot_part_start=$(echo ${image_boot_part} | awk '{print $2}')
boot_part_end=$(echo ${image_boot_part} | awk '{print $3}')
boot_part_size=$(echo ${image_boot_part} | awk '{print $4}')
log "\tExtracting boot partition from raw disk image."
extract_file_from_image ${raw_disk_image} ${boot_part_start} \
${boot_part_size} "boot.vfat"
stage_2_args="$output_dir ${mender_disk_mappings[0]}"
${tool_dir}/rpi3-convert-stage-2.sh ${stage_2_args} || ret=$?
[[ $ret -ne 0 ]] && { return $ret; }
log "$step/$total Setting root filesystem partition..."
((step++))
image_rootfs_part=$(fdisk -l ${raw_disk_image} | grep Linux)
rootfs_part_start=$(echo ${image_rootfs_part} | awk '{print $2}')
rootfs_part_end=$(echo ${image_rootfs_part} | awk '{print $3}')
rootfs_part_size=$(echo ${image_rootfs_part} | awk '{print $4}')
log "\tExtracting root filesystem partition from raw disk image."
extract_file_from_image ${raw_disk_image} ${rootfs_part_start} \
${rootfs_part_size} "rootfs.img"
echo -e "\nSetting boot partition..."
stage_2_args="$output_dir ${mender_disk_mappings[0]}"
${tool_dir}/rpi3-convert-stage-2.sh ${stage_2_args} || ret=$?
[[ $ret -ne 0 ]] && { echo "Aborting."; return $ret; }
echo -e "\nSetting root filesystem..."
stage_3_args="$output_dir ${mender_disk_mappings[1]}"
${tool_dir}/rpi3-convert-stage-3.sh ${stage_3_args} || ret=$?
[[ $ret -ne 0 ]] && { echo "Aborting."; return $ret; }
[[ $ret -ne 0 ]] && { return $ret; }
mount_mender_disk ${mender_disk_mappings[@]}
@ -389,6 +410,8 @@ do_make_sdimg_raspberrypi3() {
sudo install -d -m 755 ${sdimg_primary_dir}/uboot
sudo install -d -m 755 ${sdimg_primary_dir}/data
log "$step/$total Setting file system table..."
((step++))
set_fstab $device_type
[[ $keep != "-k" ]] && { rm -f $output_dir/boot.vfat\
@ -399,17 +422,19 @@ do_make_sdimg_raspberrypi3() {
}
do_install_mender_to_mender_disk_image() {
# Mender executables, service and configuration files installer.
log "$step/$total Installing Mender to Mender disk image..."
((step++))
if [ -z "$mender_disk_image" ] || [ -z "$device_type" ] || \
[ -z "$mender_client" ] || [ -z "$artifact_name" ]; then
show_help
exit 1
return 1
fi
local supported=$(echo ${supported_devices[@]} | grep -o $device_type | wc -w)
[[ $supported -eq 0 ]] && \
{ echo "Error: incorrect device type. Aborting."; return 1; }
{ log "Error: incorrect device type. Aborting."; return 1; }
# mender-image-1.5.0
stage_4_args="-m $mender_disk_image -d $device_type -g ${mender_client} -a ${artifact_name}"
@ -436,10 +461,8 @@ do_install_mender_to_mender_disk_image() {
eval set -- " ${stage_4_args}"
export -f create_device_maps
export -f detach_device_maps
${tool_dir}/convert-stage-4.sh ${stage_4_args}
${tool_dir}/convert-stage-4.sh ${stage_4_args} || ret=$?
[[ $ret -ne 0 ]] && { log "\nInstalling Mender to Mender disk image failed."; return $ret; }
# Update test configuration file
update_test_config_file $device_type artifact-name $artifact_name
@ -448,24 +471,26 @@ do_install_mender_to_mender_disk_image() {
}
do_install_bootloader_to_mender_disk_image() {
log "$step/$total Installing Bootloader to Mender disk image..."
((step++))
if [ -z "$mender_disk_image" ] || [ -z "$device_type" ] || \
[ -z "$bootloader_toolchain" ]; then
show_help
exit 1
return 1
fi
local supported=$(echo ${supported_devices[@]} | grep -o $device_type | wc -w)
[[ $supported -eq 0 ]] && \
{ echo "Error: incorrect device type. Aborting."; return 1; }
{ log "Error: incorrect device type. Aborting."; return 1; }
case "$device_type" in
"beaglebone")
stage_5_args="-m $mender_disk_image -d $device_type -b ${bootloader_toolchain} $keep"
eval set -- " ${stage_5_args}"
export -f create_device_maps
export -f detach_device_maps
${tool_dir}/bbb-convert-stage-5.sh ${stage_5_args}
${tool_dir}/bbb-convert-stage-5.sh ${stage_5_args}|| ret=$?
[[ $ret -ne 0 ]] && { log "\nInstalling Bootloader failed."; return $ret; }
# Update test configuration file
update_test_config_file $device_type distro-feature "mender-grub" \
@ -474,10 +499,8 @@ do_install_bootloader_to_mender_disk_image() {
"raspberrypi3")
stage_5_args="-m $mender_disk_image -d $device_type -b ${bootloader_toolchain} $keep"
eval set -- " ${stage_5_args}"
export -f create_device_maps
export -f detach_device_maps
export -f mount_mender_disk
${tool_dir}/rpi3-convert-stage-5.sh ${stage_5_args}
${tool_dir}/rpi3-convert-stage-5.sh ${stage_5_args}|| ret=$?
[[ $ret -ne 0 ]] && { log "\nInstalling Bootloader failed."; return $ret; }
# Update test configuration file
update_test_config_file $device_type mount-location "\/uboot"
@ -488,35 +511,38 @@ do_install_bootloader_to_mender_disk_image() {
}
do_mender_disk_image_to_artifact() {
log "$step/$total Creating Mender Artifact..."
((step++))
if [ -z "${mender_disk_image}" ]; then
echo "Mender disk image not set. Aborting."
exit 1
log "Mender disk image not set. Aborting."
return 1
fi
if [ -z "${device_type}" ]; then
echo "Target device_type name not set. Aborting."
exit 1
log "Target device_type name not set. Aborting."
return 1
fi
if [ -z "${artifact_name}" ]; then
echo "Artifact name not set. Aborting."
exit 1
log "Artifact name not set. Aborting."
return 1
fi
if [ -z "${rootfs_partition_id}" ]; then
echo "Rootfs partition id not set - 'primary' will be used by default."
log "\tRootfs partition id not set - 'primary' will be used by default."
rootfs_partition_id="primary"
fi
local supported=$(echo ${supported_devices[@]} | grep -o $device_type | wc -w)
[[ $supported -eq 0 ]] && \
{ echo "Error: incorrect device type. Aborting."; return 1; }
{ log "Error: incorrect device type. Aborting."; return 1; }
inarray=$(echo ${rootfs_partition_ids[@]} | grep -o $rootfs_partition_id | wc -w)
[[ $inarray -eq 0 ]] && \
{ echo "Error: invalid rootfs partition id provided. Aborting."; return 1; }
{ log "Error: invalid rootfs partition id provided. Aborting."; return 1; }
local count=
local bootstart=
@ -531,7 +557,7 @@ do_mender_disk_image_to_artifact() {
rootfs_a_size rootfs_b_start rootfs_b_size
ret=$?
[[ $ret -ne 0 ]] && \
{ echo "Error: cannot validate Mender disk image. Aborting."; return 1; }
{ log "Error: cannot validate Mender disk image. Aborting."; return 1; }
# Check if device type matches.
create_device_maps $mender_disk_image mender_disk_mappings
@ -541,12 +567,12 @@ do_mender_disk_image_to_artifact() {
mender_device_type=$( cat $sdimg_data_dir/mender/device_type | sed 's/[^=].*=//' )
if [ "$mender_device_type" != "$device_type" ]; then
echo "Error: device types of Mender artifact & Mender not matching. Aborting."
log "Error: device types of Mender artifact & Mender not matching. Aborting."
ret=1
fi
if ! [ -x "$(command -v mender-artifact)" ]; then
echo "Error: mender-artifact not found in PATH. Aborting."
log "Error: mender-artifact not found in PATH. Aborting."
ret=1
fi
@ -571,14 +597,16 @@ do_mender_disk_image_to_artifact() {
extract_file_from_image $mender_disk_image $prootfs_start \
$prootfs_size $mender_rootfs_basename
fsck.ext4 -fp $mender_rootfs_image
fsck.ext4 -fp $mender_rootfs_image &> /dev/null || ret=$?
[[ $ret -ne 0 ]] && \
{ log "Error: checking $mender_rootfs_basename file system failed. Aborting."; }
# Find first available loopback device.
loopdevice=($(sudo losetup -f || ret=$?))
[[ $ret -ne 0 ]] && \
{ log "Error: cannot find an unused loop device. Aborting."; }
if [ $ret -ne 0 ]; then
echo "Error: cannot find an unused loop device. Aborting."
else
if [ $ret -eq 0 ]; then
#Mount extracted ext4 partition to verify 'artifact_info' file content.
sudo losetup $loopdevice ${mender_rootfs_image}
rootfs_mountpoint=${output_dir}/mnt/${rootfs_partition_id}
@ -595,7 +623,7 @@ do_mender_disk_image_to_artifact() {
# Note: expected Mender Artifact name follows the scheme:
# mender-<device_name>-<artifact_name>.mender.
mender_artifact=${output_dir}/${mender_disk_filename}.mender
echo "Writing Mender artifact to: ${mender_artifact}"
log "\tWriting Mender artifact to: ${mender_artifact}"
#Create Mender artifact
mender-artifact write rootfs-image \
@ -606,8 +634,8 @@ do_mender_disk_image_to_artifact() {
ret=$?
[[ $ret -eq 0 ]] && \
{ echo "Writing Mender artifact to ${mender_artifact} succeeded."; } || \
{ echo "Writing Mender artifact to ${mender_artifact} failed."; }
{ log "\tCreating Mender Artifact succeeded."; } || \
{ log "\tCreating Mender Artifact failed."; }
fi
fi
@ -649,6 +677,14 @@ PARAMS=""
# Load necessary functions.
source ${tool_dir}/mender-convert-functions.sh
export -f create_device_maps
export -f detach_device_maps
export -f mount_mender_disk
export -f log
export -f logsetup
logsetup
while (( "$#" )); do
case "$1" in
-p | --rootfs-partition-id)
@ -712,7 +748,7 @@ while (( "$#" )); do
break
;;
-*)
echo "Error: unsupported option $1" >&2
log "Error: unsupported option $1"
exit 1
;;
*)
@ -723,7 +759,7 @@ while (( "$#" )); do
done
[ -z "${data_part_size_mb}" ] && \
{ echo "Default 'data' partition size set to 128MB"; data_part_size_mb=128; }
{ log "Default 'data' partition size set to 128MB"; data_part_size_mb=128; }
eval set -- "$PARAMS"
@ -732,42 +768,51 @@ sudo true
case "$1" in
raw-disk-image-shrink-rootfs)
total=1
do_raw_disk_image_shrink_rootfs || rc=$?
[[ $rc -ne 0 ]] && { exit 1; }
echo "The rootfs partition in the raw disk image has been shrinked successfully!"
echo "You can now convert the output raw disk image ($raw_disk_image) to a Mender disk image."
[[ $rc -ne 0 ]] && { log "Check $build_log for details."; exit 1; }
log "The rootfs partition in the raw disk image has been shrinked successfully!"
log "You can now convert the output raw disk image\n\t$raw_disk_image\
\nto a Mender disk image."
;;
raw-disk-image-create-partitions)
total=6
do_raw_disk_image_create_partitions || rc=$?
[[ $rc -ne 0 ]] && { exit 1; }
echo "A new Mender disk image with partition layout to support Mender has been successfully created!"
echo "You can find the output Mender disk image at ${mender_disk_image}."
[[ $rc -ne 0 ]] && { log "Check $build_log for details."; exit 1; }
log "A new Mender disk image with partition layout to support Mender has been successfully created!"
log "You can find the output Mender disk image at:\n\t${mender_disk_image}."
;;
install-mender-to-mender-disk-image)
total=1
do_install_mender_to_mender_disk_image || rc=$?
[[ $rc -ne 0 ]] && { exit 1; }
echo "The Mender client has been successfully installed to the Mender disk image."
echo "You can find the output Mender disk image at ${mender_disk_image}."
[[ $rc -ne 0 ]] && { log "Check $build_log for details."; exit 1; }
log "The Mender client has been successfully installed to the Mender disk image."
log "You can find the output Mender disk image at:\n\t${mender_disk_image}."
;;
install-bootloader-to-mender-disk-image)
total=1
do_install_bootloader_to_mender_disk_image || rc=$?
[[ $rc -ne 0 ]] && { exit 1; }
echo "A bootloader configuration supporting dual A/B rootfs updates has been installed to the Mender disk image!"
echo "You can find the output Mender disk image at ${mender_disk_image}."
[[ $rc -ne 0 ]] && { log "Check $build_log for details."; exit 1; }
log "A bootloader configuration supporting dual A/B rootfs updates has been installed to the Mender disk image!"
log "You can find the output Mender disk image at:\n\t${mender_disk_image}."
;;
mender-disk-image-to-artifact)
total=1
do_mender_disk_image_to_artifact || rc=$?
[[ $rc -ne 0 ]] && { exit 1; }
echo "A Mender Artifact has been successfully extracted from your Mender disk image!"
echo "You can find the Mender Artifact at $mender_artifact and use it to deploy updates."
[[ $rc -ne 0 ]] && { log "Check $build_log for details."; exit 1; }
log "A Mender Artifact has been successfully extracted from your Mender disk image!"
log "You can find the Mender Artifact at:\n\t$mender_artifact\nand use it to deploy updates."
;;
from-raw-disk-image)
total=9
do_from_raw_disk_image || rc=$?
[[ $rc -ne 0 ]] && { exit 1; }
echo "Conversion complete!"
echo "The Mender disk image you can provision your device storage with is at ${mender_disk_image}."
echo "The Mender root file system partition is at ${mender_rootfs_image}."
echo "The Mender Artifact you can upload to your Mender server to deploy to your devices is at ${mender_artifact}."
[[ $rc -ne 0 ]] && { log "Check $build_log for details."; exit 1; }
log "Conversion complete!"
log "The Mender disk image you can provision your device storage with is at:\
\n\t${mender_disk_image}."
log "The Mender root file system partition is at:\n\t${mender_rootfs_image}."
log "The Mender Artifact you can upload to your Mender server to deploy to your devices is at:\
\n\t${mender_artifact}."
;;
*)
show_help

87
mender-convert-functions.sh

@ -15,6 +15,7 @@ declare -a raw_disk_partitions=("boot" "rootfs")
tool_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
files_dir=${tool_dir}/files
output_dir=${tool_dir}/output
build_log=${output_dir}/build.log
embedded_base_dir=$output_dir/embedded
sdimg_base_dir=$output_dir/sdimg
@ -26,6 +27,16 @@ sdimg_primary_dir=$sdimg_base_dir/primary
sdimg_secondary_dir=$sdimg_base_dir/secondary
sdimg_data_dir=$sdimg_base_dir/data
logsetup() {
echo -n "" > $build_log
exec > >(tee -a $build_log)
exec 2>&1
}
log() {
echo -e "$*"
}
# Takes following arguments:
#
# $1 -relative file path
@ -51,7 +62,7 @@ get_part_number_from_device() {
echo ${1##*[0-9]p}
;;
*)
echo "Could not determine partition number from $1"
log "Could not determine partition number from $1"
exit 1
;;
esac
@ -67,7 +78,7 @@ create_single_disk_partition_table() {
local bootstart=$2
local stopsector=$(( $3 - 1 ))
sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | sudo fdisk $device
sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | sudo fdisk $device &> /dev/null
d # delete partition
n # new partition
p # primary partition
@ -90,7 +101,7 @@ create_double_disk_partition_table() {
local rootfsstart=$2
local rootfsstop=$(( $3 - 1 ))
sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | sudo fdisk $device
sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | sudo fdisk $device &> /dev/null
d # delete partition
2
n
@ -164,7 +175,7 @@ get_image_info() {
eval $rvar_rootfssize="'$lsecondpartsize'"
[[ $lcount -gt 2 ]] && \
{ echo "Unsupported type of source image. Aborting."; return 1; } || \
{ log "Unsupported type of source image. Aborting."; return 1; } || \
{ return 0; }
}
@ -196,7 +207,7 @@ get_mender_disk_info() {
local lcount=${#lparts[@]}
if [[ $lcount -ne 4 ]]; then
echo "Error: invalid Mender disk image. Aborting."
log "Error: invalid Mender disk image. Aborting."
return 1
else
local lsectorsize=($(echo "${lfdisk}" | grep '^Sector' | cut -d' ' -f4))
@ -255,7 +266,7 @@ align_partition_size() {
# $3 - boot partition size (in sectors)
# $4 - root filesystem partition size (in sectors)
# $5 - sector size (in bytes)
# $6 - image type
# $6 - number of detected partitions
analyse_raw_disk_image() {
local image=$1
local count=
@ -270,21 +281,18 @@ analyse_raw_disk_image() {
local rvar_bootsize=$3
local rvar_rootfssize=$4
local rvar_sectorsize=$5
local rvar_imagetype=$6
local rvar_partitions=$6
get_image_info $image count sectorsize bootstart bootsize \
rootfsstart rootfssize bootflag
[[ $? -ne 0 ]] && \
{ echo "Error: invalid/unsupported raw_disk image. Aborting."; exit 1; }
{ log "Error: invalid/unsupported raw disk image. Aborting."; exit 1; }
if [[ $count -eq 1 ]]; then
echo -e "\nDetected single partition raw_disk image."
rootfssize=$bootsize
# Default size of the boot partition: 16MiB.
bootsize=$(( ($partition_alignment * 2) / $sectorsize ))
elif [[ $count -eq 2 ]]; then
echo -e "\nDetected multipartition ($count) raw_disk image."
fi
# Boot partition storage offset is defined from the top down.
@ -297,13 +305,7 @@ analyse_raw_disk_image() {
eval $rvar_bootsize="'$bootsize'"
eval $rvar_rootfssize="'$rootfssize'"
eval $rvar_sectorsize="'$sectorsize'"
eval $rvar_imagetype="'$count'"
echo -e "\nEmbedded image processing summary:\
\nboot part start sector: ${bootstart}\
\nboot part size (sectors): ${bootsize}\
\nrootfs part size (sectors): ${rootfssize}\
\nsector size (bytes): ${sectorsize}\n"
eval $rvar_partitions="'$count'"
}
# Takes following arguments:
@ -336,7 +338,7 @@ calculate_mender_disk_size() {
#
# $1 - raw disk image
unmount_partitions() {
echo "1. Check if device is mounted..."
log "Check if device is mounted..."
is_mounted=`grep ${1} /proc/self/mounts | wc -l`
if [ ${is_mounted} -ne 0 ]; then
sudo umount ${1}?*
@ -347,7 +349,7 @@ unmount_partitions() {
#
# $1 - raw disk image
erase_filesystem() {
echo "2. Erase filesystem..."
log "Erase filesystem..."
sudo wipefs --all --force ${1}?*
sudo dd if=/dev/zero of=${1} bs=1M count=100
}
@ -362,8 +364,7 @@ create_mender_disk() {
local bs=$(( 1024*1024 ))
local count=$(( ${lsize} / ${bs} ))
echo -e "\nWriting $lsize bytes to Mender disk image..."
dd if=/dev/zero of=${lfile} bs=${bs} count=${count}
dd if=/dev/zero of=${lfile} bs=${bs} count=${count}>> "$build_log" 2>&1
}
# Takes following arguments:
@ -398,11 +399,7 @@ format_mender_disk() {
data_start=$(( ${secondary_start} + ${rootfs_size} + 1 ))
data_offset=$(( ${6} - 1 ))
echo $3 ${pboot_offset} $primary_start $secondary_start $data_start $data_offset
echo -e "\nFormatting Mender disk image..."
sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | sudo fdisk ${lfile}
sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | sudo fdisk ${lfile} &> /dev/null
o # clear the in memory partition table
x
h
@ -438,6 +435,7 @@ format_mender_disk() {
w # write the partition table
q # and we're done
EOF
log "\tChanges in partition table applied."
}
# Takes following arguments:
@ -457,7 +455,7 @@ verify_mender_disk() {
local no_of_parts=${#partitions[@]}
[[ $no_of_parts -eq 4 ]] || \
{ echo "Error: incorrect number of partitions: $no_of_parts. Aborting."; return 1; }
{ log "Error: incorrect number of partitions: $no_of_parts. Aborting."; return 1; }
eval $rvar_no_of_parts=="'$no_of_parts='"
@ -474,16 +472,13 @@ create_device_maps() {
if [[ -n "$1" ]]; then
mapfile -t mappings < <( sudo kpartx -v -a $1 | grep 'loop' | cut -d' ' -f3 )
[[ ${#mappings[@]} -eq 0 ]] \
&& { echo "Error: partition mappings failed. Aborting."; exit 1; } \
|| { echo "Mapped ${#mappings[@]} partition(s)."; }
&& { log "Error: partition mappings failed. Aborting."; exit 1; }
else
echo "Error: no device passed. Aborting."
log "Error: no device passed. Aborting."
exit 1
fi
sudo partprobe /dev/${mappings[0]%p*}
echo "Mapper device: ${mappings[0]%p*}"
}
# Takes following arguments:
@ -492,7 +487,7 @@ create_device_maps() {
detach_device_maps() {
local mappings=($@)
[ ${#mappings[@]} -eq 0 ] && { echo "Nothing to detach."; return; }
[ ${#mappings[@]} -eq 0 ] && { log "\tPartition mappings cleaned."; return; }
local mapper=${mappings[0]%p*}
@ -515,19 +510,20 @@ detach_device_maps() {
# $1 - partition mappings holder
make_mender_disk_filesystem() {
local mappings=($@)
echo -e "\nCreating filesystem for ${#mappings[@]} partitions..."
for mapping in ${mappings[@]}
do
map_dev=/dev/mapper/"$mapping"
part_no=$(get_part_number_from_device $map_dev)
echo -e "\nFormatting partition: ${part_no}..."
label=${mender_disk_partitions[${part_no} - 1]}
if [[ part_no -eq 1 ]]; then
sudo mkfs.vfat -n ${mender_disk_partitions[${part_no} - 1]} $map_dev
log "\tCreating MS-DOS filesystem for '$label' partition."
sudo mkfs.vfat -n ${label} $map_dev >> "$build_log" 2>&1
else
sudo mkfs.ext4 -L ${mender_disk_partitions[${part_no} - 1]} $map_dev
log "\tCreating ext4 filesystem for '$label' partition."
sudo mkfs.ext4 -L ${label} $map_dev >> "$build_log" 2>&1
fi
done
}
@ -573,12 +569,11 @@ mount_mender_disk() {
#
# $1 - device type
set_fstab() {
echo -e "\nSetting fstab..."
local mountpoint=
local device_type=$1
local sysconfdir="$sdimg_primary_dir/etc"
[ ! -d "${sysconfdir}" ] && { echo "Error: cannot find rootfs config dir."; exit 1; }
[ ! -d "${sysconfdir}" ] && { log "Error: cannot find rootfs config dir."; exit 1; }
# Erase/create the fstab file.
sudo install -b -m 644 /dev/null ${sysconfdir}/fstab
@ -609,6 +604,8 @@ set_fstab() {
/dev/mmcblk0p1 $mountpoint auto defaults,sync 0 0
/dev/mmcblk0p4 /data auto defaults 0 0
EOF"
log "\tDone."
}
# Takes following arguments
@ -618,11 +615,11 @@ set_fstab() {
# $3 - size (in 512 blocks)
extract_file_from_image() {
local cmd="dd if=$1 of=${output_dir}/$4 skip=$2 bs=512 count=$3 status=progress"
local cmd="dd if=$1 of=${output_dir}/$4 skip=$2 bs=512 count=$3"
echo "Running command:"
echo " ${cmd}"
$(${cmd})
[ "${4##*.}" == "ext4" ] && { log "\tStoring data in $4 root file system image."; } \
|| { log "\tStoring data in $4 disk image."; }
$(${cmd}>> "$build_log" 2>&1)
}
# Takes following arguments
@ -666,7 +663,7 @@ update_test_config_file() {
local device_type=$1
[ ! -f "${files_dir}/${device_type}_variables.cfg" ] && \
{ echo "Error: test configuration file '${device_type}_variables.cfg' not found. Aborting."; return 1; }
{ log "Error: test configuration file '${device_type}_variables.cfg' not found. Aborting."; return 1; }
shift

11
rpi3-convert-stage-2.sh

@ -2,23 +2,24 @@
output_dir=$1
boot_mapping=$2
build_log=$output_dir/build.log
[ ! -f $output_dir/boot.vfat ] && \
{ echo "Error: extracted boot partition not found. Aborting."; exit 1; }
{ log "Error: extracted boot partition not found. Aborting."; exit 1; }
# Make a copy of Linux kernel arguments and modify.
mcopy -o -i ${output_dir}/boot.vfat -s ::cmdline.txt ${output_dir}/cmdline.txt
mcopy -on -i ${output_dir}/boot.vfat -s ::cmdline.txt ${output_dir}/cmdline.txt
sed -i 's/\b[ ]root=[^ ]*/ root=\/dev\/mmcblk0p2/' ${output_dir}/cmdline.txt
sed -i 's/\b[ ]console=tty1//' ${output_dir}/cmdline.txt
# Update Linux kernel command arguments with our custom configuration
mcopy -o -i ${output_dir}/boot.vfat -s ${output_dir}/cmdline.txt ::cmdline.txt
mcopy -i ${output_dir}/boot.vfat -s ::config.txt ${output_dir}/config.txt
mcopy -on -i ${output_dir}/boot.vfat -s ::config.txt ${output_dir}/config.txt
echo -e '\nenable_uart=1\n' >> ${output_dir}/config.txt
mcopy -o -i ${output_dir}/boot.vfat -s ${output_dir}/config.txt ::config.txt
sudo dd if=${output_dir}/boot.vfat of=/dev/mapper/${boot_mapping} bs=1M
sudo dd if=${output_dir}/boot.vfat of=/dev/mapper/${boot_mapping} bs=1M >> "$build_log" 2>&1
echo -e "\nStage done."
log "\tDone."
exit 0

7
rpi3-convert-stage-3.sh

@ -2,15 +2,16 @@
output_dir=$1
rootfs_mapping=$2
build_log=$output_dir/build.log
[ ! -f ${output_dir}/rootfs.img ] && \
{ echo "Error: extracted rootfs partition not found. Aborting."; exit 1; }
{ log "Error: extracted rootfs partition not found. Aborting."; exit 1; }
sudo dd if=${output_dir}/rootfs.img of=/dev/mapper/${rootfs_mapping} bs=8M
sudo dd if=${output_dir}/rootfs.img of=/dev/mapper/${rootfs_mapping} bs=8M >> "$build_log" 2>&1
# dd sets the original label, make sure label follows Mender naming convention.
sudo e2label /dev/mapper/${rootfs_mapping} "primary"
echo -e "\nStage done."
log "\tDone."
exit 0

45
rpi3-convert-stage-5.sh

@ -23,7 +23,6 @@ bin_dir_pi=${bin_base_dir}/raspberrypi
sdimg_base_dir=$output_dir/sdimg
GCC_VERSION="6.3.1"
echo "Running: $(basename $0)"
declare -a mender_disk_mappings
declare -a mender_disk_partitions=("boot" "primary" "secondary" "data")
@ -46,19 +45,20 @@ build_uboot_files() {
mkdir -p $bin_dir_pi
echo -e "Building U-Boot related files..."
log "\tBuilding U-Boot related files."
if [ ! -d $uboot_repo_vc_dir ]; then
git clone https://github.com/mendersoftware/uboot-mender.git -b $branch
git clone https://github.com/mendersoftware/uboot-mender.git -b $branch >> "$build_log" 2>&1
fi
cd $uboot_dir
git checkout $commit
git checkout $commit >> "$build_log" 2>&1
make --quiet distclean
make --quiet rpi_3_32b_defconfig && make --quiet
make envtools
make --quiet distclean >> "$build_log"
make --quiet rpi_3_32b_defconfig >> "$build_log" 2>&1
make --quiet >> "$build_log" 2>&1
make --quiet envtools >> "$build_log" 2>&1
cat<<-'EOF' >boot.cmd
fdt addr ${fdt_addr} && fdt get value bootargs /chosen bootargs
@ -70,11 +70,11 @@ build_uboot_files() {
EOF
if [ ! -e $uboot_dir/tools/mkimage ]; then
echo "Error: cannot build U-Boot. Aborting"
log "Error: cannot build U-Boot. Aborting"
return 1
fi
$uboot_dir/tools/mkimage -A arm -T script -C none -n "Boot script" -d "boot.cmd" boot.scr
$uboot_dir/tools/mkimage -A arm -T script -C none -n "Boot script" -d "boot.cmd" boot.scr >> "$build_log" 2>&1
cp -t $bin_dir_pi $uboot_dir/boot.scr $uboot_dir/tools/env/fw_printenv $uboot_dir/u-boot.bin
return 0
@ -88,6 +88,8 @@ install_files() {
local boot_dir=$1
local rootfs_dir=$2
log "\tInstalling U-Boot related files."
# Make a copy of Linux kernel arguments and modify.
sudo cp ${boot_dir}/cmdline.txt ${output_dir}/cmdline.txt
@ -98,9 +100,9 @@ install_files() {
#
# But we want it to run on our image as well to resize our data part so in
# case it is missing, add it back to cmdline.txt
if ! grep "init=/usr/lib/raspi-config/init_resize.sh" ${output_dir}/cmdline.txt; then
if ! grep -q "init=/usr/lib/raspi-config/init_resize.sh" ${output_dir}/cmdline.txt; then
cmdline=$(cat ${output_dir}/cmdline.txt)
echo "${cmdline} init=/usr/lib/raspi-config/init_resize.sh" > ${output_dir}/cmdline.txt
sh -c -e "echo '${cmdline} init=/usr/lib/raspi-config/init_resize.sh' >> ${output_dir}/cmdline.txt";
fi
# Update Linux kernel command arguments with our custom configuration
@ -146,32 +148,30 @@ install_files() {
}
do_install_bootloader() {
echo "Setting bootloader..."
if [ -z "${mender_disk_image}" ]; then
echo "Mender raw disk image file not set. Aborting."
log "Mender raw disk image file not set. Aborting."
exit 1
fi
if [ -z "${bootloader_toolchain}" ]; then
echo "ARM GCC toolchain not set. Aborting."
log "ARM GCC toolchain not set. Aborting."
exit 1
fi
if [[ $(which ${bootloader_toolchain}-gcc) = 1 ]]; then
echo "Error: ARM GCC not found in PATH. Aborting."
if ! [ -x "$(command -v ${bootloader_toolchain}-gcc)" ]; then
log "Error: ARM GCC not found in PATH. Aborting."
exit 1
fi
local gcc_version=$(${bootloader_toolchain}-gcc -dumpversion)
if [ $(version $gcc_version) -ne $(version $GCC_VERSION) ]; then
echo "Error: Invalid ARM GCC version ($gcc_version). Expected $GCC_VERSION. Aborting."
log "Error: Invalid ARM GCC version ($gcc_version). Expected $GCC_VERSION. Aborting."
exit 1
fi
[ ! -f $mender_disk_image ] && \
{ echo "$mender_disk_image - file not found. Aborting."; exit 1; }
{ log "$mender_disk_image - file not found. Aborting."; exit 1; }
# Map & mount Mender compliant image.
create_device_maps $mender_disk_image mender_disk_mappings
@ -189,11 +189,12 @@ do_install_bootloader() {
fi
detach_device_maps ${mender_disk_mappings[@]}
rm -rf $sdimg_base_dir
[[ $keep -eq 0 ]] && { rm -f ${output_dir}/config.txt ${output_dir}/cmdline.txt;
rm -rf $uboot_dir $bin_base_dir $sdimg_base_dir; }
rm -rf $uboot_dir $bin_base_dir; }
[[ "$rc" -ne 0 ]] && { echo -e "\nStage failure."; exit 1; } || { echo -e "\nStage done."; }
[[ "$rc" -ne 0 ]] && { exit 1; } || { log "\tDone."; }
}
# Conditional once we support other boards
@ -226,7 +227,7 @@ while (( "$#" )); do
break
;;
-*)
echo "Error: unsupported option $1" >&2
log "Error: unsupported option $1"
exit 1
;;
*)

Loading…
Cancel
Save