ການສ້າງເຄີເນີນ (Kernel) ທີ່ກຳນົດເອງ

John Soros, Alessio, Brandon Nielsen Version unspecified Last review: 2023-12-23
ເອກະສານນີ້ໃຫ້ຄຳແນະນຳສຳລັບຜູ້ໃຊ້ລະດັບສູງທີ່ຕ້ອງການສ້າງເຄີເນີນຄືນໃໝ່ຈາກຊອດໂຄດ (source).

ເມື່ອສ້າງ ຫຼື ນຳໃຊ້ເຄີເນີນທີ່ກຳນົດເອງ, ທ່ານ ບໍ່ ຄວນຄາດຫວັງການຊ່ວຍເຫຼືອຈາກທີມງານເຄີເນີນຂອງ Fedora.

ເຫດຜົນທົ່ວໄປບາງຢ່າງໃນການສ້າງເຄີເນີນທີ່ກຳນົດເອງແມ່ນ:

  • ເພື່ອຕິດຕັ້ງແພັດຊ໌ (patches) ສຳລັບການທົດສອບທີ່ສ້າງຂຶ້ນເອງ ຫຼື ໄດ້ມາຈາກແຫຼ່ງອື່ນ

  • ເພື່ອຕັ້ງຄ່າເຄີເນີນທີ່ມີຢູ່ໃໝ່

  • ເພື່ອຮຽນຮູ້ເພີ່ມເຕີມກ່ຽວກັບເຄີເນີນ ແລະ ການພັດທະນາເຄີເນີນ

ຕິດຕັ້ງສິ່ງທີ່ຈຳເປັນຕ້ອງມີ

ວິທີທີ່ງ່າຍທີ່ສຸດໃນການຕິດຕັ້ງສິ່ງທີ່ຈຳເປັນທັງໝົດໃນການສ້າງເຄີເນີນແມ່ນການໃຊ້ໄຟລ໌ spec ຂອງເຄີເນີນ Fedora:

$ sudo dnf install fedpkg
$ fedpkg clone -a kernel
$ cd kernel
$ sudo dnf builddep kernel.spec

ຖ້າທ່ານຕ້ອງການໃຊ້ make xconfig, ທ່ານຈະຕ້ອງມີແພັກເກດເພີ່ມເຕີມ:

$ sudo dnf install qt3-devel libXi-devel gcc-c++

ການບູດແບບປອດໄພ (Secure boot)

ໃຫ້ແນ່ໃຈວ່າທ່ານໄດ້ເພີ່ມຜູ້ໃຊ້ທີ່ເຮັດການສ້າງລົງໃນ /etc/pesign/users ແລະ ຣັນສະຄຣິບອະນຸມັດຜູ້ໃຊ້:

$ sudo /usr/libexec/pesign/pesign-authorize

ສ້າງ Machine Owner Key (MOK) ໃໝ່ເພື່ອປ້ອນເຂົ້າ UEFI:

$ openssl req -new -x509 -newkey rsa:2048 -keyout "key.pem" \
        -outform DER -out "cert.der" -nodes -days 36500 \
        -subj "/CN=<your name>/"

ນຳເຂົ້າໃບຢັ້ງຢືນໃໝ່ເຂົ້າໃນຖານຂໍ້ມູນ UEFI ຂອງທ່ານ:

ທ່ານຈະຖືກຖາມໃຫ້ອະນຸມັດການນຳເຂົ້າໃນການບູດເຄື່ອງຄັ້ງຕໍ່ໄປ.
$ sudo mokutil --import "cert.der"

ສ້າງໄຟລ໌ຄີ PKCS #12:

$ openssl pkcs12 -export -out key.p12 -inkey key.pem -in cert.der

ຈາກນັ້ນທ່ານສາມາດນຳເຂົ້າໃບຢັ້ງຢືນ ແລະ ຄີ ເຂົ້າໃນຖານຂໍ້ມູນ nss:

$ sudo certutil -A -i cert.der -n "<MOK certificate nickname>" -d /etc/pki/pesign/ -t "Pu,Pu,Pu"
$ sudo pk12util -i key.p12 -d /etc/pki/pesign

