PostCreateHook: How To Populate A Newly Created Partition With Some Files?
Introduction
When creating a new partition, it can be challenging to populate it with the necessary files. In this article, we will explore how to use the postCreateHook
to create a file in the newly created partition. We will also discuss the context of using a password to decrypt a ZFS partition and how to achieve a no-password boot while maintaining encrypted ZFS incremental backups.
Context and Goal
The goal is to create a file with a password to decrypt a ZFS partition and store it in the /boot
partition. This password will be used to create the ZFS partition, and the file will be copied to the newly created /boot
partition using the postCreateHook
. This approach may seem insecure, but it is a temporary solution to achieve a no-password boot while maintaining encrypted ZFS incremental backups.
Plan and Requirements
The plan involves the following steps:
- Use
nixos-anywhere
to create a disk with encryption keys from a file (/boot/mysecretfile.txt
). - Use disko's
keylocation
option to use the password from the file when creating the ZFS partition. - Use
postCreateHook
to copy the file (/boot/mysecretfile.txt
) to the newly created/boot
partition.
Understanding postCreateHook
The postCreateHook
is a hook that is executed after the creation of a partition. It allows you to perform actions on the newly created partition, such as creating files or directories. To use postCreateHook
, you need to specify a script that will be executed after the partition is created.
Mounting the Partition
When creating a partition, it is not automatically mounted. However, you can specify a mount point using the mountpoint
option in the configuration file. If you do not specify a mount point, the partition will not be mounted.
Environment Variables
The postCreateHook
script has access to environment variables that provide information about the newly created partition. These variables include:
DISK_ID
: The ID of the newly created disk.PARTITION_ID
: The ID of the newly created partition.MOUNTPOINT
: The mount point of the newly created partition.
Using postCreateHook to Populate the Partition
To use postCreateHook
to populate the newly created partition, you need to create a script that will be executed after the partition is created. The script should create the necessary files or directories in the partition.
Here is an example script that copies the file (/boot/mysecretfile.txt
) to the newly created /boot
partition:
#!/bin/sh
# Get the ID of the newly created partition
PARTITION_ID=$(lsblk -o NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $1}')
# Get the mount point of the newly created partition
MOUNTPOINT=$(lsblk -o NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $3}')
# Copy the file to the newly created partition
cp /boot/mysecretfile.txt $MOUNTPOINT
Conclusion
In this article, we explored how to use the postCreateHook
to populate a newly created partition with some files. We discussed the context of using a password to decrypt a ZFS partition and how to achieve a no-password boot while maintaining encrypted ZFS incremental backups. We also provided an example script that uses postCreateHook
to copy a file to the newly created /boot
partition.
Example Use Case
Here is an example use case that demonstrates how to use postCreateHook
to populate a newly created partition:
{ pkgs, ... }:
{
boot.loader.grub.device = "/dev/sda1";
boot.postCreateHook = pkgs.writeShellScriptBin "populate-boot-partition" ''
# Get the ID of the newly created partition
PARTITION_ID=$(lsblk -o NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $1}')
# Get the mount point of the newly created partition
MOUNTPOINT=$(lsblk -o NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $3}')
# Copy the file to the newly created partition
cp /boot/mysecretfile.txt $MOUNTPOINT
'';
fileSystems."/boot".options = [ "noatime" "nodiratime" ];
fileSystems."/boot".fsType = "ext4";
}
Q: What is postCreateHook?
A: The postCreateHook
is a hook that is executed after the creation of a partition. It allows you to perform actions on the newly created partition, such as creating files or directories.
Q: How do I use postCreateHook?
A: To use postCreateHook
, you need to specify a script that will be executed after the partition is created. The script should create the necessary files or directories in the partition.
Q: What environment variables are available in postCreateHook?
A: The postCreateHook
script has access to environment variables that provide information about the newly created partition. These variables include:
DISK_ID
: The ID of the newly created disk.PARTITION_ID
: The ID of the newly created partition.MOUNTPOINT
: The mount point of the newly created partition.
Q: How do I get the ID of the newly created partition?
A: You can get the ID of the newly created partition using the lsblk
command. For example:
lsblk -o NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $1}'
This command will print the ID of the newly created partition.
Q: How do I get the mount point of the newly created partition?
A: You can get the mount point of the newly created partition using the lsblk
command. For example:
lsblk -o NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $3}'
This command will print the mount point of the newly created partition.
Q: Can I use postCreateHook to create a file in a specific directory?
A: Yes, you can use postCreateHook
to create a file in a specific directory. For example:
#!/bin/sh
# Get the ID of the newly created partition
PARTITION_ID=$(lsblk -o NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $1}')
# Get the mount point of the newly created partition
MOUNTPOINT=$(lsblk -o NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $3}')
# Create a file in the specific directory
mkdir -p $MOUNTPOINT/mydir
touch $MOUNTPOINT/mydir/myfile.txt
This script creates a file (myfile.txt
) in the directory (mydir
) on the newly created partition.
Q: Can I use postCreateHook to create a directory in a specific location?
A: Yes, you can use postCreateHook
to create a directory in a specific location. For example:
#!/bin/sh
# Get the ID of the newly created partition
PARTITION_ID=$(lsblk -o NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $1}')
# Get the mount point of the newly created partition
MOUNTPOINT=$(lsblko NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $3}')
# Create a directory in the specific location
mkdir -p $MOUNTPOINT/mydir/mydir2
This script creates a directory (mydir2
) in the directory (mydir
) on the newly created partition.
Q: Can I use postCreateHook to copy a file from one location to another?
A: Yes, you can use postCreateHook
to copy a file from one location to another. For example:
#!/bin/sh
# Get the ID of the newly created partition
PARTITION_ID=$(lsblk -o NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $1}')
# Get the mount point of the newly created partition
MOUNTPOINT=$(lsblk -o NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $3}')
# Copy a file from one location to another
cp /boot/mysecretfile.txt $MOUNTPOINT/mydir/myfile.txt
This script copies the file (mysecretfile.txt
) from the /boot
directory to the directory (mydir
) on the newly created partition.
Q: Can I use postCreateHook to delete a file or directory?
A: Yes, you can use postCreateHook
to delete a file or directory. For example:
#!/bin/sh
# Get the ID of the newly created partition
PARTITION_ID=$(lsblk -o NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $1}')
# Get the mount point of the newly created partition
MOUNTPOINT=$(lsblk -o NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $3}')
# Delete a file or directory
rm -rf $MOUNTPOINT/mydir/myfile.txt
This script deletes the file (myfile.txt
) in the directory (mydir
) on the newly created partition.
Q: Can I use postCreateHook to create a symbolic link?
A: Yes, you can use postCreateHook
to create a symbolic link. For example:
#!/bin/sh
# Get the ID of the newly created partition
PARTITION_ID=$(lsblk -o NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $1}')
# Get the mount point of the newly created partition
MOUNTPOINT=$(lsblk -o NAME,FSTYPE,MOUNTPOINT -d -n | grep -E "nixos-boot" | awk '{print $3}')
# Create a symbolic link
ln -s $MOUNTPOINT/mydir/myfile.txt $MOUNTPOINT/mydir/mylink.txt
This script creates a symbolic link (mylink.txt
) to the file (myfile.txt
) in the directory (mydir
) on the newly created partition.