UKIFY(1) ukify UKIFY(1) (NAME) ukify - (Unified Kernel Images - UKI) (SYNOPSIS) ukify [OPTIONS...] build ukify [OPTIONS...] genkey ukify [OPTIONS...] inspect FILE... (DESCRIPTION) ukify ( initrd UEFI systemd-stub(7)) UAPI.5 ( : UKI)[1] -- PE . UKI . UKI . qemu[2] UKI << >> . ukify UKI . build . ukify SecureBoot PCR genkey . ukify inspect . (COMMANDS) : build . build Linux=/--linux= Initrd=/--initrd=. Initrd= --initrd= . UKI . Microcode=/--microcode= Cmdline=/--cmdline= OSRelease=/--os-release= DeviceTree=/--devicetree= DeviceTreeAuto=/--devicetree-auto= HWIDs=/--hwids= Splash=/--splash= PCRPKey=/--pcrpkey= Uname=/--uname= SBAT=/--sbat= --section= . ukify PE . PCR PCRPrivateKey=/--pcr-private-key= PCRPublicKey=/--pcr-public-key= PCRCertificate=/--pcr-certificate= PCR initrd UKI . systemd-measure(1) . PCR . Phases=/--phases= . systemd-measure . PCRPrivateKey=/--pcr-private-key= PCRPublicKey=/--pcr-public-key= PCRCertificate=/--pcr-certificate= Phases=/--phases= . . --phases= --pcr-private-key= n- n- . . PCRPrivateKey= PCRPublicKey= Phases= . SigningEngine=/--signing-engine= SigningProvider=/--signing-provider= URI openssl(1) X.509 OpenSSL . SecureBoot SecureBootPrivateKey=/--secureboot-private-key= PE UKI SecureBoot . systemd-boot(7) . / ".sbat" UKI UKI Shim . SBAT Shim[3] . genkey PCR SecureBoot . build . PCRPrivateKey=/--pcr-private-key= PCRPublicKey=/--pcr-public-key= SecureBootPrivateKey=/--secureboot-private-key= . . inspect . --all . --section= . UKI . sha256 . . -j/--json= --section= . UKI : llvm-objdump(1) -p pe-inspect. (OPTIONS) ( SomeSetting=value) ( --some-setting=value) . . . . . --config=PATH ukify : /etc/systemd/ukify.conf /run/systemd/ukify.conf /usr/local/lib/systemd/ukify.conf /usr/lib/systemd/ukify.conf . ukify . LINUX INITRD Linux= Initrd= . initrd PE . (microcode) initrd . : Command line-only options --config=PATH . . . . --measure, --no-measure systemd-measure(1) PCR. false . . --policy-digest, --no-policy-digest systemd-measure(1) TPM2 . PCR . false . . --section=NAME:TEXT|@PATH, --section=NAME:text|binary[@PATH] inspect . "NAME" . "@" . . ( ) ".linux" . inspect . NAME ( ). "text" . PATH . NAME . . --join-profile=PATH PE . ukify . PCR . PE UKI PE UKI . UKI . PE UKI ".text" . . --sign-profile=ID PCR ukify . --join-profile= . PCR . . --join-pcrsig=PATH, --pcrsig=TEXT|@PATH --join-pcrsig= PE UKI . --pcrsig= JSON pcrsig . UKI . ukify JSON pcrsig UKI . --policy-digest UKI TPM2 . . --tools=DIRS . ukify $PATH . . --output=FILENAME . LINUX ".unsigned.efi" ".signed.efi" SecureBoot . . --summary . . . --all ( inspect). . --json JSON ( inspect). ( ".profile") "size" "sha256" "text" . UKI ( ) . "_profiles" ( ".profile" ). . -h, --help . --version . [UKI] section Linux=LINUX, --linux=LINUX . . OSRelease=TEXT|@PATH, --os-release=TEXT|@PATH os-release ( ".osrel"). "@" . os-release(5) . ".osrel" UKI ( kernel-install bootctl UKI ). . Cmdline=TEXT|@PATH, --cmdline=TEXT|@PATH ( ".cmdline"). "@" . . . Initrd=INITRD..., --initrd=LINUX initrd. . initrd initrd . . Microcode=UCODE, --microcode=UCODE initrd (microcode). . . Splash=PATH, --splash=PATH ( ".splash"). BMP . . . DeviceTree=PATH, --devicetree=PATH devicetree ( ".dtb"). DeviceTree . . . DeviceTreeAuto=PATH..., --devicetree-auto=PATH DeviceTree . . DeviceTree ".dtbauto" . . HWIDs=PATH, --hwids=PATH ( ".hwids"). JSON HWID . JSON "name" "compatible" "hwids" . "name" "compatible" "hwids" UUID CHID/HWID . : { "type": "devicetree", "name": "Example Laptop 16 Gen 7", "compatible": "example,laptop-16-g7", "hwids": [ "5dc05bf4-01f6-4089-b464-a08c47ea9295", "3e3f8f3c-2003-46f2-811c-85554f7d5952" ] } "Example Laptop 16 Gen 7" "name" ( ) "example,laptop-16-g7" "compatible" ( ) "hwids" CHID/HWID ( fwupdtool hwids). "/usr/lib/systemd/boot/hwids/[EFI_ARCH]/" ( ) . DeviceTree . . Uname=VERSION, --uname=VERSION ( uname -r ".uname"). . . . . SBAT=TEXT|@PATH, --sbat=TEXT|@PATH SBAT UKI . SBAT UKI DBX/MOKX . uki,1,UKI,uki,1,https://uapi-group.org/specifications/specs/unified_kernel_image UKI uki-addon,1,UKI Addon,addon,1,https://www.freedesktop.org/software/systemd/man/latest/systemd-stub.html . SBAT Shim[3] . . PCRPKey=PATH, --pcrpkey=PATH ".pcrpkey". PCRPublicKey=/--pcr-public-key= PCRCertificate=/--pcr-certificate= . . . Profile=PATH, --profile=PATH UKI ".profile". UKI --join-profile= UKI . . PCRBanks=PATH, --pcr-banks=PATH PCR . ("sha1" "sha256" "sha384" "sha512") . . SecureBootSigningTool=SIGNER, --signtool=SIGNER "sbsign" "pesign" "systemd-sbsign" . . "sbsign" . . SecureBootPrivateKey=SB_KEY, --secureboot-private-key=SB_KEY . SigningEngine=/--signing-engine= SigningProvider=/--signing-provider= . SecureBootSigningTool=sbsign/--signtool=sbsign SecureBootSigningTool=systemd-sbsign/--signtool=systemd-sbsign . . SecureBootCertificate=SB_CERT, --secureboot-certificate=SB_CERT . SigningEngine=/--signing-engine= SigningProvider=/--signing-provider= . SecureBootSigningTool=sbsign/--signtool=sbsign SecureBootSigningTool=systemd-sbsign/--signtool=systemd-sbsign . . SecureBootCertificateDir=SB_PATH, --secureboot-certificate-dir=SB_PATH nss . SecureBootSigningTool=pesign/--signtool=pesign . /etc/pki/pesign . . SecureBootCertificateName=SB_CERTNAME, --secureboot-certificate-name=SB_CERTNAME nss . SecureBootSigningTool=pesign/--signtool=pesign . . SecureBootCertificateValidity=DAYS, --secureboot-certificate-validity=DAYS ( ) genkey. . . SigningEngine=ENGINE, --signing-engine=ENGINE OpenSSL PCR openssl-engine(1) . . SigningProvider=PROVIDER, --signing-provider=PROVIDER OpenSSL PCR provider(7) . systemd-sbsign . . CertificateProvider=PROVIDER, --certificate-provider=PROVIDER OpenSSL PCR provider(7) . systemd-sbsign . . SignKernel=BOOL, --sign-kernel, --no-sign-kernel . SecureBoot SecureBootPrivateKey=/--secureboot-private-key= . SignKernel=/--sign-kernel true . . [PCRSignature:NAME] section . . . PCRPrivateKey=PATH, --pcr-private-key=PATH PCR. . . PCRPublicKey=PATH, --pcr-public-key=PATH PCR. --pcr-private-key=. . --pcr-private-key= . --pcr-certificate= . . PCRCertificate=PATH, --pcr-certificate=PATH X.509 PCR. --pcr-private-key=. . --pcr-private-key= . --pcr-public-key= . . Phases=LIST, --phases=LIST . . systemd- measure(1) . --pcr-private-key= . . (EXAMPLES) . $ ukify build \ --linux=/lib/modules/6.0.9-300.fc37.x86_64/vmlinuz \ --initrd=/some/path/initramfs-6.0.9-300.fc37.x86_64.img \ --cmdline='quiet rw' UKI ./vmlinuz.unsigned.efi . . qemu[2] OVMF[4] ( UEFI ) -kernel UKI . : qemu-kvm -drive if=pflash,format=qcow2,readonly=on,file=/usr/share/edk2/ovmf/OVMF_CODE_4M.qcow2 -kernel ./vmlinuz.unsigned.efi [ ... ] ( .) -drive . . $ ukify build \ --linux=/lib/modules/6.0.9-300.fc37.x86_64/vmlinuz \ --initrd=early_cpio \ --initrd=/some/path/initramfs-6.0.9-300.fc37.x86_64.img \ --sbat='sbat,1,SBAT Version,sbat,1,https://github.com/rhboot/shim/blob/main/SBAT.md uki.author.myimage,1,UKI for System,uki.author.myimage,1,https://uapi-group.org/specifications/specs/unified_kernel_image' \ --pcr-private-key=tpm2-pcr-initrd-private-key.pem \ --pcr-public-key=tpm2-pcr-initrd-public-key.pem \ --phases='enter-initrd' \ --pcr-private-key=tpm2-pcr-private-key-system.pem \ --pcr-public-key=tpm2-pcr-public-key-system.pem \ --phases='enter-initrd:leave-initrd enter-initrd:leave-initrd:sysinit \ enter-initrd:leave-initrd:sysinit:ready' \ --pcr-banks=sha384,sha512 \ --secureboot-private-key=secureboot-private-key.pem \ --secureboot-certificate=secureboot-certificate.pem \ --sign-kernel \ --cmdline='quiet rw rhgb' UKI ./vmlinuz.signed.efi . initrd : early_cpio initramfs-6.0.9-300.fc37.x86_64.img. ".pcrsig" initrd ( enter-initrd) tpm2-pcr-initrd-private-key.pem ( leave-initrd sysinit ready) tpm2-pcr-private-key-system.pem . SecureBoot secureboot-private-key.pem . . : $ cat ukify.conf [UKI] Initrd=early_cpio Cmdline=quiet rw rhgb SecureBootPrivateKey=secureboot-private-key.pem SecureBootCertificate=secureboot-certificate.pem SignKernel=yes PCRBanks=sha384,sha512 [PCRSignature:initrd] PCRPrivateKey=tpm2-pcr-initrd-private-key.pem PCRPublicKey=tpm2-pcr-initrd-public-key.pem Phases=enter-initrd [PCRSignature:system] PCRPrivateKey=tpm2-pcr-private-key-system.pem PCRPublicKey=tpm2-pcr-public-key-system.pem Phases=enter-initrd:leave-initrd enter-initrd:leave-initrd:sysinit enter-initrd:leave-initrd:sysinit:ready $ ukify -c ukify.conf build \ --linux=/lib/modules/6.0.9-300.fc37.x86_64/vmlinuz \ --initrd=/some/path/initramfs-6.0.9-300.fc37.x86_64.img "initrd" ( early_cpio) initrd ( initramfs-6.0.9-300.fc37.x86_64.img) . initrd (microcode) initrd . . PE ukify build \ --secureboot-private-key=secureboot-private-key.pem \ --secureboot-certificate=secureboot-certificate.pem \ --cmdline='debug' \ --sbat='sbat,1,SBAT Version,sbat,1,https://github.com/rhboot/shim/blob/main/SBAT.md uki-addon.author,1,UKI Addon for System,uki-addon.author,1,https://www.freedesktop.org/software/systemd/man/systemd-stub.html' --output=debug.addon.efi PE "debug" SBAT . . : # cat >/etc/kernel/uki.conf < : # ukify genkey --config=/etc/kernel/uki.conf Writing SecureBoot private key to /etc/kernel/secureboot-private-key.pem Writing SecureBoot certificate to /etc/kernel/secureboot-certificate.pem Writing private key for PCR signing to /etc/systemd/tpm2-pcr-initrd-private-key.pem Writing public key for PCR signing to /etc/systemd/tpm2-pcr-initrd-public-key.pem Writing private key for PCR signing to /etc/systemd/tpm2-pcr-private-key-system.pem Writing public key for PCR signing to /etc/systemd/tpm2-pcr-public-key-system.pem ( /etc/kernel/ .) (ukify build --config=/etc/kernel/uki.conf) . kernel- install(8) 60-ukify.install /etc/kernel/uki.conf kernel-install UKI . . (Multi-Profile UKI) : $ ukify build \ --profile='TITLE=Base' \ --output=profile0.efi (@1): $ ukify build \ --profile='TITLE=Boot into Storage Target Mode ID=storagetm' \ --cmdline='quiet rw rd.systemd.unit=storage-target-mode.target' \ --output=profile1.efi (@2): $ ukify build \ --profile='TITLE=Factory Reset ID=factory-reset' \ --cmdline='quiet rw systemd.unit=factory-reset.target' \ --output=profile2.efi UKI : $ ukify build \ --linux=/lib/modules/6.0.9-300.fc37.x86_64/vmlinuz \ --initrd=/some/path/initramfs-6.0.9-300.fc37.x86_64.img \ --cmdline='quiet rw' \ --join-profile=profile0.efi \ --join-profile=profile1.efi \ --join-profile=profile2.efi \ --output=base.efi UKI base-with-profile-0-1-2.efi . . pcrsig UKI JSON PCR : $ ukify build \ --linux=/lib/modules/6.0.9-300.fc37.x86_64/vmlinuz \ --initrd=/some/path/initramfs-6.0.9-300.fc37.x86_64.img \ --cmdline='quiet rw' \ --pcr-public-key=tpm2-pcr-initrd-public-key.pem \ --policy-digest \ --json=short \ --output=base.efi >base.pcrs PCR JSON : #!/usr/bin/python3 import base64, json, subprocess priv_key = '/home/zbyszek/src/systemd/tpm2-pcr-private.pem' base_file = 'base.pcrs' base = json.load(open(base_file)) for bank,policies in base.items(): for policy in policies: pol = base64.b16decode(policy['pol'].upper()) call = subprocess.run(['openssl', 'dgst', f'-{bank}', '-sign', priv_key], input=pol, check=True, capture_output=True) sig = base64.b64encode(call.stdout).decode() policy['sig'] = sig print(json.dumps(base)) JSON UKI : $ ukify build \ --join-pcrsig=base.efi \ --pcrsig=@base.pcrs \ --json=short \ --output=base-signed.efi UKI base-signed.efi PCR . (SEE ALSO) systemd(1), systemd-stub(7), systemd-boot(7), systemd-measure(1), systemd-pcrphase.service(8) (NOTES) 1. UAPI.5 Unified Kernel Image (UKI) https://uapi-group.org/specifications/specs/unified_kernel_image 2. qemu https://www.qemu.org/docs/master 3. Shim documentation https://github.com/rhboot/shim/blob/main/SBAT.md 4. OVMF https://www.linux-kvm.org/downloads/lersek/ovmf-whitepaper- c770f8c.txt systemd 261.3 UKIFY(1)