UKIFY(1)

الاسم
ukify - اجمع المكونات في صورة نواة موحدة (UKI) موثقة لأنظمة UEFI

موجز

ukify [الخيارات...] build

ukify [الخيارات...] genkey

ukify [الخيارات...] inspect ملف...

الوصف

ukify أداة غرضها الرئيس هو دمج المكونات (عادةً نواة، و initrd، و systemd-stub(7) UEFI stub) لإنشاء صورة نواة موحدة (UKI)[1] بمواصفات UAPI.5 — وهي ملف PE ثنائي واحد يُقلع منه النظام. عند تنفيذ صورة UKI، يستخرج stub نواة لينكس المضمنة ويُقلعها. يمكن بدء صورة UKI مباشرة عبر البرمجيات المضمنة (firmware) أو عبر محمل إقلاع. عند استخدامه مع qemu[2]، يمكن أيضًا تنفيذ صورة UKI عبر "إقلاع النواة المباشر"، انظر المثال أدناه.

يمكن أيضًا استخدام ukify لإنشاء أنواع أخرى من الصور الشبيهة بـ UKI، ولا سيما الامتدادات. انظر وصف الأمر build أدناه. يمكن لـ ukify أيضًا توليد الشهادات والمفاتيح للإقلاع الآمن (SecureBoot) وتوثيق سجلات PCR، انظر وصف الأمر genkey أدناه. يمكن لـ ukify أيضًا طباعة معلومات مفصلة حول صور النواة الموحدة، انظر وصف الأمر inspect أدناه.

الأوامر

الأوامر التالية مفهومة:

  build

يُنشئ هذا الأمر صورة نواة موحدة (UKI). الخياران الرئيسان اللذان ينبغي تحديدهما للأمر 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=، فستُمرر وسطاء المفتاح الخاص حرفيًا إلى openssl(1) كمعرفات موارد موحدة (URIs)، وستُحمل وسطاء المفتاح العام كشهادات X.509، بحيث يمكن إجراء التوثيق باستخدام محرك أو مزود OpenSSL على التوالي.

إذا وُفر مفتاح توثيق الإقلاع الآمن (SecureBoot) عبر خيار SecureBootPrivateKey=/--secureboot-private-key=، فسيُوثق ملف PE الثنائي الناتج ككل، مما يسمح لصورة UKI الناتجة بأن تكون موثوقة من قِبل الإقلاع الآمن. انظر أيضًا مناقشة التسجيل الآلي في systemd-boot(7).

إذا احتوى stub أو النواة على أقسام ".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.

إعدادات التهيئة

يمكن أن تظهر الإعدادات في ملفات التهيئة (بالصيغة الإعداد=القيمة) وفي سطر الأوامر (بالصيغة --الإعداد=القيمة). وبالنسبة لبعض معاملات سطر الأوامر، يُسمح أيضًا باختصار من حرف واحد. في ملفات التهيئة، يجب أن يكون الإعداد في القسم المناسب، لذا جُمعت الأوصاف حسب الأقسام أدناه. عندما يظهر نفس الإعداد في ملف التهيئة وفي سطر الأوامر، فعادةً ما تكون لإعداد سطر الأوامر أولوية أعلى ويحل محل إعداد ملف التهيئة تمامًا. وإذا سلك إعداد ما سلوكًا مختلفًا، فسيُشرح ذلك أدناه.

إذا لم يُوفر ملف تهيئة عبر الخيار --config=المسار، فسيحاول 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 الفعلي.

الخيارات والإعدادات التالية مفهومة:

  خيارات سطر الأوامر فقط

--config=المسار
    حمّل الإعدادات من ملف التهيئة المعطى. وبشكل عام، تكون للإعدادات المحددة في ملف التهيئة أسبقية أقل من الإعدادات المحددة عبر الخيارات. الحالات التي لا يتجاوز فيها خيار سطر الأوامر إعداد ملف التهيئة بالكامل تُذكر صراحة في أوصاف الخيارات الفردية.

    أُضيف في الإصدار 254.

--measure، --no-measure
    فعل أو عطل استدعاء systemd-measure(1) لطباعة قيم PCR المحسوبة مسبقًا. القيمة المبدئية هي كاذب (false).

    أُضيف في الإصدار 253.

