Statistics
| Branch: | Tag: | Revision:

root / snf-image-helper / tasks / 10FixPartitionTable.in @ 4e364304

History | View | Annotate | Download (6.1 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 2a0ab295 Nikos Skalkotos
trap task_cleanup EXIT
30 a50a2bff Nikos Skalkotos
report_task_start
31 2a0c492d Nikos Skalkotos
# Check if the task should be prevented from running.
32 2a0c492d Nikos Skalkotos
check_if_excluded
33 2a0c492d Nikos Skalkotos
34 42f09a19 Nikos Skalkotos
if [ ! -b "$SNF_IMAGE_DEV" ]; then
35 42f09a19 Nikos Skalkotos
    log_error "Device file:\`${SNF_IMAGE_DEV}' is not a block device"
36 42f09a19 Nikos Skalkotos
fi
37 42f09a19 Nikos Skalkotos
38 de34e7aa Nikos Skalkotos
if [ "$SNF_IMAGE_PROPERTY_OSFAMILY" = openbsd ]; then
39 4e364304 Nikos Skalkotos
    @scriptsdir@/disklabel.py -d "$($BLOCKDEV --getsz "$SNF_IMAGE_DEV")" -p "$SNF_IMAGE_DEV"
40 4e364304 Nikos Skalkotos
    # Tell the kernel to recreate the disk partitions.
41 4e364304 Nikos Skalkotos
    # We cannot use partprobe to do this because partprobe uses BLKPG ioctl
42 4e364304 Nikos Skalkotos
    # to create the partitions device files by itself one by one. Since parted
43 4e364304 Nikos Skalkotos
    # does not support disklabels, the partitions with id larger than 4 will
44 4e364304 Nikos Skalkotos
    # not be created.
45 4e364304 Nikos Skalkotos
    # We need to tell the kernel to read the partition table by itself.
46 4e364304 Nikos Skalkotos
    $BLOCKDEV --rereadpt "$SNF_IMAGE_DEV"
47 de34e7aa Nikos Skalkotos
    exit 0
48 de34e7aa Nikos Skalkotos
fi
49 de34e7aa Nikos Skalkotos
50 de34e7aa Nikos Skalkotos
if [ "$SNF_IMAGE_PROPERTY_OSFAMILY" = netbsd ]; then
51 de34e7aa Nikos Skalkotos
    warn "Partition resizing currently not supported for NetBSD"
52 84d01e3e Nikos Skalkotos
    exit 0
53 84d01e3e Nikos Skalkotos
fi
54 84d01e3e Nikos Skalkotos
55 b126203e Nikos Skalkotos
table=$(get_partition_table "$SNF_IMAGE_DEV")
56 eb8e3364 Nikos Skalkotos
57 b126203e Nikos Skalkotos
if [ $(get_partition_count "$table") -eq 0 ]; then
58 42f09a19 Nikos Skalkotos
    log_error "Device: \`${SNF_IMAGE_DEV}' does not contain any partition"
59 42f09a19 Nikos Skalkotos
fi
60 42f09a19 Nikos Skalkotos
61 b126203e Nikos Skalkotos
table_type=$(get_partition_table_type "$table")
62 42f09a19 Nikos Skalkotos
63 1876c955 Nikos Skalkotos
if [ "$SNF_IMAGE_PROPERTY_OSFAMILY" = "freebsd" -a "$table_type" != "gpt" ]; then
64 1876c955 Nikos Skalkotos
    log_error "The image contains a(n) $table_type partition table. " \
65 1876c955 Nikos Skalkotos
        "For FreeBSD images only GUID Partition Tables are supported."
66 1876c955 Nikos Skalkotos
fi
67 1876c955 Nikos Skalkotos
68 822ba661 Nikos Skalkotos
if [ "$table_type" == "gpt" ]; then
69 b0cb7802 Nikos Skalkotos
    "$SGDISK" --move-second-header "$SNF_IMAGE_DEV"
70 822ba661 Nikos Skalkotos
elif [ "$table_type" != "msdos" ]; then
71 1876c955 Nikos Skalkotos
    log_error "Device: \'${SNF_IMAGE_DEV}' contains unsupported partition " \
72 666b80ee Nikos Skalkotos
              "table type: \`$table_type'. Only msdos & gpt partitions are" \
73 666b80ee Nikos Skalkotos
              "supported."
74 42f09a19 Nikos Skalkotos
fi
75 42f09a19 Nikos Skalkotos
76 b126203e Nikos Skalkotos
last_part=$(get_last_partition "$table")
77 b126203e Nikos Skalkotos
last_part_id=$(cut -d':' -f1 <<< "$last_part")
78 b126203e Nikos Skalkotos
79 01da0f7d Nikos Skalkotos
# Check if swap is defined...
80 01da0f7d Nikos Skalkotos
if [ -n "$SNF_IMAGE_PROPERTY_SWAP" ]; then
81 01da0f7d Nikos Skalkotos
    if [[ "$SNF_IMAGE_PROPERTY_SWAP" =~ ^([0-9]+):([0-9]+)$ ]]; then
82 01da0f7d Nikos Skalkotos
        swap_num=${BASH_REMATCH[1]}
83 01da0f7d Nikos Skalkotos
        swap_size=${BASH_REMATCH[2]}
84 01da0f7d Nikos Skalkotos
        swap_unit="MB"
85 01da0f7d Nikos Skalkotos
    else
86 01da0f7d Nikos Skalkotos
        log_error "SWAP property \`$SNF_IMAGE_PROPERTY_SWAP' is not valid"
87 01da0f7d Nikos Skalkotos
    fi
88 01da0f7d Nikos Skalkotos
fi
89 01da0f7d Nikos Skalkotos
90 01da0f7d Nikos Skalkotos
if [ -z "$swap_num" ]; then
91 01da0f7d Nikos Skalkotos
    swap_num=0
92 01da0f7d Nikos Skalkotos
fi
93 01da0f7d Nikos Skalkotos
94 01da0f7d Nikos Skalkotos
# Most partition setups leave 2048s in the end. For GPT partitions you need at
95 01da0f7d Nikos Skalkotos
# least 34s for the secondary GPT header.
96 01da0f7d Nikos Skalkotos
new_end="-2049"
97 01da0f7d Nikos Skalkotos
98 01da0f7d Nikos Skalkotos
if [ $swap_num -ne 0 ]; then
99 01da0f7d Nikos Skalkotos
    free=$(get_last_free_sector "$SNF_IMAGE_DEV" "$swap_unit")
100 01da0f7d Nikos Skalkotos
    free_size=$(cut -d: -f4 <<< "$free")
101 01da0f7d Nikos Skalkotos
    free_size_val=${free_size/$swap_unit/}
102 01da0f7d Nikos Skalkotos
    if [ $free_size_val -le $swap_size ]; then
103 01da0f7d Nikos Skalkotos
        log_error "Not enough space for swap partition"
104 01da0f7d Nikos Skalkotos
    fi
105 01da0f7d Nikos Skalkotos
106 01da0f7d Nikos Skalkotos
    swap_end="$new_end"
107 01da0f7d Nikos Skalkotos
108 01da0f7d Nikos Skalkotos
    swap_start=$((new_end - (swap_size * 2048) + 1)) # in sectors
109 01da0f7d Nikos Skalkotos
    new_end=$((swap_start - 1))
110 01da0f7d Nikos Skalkotos
fi
111 01da0f7d Nikos Skalkotos
112 01da0f7d Nikos Skalkotos
extended=""
113 01da0f7d Nikos Skalkotos
114 b126203e Nikos Skalkotos
if [ "$table_type" != "msdos" ]; then
115 9ec298c7 Nikos Skalkotos
    # For gpt partitions, get the partition GUID code as partition type
116 9ec298c7 Nikos Skalkotos
    last_part_type="$($SGDISK -i "$last_part_id" "$SNF_IMAGE_DEV" | grep "^Partition GUID code:" | cut -d"(" -f1 | cut -d: -f2 | xargs echo)"
117 b126203e Nikos Skalkotos
elif [ $last_part_id -gt 4 ]; then
118 b126203e Nikos Skalkotos
    last_part_type="logical"
119 b126203e Nikos Skalkotos
    extended=$(get_extended_partition "$table")
120 b126203e Nikos Skalkotos
    last_primary=$(get_last_primary_partition "$table")
121 b126203e Nikos Skalkotos
122 b126203e Nikos Skalkotos
    ext_id=$(cut -d':' -f1 <<< "$extended")
123 b126203e Nikos Skalkotos
    last_prim_id=$(cut -d':' -f1 <<< "$last_primary")
124 b126203e Nikos Skalkotos
125 b126203e Nikos Skalkotos
    if [ "$ext_id" != "$last_prim_id" ]; then
126 01da0f7d Nikos Skalkotos
        # Mark last primary as the last partition
127 b126203e Nikos Skalkotos
        last_part="$extended"
128 b126203e Nikos Skalkotos
        last_part_id="$ext_id"
129 b126203e Nikos Skalkotos
        last_part_type="primary"
130 b126203e Nikos Skalkotos
    else
131 01da0f7d Nikos Skalkotos
        # Enlarge the extended partition
132 01da0f7d Nikos Skalkotos
        if [ $swap_num -ge 5 ]; then
133 10bf026d Nikos Skalkotos
            # This is needed because logical partitions need to have at least
134 10bf026d Nikos Skalkotos
            # 1 sector gap between them. We make the gap 2048 sectors to
135 10bf026d Nikos Skalkotos
            # properly align them.
136 10bf026d Nikos Skalkotos
            new_end=$((new_end - 2048))
137 01da0f7d Nikos Skalkotos
            enlarge_partition "$SNF_IMAGE_DEV" "$extended" "extended" "${swap_end}s"
138 01da0f7d Nikos Skalkotos
        else
139 01da0f7d Nikos Skalkotos
            enlarge_partition "$SNF_IMAGE_DEV" "$extended" "extended" "${new_end}s"
140 01da0f7d Nikos Skalkotos
        fi
141 b126203e Nikos Skalkotos
    fi
142 b126203e Nikos Skalkotos
elif [ $(is_extended_partition "$SNF_IMAGE_DEV" "$last_part_id") = "yes" ]; then
143 b126203e Nikos Skalkotos
    last_part_type="extended"
144 01da0f7d Nikos Skalkotos
    extended="$last_part"
145 01da0f7d Nikos Skalkotos
    if [ $swap_num -ge 5]; then
146 01da0f7d Nikos Skalkotos
        new_end=$swap_end
147 01da0f7d Nikos Skalkotos
    fi
148 b126203e Nikos Skalkotos
else
149 b126203e Nikos Skalkotos
    last_part_type="primary"
150 01da0f7d Nikos Skalkotos
    if [ $swap_num -ge 5 ]; then
151 01da0f7d Nikos Skalkotos
        # This is needed because the swap partition should be added inside a
152 01da0f7d Nikos Skalkotos
        # new extended partition. In order to align the swap partition, we
153 01da0f7d Nikos Skalkotos
        # need to create some extra space between the (aligned) primary and
154 01da0f7d Nikos Skalkotos
        # the swap.
155 01da0f7d Nikos Skalkotos
        new_end=$((new_end - 2048))
156 01da0f7d Nikos Skalkotos
    fi
157 42f09a19 Nikos Skalkotos
fi
158 42f09a19 Nikos Skalkotos
159 01da0f7d Nikos Skalkotos
enlarge_partition "$SNF_IMAGE_DEV" "$last_part" "$last_part_type" "${new_end}s"
160 01da0f7d Nikos Skalkotos
161 01da0f7d Nikos Skalkotos
if [ $swap_num -gt 0 ]; then
162 01da0f7d Nikos Skalkotos
    swap_part="$swap_num:${swap_start}s:${swap_end}s:0:linux-swap(v1)::;"
163 01da0f7d Nikos Skalkotos
    if [ "$table_type" != "msdos" ]; then
164 822ba661 Nikos Skalkotos
        swap_ptype="swap" # in gpt this is used as a partition name
165 01da0f7d Nikos Skalkotos
    elif [ $swap_num -ge 5 ]; then
166 01da0f7d Nikos Skalkotos
        if [ -z "$extended" ]; then
167 01da0f7d Nikos Skalkotos
            extended="0:$((swap_start - 2))s:${swap_end}s:0:::;"
168 01da0f7d Nikos Skalkotos
            create_partition "$SNF_IMAGE_DEV" "$extended" "extended"
169 01da0f7d Nikos Skalkotos
        fi
170 01da0f7d Nikos Skalkotos
        swap_ptype="logical"
171 01da0f7d Nikos Skalkotos
    else
172 01da0f7d Nikos Skalkotos
        swap_ptype="primary"
173 01da0f7d Nikos Skalkotos
    fi
174 01da0f7d Nikos Skalkotos
    create_partition "$SNF_IMAGE_DEV" "$swap_part" "$swap_ptype"
175 01da0f7d Nikos Skalkotos
fi
176 42f09a19 Nikos Skalkotos
177 38552c68 Nikos Skalkotos
# Inform the kernel about the changes
178 42f09a19 Nikos Skalkotos
partprobe "$SNF_IMAGE_DEV"
179 42f09a19 Nikos Skalkotos
180 42f09a19 Nikos Skalkotos
exit 0
181 42f09a19 Nikos Skalkotos
182 42f09a19 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :