modules/outputs/ubivolume: introduce ubinization
It creates an UBI image based on an UBI volume configuration. For now, it creates only an empty rootfs.
This commit is contained in:
parent
3dc58de0eb
commit
e9ab8d7183
2 changed files with 93 additions and 0 deletions
|
@ -31,6 +31,8 @@
|
||||||
./ssh
|
./ssh
|
||||||
./outputs/tftpboot.nix
|
./outputs/tftpboot.nix
|
||||||
./outputs/ubifs.nix
|
./outputs/ubifs.nix
|
||||||
|
./ubifs.nix
|
||||||
|
./ubinize.nix
|
||||||
./users.nix
|
./users.nix
|
||||||
./vlan
|
./vlan
|
||||||
./watchdog
|
./watchdog
|
||||||
|
|
91
modules/outputs/ubivolume.nix
Normal file
91
modules/outputs/ubivolume.nix
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
{
|
||||||
|
config
|
||||||
|
, pkgs
|
||||||
|
, lib
|
||||||
|
, ...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (pkgs) liminix;
|
||||||
|
inherit (lib) mkIf mkOption types concatStringsSep optionalString;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./initramfs.nix
|
||||||
|
./ubifs.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
options.hardware.ubi = {
|
||||||
|
minIOSize = mkOption { type = types.str; };
|
||||||
|
eraseBlockSize = mkOption { type = types.str; }; # LEB
|
||||||
|
maxLEBcount = mkOption { type = types.str; }; # LEB
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (config.rootfsType == "ubifs") {
|
||||||
|
kernel.config = {
|
||||||
|
MTD_UBI="y";
|
||||||
|
|
||||||
|
UBIFS_FS = "y";
|
||||||
|
UBIFS_FS_SECURITY = "n";
|
||||||
|
};
|
||||||
|
boot.initramfs.enable = true;
|
||||||
|
|
||||||
|
system.outputs.rootfs =
|
||||||
|
let
|
||||||
|
inherit (pkgs.pkgsBuildBuild) runCommand;
|
||||||
|
ubiVolume = ({ name, volumeId, image, flags ? [] }:
|
||||||
|
''
|
||||||
|
[${name}]
|
||||||
|
mode=ubi
|
||||||
|
vol_id=${toString volumeId}
|
||||||
|
vol_type=dynamic
|
||||||
|
vol_name=${name}
|
||||||
|
vol_alignment=1
|
||||||
|
${optionalString (image != null) ''
|
||||||
|
image=${image}
|
||||||
|
''}
|
||||||
|
${optionalString (image == null) ''
|
||||||
|
vol_size=1MiB
|
||||||
|
''}
|
||||||
|
${optionalString (flags != []) ''
|
||||||
|
vol_flags=${concatStringsSep "," flags}
|
||||||
|
''}
|
||||||
|
'');
|
||||||
|
|
||||||
|
ubiImage = (volumes:
|
||||||
|
let
|
||||||
|
ubinizeConfig = pkgs.writeText "ubinize.conf" (concatStringsSep "\n" volumes);
|
||||||
|
inherit (pkgs.pkgsBuildBuild) mtdutils;
|
||||||
|
in
|
||||||
|
runCommand "ubinize" {
|
||||||
|
depsBuildBuild = [ mtdutils ];
|
||||||
|
# block size := 128kb
|
||||||
|
# page size := 2048
|
||||||
|
# ubninize opts := -E 5
|
||||||
|
} ''
|
||||||
|
ubinize -Q "$SOURCE_DATE_EPOCH" -o $out \
|
||||||
|
-p ${config.hardware.ubi.physicalEraseBlockSize} -m ${config.hardware.ubi.minIOSize} \
|
||||||
|
-e ${config.hardware.ubi.logicalEraseBlockSize} \
|
||||||
|
${ubinizeConfig}
|
||||||
|
'');
|
||||||
|
|
||||||
|
ubiDisk = ({ initramfs }:
|
||||||
|
let
|
||||||
|
initramfsUbi = ubiVolume {
|
||||||
|
name = "rootfs";
|
||||||
|
volumeId = 0;
|
||||||
|
image = initramfs;
|
||||||
|
flags = [ "autoresize" ];
|
||||||
|
};
|
||||||
|
in
|
||||||
|
ubiImage [
|
||||||
|
initramfsUbi
|
||||||
|
]);
|
||||||
|
|
||||||
|
disk = ubiDisk {
|
||||||
|
initramfs = config.system.outputs.rootubifs; # liminix.builders.squashfs config.filesystem.contents; # # assert this is a proper FIT.
|
||||||
|
};
|
||||||
|
|
||||||
|
in
|
||||||
|
disk;
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in a new issue