การผสานเวอร์ชันเสถียรของ Linux

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

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

สิ่งที่ต้องมีก่อน

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

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

การผสานการเปลี่ยนแปลง LTS
ภาพที่ 1: การรวมการเปลี่ยนแปลง LTS

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

  • ผสาน Branch ของการเผยแพร่เคอร์เนลเป้าหมายเข้ากับ Branch การทดลองใช้ -LTS
  • ผสาน linux-stable หรือ Android common กับสาขาระยะเตรียมความพร้อม -LTS ในเครื่อง
  • แก้ไขข้อขัดแย้งในการผสาน (ปรึกษาเจ้าของพื้นที่/โค้ดตามต้องการ)
  • สร้างในเครื่องและทำการทดสอบความเรียบร้อย/อุปกรณ์ (ดูส่วนการทดสอบด้านล่าง)
  • อัปโหลดและผสานการเปลี่ยนแปลงทั่วไปของ Android ไปยังสาขา Staging ของ LTS
  • ทดสอบอย่างละเอียดโดยใช้สาขาระยะเตรียมความพร้อม -LTS (ดูส่วนการทดสอบด้านล่าง)
  • ตรวจสอบผลการทดสอบ
  • จัดการกับการถดถอย แยกการผสานตามต้องการ
  • ผสานสาขาระยะเตรียมความพร้อม -LTS เข้ากับสาขารุ่นเคอร์เนลของอุปกรณ์หลัก
  • สร้างบิลด์ Android ใหม่สำหรับอุปกรณ์ที่มีเคอร์เนล LTS ระยะเตรียมความพร้อม
  • คอมไพล์บิลด์/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 Common เข้ากับการแยกรุ่น LTS

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

แก้ไขความขัดแย้งในการผสาน

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

การผสานที่เพิ่มขึ้น

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

ตัวอย่างเช่น หากเวอร์ชันเคอร์เนลของอุปกรณ์เป็นเวอร์ชันย่อย 4.14.100 และเวอร์ชันย่อยที่เสถียรของ upstream เป็น 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 เพื่อหาข้อผิดพลาดและยืนยันว่าไม่มีข้อผิดพลาดก่อนดำเนินการต่อ ทดสอบสิ่งต่อไปนี้เพื่อให้แน่ใจว่าทุกอย่างทำงานตามที่คาดไว้

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

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

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