--policy-digest، --no-policy-digest
    فعل أو عطل استدعاء systemd-measure(1) لطباعة خلاصات سياسة TPM2 المحسوبة مسبقًا. مفيد لتوثيق سياسات PCR دون اتصال بالإنترنت. القيمة المبدئية هي كاذب (false).

    أُضيف في الإصدار 258.

--section=الاسم:النص|@المسار، --section=الاسم:text|binary[@المسار]
    بالنسبة لجميع الأفعال ما عدا inspect، تُستخدم الصيغة الأولى. حدد قسمًا إضافيًا اختياريًا "الاسم". قد تكون المعاملة سلسلة نصية حرفية، أو "@" متبوعة باسم مسار. يمكن تحديد هذا الخيار أكثر من مرة. أي أقسام تُحدد بهذا الأسلوب ستُدرج (بالترتيب) قبل قسم ".linux" الذي يكون دائمًا في الآخر.

    بالنسبة للفعل inspect، تُستخدم الصيغة الثانية. سيُفحص القسم الاسم (إذا وُجد). إذا كانت المعاملة الثانية هي "text"، فستُطبع المحتويات. وإذا أُعطيت المعاملة الثالثة، فستُحفظ المحتويات في الملف المسمى المسار.

    لاحظ أن الاسم يُستخدم كما هو، وإذا كان يجب أن يبدأ اسم القسم بنقطة، فيجب تضمينها في الاسم.

    أُضيف في الإصدار 253.

--join-profile=المسار
    يأخذ مسارًا لملف PE موجود يحتوي على تشكيلة إضافية لإضافتها إلى صورة النواة الموحدة. يمكن توليد التشكيلة مسبقًا باستخدام ukify. لا يلزم أن تكون التشكيلة موثقة أو تحتوي على قياسات PCR. تُنسخ جميع أقسام PE الخاصة بـ UKI من ملف PE المحدد إلى صورة UKI المولدة. هذا مفيد لتوليد صور UKI متعددة التشكيلات. لاحظ أن هذا ينسخ فقط أقسام PE التي تحددها مواصفات UKI، ويتجاهل أي أقسام أخرى، مثل ".text" أو ما شابه.

    أُضيف في الإصدار 257.

--sign-profile=المعرف
    يأخذ معرف تشكيلة يجب أن يولد لها ukify قياسات PCR موثقة. يمكن استخدام هذا الخيار مع --join-profile= عند بناء صورة النواة الموحدة النهائية. إذا لم يُحدد، فستُضاف قياسات PCR موثقة لجميع التشكيلات.

    أُضيف في الإصدار 258.

--join-pcrsig=المسار، --pcrsig=النص|@المسار
    يأخذ --join-pcrsig= مسارًا لملف PE موجود يحتوي على صورة UKI بُنيت سابقًا. ويأخذ --pcrsig= مسارًا لكتلة pcrsig JSON موجودة، أو كتلة مضمنة حرفيًا. يجب استخدامهما معًا، ودون تحديد أي معاملات أخرى لأقسام UKI. سيرفق ukify كتلة pcrsig JSON بصورة UKI. هذا مفيد بالاقتران مع --policy-digest لإنشاء صورة UKI ثم توثيق خلاصات سياسة TPM2 دون اتصال بالإنترنت.

    أُضيف في الإصدار 258.

--tools=المجلدات
    حدد مجلدًا واحدًا أو أكثر يحتوي على أدوات مساعدة. سيبحث ukify عن الأدوات المساعدة في تلك المجلدات أولاً، وإذا لم يجدها، فسيحاول تحميلها من $PATH بالطريقة المعتادة.

    أُضيف في الإصدار 253.

--output=اسم_الملف
    اسم ملف المخرجات. إذا لم يُحدد، فسيُستخدم اسم وسيطة LINUX، مع اللاحقة ".unsigned.efi" أو ".signed.efi"، اعتمادًا على ما إذا كان قد أُجري توثيق للإقلاع الآمن (SecureBoot).

    أُضيف في الإصدار 253.

--summary
    اطبع ملخصًا للإعدادات المحملة واخرج. هذا مفيد للتحقق من كيفية دمج الخيارات من ملف التهيئة وسطر الأوامر.

    أُضيف في الإصدار 254.

--all
    اطبع جميع الأقسام (باستخدام الفعل inspect).

    أُضيف في الإصدار 255.

