วิธีอัปเดตเคอร์เนล Android เป็น Linux ล่าสุดที่เสถียร
เราได้ครอบคลุมแนวทางเกี่ยวกับเคอร์เนลของ Android เช่น "วิธีสร้างเคอร์เนลที่กำหนดเอง" และ "เคอร์เนลที่กำหนดเองที่ดีที่สุดสำหรับ Android" แต่วันนี้เราจะแสดงวิธีอัปสตรีมเคอร์เนลของคุณกับ Linux เสถียรล่าสุด
โปรดทราบว่านี่คือสิ่ง ขั้นสูง - หากคุณไม่เคยรวบรวมเคอร์เนลมาก่อนคุณควรทำตามคำแนะนำ "วิธีสร้างเคอร์เนลที่กำหนดเอง" ที่ลิงก์ด้านบนและคู่มือนี้จะเกี่ยวข้องกับการรวบรวมเชอร์รี่และคอมมิชชันจาก Linux ล่าสุด - เคอร์เนลที่เสถียรกับเคอร์เนล Android ของคุณก่อนที่คุณจะรวบรวม
การอัปเกรดเคอร์เนล Android ของคุณไปยัง Linux ล่าสุดจะมีประโยชน์มากมายเช่นการอัพเดทความปลอดภัยและข้อผิดพลาดล่าสุด - เราจะอธิบายข้อดีและข้อเสียบางอย่างในคู่มือนี้
เคอร์เนล Linux-Stable คืออะไร
Linux-stable ตามชื่อหมายถึงเป็นแขนที่มั่นคงของเคอร์เนล Linux แขนอีกข้างเรียกว่า "ฉีด" ซึ่งเป็น แขนงหลัก การพัฒนาเคอร์เนล Linux ทั้งหมดเกิดขึ้นในการฉีดและโดยทั่วไปจะทำตามกระบวนการนี้:
- Linus Torvalds จะหยิบของปะจากผู้ดูแลของเขาเป็นเวลาสองสัปดาห์
- หลังจากสองสัปดาห์นี้เขาจะปล่อยเคอร์เนล rc1 (เช่น 4.14-rc1)
- สำหรับแต่ละสัปดาห์สำหรับ 6-8 สัปดาห์ถัดไปเขาจะปล่อยเคอร์เนล RC (เช่น 4.14-rc2, 4.14-rc3 และอื่น ๆ ) ซึ่งมีเฉพาะการแก้ไขข้อบกพร่องและการถดถอยเท่านั้น
- เมื่อถือว่ามีเสถียรภาพแล้วจะมีการเปิดตัวเป็น tarball สำหรับดาวน์โหลดในองค์กร (เช่น 4.14)
เมล็ด LTS คืออะไร?
ทุกปี Greg จะเลือกเคอร์เนลหนึ่งตัวและเก็บรักษาไว้เป็นเวลาสองปี (LTS) หรือหกปี (Extended LTS) สิ่งเหล่านี้ได้รับการออกแบบให้มีผลิตภัณฑ์ที่ต้องการความเสถียร (เช่นโทรศัพท์ Android หรืออุปกรณ์ IOT อื่น ๆ ) กระบวนการนี้เป็นแบบเดียวกันกับที่กล่าวไว้ข้างต้นมันเพิ่งเกิดขึ้นเป็นเวลานาน ปัจจุบันมีเมล็ด LTS หกเมล็ด (ซึ่งสามารถดูได้ในหน้าเผยแพร่ kernel.org):
- 4.14 (LTS) ดูแลโดย Greg Kroah-Hartman
- 4.9 (LTS), ดูแลโดย Greg Kroah-Hartman
- 4.4 (eLTS) ดูแลโดย Greg Kroah-Hartman
- 4.1 (LTS) ดูแลโดย Sasha Levin
- 3.16 (LTS) ดูแลโดย Ben Hutchings
- 3.2 (LTS) ดูแลโดย Ben Hutchings
การอัปเกรดเคอร์เนล Android ของฉันไปยัง Linux Stable มีประโยชน์อย่างไร
เมื่อมีการเปิดเผย / แก้ไขช่องโหว่ที่สำคัญเมล็ดที่เสถียรจะเป็นช่องโหว่แรกที่ได้รับ ดังนั้นเคอร์เนล Android ของคุณจะปลอดภัยมากขึ้นจากการโจมตีข้อบกพร่องด้านความปลอดภัยและข้อบกพร่องโดยทั่วไป
Linux เสถียรรวมถึงการแก้ไขสำหรับไดรเวอร์จำนวนมากที่อุปกรณ์ Android ของฉันไม่ได้ใช้มันไม่จำเป็นเลยใช่มั้ย
ใช่และไม่ขึ้นอยู่กับว่าคุณให้นิยาม“ ส่วนใหญ่” เคอร์เนล Linux อาจมีรหัสจำนวนมากที่ไม่ได้ใช้ในระบบ Android แต่ไม่รับประกันว่าจะไม่มีความขัดแย้งจากไฟล์เหล่านั้นเมื่อทำการผสานเวอร์ชันใหม่! เข้าใจว่าแทบ ไม่มีใคร สร้างส่วนของเคอร์เนลได้แม้แต่แม้แต่ลินุกซ์ distros ทั่วไปเช่น Ubuntu หรือ Mint นี่ไม่ได้หมายความว่าคุณไม่ควรทำการแก้ไขเหล่านี้เพราะมีการแก้ไขสำหรับไดรเวอร์ที่คุณรัน ยกตัวอย่างเช่น arm / arm64 และ ext4 ซึ่งเป็นสถาปัตยกรรม Android ที่พบมากที่สุดและระบบไฟล์ตามลำดับ ใน 4.4 จาก 4.4.78 (เวอร์ชันของแท็ก Oreo CAF ล่าสุด) ถึง 4.4.121 (แท็กอัปสตรีมล่าสุด) นี่คือตัวเลขต่อไปนี้สำหรับการกระทำของระบบเหล่านั้น:
~ / kernels / linux-stable (master) บันทึก $ git - รูปแบบ =% h v4.4.78..v4.4.121 | wc -l2285 ~ / kernels / linux-stable (master) บันทึก $ git - รูปแบบ =% h v4.4.78..v4.4.121 arch / arm | wc -l58 ~ / kernels / linux-stable (master) บันทึก $ git - รูปแบบ =% h v4.4.78..v4.4.121 arch / arm64 | wc -l22 ~ / kernels / linux-stable (หลัก) บันทึก $ git - รูปแบบ =% h v4.4.78..v4.4.121 fs / ext4 | ห้องสุขา -l18
ส่วนที่ใช้เวลามากที่สุดคือการเริ่มต้นทำงาน เมื่อคุณได้รับข้อมูลล่าสุดแล้วก็ไม่ต้องใช้เวลาในการรวมเข้ากับรีลีสใหม่ซึ่งมักจะมีการคอมมิทไม่เกิน 100 คอมมิท ประโยชน์ที่จะได้รับ (เสถียรภาพมากขึ้นและความปลอดภัยที่ดีขึ้นสำหรับผู้ใช้ของคุณ) ควรทำให้กระบวนการนี้มีความจำเป็น
วิธีผสานเคอร์เนล Linux เสถียรเข้ากับเคอร์เนล Android
ก่อนอื่นคุณต้องหาว่ารุ่นใดที่เคอร์เนลอุปกรณ์ Android ของคุณใช้งานอยู่
เป็นเรื่องเล็กน้อยอย่างที่เห็นมันเป็นสิ่งจำเป็นที่จะต้องรู้ว่าคุณต้องเริ่มจากตรงไหน รันคำสั่งต่อไปนี้ในแผนผังเคอร์เนลของคุณ:
ทำ kernelversion
มันจะส่งคืนเวอร์ชันที่คุณใช้อยู่ ตัวเลขสองตัวแรกจะถูกนำมาใช้เพื่อหาสาขาที่คุณต้องการ (เช่น linux-4.4.y สำหรับเคอร์เนล 4.4) และหมายเลขสุดท้ายจะถูกใช้เพื่อกำหนดเวอร์ชันที่คุณต้องการเริ่มต้นด้วยการผสาน (เช่นถ้าคุณใช้ 4.4 .21 คุณจะรวม 4.4.22 ต่อไป)
คว้าแหล่งเคอร์เนลล่าสุดจาก kernel.org
kernel.org เป็นแหล่งของเคอร์เนลล่าสุดในที่เก็บ linux-stable ที่ด้านล่างของหน้านั้นจะมีลิงค์ดึงข้อมูลอยู่สามลิงก์ จากประสบการณ์ของฉันกระจกของ Google มีแนวโน้มที่จะเร็วที่สุด แต่ผลลัพธ์ของคุณอาจแตกต่างกันไป รันคำสั่งต่อไปนี้:
git remote เพิ่ม linux-stable //kernel.googlesource.com/pub/scm/linux/kernel/git/stable/linux-stable.gitgit ดึง linux-stable
ตัดสินใจว่าคุณต้องการรวมเคอร์เนลทั้งหมดหรือเลือกเชอร์รี่
ถัดไปคุณจะต้องเลือกถ้าคุณต้องการรวมการกระทำหรือเชอร์รี่เลือก นี่คือข้อดีข้อเสียของแต่ละคนและเมื่อคุณอาจต้องการที่จะทำ
หมายเหตุ: หากแหล่งเคอร์เนลของคุณอยู่ในรูปแบบของ tarball ส่วนใหญ่คุณจะต้องเลือกรับไม่เช่นนั้นคุณจะได้รับความขัดแย้งหลายพันไฟล์เนื่องจาก git กำลังเติมประวัติตามทางต้นน้ำไม่ใช่ OEM หรือ CAF การเปลี่ยนแปลง เพียงข้ามไปขั้นตอนที่ 4
เชอร์รี่แคะ:
ข้อดี:
- ง่ายขึ้นในการแก้ไขข้อขัดแย้งตามที่คุณทราบแน่ชัดว่าความขัดแย้งใดที่ทำให้เกิดปัญหา
- ง่ายต่อการรีบูตเนื่องจากการส่งแต่ละครั้งจะดำเนินการด้วยตนเอง
- ง่ายต่อการแบ่งออกเป็นสองส่วนหากพบปัญหา
จุดด้อย:
- ใช้เวลานานกว่าที่แต่ละการส่งมอบจะต้องเลือกทีละรายการ
- ยากขึ้นอีกเล็กน้อยที่จะบอกได้ว่าการกระทำนั้นมาจากต้นน้ำเมื่อมองแวบแรก
ผสาน
ข้อดี :
- มันเร็วกว่าที่คุณไม่ต้องรอให้แผ่นสะอาดทั้งหมดรวมเข้าด้วยกัน
- มันง่ายกว่าที่จะเห็นว่าการกระทำนั้นมาจากต้นน้ำเพราะคุณจะไม่ใช่ผู้มุ่งมั่นผู้ดูแลต้นน้ำจะเป็น
จุดด้อย:
- การแก้ไขข้อขัดแย้งอาจเป็นเรื่องยากขึ้นเล็กน้อยเนื่องจากคุณจะต้องค้นหาว่าการกระทำใดก่อให้เกิดความขัดแย้งโดยใช้การตำหนิ git log / git มันจะไม่บอกคุณโดยตรง
- การรีบูทเป็นเรื่องยากเนื่องจากคุณไม่สามารถรีบูตการผสานได้มันจะเสนอให้เลือกการกระทำทั้งหมดเป็นรายบุคคล อย่างไรก็ตามคุณไม่ควรทำการรีบูตบ่อยครั้งแทนที่จะใช้ git revert และ git merge เมื่อเป็นไปได้
ฉันขอแนะนำให้ทำ Cherry-pick เพื่อหาข้อขัดแย้งของปัญหาใด ๆ ในตอนแรกทำการผสานจากนั้นจึงย้อนกลับปัญหาที่เกิดขึ้นหลังจากนั้นเพื่อให้การอัปเดตนั้นง่ายขึ้น (การผสานนั้นเร็วขึ้นหลังจากอัปเดตเป็นปัจจุบัน)
เพิ่มคอมมิชชันลงในแหล่งที่มาของคุณทีละหนึ่งเวอร์ชัน
ส่วนที่สำคัญที่สุดของกระบวนการนี้คือรุ่นหนึ่งในเวลาส่วนหนึ่ง อาจมีปัญหาในซีรีย์อัปสตรีมของคุณซึ่งอาจทำให้เกิดปัญหากับการบูทหรือทำลายบางอย่างเช่นเสียงหรือการชาร์จ (อธิบายไว้ในส่วนเคล็ดลับและลูกเล่น) การทำการเปลี่ยนแปลงรุ่นเพิ่มเติมนั้นมีความสำคัญสำหรับเหตุผลนี้ทำให้ง่ายต่อการค้นหาปัญหาใน 50 คอมมิทมากกว่าการคอมมิทรุ่นขึ้นไป 2000 ครั้งสำหรับบางเวอร์ชั่น ฉันอยากจะแนะนำให้ทำการผสานอย่างสมบูรณ์เมื่อคุณรู้ว่าปัญหาทั้งหมดกระทำและการแก้ไขข้อขัดแย้ง
เชอร์รี่แคะ
รูปแบบ:
คอมไพล์เชอร์รี่เลือก ..
ตัวอย่าง:
git cherry-pick v3.10.73..v3.10.74
ผสาน
รูปแบบ:
คอมไพล์ผสาน
ตัวอย่าง:
git merge v3.10.74
ฉันขอแนะนำให้ติดตามความขัดแย้งในการรวมการกระทำโดยการลบเครื่องหมาย # ออก
วิธีแก้ไขความขัดแย้ง
เราไม่สามารถให้คำแนะนำทีละขั้นตอนเพื่อแก้ไขความขัดแย้งทุกอย่างเนื่องจากเกี่ยวข้องกับความรู้ภาษา C ที่ดี แต่นี่เป็นคำแนะนำเล็กน้อย
หากคุณกำลังรวมกันให้คิดว่าการกระทำใดก่อให้เกิดความขัดแย้ง คุณสามารถทำหนึ่งในสองวิธีนี้:
- git log -pv $ (สร้างเคอร์เนล) เพื่อรับการเปลี่ยนแปลงระหว่างเวอร์ชันปัจจุบันของคุณกับเวอร์ชันล่าสุดจาก upstream แฟล็ก -p จะให้การเปลี่ยนแปลงที่คุณทำโดยแต่ละคอมมิทเพื่อที่คุณจะได้เห็น
- เรียกใช้การคอมไพล์ตำหนิในไฟล์เพื่อรับการแฮชของการคอมมิทแต่ละครั้งในพื้นที่ จากนั้นคุณสามารถเรียกใช้ git show –format = fuller เพื่อดูว่าคอมมิชชันนั้นมาจากการฉีด / เสถียร, Google หรือ CodeAurora
- คิดออกว่าคุณมีความมุ่งมั่นแล้ว ผู้ค้าบางรายเช่น Google หรือ CAF จะพยายามค้นหาข้อบกพร่องที่สำคัญเช่นการแก้ไข Dirty COW และ backport ของพวกเขาอาจขัดแย้งกับของ upstream คุณสามารถเรียกใช้ git log –grep =”” และดูว่ามันส่งคืนอะไรหรือไม่ ถ้าเป็นเช่นนั้นคุณสามารถข้ามการกระทำ (ถ้าการหยิบเชอร์รี่โดยใช้การรีเซ็ต git - ฮาร์ด && git การเลือกเชอร์รี่ - ต่อเนื่อง) หรือละเว้นข้อขัดแย้ง (ลบ <<<<< >>>>>)
- คิดออกว่ามี backport ที่ messing up ความละเอียด Google และ CAF ต้องการ backport แพทช์บางอย่างที่ไม่น่าเชื่อถือ เสถียรมักจะต้องปรับความละเอียดของการฉีดเพื่อให้ได้มาซึ่งความไม่แน่นอนของ patch ที่ Google เลือกที่จะ backport คุณสามารถดูการกระทำการฉีดได้โดยการรันการแสดง git (แฮชการฉีดจะพร้อมใช้งานในข้อความการส่งข้อความของการส่งข้อมูลที่มีเสถียรภาพ) หากมี backport messing มันขึ้นคุณสามารถยกเลิกการเปลี่ยนแปลงหรือคุณสามารถใช้รุ่น mainline (ซึ่งเป็นสิ่งที่คุณมักจะต้องทำ)
- อ่านสิ่งที่ผู้มอบอำนาจพยายามทำและดูว่าปัญหาได้รับการแก้ไขแล้วหรือไม่ บางครั้ง CAF อาจแก้ไขข้อผิดพลาดที่เป็นอิสระจาก upstream ซึ่งหมายความว่าคุณสามารถเขียนทับการแก้ไขของพวกเขาสำหรับ upstream's หรือละทิ้งมันเช่นด้านบน
ไม่เช่นนั้นอาจเป็นผลมาจากการเพิ่ม CAF / Google / OEM ซึ่งในกรณีนี้คุณต้องสลับบางสิ่งรอบ ๆ
นี่เป็นภาพสะท้อนของพื้นที่เก็บข้อมูล kernel.org ที่มีเสถียรภาพของ linux บน GitHub ซึ่งสามารถค้นหารายการคอมมิตและการแก้ไขข้อขัดแย้งได้ง่ายขึ้น ฉันขอแนะนำให้ไปที่มุมมองรายการยอมรับก่อนและค้นหาปัญหาที่กระทำเพื่อดู diff ต้นฉบับเพื่อเปรียบเทียบกับของคุณ
ตัวอย่าง URL: //github.com/nathanchance/linux-stable/commits/linux-3.10.y/arch/arm64/mm/mmu.c
คุณยังสามารถทำได้ผ่านบรรทัดคำสั่ง:
git log .. git show
การแก้ปัญหาคือทั้งหมดที่เกี่ยวกับบริบท สิ่งที่คุณควรทำเสมอคือทำให้แน่ใจว่า diff สุดท้ายของคุณตรงกับ upstream โดยเรียกใช้คำสั่งต่อไปนี้ในหน้าต่างแยกสองหน้าต่าง:
git diff HEAD git diff v $ (ทำเคอร์เนลรุ่น) .. $ (แท็ก git --sort = -taggerdate -lv $ (ทำ kernelversion | cut -d. -f 1, 2) * | head -n1)
เปิดใช้งานการทำซ้ำ
Git มีคุณสมบัติที่เรียกว่า rerere (ย่อมาจาก Reuse Recorded Resolution) ซึ่งหมายความว่าเมื่อตรวจพบข้อขัดแย้งมันจะบันทึกวิธีที่คุณแก้ไขมันเพื่อให้คุณสามารถนำกลับมาใช้ใหม่ได้ในภายหลัง สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับทั้งผู้รีบาวด์เรื้อรังที่มีทั้งการรวมและการเลือกเชอร์รี่เนื่องจากคุณจะต้องเพิ่มคอมไพล์ && git - หยุดเมื่อทำการ redupup ของอัปสตรีมเนื่องจากความขัดแย้งจะได้รับการแก้ไขวิธีที่คุณแก้ไขก่อนหน้านี้
มันสามารถเปิดใช้งานโดยการเรียกใช้คำสั่งต่อไปนี้ใน repo เคอร์เนลของคุณ:
git config rerere.enabled จริง
วิธีการคอมไพล์ทวิตเมื่อทำงานเป็นคอมไพเลอร์หรือข้อผิดพลาดรันไทม์
เนื่องจากคุณจะเพิ่มจำนวนการคอมมิทที่มากพอคุณสามารถแนะนำคอมไพเลอร์หรือข้อผิดพลาดรันไทม์ได้ แทนที่จะยอมแพ้คุณสามารถใช้เครื่องมือ bisect ในตัวเพื่อหาสาเหตุของปัญหาได้! เป็นการดีที่คุณจะสร้างและกระพริบทุกเคอร์เนลเวอร์ชันเดียวตามที่คุณเพิ่มมันการตัดจะใช้เวลาน้อยลงหากจำเป็น แต่คุณสามารถแบ่งออกได้ 5, 000 commits โดยไม่มีปัญหาใด ๆ
สิ่งที่ gis bisect จะทำคือใช้ช่วงของการคอมมิชชันจากที่มีปัญหาไปยังที่ที่ไม่ได้อยู่จากนั้นเริ่มครึ่งช่วงคอมมิชชันที่อนุญาตให้คุณสร้างและทดสอบและแจ้งให้ทราบว่าดีหรือไม่ . มันจะดำเนินการต่อไปจนกว่าจะแยกการกระทำที่ทำให้เกิดปัญหาของคุณ ณ จุดนี้คุณสามารถแก้ไขได้หรือย้อนกลับ
- เริ่มต้นแบ่งครึ่ง: เริ่มต้นแบ่งครึ่ง
- ติดป้ายการแก้ไขปัจจุบันว่าไม่ดี: คอมไพล์ไม่ดี
- ติดป้ายการแก้ไขว่าดี: คอมไพล์ดี
- สร้างด้วยการแก้ไขใหม่
- ขึ้นอยู่กับผลลัพธ์ (หากมีปัญหาหรือไม่) บอก git: git bisect ดีหรือ git bisect ไม่ดี
- ล้างและทำซ้ำขั้นตอนที่ 4-5 จนกระทั่งพบปัญหาการส่ง!
- ย้อนกลับหรือแก้ไขปัญหาการมอบหมาย
หมายเหตุ: การควบรวมกิจการจะต้องเรียกใช้ git rebase -i ชั่วคราวเพื่อนำ patch ทั้งหมดไปใช้กับสาขาของคุณเพื่อทำการตัดที่เหมาะสมเนื่องจากการตัดกับการรวมในสถานที่นั้นมักจะมีการชำระเงินครั้งเดียวกับคอมมิชชัน upstream ซึ่งหมายความว่า ฉันสามารถพูดคุยเกี่ยวกับเรื่องนี้ได้ลึกกว่านี้ตามที่ขอ แต่เชื่อฉันเป็นสิ่งจำเป็น เมื่อคุณระบุปัญหาที่กระทำแล้วคุณสามารถย้อนกลับหรือทำการรีบูตเป็นการผสานได้
อย่าสควอชอัปเดตอัปสตรีม
นักพัฒนาใหม่จำนวนมากถูกล่อลวงให้ทำเช่นนี้เพราะ "สะอาด" และ "ง่ายขึ้น" ในการจัดการ นี่คือเหตุผลที่น่ากลัวด้วยเหตุผลบางประการ:
- การประพันธ์สูญหายไป มันไม่ยุติธรรมกับผู้พัฒนารายอื่นที่จะให้เครดิตกับงานของพวกเขา
- การตัดแบ่งเป็นไปไม่ได้ หากคุณสควอชชุดของการกระทำและสิ่งที่เป็นปัญหาในซีรีส์นั้นมันเป็นไปไม่ได้ที่จะบอกได้ว่าการกระทำที่ก่อให้เกิดปัญหาในสควอช
- การเลือกเชอร์รี่ในอนาคตนั้นยากกว่า หากคุณต้องการรีบูตด้วยซีรี่ส์ที่ถูกแบนมันเป็นเรื่องยาก / เป็นไปไม่ได้ที่จะบอกได้ว่าความขัดแย้งนั้นมาจากไหน
สมัครสมาชิกลิสต์การส่งเมลเคอร์เนลเพื่อรับการอัพเดททันเวลา
เพื่อรับการแจ้งเตือนเมื่อใดก็ตามที่มีการอัปเดตอัปสตรีมให้สมัครสมาชิกรายการ linux-kernel-ประกาศ วิธีนี้จะช่วยให้คุณได้รับอีเมลทุกครั้งที่เคอร์เนลใหม่ถูกปล่อยออกมาเพื่อให้คุณสามารถอัปเดตและพุชได้อย่างรวดเร็วที่สุด