การผสานที่เสถียรของ Linux

ทุกๆ วันมีการเปลี่ยนแปลงจำนวนมากเกิดขึ้นกับเคอร์เนลอัปสตรีม Linux โดยทั่วไปการเปลี่ยนแปลงเหล่านี้ไม่ได้รับการประเมินผลกระทบด้านความปลอดภัย แต่การเปลี่ยนแปลงส่วนใหญ่มีแนวโน้มที่จะส่งผลกระทบต่อความปลอดภัยของเคอร์เนล การประเมินการเปลี่ยนแปลงแต่ละครั้งสำหรับผลกระทบด้านความปลอดภัยถือเป็นการดำเนินการที่มีราคาแพงและมีแนวโน้มว่าจะเป็นไปไม่ได้ แนวทางที่ยั่งยืนและบำรุงรักษาได้ดีกว่าคือการซิงค์การเปลี่ยนแปลงกับเคอร์เนลอัพสตรีม Linux เป็นประจำ

ขอแนะนำให้อัปเดตอุปกรณ์เป็นประจำด้วยเคอร์เนล Long Term Supported (LTS) ที่ใหม่กว่า การอัปเดต LTS เป็นประจำสามารถช่วยแก้ไขช่องโหว่ด้านความปลอดภัยที่อาจไม่รู้จักได้ เช่น รายงาน Project Zero นี้ ตั้งแต่ต้นปี 2019 ก่อนที่ผู้ไม่ประสงค์ดีจะเปิดเผยหรือค้นพบต่อสาธารณะ

ข้อกำหนดเบื้องต้น

  • สาขาเคอร์เนลทั่วไปของ Android (จาก AOSP)
  • สาขาการจัดเตรียม LTS ผสานสำหรับเคอร์เนลอุปกรณ์เป้าหมาย
  • สาขาการเผยแพร่เคอร์เนลของอุปกรณ์
  • Git repo
  • Toolchain สร้างเคอร์เนล

ผสานกับการเปลี่ยนแปลง LTS

การรวมการเปลี่ยนแปลง LTS
รูปที่ 1 : การรวมการเปลี่ยนแปลง LTS

ขั้นตอนต่อไปนี้สรุปขั้นตอนทั่วไปสำหรับการผสาน LTS

  • ผสานสาขาการเผยแพร่เคอร์เนลเป้าหมายกลับเข้าไปในสาขาการจัดเตรียม -LTS
  • ผสาน linux-stable หรือ Android ทั่วไปเข้ากับสาขา -LTS staging
  • แก้ไขข้อขัดแย้งในการผสาน (ปรึกษาพื้นที่/เจ้าของรหัสตามความจำเป็น)
  • สร้างในพื้นที่และดำเนินการทดสอบสุขภาพ/หน่วย (ดูหัวข้อการทดสอบด้านล่าง)
  • อัปโหลดและรวมการเปลี่ยนแปลงทั่วไปของ Android เข้ากับสาขาการแสดงละครของ LTS
  • ทดสอบอย่างละเอียดโดยใช้สาขาการจัดเตรียม -LTS (ดูส่วนการทดสอบด้านล่าง)
  • ทบทวนผลการทดสอบ
  • จัดการกับการถดถอย แบ่งการผสานตามความจำเป็น
  • ผสานสาขาการจัดเตรียม -LTS เข้ากับสาขาการเผยแพร่เคอร์เนลของอุปกรณ์หลัก
  • สร้าง Android รุ่นใหม่สำหรับอุปกรณ์ของคุณที่มีเคอร์เนล LTS ชั่วคราว
  • คอมไพล์รีลีส build/ROM ด้วยเคอร์เนลใหม่

ตัวอย่างการรวมเข้ากับ LTS

รวม android-4.9 เข้ากับ main (ผ่านการจัดเตรียม LTS) และชำระเงินและซิงค์สาขาการแสดงละคร LTS:

repo init -b <Device kernel LTS staging branch>  # init
repo sync
git checkout -b lts <Device kernel LTS staging branch>
git merge <Device kernel release branch>         # back-merge
git commit

ณ จุดนี้ วิธีที่ดีที่สุดคือดันการผสานย้อนกลับไปยังรีโมตต้นทางของคุณก่อนที่จะดำเนินการต่อ หลังจากนั้นให้รวม Android ทั่วไปเข้ากับการแสดงละคร LTS

git merge -X patience android-4.9-q            # LTS merge

การแก้ไขข้อขัดแย้งในการผสาน