ເມື່ອນຳເຂົ້າໃບຢັ້ງຢືນ ແລະ ຄີ ເຂົ້າໃນຖານຂໍ້ມູນ nss ແລ້ວ, ທ່ານສາມາດສ້າງເຄີເນີນດ້ວຍຄີທີ່ເລືອກໂດຍການເພີ່ມ %define pe_signing_cert <ຊື່ຫຼິ້ນໃບຢັ້ງຢືນ MOK> ລົງໃນໄຟລ໌ kernel.spec ຫຼື ເອີ້ນໃຊ້ rpmbuild ໂດຍກົງດ້ວຍແຟລັກ --define "pe_signing_cert <ຊື່ຫຼິ້ນໃບຢັ້ງຢືນ MOK>".

ໃນຂະນະທີ່ bugzilla bug #1651020 ຍັງບໍ່ທັນໄດ້ຮັບການແກ້ໄຂ, ທ່ານອາດຈະຕ້ອງແກ້ໄຂແຖວທີ່ຂຶ້ນຕົ້ນດ້ວຍ %pesign ໃນໄຟລ໌ kernel spec ແລະ ແທນບ່ອນມັນດ້ວຍ pesign -c %{pe_signing_cert} --certdir /etc/pki/pesign/ -s -i $KernelImage -o vmlinuz.signed.

ແນະນຳໃຫ້ຕິດຕັ້ງ ccache ນຳ, ເຊິ່ງຈະຊ່ວຍໃຫ້ການສ້າງເຄີເນີນຄືນໃໝ່ໄວຂຶ້ນ:

$ sudo dnf install ccache

ການສ້າງເຄີເນີນຈາກ Fedora dist-git

ທຳອິດ, ຕ້ອງໄດ້ checkout ຈາກ Fedora kernel dist-git:

$ git clone https://src.fedoraproject.org/rpms/kernel.git

ເຄີເນີນ ກໍ່ຄືກັບແພັກເກດ Fedora ອື່ນໆ, ມີແບຣນຊ໌ (branch) ແຍກຕາມແຕ່ລະລຸ້ນຂອງ Fedora. rawhide ແມ່ນສຳລັບ Rawhide ແລະ ແຕ່ລະລຸ້ນຂອງ Fedora ຈະມີແບຣນຊ໌ທີ່ຊື່ວ່າ f<ລຸ້ນ>.

  1. ຕົວຢ່າງ, ເພື່ອສ້າງເຄີເນີນ Fedora 28, ກ່ອນອື່ນທ່ານຕ້ອງສະຫຼັບໄປຫາແບຣນຊ໌ນັ້ນດ້ວຍຄຳສັ່ງ:

    $ git switch f28
  2. ເພື່ອຫຼີກເວັ້ນການຂັດແຍ້ງກັບເຄີເນີນທີ່ມີຢູ່, ທ່ານສາມາດກຳນົດ buildid ເອງໄດ້ໂດຍ ປ່ຽນ # define buildid .local ເປັນ %define buildid .<ຊື່_id_ຂອງທ່ານ_ຢູ່ບ່ອນນີ້> ໃນ kernel.spec.

  3. ເຮັດການປ່ຽນແປງ ຫຼື ປັບແຕ່ງຕາມທີ່ທ່ານຕ້ອງການ:

    1. ຕົວເລືອກການຕັ້ງຄ່າເຄີເນີນສາມາດປ່ຽນແປງໄດ້ໂດຍການແກ້ໄຂໄຟລ໌ kernel-local.

    2. ແພັດຊ໌ທີ່ມີຢູ່ສາມາດເພີ່ມເຂົ້າໃນ linux-kernel-test.patch, ມັນຈະຖືກດຶງໄປໃຊ້ໃນລະຫວ່າງການສ້າງໂດຍອັດຕະໂນມັດ.

    3. ແພັດຊ໌ຍັງສາມາດເກັບໄວ້ໃນໄຟລ໌ແຍກຕ່າງຫາກ ແລະ ເພີ່ມເຂົ້າໃນ kernel.spec ດ້ວຍ Patch2: foo.patch, Patch3: bar.patch, ແລະ ອື່ນໆ. ຕ້ອງເພີ່ມແຖວ ApplyOptionalPatch foo.patch, ApplyOptionalPatch bar.patch ໃຫ້ກົງກັນເພື່ອຕິດຕັ້ງແພັດຊ໌ໃນລະຫວ່າງຂະບວນການສ້າງ.

    4. ເພື່ອເຮັດການປ່ຽນແປງຊອດໂຄດເຄີເນີນດ້ວຍຕົວທ່ານເອງ, ໃຫ້ດຶງຊອດໂຄດເຄີເນີນສຳລັບແບຣນຊ໌ dist-git ປັດຈຸບັນດ້ວຍ fedpkg sources, ຈາກນັ້ນເຮັດການປ່ຽນແປງຕາມທີ່ຕ້ອງການ ແລະ ສ້າງແພັດຊ໌, ຕົວຢ່າງດ້ວຍ diff -rupN kernel_src_folder kernel_src_folder_patched > mypatch.patch. ຈາກນັ້ນສາມາດເພີ່ມແພັດຊ໌ເຂົ້າໃນ linux-kernel-test.patch ຫຼື ໄຟລ໌ spec ໄດ້.

  4. ສ້າງໄຟລ໌ RPMs:

    $ fedpkg local
  5. ຕິດຕັ້ງເຄີເນີນໃໝ່:

    $ sudo dnf install --nogpgcheck ./x86_64/kernel-$version.rpm