--json
    ولد مخرجات بصيغة JSON (باستخدام الفعل inspect).

    أُضيف في الإصدار 255.

-h، --help
    اطبع نص مساعدة قصير واخرج.

--version
    اطبع سلسلة إصدار قصيرة واخرج.

  قسم [UKI]

Linux=LINUX، --linux=LINUX
    مسار إلى ملف النواة الثنائي.

    أُضيف في الإصدار 254.

OSRelease=النص|@المسار، --os-release=النص|@المسار
    وصف إصدار نظام التشغيل (قسم ".osrel"). قد تكون المعاملة سلسلة حرفية، أو "@" متبوعة باسم مسار. إذا لم يُحدد، فسيُجلب ملف os-release(5) من النظام المضيف. وإذا ضُبط صراحة على سلسلة فارغة، فسيُحذف قسم ".osrel" من صورة UKI (وهذا غير موصى به في معظم الحالات، ويؤدي إلى عدم التعرف على المنتج الناتج كصورة UKI بواسطة أدوات أخرى مثل kernel-install و bootctl).

    أُضيف في الإصدار 253.

Cmdline=النص|@المسار، --cmdline=النص|@المسار
    سطر أوامر النواة (قسم ".cmdline"). قد تكون المعاملة سلسلة حرفية، أو "@" متبوعة باسم مسار. إذا لم يُحدد، فلن يُضمن أي سطر أوامر.

    أُضيف في الإصدار 253.

Initrd=INITRD...، --initrd=LINUX
    صفر أو أكثر من مسارات initrd. في ملف التهيئة، تُفصل العناصر بمسافات بيضاء. تُجمع ملفات initrd بترتيب تحديدها، مع وضع ملفات initrd المحددة في ملف التهيئة أولاً.

    أُضيف في الإصدار 254.

Microcode=UCODE، --microcode=UCODE
    المسار إلى initrd الذي يحتوي على تحديثات الميكروكود. إذا لم يُحدد، فلن يكون القسم موجودًا.

    أُضيف في الإصدار 256.

Splash=المسار، --splash=المسار
    صورة تُعرض أثناء الإقلاع (قسم ".splash"). المعاملة هي مسار لملف BMP. إذا لم يُحدد، فلن يكون القسم موجودًا.

    أُضيف في الإصدار 253.

DeviceTree=المسار، --devicetree=المسار
    وصف شجرة الأجهزة (قسم ".dtb"). المعاملة هي مسار لملف DeviceTree ثنائي مُجمع. إذا لم يُحدد، فلن يكون القسم موجودًا.

    أُضيف في الإصدار 253.

DeviceTreeAuto=المسار...، --devicetree-auto=المسار
    صفر أو أكثر من ملفات DeviceTree القابلة للاختيار آليًا. في ملف التهيئة، تُفصل العناصر بمسافات بيضاء. ستكون كل شجرة أجهزة في قسم ".dtbauto" منفصل.

    أُضيف في الإصدار 257.