ในกรณีส่วนใหญ่ จะมีข้อขัดแย้งระหว่างเคอร์เนลทั่วไปของ Android และสาขาการแสดงละคร -LTS การแก้ไขข้อขัดแย้งในการผสานระหว่างการผสาน LTS อาจเป็นเรื่องที่ท้าทาย ดังนั้นเคล็ดลับที่เป็นประโยชน์บางประการในการแก้ไขข้อขัดแย้งด้านล่างนี้

การผสานกันแบบค่อยเป็นค่อยไป

หากผ่านไปเป็นเวลานานพอสมควรนับตั้งแต่เคอร์เนลของอุปกรณ์ได้รับการอัปเดตด้วย LTS ก็มีโอกาสที่ดีที่จะมีการเผยแพร่ที่เสถียรจำนวนมาก (>50) นับตั้งแต่การอัปเดตที่รวมครั้งล่าสุดถูกเผยแพร่ต้นทาง วิธีที่ดีที่สุดในการแก้ไขปัญหานี้คือค่อยๆ ไล่ตามให้ทันโดยรวมรุ่นต่างๆ ออกเป็นจำนวนน้อยลงในแต่ละครั้ง (<=5 เวอร์ชันรอง) ขณะทดสอบในแต่ละขั้นตอน

ตัวอย่างเช่น หากระดับย่อยของเวอร์ชันเคอร์เนลของอุปกรณ์คือ 4.14.100 และระดับย่อยที่เสถียรของอัปสตรีมคือ 4.14.155 วิธีที่ดีที่สุดคือรวมเข้าด้วยกันทีละน้อยเพื่อให้แน่ใจว่าสามารถตรวจสอบและทดสอบการเปลี่ยนแปลงในปริมาณที่เหมาะสมได้

โดยทั่วไป เราพบว่าการทำงานแบบค่อยเป็นค่อยไปในชุดการเผยแพร่ย่อย <=5 รายการต่อการผสานแต่ละครั้ง ช่วยให้มั่นใจได้ว่าชุดแพตช์จะจัดการได้ง่ายขึ้น

การทดสอบ

การทดสอบการบูตอย่างรวดเร็ว

หากต้องการดำเนินการทดสอบการบูตอย่างรวดเร็ว คุณต้องรวมการเปลี่ยนแปลง LTS ในเครื่องและสร้างเคอร์เนลก่อน
ขั้นตอนต่อไปนี้จะอธิบายกระบวนการทดสอบการบู๊ตแบบรวดเร็ว

เชื่อมต่ออุปกรณ์เป้าหมายเข้ากับคอมพิวเตอร์ของคุณโดยใช้สาย USB และกด .ko ไปยังอุปกรณ์โดยใช้ Android Debug Bridge (ADB)

adb root
adb disable-verity
adb reboot
(wait for device boot-to-home)
adb root
adb remount
adb push *.ko vendor/lib/modules/
adb reboot bootloader

บูต dtbo และไซด์โหลดอิมเมจเคอร์เนล

fastboot boot --header-version=2 Image.lz4 (redo again if device rebooted)

ตรวจสอบบันทึก /dev/kmsg เพื่อดูข้อผิดพลาด

adb shell
su
cat /dev/kmsg  (inspect kernel log for obvious new errors)

การทดสอบ Android

ขั้นแรกให้สร้างอิมเมจ -userdebug ภายในเครื่องด้วยเคอร์เนลและโมดูล LTS ใหม่

ตรวจสอบ /dev/kmsg เพื่อดูข้อผิดพลาดและยืนยันว่าไม่มีข้อผิดพลาดก่อนดำเนินการต่อ ทดสอบสิ่งต่อไปนี้เพื่อให้แน่ใจว่าทุกอย่างทำงานได้ตามที่คาดไว้

  • ความเร็วอินเตอร์เน็ตไร้สาย
  • เบราว์เซอร์ Chrome
  • จับภาพและวิดีโอด้วยแอพกล้องถ่ายรูป
  • การเล่นวิดีโอ YouTube ด้วยลำโพงในตัวและชุดหูฟัง Bluetooth
  • โทรผ่านเครือข่ายผู้ให้บริการ
  • แฮงเอาท์วิดีโอผ่าน Wi-Fi

ชุดทดสอบอัตโนมัติ

การตรวจสอบขั้นสุดท้ายเพื่อให้แน่ใจว่ารูปภาพผลิตภัณฑ์ไม่ถดถอยจะดำเนินการโดยใช้ชุดการทดสอบที่มีให้ผ่าน ชุดทดสอบของผู้จำหน่าย (VTS) และการทดสอบความเครียดด้านความเสถียรแบบอัตโนมัติ