ການສ້າງເຄີເນີນຕົ້ນສະບັບ (Vanilla upstream kernel)

ບາງຄັ້ງນັກພັດທະນາ Fedora ອາດຈະຂໍໃຫ້ທ່ານລອງສ້າງ ແລະ ຕິດຕັ້ງເຄີເນີນຕົ້ນທາງ (upstream kernel) (ອາດຈະມີການເພີ່ມແພັດຊ໌) ເພື່ອທົດສອບ. ຫາກມີການທົດສອບຫຼາຍຄັ້ງ, ການທີ່ທ່ານເຮັດເອງອາດຈະໄວກວ່າການລໍຖ້ານັກພັດທະນາສ້າງໄຟລ໌ RPM ຫຼາຍໆລຸ້ນ.

ໃນຂະນະນີ້ກຳລັງມີຄວາມພະຍາຍາມໃນການເຮັດແພັກເກດເຄີເນີນແບບ vanilla. ລອງເບິ່ງວ່າມັນກົງກັບຄວາມຕ້ອງການຂອງທ່ານກ່ອນຫຼືບໍ່

ການດຶງຊອດໂຄດ (Sources)

ໂຄລນ (Clone) ເຄີເນີນທຣີ ຈາກ kernel.org. ຫາກທ່ານບໍ່ຮູ້ວ່າຕ້ອງໃຊ້ທຣີໃດ, ທ່ານຄວນໃຊ້ທຣີຂອງ Linus:

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
$ cd linux

ທ່ານອາດຈະຕ້ອງການສະເຕເບິລທຣີ (stable tree) (ລຸ້ນ 4.y.z), ເຊິ່ງທ່ານສາມາດເພີ່ມໄດ້ດ້ວຍ:

$ git remote add -f stable git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

ການຕິດຕັ້ງແພັດຊ໌

ເພື່ອຕິດຕັ້ງໄຟລ໌ແພັດຊ໌, ທ່ານສາມາດໃຊ້ git-am:

$ git am -3 <patch file>

ການຕັ້ງຄ່າເຄີເນີນ

ຫາກນັກພັດທະນາໄດ້ແນະນຳໄຟລ໌ config ສະເພາະໃຫ້ໃຊ້, ໃຫ້ບັນທຶກມັນໄວ້ໃນໄດເຣັກທໍຣີ linux ດ້ວຍຊື່ໄຟລ໌ .config

ບໍ່ດັ່ງນັ້ນ, ທ່ານຈະຕ້ອງເລືອກໄຟລ໌ການຕັ້ງຄ່າເພື່ອເລີ່ມຕົ້ນ. ເຄີເນີນຂອງ Linux ມີຕົວເລືອກການຕັ້ງຄ່າເປັນພັນໆຢ່າງ, ດັ່ງນັ້ນທ່ານຄົງບໍ່ຢາກເລີ່ມຕົ້ນໃໝ່ທັງໝົດ ຍົກເວັ້ນແຕ່ວ່າທ່ານຮູ້ໃນສິ່ງທີ່ກຳລັງເຮັດຢູ່.