HWIDs=المسار، --hwids=المسار
    جدول أجهزة معرفات العتاد (قسم ".hwids"). المعاملة هي مسار لمجلد يحتوي على ملفات وصف أجهزة HWID بصيغة JSON. يجب أن يحتوي كل ملف على كائن JSON واحد بمفاتيح "name" و "compatible" و "hwids". يجب أن تكون قيم مفتاحي "name" و "compatible" سلاسل نصية، ويجب أن تكون قيمة مفتاح "hwids" قائمة من السلاسل النصية، حيث يجب أن تكون السلاسل معرفات UUID صالحة تمثل CHIDs/HWIDs. مثال:

        {
            "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" هو "اسم" الجهاز (كما حددته الشركة المصنعة)، و "example,laptop-16-g7" هو "المتطابق" (كما حددته النواة) و "hwids" هي مصفوفة من CHIDs/HWIDs (استُخرجت مثلاً من مخرجات fwupdtool hwids). إذا لم يُحدد، وكان المجلد "/usr/lib/systemd/boot/hwids/[EFI_ARCH]/" موجودًا، فسيُملأ القسم آليًا من ذلك المجلد (حدد سلسلة فارغة كمعامل لهذا الخيار لتعطيل هذا السلوك)، وإلا فلن يكون موجودًا. يوصى بتحديد هذا المعامل إذا كان سيُستخدم ملفات DeviceTrees القابلة للاختيار آليًا.

    أُضيف في الإصدار 257.

Uname=الإصدار، --uname=الإصدار
    حدد إصدار النواة (كما في uname -r، قسم ".uname"). إذا لم يُحدد، فستُجرى محاولة لاستخراج سلسلة الإصدار من صورة النواة. يوصى بتمرير هذا صراحة إذا كان معروفًا، لأن الاستخراج يعتمد على طرق استدلالية وليست موثوقة للغاية. إذا لم يُحدد وفشل الاستخراج، فلن يكون القسم موجودًا.

    أُضيف في الإصدار 253.

SBAT=النص|@المسار، --sbat=النص|@المسار
    بيانات SBAT الوصفية المرتبطة بصورة UKI أو الملحق. سياسات SBAT مفيدة لإلغاء مجموعات كاملة من صور UKI أو الملحقات بتحديث سياسة واحد وثابت لا يشغل مساحة في DBX/MOKX. إذا لم تُحدد يدويًا، فسيُستخدم إدخال بيانات وصفية مبدئي يتكون من

        uki,1,UKI,uki,1,https://uapi-group.org/specifications/specs/unified_kernel_image/

    لصور UKIs و

        uki-addon,1,UKI Addon,addon,1,https://www.freedesktop.org/software/systemd/man/latest/systemd-stub.html

    سوف تُستخدم للملحقات، لضمان إمكانية إبطالها دائمًا. لمزيد من المعلومات حول SBAT راجع توثيق Shim[3].

    أُضيف في الإصدار 254.

PCRPKey=المسار، --pcrpkey=المسار
    مسار إلى مفتاح عام لتضمينه في قسم ".pcrpkey". إذا لم يُحدد، ووجد وسيط واحد تمامًا من النوع PCRPublicKey=/--pcr-public-key= أو PCRCertificate=/--pcr-certificate=، فسيُستخدم ذلك المفتاح. وبخلاف ذلك، لن يكون القسم موجودًا.

    أُضيف في الإصدار 253.

Profile=المسار، --profile=المسار
    مسار إلى تشكيلة UKI لوضعها في قسم ".profile". هذا الخيار مفيد لإنشاء صور UKI متعددة التشكيلات، ويُستخدم عادةً بالاقتران مع --join-profile=، لتوسيع صورة UKI المحددة بتشكيلة إضافية.

    أُضيف في الإصدار 257.

PCRBanks=المسار، --pcr-banks=المسار
    قائمة مفصولة بفاصلة أو مسافة لمصارف PCR لتوقيع سياسة لها. إذا لم توجد، فستُستخدم جميع المصارف المعروفة ("sha1"، و "sha256"، و "sha384"، و "sha512")، وسيفشل الأمر إذا كان النظام لا يدعمها.

    أُضيف في الإصدار 253.

SecureBootSigningTool=الموقّع، --signtool=الموقّع
    ما إذا كان سيُستخدم "sbsign"، أو "pesign"، أو "systemd-sbsign". بناءً على هذا الاختيار، تُطلب معلمات مختلفة من أجل توقيع صورة. القيمة المبدئية هي "sbsign".

    أُضيف في الإصدار 254.

SecureBootPrivateKey=SB_KEY, --secureboot-private-key=SB_KEY
    مسار لمفتاح خاص لاستخدامه في توقيع الملف الثنائي الناتج. إذا استُخدم الخيار SigningEngine=/--signing-engine= أو SigningProvider=/--signing-provider=، فقد يكون هذا أيضًا تعيينًا خاصًا بمحرك أو بمزود معين. هذا الخيار مطلوب بواسطة SecureBootSigningTool=sbsign/--signtool=sbsign و SecureBootSigningTool=systemd-sbsign/--signtool=systemd-sbsign.

    أُضيف في الإصدار 253.

SecureBootCertificate=SB_CERT, --secureboot-certificate=SB_CERT
    مسار لشهادة تُستخدم لتوقيع الملف الثنائي الناتج. إذا استُخدم الخيار SigningEngine=/--signing-engine= أو SigningProvider=/--signing-provider=، فقد يكون هذا أيضًا تعيينًا خاصًا بمحرك أو بمزود معين. هذا الخيار مطلوب بواسطة SecureBootSigningTool=sbsign/--signtool=sbsign و SecureBootSigningTool=systemd-sbsign/--signtool=systemd-sbsign.

    أُضيف في الإصدار 253.

SecureBootCertificateDir=SB_PATH, --secureboot-certificate-dir=SB_PATH
    مسار لدليل قاعدة بيانات شهادات nss لاستخدامه في توقيع الملف الثنائي الناتج. يسري مفعوله عند استخدام SecureBootSigningTool=pesign/--signtool=pesign. القيمة المبدئية هي /etc/pki/pesign.

    أُضيف في الإصدار 254.

SecureBootCertificateName=SB_CERTNAME, --secureboot-certificate-name=SB_CERTNAME
    اسم مدخل قاعدة بيانات شهادات nss لاستخدامه في توقيع الملف الثنائي الناتج. هذا الخيار مطلوب بواسطة SecureBootSigningTool=pesign/--signtool=pesign.

    أُضيف في الإصدار 254.

SecureBootCertificateValidity=DAYS, --secureboot-certificate-validity=DAYS
    فترة الصلاحية (بالأيام) لشهادة أُنشئت بواسطة genkey. القيمة المبدئية هي 3650، أي 10 سنوات.

    أُضيف في الإصدار 254.

SigningEngine=ENGINE, --signing-engine=ENGINE
    محرك OpenSSL ليُستخدم لتوقيع الملف الثنائي الناتج وقياسات PCR، راجع openssl-engine(1).

    أُضيف في الإصدار 253.

SigningProvider=PROVIDER, --signing-provider=PROVIDER
    مزود OpenSSL ليُستخدم لتوقيع الملف الثنائي الناتج وقياسات PCR، راجع provider(7). لا يمكن استخدام هذا الخيار إلا عند استخدام systemd-sbsign كأداة توقيع.

    أُضيف في الإصدار 257.

CertificateProvider=PROVIDER, --certificate-provider=PROVIDER
    مزود OpenSSL ليُستخدم لتحميل الشهادة المستخدمة لتوقيع الملف الثنائي الناتج وقياسات PCR، راجع provider(7). لا يمكن استخدام هذا الخيار إلا عند استخدام systemd-sbsign كأداة توقيع.

    أُضيف في الإصدار 257.

SignKernel=BOOL, --sign-kernel, --no-sign-kernel
    تخطي الكشف عما إذا كان يجب توقيع ثنائي لينكس نفسه قبل تضمينه في الصورة المجمعة. إذا لم يُحدد، فسيُوقع إذا وُفر مفتاح توقيع الإقلاع الآمن عبر خيار SecureBootPrivateKey=/--secureboot-private-key= ولم يكن الثنائي موقعًا بالفعل. إذا كان SignKernel=/--sign-kernel صحيحًا، وكان الثنائي موقعًا بالفعل، فسيُلحق التوقيع على أي حال.

    أُضيف في الإصدار 253.

  قسم [PCRSignature:الاسم]

في ملف الضبط، تُجمع هذه الخيارات حسب القسم. في سطر الأوامر، يجب تحديدها بنفس الترتيب. تُدمج الأقسام المحددة في كلا المصدرين.

PCRPrivateKey=المسار، --pcr-private-key=المسار
    مفتاح خاص لاستخدامه في توقيع سياسات PCR. في سطر الأوامر، يمكن تحديد هذا الخيار أكثر من مرة، وفي هذه الحالة ستُجرى توقيعات متعددة.

    أُضيف في الإصدار 253.

PCRPublicKey=المسار، --pcr-public-key=المسار
    مفتاح عام لاستخدامه في توقيع سياسات PCR.

    في سطر الأوامر، يمكن تحديد هذا الخيار أكثر من مرة، بشكل مشابه لخيار --pcr-private-key=. إذا لم يوجد، فستُستخرج المفاتيح العامة من المفاتيح الخاصة. في سطر الأوامر، إذا وُجد، يجب تحديد هذا الخيار بنفس عدد مرات خيار --pcr-private-key=. لا يمكن تحديده إذا استُخدم --pcr-certificate=.

    أُضيف في الإصدار 253.

PCRCertificate=المسار، --pcr-certificate=المسار
    شهادة X.509 لاستخدامها في توقيع سياسات PCR.

    في سطر الأوامر، يمكن تحديد هذا الخيار أكثر من مرة، بشكل مشابه لخيار --pcr-private-key=. إذا لم يوجد، فستُستخرج المفاتيح العامة من المفاتيح الخاصة. في سطر الأوامر، إذا وُجد، يجب تحديد هذا الخيار بنفس عدد مرات خيار --pcr-private-key=. لا يمكن تحديده إذا استُخدم --pcr-public-key=.

    أُضيف في الإصدار 258.

Phases=القائمة، --phases=القائمة
    قائمة مفصولة بفاصلة أو مسافة لمسارات مراحل مفصولة بنقطتين لتوقيع سياسة لها. ستُوقع كل مجموعة من مسارات مراحل الإقلاع بـالمفتاح الخاص المقابل. إذا لم توجد، فستُستخدم القيمة المبدئية لـ systemd-measure(1).

    في سطر الأوامر، عند وجود هذه المعلمة، يجب أن تظهر نفس عدد مرات خيار --pcr-private-key=.

    أُضيف في الإصدار 253.

أمثلة

مثال 1. استدعاء بسيط

    $ 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.

Example 2. Direct kernel boot in a virtual machine

عند استخدام 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 أخرى لوصل صورة قرص فعلية، لكن هذا ليس مطلوبًا.

مثال 3. كل الإضافات والكماليات

    $ 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-private-key.pem.

مثال 4. كل الإضافات والكماليات، عبر ملف ضبط

هذا هو نفس المثال السابق، ولكن هذه المرة حُفظ الضبط في ملف:

    $ 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) في ملف الضبط، والآخر (initramfs-6.0.9-300.fc37.x86_64.img) في سطر الأوامر. قد يكون هذا مفيدًا على سبيل المثال عندما يحتوي initrd الأول على كود دقيق (microcode) للمعالج ولا يحتاج للتحديث عند تغير إصدار النواة، بخلاف initrd الفعلي.

