From 6dc6d1c39b4a97c4b03b3ab543fec0f2f5802d3e Mon Sep 17 00:00:00 2001
From: "joachim.schmidt" <joachim.schmidt@hesge.ch>
Date: Mon, 15 Mar 2021 11:05:38 +0100
Subject: [PATCH] Added a virtfs.sh tool to create file systems for the SD
 card.

---
 tools/virtfs.sh  | 112 +++++++++++++++++++++++++++++++++++++++++++++++
 tools/virtfs.sh~ | 108 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 220 insertions(+)
 create mode 100755 tools/virtfs.sh
 create mode 100755 tools/virtfs.sh~

diff --git a/tools/virtfs.sh b/tools/virtfs.sh
new file mode 100755
index 0000000..5c15bb3
--- /dev/null
+++ b/tools/virtfs.sh
@@ -0,0 +1,112 @@
+#!/usr/bin/env bash
+
+# Input params.
+root_dir_1=datafs
+root_dir_2=rootfs
+partition_file_1=datafs.ext4
+partition_file_2=rootfs.ext4
+partition_size_1_megs=500
+partition_size_2_megs=28000
+img_file=virtualfs-ext4.img
+block_size=512
+
+# Calculated params.
+mega="$(echo '2^20' | bc)"
+partition_size_1=$(($partition_size_1_megs * $mega))
+partition_size_2=$(($partition_size_2_megs * $mega))
+
+# Create a test directory to convert to ext2.
+mkdir -p "${root_dir_1}"
+cp image.ub datafs/
+mkdir -p "${root_dir_2}"
+cd ${root_dir_2}
+cat ../rootfs.cpio | cpio -idvm --no-absolute-filenames
+cd ..
+sudo chown -R root:root ${root_dir_2}
+
+# Create the 2 raw ext2 images.
+rm -f "${partition_file_1}"
+mke2fs \
+  -t ext4 \
+  -d "${root_dir_1}" \
+  -r 1 \
+  -N 0 \
+  -m 5 \
+  -L '' \
+  -O ^64bit \
+  "${partition_file_1}" \
+  "${partition_size_1_megs}M" \
+;
+rm -f "${partition_file_2}"
+mke2fs \
+  -t ext4 \
+  -d "${root_dir_2}" \
+  -r 1 \
+  -N 0 \
+  -m 5 \
+  -L '' \
+  -O ^64bit \
+  "${partition_file_2}" \
+  "${partition_size_2_megs}M" \
+;
+
+# Default offset according to
+part_table_offset=$((2**20))
+cur_offset=0
+bs=1024
+dd if=/dev/zero of="${img_file}" bs="${bs}" count=$(((${part_table_offset} + ${partition_size_1} + ${partition_size_2})/${bs})) skip="$((${cur_offset}/${bs}))"
+printf "
+type=83, size=$((${partition_size_1}/${block_size}))
+type=83, size=$((${partition_size_2}/${block_size}))
+" | sfdisk "${img_file}"
+cur_offset=$((${cur_offset} + ${part_table_offset}))
+# TODO: can we prevent this and use mke2fs directly on the image at an offset?
+# Tried -E offset= but could not get it to work.
+dd if="${partition_file_1}" of="${img_file}" bs="${bs}" seek="$((${cur_offset}/${bs}))"
+cur_offset=$((${cur_offset} + ${partition_size_1}))
+rm "${partition_file_1}"
+dd if="${partition_file_2}" of="${img_file}" bs="${bs}" seek="$((${cur_offset}/${bs}))"
+cur_offset=$((${cur_offset} + ${partition_size_2}))
+rm "${partition_file_2}"
+
+# Test the ext2 by mounting it with sudo.
+# sudo is only used for testing, the image is completely ready at this point.
+
+# losetup automation functions from:
+# https://stackoverflow.com/questions/1419489/how-to-mount-one-partition-from-an-image-file-that-contains-multiple-partitions/39675265#39675265
+loop-mount-partitions() (
+  set -e
+  img="$1"
+  dev="$(sudo losetup --show -f -P "$img")"
+  echo "${dev}" | sed -E 's/.*[^[:digit:]]([[:digit:]]+$)/\1/g'
+  for part in "${dev}p"*; do
+    if [ "${part}" = "${dev}p*" ]; then
+      # Single partition image.
+      part="${dev}"
+    fi
+    dst="/mnt/$(basename "${part}")"
+    echo "${dst}" 1>&2
+    sudo mkdir -p "${dst}"
+    sudo mount "${part}" "${dst}"
+  done
+)
+loop-unmount-partitions() (
+  set -e
+  for loop_id in "$@"; do
+    dev="/dev/loop${loop_id}"
+    for part in "${dev}p"*; do
+      if [ "${part}" = "${dev}p*" ]; then
+        part="${dev}"
+      fi
+      dst="/mnt/$(basename "${part}")"
+      sudo umount "${dst}"
+    done
+    sudo losetup -d "${dev}"
+  done
+)
+
+loop_id="$(loop-mount-partitions "${img_file}")"
+#sudo cmp /mnt/loop0p1/file-1 "${root_dir_1}/file-1"
+#sudo cmp /mnt/loop0p2/file-2 "${root_dir_2}/file-2"
+loop-unmount-partitions "${loop_id}"
+sudo chown -R ${USER}:${USER} ${root_dir_2}
diff --git a/tools/virtfs.sh~ b/tools/virtfs.sh~
new file mode 100755
index 0000000..d001a73
--- /dev/null
+++ b/tools/virtfs.sh~
@@ -0,0 +1,108 @@
+#!/usr/bin/env bash
+
+# Input params.
+root_dir_1=datafs
+root_dir_2=rootfs
+partition_file_1=datafs.ext4
+partition_file_2=rootfs.ext4
+partition_size_1_megs=500
+partition_size_2_megs=28000
+img_file=virtualfs-ext4.img
+block_size=512
+
+# Calculated params.
+mega="$(echo '2^20' | bc)"
+partition_size_1=$(($partition_size_1_megs * $mega))
+partition_size_2=$(($partition_size_2_megs * $mega))
+
+# Create a test directory to convert to ext2.
+mkdir -p "${root_dir_1}"
+echo content-1 > "${root_dir_1}/file-1"
+mkdir -p "${root_dir_2}"
+echo content-2 > "${root_dir_2}/file-2"
+
+# Create the 2 raw ext2 images.
+rm -f "${partition_file_1}"
+mke2fs \
+  -t ext4 \
+  -d "${root_dir_1}" \
+  -r 1 \
+  -N 0 \
+  -m 5 \
+  -L '' \
+  -O ^64bit \
+  "${partition_file_1}" \
+  "${partition_size_1_megs}M" \
+;
+rm -f "${partition_file_2}"
+mke2fs \
+  -t ext4 \
+  -d "${root_dir_2}" \
+  -r 1 \
+  -N 0 \
+  -m 5 \
+  -L '' \
+  -O ^64bit \
+  "${partition_file_2}" \
+  "${partition_size_2_megs}M" \
+;
+
+# Default offset according to
+part_table_offset=$((2**20))
+cur_offset=0
+bs=1024
+dd if=/dev/zero of="${img_file}" bs="${bs}" count=$(((${part_table_offset} + ${partition_size_1} + ${partition_size_2})/${bs})) skip="$((${cur_offset}/${bs}))"
+printf "
+type=83, size=$((${partition_size_1}/${block_size}))
+type=83, size=$((${partition_size_2}/${block_size}))
+" | sfdisk "${img_file}"
+cur_offset=$((${cur_offset} + ${part_table_offset}))
+# TODO: can we prevent this and use mke2fs directly on the image at an offset?
+# Tried -E offset= but could not get it to work.
+dd if="${partition_file_1}" of="${img_file}" bs="${bs}" seek="$((${cur_offset}/${bs}))"
+cur_offset=$((${cur_offset} + ${partition_size_1}))
+rm "${partition_file_1}"
+dd if="${partition_file_2}" of="${img_file}" bs="${bs}" seek="$((${cur_offset}/${bs}))"
+cur_offset=$((${cur_offset} + ${partition_size_2}))
+rm "${partition_file_2}"
+
+# Test the ext2 by mounting it with sudo.
+# sudo is only used for testing, the image is completely ready at this point.
+
+# losetup automation functions from:
+# https://stackoverflow.com/questions/1419489/how-to-mount-one-partition-from-an-image-file-that-contains-multiple-partitions/39675265#39675265
+loop-mount-partitions() (
+  set -e
+  img="$1"
+  dev="$(sudo losetup --show -f -P "$img")"
+  echo "${dev}" | sed -E 's/.*[^[:digit:]]([[:digit:]]+$)/\1/g'
+  for part in "${dev}p"*; do
+    if [ "${part}" = "${dev}p*" ]; then
+      # Single partition image.
+      part="${dev}"
+    fi
+    dst="/mnt/$(basename "${part}")"
+    echo "${dst}" 1>&2
+    sudo mkdir -p "${dst}"
+    sudo mount "${part}" "${dst}"
+  done
+)
+loop-unmount-partitions() (
+  set -e
+  for loop_id in "$@"; do
+    dev="/dev/loop${loop_id}"
+    for part in "${dev}p"*; do
+      if [ "${part}" = "${dev}p*" ]; then
+        part="${dev}"
+      fi
+      dst="/mnt/$(basename "${part}")"
+      sudo umount "${dst}"
+    done
+    sudo losetup -d "${dev}"
+  done
+)
+
+loop_id="$(loop-mount-partitions "${img_file}")"
+#sudo cmp /mnt/loop0p1/file-1 "${root_dir_1}/file-1"
+#sudo cmp /mnt/loop0p2/file-2 "${root_dir_2}/file-2"
+loop-unmount-partitions "${loop_id}"
-- 
GitLab