blob: 197719d4a5f75458d13b7ba11d80ee212aae0279 [file] [log] [blame] [edit]
# Copyright 2024 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
description "LVM migration to reclaim space for thinpool"
author "chromium-os-dev@chromium.org"
start on stopped startup
stop on stopping system-services
task
# The job can be later restarted.
oom score -100
env VPD_MIGRATION_STATUS=/sys/firmware/vpd/rw/thinpool_migration_status
script
get_volume_group() {
local physical_volume="$1"
pvs --reportformat json --readonly -o vg_name "${physical_volume}" \
| jq .report[0].pv[0].vg_name
}
if ! [ -f "${VPD_MIGRATION_STATUS}" ]; then
stop
exit 0
fi
# Example root dev types we need to handle: /dev/sda2 -> /dev/sda,
# /dev/mmcblk0p0 -> /dev/mmcblk0p, /dev/ubi2_1 -> /dev/ubi
STATE_DEV="$(rootdev -s | sed 's/[0-9_]*$//')1"
VG_NAME="$(get_volume_group "${STATE_DEV}")"
if ! [ -n "${VG_NAME}" ]; then
stop
exit 0
fi
# Disable passdowns for the duration of this script: this speeds up the
# reclaim process by ~30%.
lvchange --discards nopassdown "${VG_NAME}/thinpool"
# Add ionice to ensure that we don't overwhelm the system with discards.
ionice -c 3 -- fstrim /mnt/stateful_partition
lvchange --discards passdown "${VG_NAME}/thinpool"
# Cleanup ensures that we will only trim the stateful logical volume
# once post migration.
thinpool_migrator --cleanup
logger -t "${UPSTART_JOB}" "LVM migration finalized"
end script