root / snf-image-helper / tasks / 10FixPartitionTable.in @ 10bf026d
History | View | Annotate | Download (5.3 kB)
1 | 42f09a19 | Nikos Skalkotos | #! /bin/bash |
---|---|---|---|
2 | 42f09a19 | Nikos Skalkotos | |
3 | 7e5d635b | Nikos Skalkotos | # Copyright (C) 2011 GRNET S.A. |
4 | 7e5d635b | Nikos Skalkotos | # |
5 | 7e5d635b | Nikos Skalkotos | # This program is free software; you can redistribute it and/or modify |
6 | 7e5d635b | Nikos Skalkotos | # it under the terms of the GNU General Public License as published by |
7 | 7e5d635b | Nikos Skalkotos | # the Free Software Foundation; either version 2 of the License, or |
8 | 7e5d635b | Nikos Skalkotos | # (at your option) any later version. |
9 | 7e5d635b | Nikos Skalkotos | # |
10 | 7e5d635b | Nikos Skalkotos | # This program is distributed in the hope that it will be useful, but |
11 | 7e5d635b | Nikos Skalkotos | # WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | 7e5d635b | Nikos Skalkotos | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | 7e5d635b | Nikos Skalkotos | # General Public License for more details. |
14 | 7e5d635b | Nikos Skalkotos | # |
15 | 7e5d635b | Nikos Skalkotos | # You should have received a copy of the GNU General Public License |
16 | 7e5d635b | Nikos Skalkotos | # along with this program; if not, write to the Free Software |
17 | 7e5d635b | Nikos Skalkotos | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
18 | 7e5d635b | Nikos Skalkotos | # 02110-1301, USA. |
19 | 7e5d635b | Nikos Skalkotos | |
20 | 42f09a19 | Nikos Skalkotos | ### BEGIN TASK INFO |
21 | 42f09a19 | Nikos Skalkotos | # Provides: FixPartitionTable |
22 | 42f09a19 | Nikos Skalkotos | # RunBefore: FilesystemResizeUnmounted |
23 | cb93c144 | Nikos Skalkotos | # Short-Description: Enlarge last partition to use all the available space |
24 | 42f09a19 | Nikos Skalkotos | ### END TASK INFO |
25 | 42f09a19 | Nikos Skalkotos | |
26 | 42f09a19 | Nikos Skalkotos | set -e |
27 | 42f09a19 | Nikos Skalkotos | . "@commondir@/common.sh" |
28 | 42f09a19 | Nikos Skalkotos | |
29 | 2a0c492d | Nikos Skalkotos | # Check if the task should be prevented from running. |
30 | 2a0c492d | Nikos Skalkotos | check_if_excluded |
31 | 2a0c492d | Nikos Skalkotos | |
32 | 42f09a19 | Nikos Skalkotos | if [ ! -b "$SNF_IMAGE_DEV" ]; then |
33 | 42f09a19 | Nikos Skalkotos | log_error "Device file:\`${SNF_IMAGE_DEV}' is not a block device" |
34 | 42f09a19 | Nikos Skalkotos | fi |
35 | 42f09a19 | Nikos Skalkotos | |
36 | b126203e | Nikos Skalkotos | table=$(get_partition_table "$SNF_IMAGE_DEV") |
37 | eb8e3364 | Nikos Skalkotos | |
38 | b126203e | Nikos Skalkotos | if [ $(get_partition_count "$table") -eq 0 ]; then |
39 | 42f09a19 | Nikos Skalkotos | log_error "Device: \`${SNF_IMAGE_DEV}' does not contain any partition" |
40 | 42f09a19 | Nikos Skalkotos | fi |
41 | 42f09a19 | Nikos Skalkotos | |
42 | b126203e | Nikos Skalkotos | table_type=$(get_partition_table_type "$table") |
43 | 42f09a19 | Nikos Skalkotos | |
44 | 822ba661 | Nikos Skalkotos | if [ "$table_type" == "gpt" ]; then |
45 | 822ba661 | Nikos Skalkotos | "@scriptsdir@/fix_gpt.py" "$SNF_IMAGE_DEV" $($BLOCKDEV --getsz "$SNF_IMAGE_DEV") |
46 | 822ba661 | Nikos Skalkotos | elif [ "$table_type" != "msdos" ]; then |
47 | b126203e | Nikos Skalkotos | log_error "Device: \'${SNF_IMAGE_DEV}' contains unsupported partition " |
48 | 822ba661 | Nikos Skalkotos | "table type: \`$table_type'. Only msdos & gpt partitions are supported." |
49 | 42f09a19 | Nikos Skalkotos | fi |
50 | 42f09a19 | Nikos Skalkotos | |
51 | b126203e | Nikos Skalkotos | last_part=$(get_last_partition "$table") |
52 | b126203e | Nikos Skalkotos | last_part_id=$(cut -d':' -f1 <<< "$last_part") |
53 | b126203e | Nikos Skalkotos | |
54 | 01da0f7d | Nikos Skalkotos | # Check if swap is defined... |
55 | 01da0f7d | Nikos Skalkotos | if [ -n "$SNF_IMAGE_PROPERTY_SWAP" ]; then |
56 | 01da0f7d | Nikos Skalkotos | if [[ "$SNF_IMAGE_PROPERTY_SWAP" =~ ^([0-9]+):([0-9]+)$ ]]; then |
57 | 01da0f7d | Nikos Skalkotos | swap_num=${BASH_REMATCH[1]} |
58 | 01da0f7d | Nikos Skalkotos | swap_size=${BASH_REMATCH[2]} |
59 | 01da0f7d | Nikos Skalkotos | swap_unit="MB" |
60 | 01da0f7d | Nikos Skalkotos | else |
61 | 01da0f7d | Nikos Skalkotos | log_error "SWAP property \`$SNF_IMAGE_PROPERTY_SWAP' is not valid" |
62 | 01da0f7d | Nikos Skalkotos | fi |
63 | 01da0f7d | Nikos Skalkotos | fi |
64 | 01da0f7d | Nikos Skalkotos | |
65 | 01da0f7d | Nikos Skalkotos | if [ -z "$swap_num" ]; then |
66 | 01da0f7d | Nikos Skalkotos | swap_num=0 |
67 | 01da0f7d | Nikos Skalkotos | fi |
68 | 01da0f7d | Nikos Skalkotos | |
69 | 01da0f7d | Nikos Skalkotos | # Most partition setups leave 2048s in the end. For GPT partitions you need at |
70 | 01da0f7d | Nikos Skalkotos | # least 34s for the secondary GPT header. |
71 | 01da0f7d | Nikos Skalkotos | new_end="-2049" |
72 | 01da0f7d | Nikos Skalkotos | |
73 | 01da0f7d | Nikos Skalkotos | if [ $swap_num -ne 0 ]; then |
74 | 01da0f7d | Nikos Skalkotos | free=$(get_last_free_sector "$SNF_IMAGE_DEV" "$swap_unit") |
75 | 01da0f7d | Nikos Skalkotos | free_size=$(cut -d: -f4 <<< "$free") |
76 | 01da0f7d | Nikos Skalkotos | free_size_val=${free_size/$swap_unit/} |
77 | 01da0f7d | Nikos Skalkotos | if [ $free_size_val -le $swap_size ]; then |
78 | 01da0f7d | Nikos Skalkotos | log_error "Not enough space for swap partition" |
79 | 01da0f7d | Nikos Skalkotos | fi |
80 | 01da0f7d | Nikos Skalkotos | |
81 | 01da0f7d | Nikos Skalkotos | swap_end="$new_end" |
82 | 01da0f7d | Nikos Skalkotos | |
83 | 01da0f7d | Nikos Skalkotos | swap_start=$((new_end - (swap_size * 2048) + 1)) # in sectors |
84 | 01da0f7d | Nikos Skalkotos | new_end=$((swap_start - 1)) |
85 | 01da0f7d | Nikos Skalkotos | fi |
86 | 01da0f7d | Nikos Skalkotos | |
87 | 01da0f7d | Nikos Skalkotos | extended="" |
88 | 01da0f7d | Nikos Skalkotos | |
89 | b126203e | Nikos Skalkotos | if [ "$table_type" != "msdos" ]; then |
90 | b126203e | Nikos Skalkotos | # Primary, extended and logical partitions is a concept for msdos partition |
91 | b126203e | Nikos Skalkotos | # tables. Parted's mkpart will use part-type as partition name if applied |
92 | 822ba661 | Nikos Skalkotos | # on a gpt table and leaving this empty is fragile: For a strange reason |
93 | 822ba661 | Nikos Skalkotos | # for swap partitions the command fails (???) |
94 | 822ba661 | Nikos Skalkotos | last_part_type="primary" |
95 | b126203e | Nikos Skalkotos | elif [ $last_part_id -gt 4 ]; then |
96 | b126203e | Nikos Skalkotos | last_part_type="logical" |
97 | b126203e | Nikos Skalkotos | extended=$(get_extended_partition "$table") |
98 | b126203e | Nikos Skalkotos | last_primary=$(get_last_primary_partition "$table") |
99 | b126203e | Nikos Skalkotos | |
100 | b126203e | Nikos Skalkotos | ext_id=$(cut -d':' -f1 <<< "$extended") |
101 | b126203e | Nikos Skalkotos | last_prim_id=$(cut -d':' -f1 <<< "$last_primary") |
102 | b126203e | Nikos Skalkotos | |
103 | b126203e | Nikos Skalkotos | if [ "$ext_id" != "$last_prim_id" ]; then |
104 | 01da0f7d | Nikos Skalkotos | # Mark last primary as the last partition |
105 | b126203e | Nikos Skalkotos | last_part="$extended" |
106 | b126203e | Nikos Skalkotos | last_part_id="$ext_id" |
107 | b126203e | Nikos Skalkotos | last_part_type="primary" |
108 | b126203e | Nikos Skalkotos | else |
109 | 01da0f7d | Nikos Skalkotos | # Enlarge the extended partition |
110 | 01da0f7d | Nikos Skalkotos | if [ $swap_num -ge 5 ]; then |
111 | 10bf026d | Nikos Skalkotos | # This is needed because logical partitions need to have at least |
112 | 10bf026d | Nikos Skalkotos | # 1 sector gap between them. We make the gap 2048 sectors to |
113 | 10bf026d | Nikos Skalkotos | # properly align them. |
114 | 10bf026d | Nikos Skalkotos | new_end=$((new_end - 2048)) |
115 | 01da0f7d | Nikos Skalkotos | enlarge_partition "$SNF_IMAGE_DEV" "$extended" "extended" "${swap_end}s" |
116 | 01da0f7d | Nikos Skalkotos | else |
117 | 01da0f7d | Nikos Skalkotos | enlarge_partition "$SNF_IMAGE_DEV" "$extended" "extended" "${new_end}s" |
118 | 01da0f7d | Nikos Skalkotos | fi |
119 | b126203e | Nikos Skalkotos | fi |
120 | b126203e | Nikos Skalkotos | elif [ $(is_extended_partition "$SNF_IMAGE_DEV" "$last_part_id") = "yes" ]; then |
121 | b126203e | Nikos Skalkotos | last_part_type="extended" |
122 | 01da0f7d | Nikos Skalkotos | extended="$last_part" |
123 | 01da0f7d | Nikos Skalkotos | if [ $swap_num -ge 5]; then |
124 | 01da0f7d | Nikos Skalkotos | new_end=$swap_end |
125 | 01da0f7d | Nikos Skalkotos | fi |
126 | b126203e | Nikos Skalkotos | else |
127 | b126203e | Nikos Skalkotos | last_part_type="primary" |
128 | 01da0f7d | Nikos Skalkotos | if [ $swap_num -ge 5 ]; then |
129 | 01da0f7d | Nikos Skalkotos | # This is needed because the swap partition should be added inside a |
130 | 01da0f7d | Nikos Skalkotos | # new extended partition. In order to align the swap partition, we |
131 | 01da0f7d | Nikos Skalkotos | # need to create some extra space between the (aligned) primary and |
132 | 01da0f7d | Nikos Skalkotos | # the swap. |
133 | 01da0f7d | Nikos Skalkotos | new_end=$((new_end - 2048)) |
134 | 01da0f7d | Nikos Skalkotos | fi |
135 | 42f09a19 | Nikos Skalkotos | fi |
136 | 42f09a19 | Nikos Skalkotos | |
137 | 01da0f7d | Nikos Skalkotos | enlarge_partition "$SNF_IMAGE_DEV" "$last_part" "$last_part_type" "${new_end}s" |
138 | 01da0f7d | Nikos Skalkotos | |
139 | 01da0f7d | Nikos Skalkotos | if [ $swap_num -gt 0 ]; then |
140 | 01da0f7d | Nikos Skalkotos | swap_part="$swap_num:${swap_start}s:${swap_end}s:0:linux-swap(v1)::;" |
141 | 01da0f7d | Nikos Skalkotos | if [ "$table_type" != "msdos" ]; then |
142 | 822ba661 | Nikos Skalkotos | swap_ptype="swap" # in gpt this is used as a partition name |
143 | 01da0f7d | Nikos Skalkotos | elif [ $swap_num -ge 5 ]; then |
144 | 01da0f7d | Nikos Skalkotos | if [ -z "$extended" ]; then |
145 | 01da0f7d | Nikos Skalkotos | extended="0:$((swap_start - 2))s:${swap_end}s:0:::;" |
146 | 01da0f7d | Nikos Skalkotos | create_partition "$SNF_IMAGE_DEV" "$extended" "extended" |
147 | 01da0f7d | Nikos Skalkotos | fi |
148 | 01da0f7d | Nikos Skalkotos | swap_ptype="logical" |
149 | 01da0f7d | Nikos Skalkotos | else |
150 | 01da0f7d | Nikos Skalkotos | swap_ptype="primary" |
151 | 01da0f7d | Nikos Skalkotos | fi |
152 | 01da0f7d | Nikos Skalkotos | create_partition "$SNF_IMAGE_DEV" "$swap_part" "$swap_ptype" |
153 | 01da0f7d | Nikos Skalkotos | fi |
154 | 42f09a19 | Nikos Skalkotos | |
155 | 38552c68 | Nikos Skalkotos | # Inform the kernel about the changes |
156 | 42f09a19 | Nikos Skalkotos | partprobe "$SNF_IMAGE_DEV" |
157 | 42f09a19 | Nikos Skalkotos | |
158 | 42f09a19 | Nikos Skalkotos | exit 0 |
159 | 42f09a19 | Nikos Skalkotos | |
160 | 42f09a19 | Nikos Skalkotos | # vim: set sta sts=4 shiftwidth=4 sw=4 et ai : |