ເລີ່ມຕົ້ນຈາກການຕັ້ງຄ່າຂອງເຄີເນີນທີ່ຕິດຕັ້ງແລ້ວ

ຫາກທ່ານຕ້ອງການປັບແຕ່ງການຕັ້ງຄ່າຂອງເຄີເນີນທີ່ທ່ານໄດ້ຕິດຕັ້ງໄວ້ແລ້ວ, ທ່ານສາມາດເລີ່ມຕົ້ນດ້ວຍການຕັ້ງຄ່າຂອງມັນເຊິ່ງຖືກເກັບໄວ້ໃນ /boot/. ຕົວຢ່າງ, ເພື່ອເລີ່ມຕົ້ນດ້ວຍການຕັ້ງຄ່າຂອງເຄີເນີນທີ່ກຳລັງເຮັດວຽກຢູ່ໃນປັດຈຸບັນ:

$ cp /boot/config-`uname -r`* .config

ເລີ່ມຕົ້ນຈາກ dist-git

ຫາກທ່ານຕ້ອງການໃຊ້ການຕັ້ງຄ່າສຳລັບເຄີເນີນທີ່ທ່ານບໍ່ໄດ້ຕິດຕັ້ງໄວ້, ທ່ານສາມາດເອົາການຕັ້ງຄ່າຈາກຄັງເກັບ Fedora dist-git. ຕົວຢ່າງ, ເພື່ອເລີ່ມຕົ້ນດ້ວຍການຕັ້ງຄ່າ Rawhide ຫຼ້າສຸດ:

$ cd <dist-git directory>
$ git checkout rawhide
$ ./generate_all_configs.sh # Ensure the latest configuration files are generated
$ cp kernel-<arch>.config <linux kernel directory>.config

ລຸ້ນດີບັກ (debug) ຂອງໄຟລ໌ການຕັ້ງຄ່າຈະຢູ່ໃນ kernel-<arch>-debug.config ຫາກທ່ານຕ້ອງການສ້າງເຄີເນີນທີ່ມີການເປີດໃຊ້ຕົວເລືອກການດີບັກ.

ການປ່ຽນແປງການຕັ້ງຄ່າ

ມີຫຼາຍວິທີໃນການປ່ຽນແປງການຕັ້ງຄ່າ. ທ່ານສາມາດຣັນ make help ແລະ ເບິ່ງທີ່ Configuration targets ສຳລັບລາຍການທັງໝົດ, ແຕ່ make menuconfig ເປັນບ່ອນເລີ່ມຕົ້ນທີ່ດີ. ທ່ານຍັງສາມາດແກ້ໄຂໄຟລ໌ .config ໂດຍກົງໄດ້ເລີຍ.

ຕົວເລືອກການຕັ້ງຄ່າໜຶ່ງທີ່ທ່ານອາດຈະຕ້ອງການກຳນົດຄື CONFIG_MODULE_COMPRESS, ເຊິ່ງຈະບີບອັດໂມດູນ (ດ້ວຍ gzip ໂດຍຄ່າເລີ່ມຕົ້ນ) ເມື່ອຕິດຕັ້ງພວກມັນ. ຫາກບໍ່ມີການຕັ້ງຄ່ານີ້, ໂມດູນອາດຈະມີຂະໜາດໃຫຍ່ຫຼາຍ.

ການສ້າງເຄີເນີນ

ເມື່ອທ່ານຕັ້ງຄ່າເຄີເນີນແລ້ວ, ທ່ານກໍ່ພ້ອມທີ່ຈະສ້າງມັນ. ກ່ອນຈະເຮັດແນວນັ້ນ, ທ່ານຄວນປ່ຽນ EXTRAVERSION ໃນ Makefile ໃຫ້ເປັນສິ່ງທີ່ທ່ານຈະຈື່ໄດ້ໃນພາຍຫຼັງ. ຕົວຢ່າງ, ຫາກມັນຂຽນວ່າ EXTRAVERSION = -rc5 ໃຫ້ປ່ຽນເປັນ EXTRAVERSION = -rc5-dave:

$ $EDITOR Makefile

ດຽວນີ້ທ່ານພ້ອມທີ່ຈະສ້າງເຄີເນີນແລ້ວ:

$ make oldconfig
$ make bzImage
$ make modules

