Previously, the `disk-deactivate` script stopped mdadm arrays before
wiping the underlying physical disks. This caused filesystems with
backup superblocks (like BTRFS at 64 MiB and 256 GiB offsets) to
survive the wipe, as the backups were striped across the physical
disks and missed by `wipefs` on the raw block devices.
When the array was reassembled during reprovisioning, the filesystem
superblocks realigned. `disko` would detect the old filesystem via
`blkid` and silently skip the `mkfs` step, leaving stale data intact.
This commit adds a `wipefs --all` command against the assembled RAID
device *before* stopping it, ensuring all filesystem signatures and
backup superblocks are cleanly destroyed.
Before this change, if you created a systemd service that ran
“disko --mode disko <path-to-config>”, then you would (probably) get
this error:
disk-deactivate: line 6: /dev/stderr: No such device or address
Since disk-deactivate uses “set -e”, that error would prevent
disk-deactivate from actually deactivating any disks. The problem is
that disk-deactivate tries to print text to stderr by doing this:
echo "Text" >/dev/stderr
systemd.exec(5) explains why that doesn’t work and goes on to say [1]:
> This means when executing shell scripts the construct
> **echo "hello" > /dev/stderr** for writing text to stderr will not
> work. To mitigate this use the construct **echo "hello" >&2** instead,
> which is mostly equivalent and avoids this pitfall.
[1]: <https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html#StandardOutput=>
---
You can test this commit by doing the following:
1. Download a copy of this gist:
<https://gist.github.com/Jayman2000/60b483659e89283716582ac38856dca6>
2. Build a custom NixOS installation ISO that contains a systemd service
that runs disko:
nix-build --arg diskoDir <path-to-disko-repo> <path-to-gist>
Once that command finishes, the ISO will be in ./result/iso/.
3. Create a VM. Make sure that it has a VirtIO disk that’s more than
500M large. Also make sure that it has an optical disc drive.
4. Put the ISO file from step 2 into the VM’s optical disc drive.
5. Turn on the VM and boot into the installation ISO.
6. Start the systemd service:
sudo systemctl start disko-test
7. Check journalctl to see if there are any errors related to
disk-deactivate.
this is useful in cases where the target machine has
a pre-configured RAID setup, as otherwise disko would
wipe the partition tables and create new ones but would
not be able to inform the kernel about it, as the old
raid was still in use.