مثال 5. ملحق 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 التعريفية التي تشير إلى مالك الملحق.

مثال 6. تحديد سياسة التوقيع، وإنشاء الشهادة والمفاتيح

أولاً، لننشئ ملف تهيئة يحدد التوقيعات التي ستُجرى:

    # cat >/etc/kernel/uki.conf <<EOF
    [UKI]
    SecureBootPrivateKey=/etc/kernel/secureboot-private-key.pem
    SecureBootCertificate=/etc/kernel/secureboot-certificate.pem

    [PCRSignature:initrd]
    Phases=enter-initrd
    PCRPrivateKey=/etc/systemd/tpm2-pcr-initrd-private-key.pem
    PCRPublicKey=/etc/systemd/tpm2-pcr-initrd-public-key.pem

    [PCRSignature:system]
    Phases=enter-initrd:leave-initrd enter-initrd:leave-initrd:sysinit
           enter-initrd:leave-initrd:sysinit:ready
    PCRPrivateKey=/etc/systemd/tpm2-pcr-private-key-system.pem
    PCRPublicKey=/etc/systemd/tpm2-pcr-public-key-system.pem
    EOF

بعد ذلك، يمكننا توليد الشهادة والمفاتيح:

    # 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 افتراضيًا، لذا بعد إنشاء هذا الملف، ستقوم عمليات تثبيت النوى التي تنشئ صورة UKI على الجهاز المحلي باستخدام kernel-install بإجراء التوقيع باستخدام هذا الضبط.

مثال 7. صورة 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 الآن على ثلاث تشكيلات.

مثال 8. توقيع قسم pcrsig دون اتصال

أولاً، أنشئ UKI واحفظ كتلة PCR JSON:

    $ 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 الموقعة.

انظر أيضًا

systemd(1)، systemd-stub(7)، systemd-boot(7)، systemd-measure(1)، systemd-pcrphase.service(8)

ملاحظات

1.  صورة نواة موحدة (UKI) من النوع UAPI.5
    https://uapi-group.org/specifications/specs/unified_kernel_image/

2.  qemu
    https://www.qemu.org/docs/master/

3.  توثيق Shim
    https://github.com/rhboot/shim/blob/main/SBAT.md

4.  OVMF
    https://www.linux-kvm.org/downloads/lersek/ovmf-whitepaper-c770f8c.txt

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.