ການຕິດຕັ້ງເຄີເນີນ

ການຕິດຕັ້ງເຄີເນີນແມ່ນງ່າຍໆພຽງແຕ່:

$ sudo make modules_install
$ sudo make install

ການສ້າງຄືນໃໝ່

ຫາກທ່ານຖືກຂໍໃຫ້ລອງເຮັດຫຼາຍຢ່າງທີ່ແຕກຕ່າງກັນ, ຂັ້ນຕອນຫຼັງຈາກທີ່ທ່ານໄດ້ສ້າງທຣີໄປແລ້ວຄັ້ງໜຶ່ງ ສ່ວນຫຼາຍແມ່ນຈະຄືເກົ່າ. ແນະນຳໃຫ້ຣັນ make clean ລະຫວ່າງການສ້າງແຕ່ລະຄັ້ງ. ສິ່ງນີ້ຈະຍັງເກັບ .config ໄວ້ຄືເກົ່າ, ດັ່ງນັ້ນທ່ານສາມາດຂ້າມຂັ້ນຕອນນັ້ນໄປ ແລະ ໄປຫາສ່ວນ make bzImage ໄດ້ເລີຍ. ເນື່ອງຈາກພວກເຮົາໄດ້ຕິດຕັ້ງ ccache ໃນຂັ້ນຕອນທຳອິດ, ການສ້າງໃນຄັ້ງຕໍ່ໆໄປອາດຈະໄວຂຶ້ນຫຼາຍ ເພາະຄອມໄພເລີ (compiler) ຈະບໍ່ຕ້ອງສ້າງໄຟລ໌ທີ່ບໍ່ມີການປ່ຽນແປງຄືນໃໝ່.

ການລຶບໄຟລ໌ທີ່ບໍ່ຈຳເປັນ (Cleaning up)

ເມື່ອທ່ານໄດ້ທົດສອບເຄີເນີນແລ້ວ, ແລະ ໄດ້ບູດເຄື່ອງກັບຄືນໄປຫາເຄີເນີນທີ່ຕິດຕັ້ງຈາກ RPM ແລ້ວ, ທ່ານສາມາດລຶບໄຟລ໌ຕ່າງໆທີ່ຕິດຕັ້ງຈາກຂັ້ນຕອນຂ້າງເທິງນັ້ນອອກໄດ້.

ເມື່ອຣັນຄຳສັ່ງຕໍ່ໄປນີ້, ໃຫ້ແນ່ໃຈວ່າທ່ານເລືອກລຸ້ນຂອງເຄີເນີນໄດ້ຢ່າງຖືກຕ້ອງ!

ເນື່ອງຈາກທ່ານໄດ້ປ່ຽນ EXTRAVERSION ໃນ Makefile ເພື່ອເພີ່ມ 'ແທັກ (tag)', ໄຟລ໌ທັງໝົດທີ່ຕິດຕັ້ງໄປຈະມີສິ່ງນີ້ເປັນສ່ວນໜຶ່ງຂອງຊື່ໄຟລ໌. ດັ່ງນັ້ນ ທ່ານຄວນຈະສາມາດໃຊ້ wildcards ເພື່ອລຶບພວກມັນໄດ້ຢ່າງປອດໄພໂດຍໃຊ້ຄຳສັ່ງທີ່ຄ້າຍຄືກັບຂ້າງລຸ່ມນີ້ (ພຽງແຕ່ປ່ຽນ 'dave' ເປັນແທັກທີ່ທ່ານເລືອກ):

$ sudo rm -f /boot/config-*dave* /boot/initramfs-*dave* /boot/vmlinuz-*dave* /boot/System.map-*dave*
$ sudo rm -rf /lib/modules/*dave*

ສຸດທ້າຍ, ທ່ານຈະຕ້ອງເອົາເຄີເນີນນັ້ນອອກຈາກຕົວເລືອກໃນ bootloader. ສົມມຸດວ່າລະບົບຂອງທ່ານໃຊ້ grub2, ສິ່ງນີ້ສາມາດເຮັດໄດ້ໂດຍການລຶບລາຍການ bootloader specification ແລະ ສ້າງການຕັ້ງຄ່າ grub ໃໝ່:

$ sudo rm -f /boot/loader/entries/*dave*
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg