-
Notifications
You must be signed in to change notification settings - Fork 48
/
Copy pathS00datapart
executable file
·99 lines (83 loc) · 3.19 KB
/
S00datapart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/bin/bash
DATA_OFFS="1024" # up to 1024MB reserved for boot + root
test -n "${OS_VERSION}" || source /etc/init.d/base
case "$1" in
start)
msg_begin "Detecting disk device"
root_dev=$(cat /proc/cmdline | grep -oE 'root=[/a-z0-9]+' | cut -d '=' -f 2)
if [[ "${root_dev}" =~ ^([/a-z0-9]+)(p[0-9])$ ]]; then # e.g. /dev/mmcblk0p2
disk_dev=${BASH_REMATCH[1]}
disk_dev_prefix=${disk_dev}p
root_part_no=$(echo ${root_dev} | grep -oE '[0-9]$')
boot_dev=${disk_dev}p$(( root_part_no - 1 ))
data_dev=${disk_dev}p$(( root_part_no + 1 ))
elif [[ "${root_dev}" =~ ^([/a-z0-9]+)([0-9])$ ]]; then # e.g. /dev/sdc2
disk_dev=${BASH_REMATCH[1]}
disk_dev_prefix=${disk_dev}
root_part_no=$(echo ${root_dev} | grep -oE '[0-9]$')
boot_dev=${disk_dev}$(( root_part_no - 1 ))
data_dev=${disk_dev}$(( root_part_no + 1 ))
else
msg_fail "unknown (${root_dev})"
exit 1
fi
part_table_type=$(fdisk -l ${disk_dev} | grep Disklabel | tr -d ' ' | cut -d : -f 2)
for ext in disk extra overlay; do
sed "s,"'${disk_dev_prefix}'",${disk_dev_prefix},g" /etc/fstab.${ext} > /tmp/fstab.${ext}
sed -i "s,"'${boot_dev}'",${boot_dev},g" /tmp/fstab.${ext}
sed -i "s,"'${root_dev}'",${root_dev},g" /tmp/fstab.${ext}
sed -i "s,"'${data_dev}'",${data_dev},g" /tmp/fstab.${ext}
done
# Output disk info to /tmp/disk_info
{
echo "DISK_DEV=${disk_dev}"
echo "DISK_DEV_PREFIX=${disk_dev_prefix}"
echo "BOOT_DEV=${boot_dev}"
echo "ROOT_DEV=${root_dev}"
echo "DATA_DEV=${data_dev}"
echo "PART_TABLE_TYPE=${part_table_type}"
} > /tmp/disk_info
msg_done "${disk_dev}"
if [[ -b ${data_dev} ]]; then
msg_begin "Checking data filesystem"
if grep -q 'fsck.mode=force' /proc/cmdline; then
/sbin/e2fsck -fy ${data_dev} &> /tmp/fsck.log
elif ! grep -q 'fsck.mode=skip' /proc/cmdline; then
/sbin/e2fsck -y ${data_dev} &> /tmp/fsck.log
fi
if [[ $? == 0 ]]; then
msg_done
else
msg_fail
cat /tmp/fsck.log
fi
exit 0
fi
msg_begin "Creating data partition"
data_start=$((DATA_OFFS * 2048))
echo -e "n
p
$(( root_part_no + 1 ))
${data_start}
\n
w" | /sbin/fdisk ${disk_dev} &>/dev/null
partx -a ${disk_dev} &>/dev/null
test -b ${data_dev} && msg_done || msg_fail
msg_begin "Formatting data partition"
mkfs.ext4 -q ${data_dev}
test $? == 0 && msg_done || msg_fail
msg_begin "Mounting data partition"
mount -T /tmp/fstab.disk /data && msg_done || msg_fail
msg_begin "Copying data skeleton"
cp -pur /usr/share/dataskel/* /data
sync
msg_done
touch /data/.install_factory_defaults
;;
stop)
true
;;
*)
echo "Usage: $0 {start}"
exit 1
esac