mirror of
https://gitlab.postmarketos.org/postmarketOS/pmbootstrap.git
synced 2025-07-14 03:49:48 +03:00
Calculate the end of the reserved space properly. Instead of: from size_boot to size_reserve it is: from size_boot to (size_reserve + size_boot) The reserved space is used by the on-device installer. Without this patch, the reserved space could easily end up being too small, resulting in no space left errors during the installation.
90 lines
3.2 KiB
Python
90 lines
3.2 KiB
Python
# Copyright 2021 Oliver Smith
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
import logging
|
|
import os
|
|
import time
|
|
import pmb.chroot
|
|
import pmb.config
|
|
import pmb.install.losetup
|
|
|
|
|
|
def partitions_mount(args, root_id, sdcard):
|
|
"""
|
|
Mount blockdevices of partitions inside native chroot
|
|
:param root_id: root partition id
|
|
:param sdcard: path to sdcard device (e.g. /dev/mmcblk0) or None
|
|
"""
|
|
prefix = sdcard
|
|
if not sdcard:
|
|
img_path = "/home/pmos/rootfs/" + args.device + ".img"
|
|
prefix = pmb.install.losetup.device_by_back_file(args, img_path)
|
|
|
|
partition_prefix = None
|
|
tries = 20
|
|
for i in range(tries):
|
|
for symbol in ["p", ""]:
|
|
if os.path.exists(prefix + symbol + "1"):
|
|
partition_prefix = symbol
|
|
if partition_prefix is not None:
|
|
break
|
|
logging.debug(f"NOTE: ({i + 1}/{tries}) failed to find the install "
|
|
"partition. Retrying...")
|
|
time.sleep(0.1)
|
|
|
|
if partition_prefix is None:
|
|
raise RuntimeError("Unable to find the partition prefix,"
|
|
" expected the first partition of " +
|
|
prefix + " to be located at " + prefix +
|
|
"1 or " + prefix + "p1!")
|
|
|
|
for i in [1, root_id]:
|
|
source = prefix + partition_prefix + str(i)
|
|
target = args.work + "/chroot_native/dev/installp" + str(i)
|
|
pmb.helpers.mount.bind_file(args, source, target)
|
|
|
|
|
|
def partition(args, size_boot, size_reserve):
|
|
"""
|
|
Partition /dev/install and create /dev/install{p1,p2,p3}:
|
|
* /dev/installp1: boot
|
|
* /dev/installp2: root (or reserved space)
|
|
* /dev/installp3: (root, if reserved space > 0)
|
|
|
|
When adjusting this function, make sure to also adjust
|
|
ondev-prepare-internal-storage.sh in postmarketos-ondev.git!
|
|
|
|
:param size_boot: size of the boot partition in MiB
|
|
:param size_reserve: empty partition between root and boot in MiB (pma#463)
|
|
"""
|
|
# Convert to MB and print info
|
|
mb_boot = f"{round(size_boot)}M"
|
|
mb_reserved = f"{round(size_reserve)}M"
|
|
mb_root_start = f"{round(size_boot) + round(size_reserve)}M"
|
|
logging.info(f"(native) partition /dev/install (boot: {mb_boot},"
|
|
f" reserved: {mb_reserved}, root: the rest)")
|
|
|
|
filesystem = args.deviceinfo["boot_filesystem"] or "ext2"
|
|
|
|
# Actual partitioning with 'parted'. Using check=False, because parted
|
|
# sometimes "fails to inform the kernel". In case it really failed with
|
|
# partitioning, the follow-up mounting/formatting will not work, so it
|
|
# will stop there (see #463).
|
|
boot_part_start = args.deviceinfo["boot_part_start"] or "2048"
|
|
|
|
commands = [
|
|
["mktable", "msdos"],
|
|
["mkpart", "primary", filesystem, boot_part_start + 's', mb_boot],
|
|
]
|
|
|
|
if size_reserve:
|
|
mb_reserved_end = f"{round(size_reserve + size_boot)}M"
|
|
commands += [["mkpart", "primary", mb_boot, mb_reserved_end]]
|
|
|
|
commands += [
|
|
["mkpart", "primary", mb_root_start, "100%"],
|
|
["set", "1", "boot", "on"]
|
|
]
|
|
|
|
for command in commands:
|
|
pmb.chroot.root(args, ["parted", "-s", "/dev/install"] +
|
|
command, check=False)
|