สารบัญ:
- ขั้นตอนที่ 1: ข้อกำหนด
- ขั้นตอนที่ 2: การกำหนดค่าโฮสต์เพื่อสร้างเคอร์เนลและสร้างเคอร์เนลใน HOST
- ขั้นตอนที่ 3: สร้าง Boot.img ใหม่ใน HOST
- ขั้นตอนที่ 4: การสร้างระบบไฟล์รูทใน HOST
- ขั้นตอนที่ 5: การสร้างเซิร์ฟเวอร์ NFS ในโฮสต์และการคัดลอกไฟล์
- ขั้นตอนที่ 6: การอัปเดตอิมเมจบูต Dragonboard 410c และการกำหนดค่าอินเทอร์เฟซเครือข่าย
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
วัตถุประสงค์:
- ติดตั้ง toolchain และเคอร์เนลคอมไพล์ใหม่เพื่อแทรกการสนับสนุน USB Ethernet CDC Gadget
- สร้าง boot.img จาก Linaro เพื่อบูต USB Ethernet CDC;
- สร้างเซิร์ฟเวอร์ NFS เพื่อโฮสต์ระบบไฟล์รูท
- การกำหนดค่า IP ใน DEVICE และ HOST
ขั้นตอนที่ 1: ข้อกำหนด
คุณจะต้องมี itens ต่อไปนี้:
- DragonBoard™ 410c (ชื่ออุปกรณ์ที่นี่);
- พีซีที่ใช้ Ubuntu 16.04.3 ได้รับการอัพเดต (ชื่อ HOST ที่นี่) พร้อมการเชื่อมต่ออินเทอร์เน็ตและช่องเสียบ SDCard
- การติดตั้ง Linaro-developer เวอร์ชัน 431 ใหม่ทั้งหมด - ลิงก์: Snapshot Linaro Debian v431
- จอภาพ HDMI;
- แป้นพิมพ์ USB;
- การ์ด SD 8Gb;
- สาย USB, uUSB USB เพื่อเชื่อมต่อ DEVICE บน HOST
ขั้นตอนที่ 2: การกำหนดค่าโฮสต์เพื่อสร้างเคอร์เนลและสร้างเคอร์เนลใน HOST
อันดับแรก เราจะสร้างไดเร็กทอรีทั้งหมดก่อนเพื่อดำเนินการต่อ ดังนั้น:
$ cd ~
$ mkdir db410remoteroot $ cd db410remoteroot $ mkdir toolchain $ mkdir db410c-โมดูล
ขออภัย เคอร์เนล linux ที่ใช้โดย Linaro (เวอร์ชัน 431) ไม่รองรับอุปกรณ์ USB Ethernet gadget ด้วยเหตุนี้ เคอร์เนล Linux จึงต้องถูกสร้างขึ้นใหม่สำหรับเวอร์ชันเฉพาะนี้ ดาวน์โหลด Linaro toolchain เพื่อสร้างและปรับใช้เคอร์เนล linux บน Dragonboard410c จากเครื่องโฮสต์ x86
$ wget
$ tar -xf gcc-*-x86_64_aarch64-linux-gnu.tar.xz -C./toolchain --strip-components=1
ตอนนี้ติดตั้งแพ็คเกจที่จำเป็นในการสร้างเคอร์เนล:
$ sudo apt update && sudo apt-get install git build-essential abootimg แพ็คเกจเคอร์เนล fakeroot libncurses5-dev libssl-dev ccache
รับแหล่งเคอร์เนลลินุกซ์ Clone Qualcomm Landing team ที่เก็บ Linux:
โคลน $ git
$ cd kernel $ git checkout origin/release/qcomlt-4.14 -b my-custom-4.14
ตอนนี้ ตั้งค่าตัวแปรสภาพแวดล้อมการคอมไพล์:
$ ส่งออก ARCH=arm64
$ ส่งออก CROSS_COMPILE=$(pwd)/../toolchain/bin/aarch64-linux-gnu-
ณ จุดนี้ เราจำเป็นต้องเพิ่มโมดูลไปยัง USB Ethernet CDC ในเคอร์เนล ฉันทำอย่างนั้นมาก่อนและคุณสามารถทำสิ่งนี้ได้เมื่อสิ้นสุดขั้นตอนนี้ ฉันลบบาง itens แต่ใช้งานได้
ก่อนที่จะคอมไพล์ โปรดแก้ไขข้อผิดพลาดของเคอร์เนลใน drivers/mmc/host/sdhci-msm.c โดยเปลี่ยน struct ในบรรทัด 1150 เป็น:
โครงสร้าง const แบบคงที่ sdhci_ops sdhci_msm_ops = {
.reset = sdhci_reset,.set_clock = sdhci_msm_set_clock,.get_min_clock = sdhci_msm_get_min_clock,.get_max_clock = sdhci_msm_get_max_clock,.set_bus_width = sdhci_set_bus_width,.set_uhs_signaling = sdhci_msm_set_uhs_signaling,.voltage_switch = sdhci_msm_voltage_switch, #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS.write_w = sdhci_msm_write_w, endif #};
คลายการบีบอัด configfile.zip คัดลอกไฟล์.config ไปยังไดเร็กทอรีเคอร์เนล สร้างเคอร์เนล โมดูล และติดตั้งโมดูลในไดเร็กทอรี:
$ make -j$(nproc) Image.gz dtbs
$ make -j$(nproc) โมดูล $ make modules_install INSTALL_MOD_PATH=../db410c-modules
อ้างอิง: เอกสาร 96Boards
ขั้นตอนที่ 3: สร้าง Boot.img ใหม่ใน HOST
ในขั้นตอนนี้ เราจำเป็นต้องเปิดอิมเมจ initrd ใส่โมดูลที่สร้างขึ้นภายในอิมเมจ กำหนดค่าระบบเพื่อเริ่มต้นโมดูลนั้น และสร้าง initrd.img ใหม่ด้วยบรรทัดคำสั่งเคอร์เนลใหม่เพื่อบูตระบบไฟล์รูทจากระยะไกล
ก่อนอื่นเราต้องดาวน์โหลด initrd.img จากเว็บไซต์ linaro:
$ ซีดี..
$ mkdir inird_nfs $ cd initrd_nfs $ wget -O ramdisk.img
ตอนนี้ หลังจากดาวน์โหลด ให้คลายการบีบอัดและแตกไฟล์ initrd:
$ zcat ramdisk.img | cpio -idmv
ในไดเรกทอรีนี้ เรามีระบบไฟล์รูทที่เคอร์เนลใช้ในการเริ่มต้น ดังนั้นเราจะกำหนดค่าโมดูล USB Ethernet CDC และพารามิเตอร์ระยะไกล NFS เช่น NFS เซิร์ฟเวอร์ IP และอีเธอร์เน็ต (usb) ที่จำเป็นที่นี่
ตอนนี้ มากำหนดค่าบางไฟล์กัน:
conf/initramfs.conf:
MODULES=ส่วนใหญ่
BUSYBOX=บีบอัดอัตโนมัติ=gzip DEVICE=usb0 NFSROOT=ทำงานอัตโนมัติ=10%
สร้างไดเร็กทอรี init-premount ในไดเร็กทอรี scripts/
$ mkdir scripts/init-premount
และเพิ่มไฟล์ในไดเร็กทอรีที่เพิ่งสร้างขึ้นเหล่านี้:
คำสั่ง
/scripts/init-premount/usb "$@"
[-e /conf/param.conf] &&. /conf/param.conf
ยูเอสบี
#!/bin/sh
PREREQ="" prereqs () { echo "$PREREQ" } กรณี $1 ใน # get pre-requisites prereqs) prereqs exit 0;; esac modprobe usb_f_ecm modprobe libcomposite modprobe usb_f_rndis modprobe g_ether
อย่าลืมใช้ chmod ในไฟล์ usb เพื่อให้ปฏิบัติการได้:
$ chmod +x สคริปต์/init-premount/usb
ตอนนี้ คัดลอกไดเร็กทอรีทั้งหมดที่มีโมดูลจาก db410c-modules (ขั้นตอนที่ 2) ไปยัง lib/modules ใน initrd:
$ cp -R../db410-modules/lib usr/
ลบไฟล์ทั้งหมดใน lib/modules/4.14.96-xxxx-dirty ยกเว้นไฟล์โมดูลทั้งหมด* และรายการไฟล์นั้น:
เคอร์เนล/ไดรเวอร์/usb/gadget/legacy/g_ether.ko
kernel/drivers/usb/gadget/legacy/g_mass_storage.ko kernel/drivers/usb/gadget/legacy/g_cdc.ko kernel/drivers/usb/gadget/legacy/g_serial.ko kernel/drivers/usb/gadget/function/usb_f_mass_storage เคอร์เนล.ko/drivers/usb/gadget/function/usb_f_acm.ko kernel/drivers/usb/gadget/function/u_ether.ko kernel/drivers/usb/gadget/function/usb_f_obex.ko kernel/drivers/usb/gadget/function /usb_f_serial.ko kernel/drivers/usb/gadget/function/usb_f_ecm.ko kernel/drivers/usb/gadget/function/usb_f_rndis.ko kernel/drivers/usb/gadget/function/u_serial.ko kernel/drivers/usb/gadget /function/usb_f_fs.ko เคอร์เนล/drivers/usb/gadget/function/usb_f_ecm_subset.ko kernel/drivers/usb/gadget/libcomposite.ko
ไฟล์เหล่านี้เป็นโมดูลทั้งหมดที่จำเป็นสำหรับการเริ่มต้น USB Ethernet CDC
ในที่สุดก็บรรจุใหม่และบีบอัดอิมเมจ initrd:
$ ค้นหา | cpio -o -H newc | gzip -9 >../kernel/initrd_nfs.img
อย่างน้อย เคอร์เนลอิมเมจและไฟล์ DTB จะต้องถูกบรรจุลงในอิมเมจสำหรับบูต Android ภาพดังกล่าวสามารถสร้างได้ด้วยเครื่องมือ abootimg
ไปที่เคอร์เนลไดเร็กทอรีและใช้คำสั่งด้านล่างเพื่อสร้างอิมเมจและผนวก DTB ในอิมเมจเคอร์เนลที่บีบอัด:
$ cd../kernel
$ cat arch/$ARCH/boot/Image.gz arch/$ARCH/boot/dts/qcom/apq8016-sbc.dtb > Image.gz+dtb
และสุดท้าย สร้างอิมเมจสำหรับบูต (ที่นี่ rootfs ของเรามีพาร์ติชั่นระยะไกลใน 10.42.0.1)
abootimg -- สร้าง boot-db410c.img -k Image.gz+dtb -r initrd_nfs.img -c ขนาดหน้า = 2048
-c kerneladdr=0x80008000 -c ramdiskaddr=0x81000000 -c cmdline="root=/dev/nfs nfsroot=10.42.0.1:/srv/nfs/rootfs ip=10.42.0.2:10.42.0.1:10.42.0.1:255.255.255.0:db410c:usb0:ปิด rw rootwait คอนโซล=tty0 คอนโซล=ttyMSM0, 115200n8"
ข้อมูลอ้างอิง:
- https://access.redhat.com/solutions/24029
- เอกสาร 96Boards
ขั้นตอนที่ 4: การสร้างระบบไฟล์รูทใน HOST
ตอนนี้ เรามีบูตอิมเมจใหม่สำหรับอัปเดต dragonboard 410c แต่เราต้องการระบบไฟล์รูทในเซิร์ฟเวอร์ระยะไกลเพื่อบูตโมดูล บริการ และแอปพลิเคชัน ในขั้นตอนนี้ เราจะสร้างไดเร็กทอรีที่ใช้ร่วมกันในโฮสต์เพื่อบันทึกข้อมูลเหล่านี้ทั้งหมด ด้วยวิธีนั้น เรามาดาวน์โหลดระบบไฟล์ rootfs จากเว็บไซต์ linaro โดยใช้เวอร์ชันเดียวกับที่ใช้ใน initrd ดังนั้น ย้อนกลับไปหนึ่งไดเร็กทอรีและดาวน์โหลดอิมเมจ rootfs ของนักพัฒนา linaro ด้วยเวอร์ชัน 431
$ ซีดี..
$ wget
คลายการบีบอัดไฟล์นี้
$ เปิดเครื่องรูด dragonboard-410c-sdcard-developer-buster-431.zip
ใช้ไฟล์นี้ มาเขียนภาพทั้งหมดใน sdcard เพื่อเข้าถึงพาร์ติชั่นทั้งหมดและคัดลอกไฟล์ rootfs ดังนั้น ตรวจสอบให้แน่ใจว่าได้สำรองข้อมูลจาก uSDCard เพราะทุกอย่างใน SDCard จะสูญหาย
หากต้องการค้นหาชื่ออุปกรณ์ SDCard ให้ลบ SDCard และเรียกใช้คำสั่งต่อไปนี้:
$ lsblk
บันทึกชื่อดิสก์ที่รู้จักทั้งหมดไว้ในใจของคุณ ตอนนี้ใส่ SDCard รอสักครู่แล้วรันคำสั่งอีกครั้ง:
$ lsblk
สังเกตดิสก์ที่รู้จักใหม่ นี่จะเป็น SDCard ของคุณ จำชื่อของคุณและเปลี่ยนพารามิเตอร์ "of=" สำหรับชื่ออุปกรณ์ SDCard ของคุณและต้องแน่ใจว่าใช้ชื่ออุปกรณ์โดยไม่มีพาร์ติชัน p.e.: /dev/mmcblk0
$ sudo dd if=dragonboard-410c-sdcard-developer-buster-431.img of=/dev/XXX bs=4M oflag=สถานะการซิงค์=ความคืบหน้า
หมายเหตุ:
- คำสั่งนี้จะใช้เวลาในการดำเนินการ อดทนและหลีกเลี่ยงการยุ่งเกี่ยวกับเครื่องจนกว่ากระบวนการจะสิ้นสุด
- เมื่อการ์ด SD กะพริบเสร็จแล้ว ให้นำออกจากคอมพิวเตอร์โฮสต์
อ้างอิง: เอกสารประกอบ 96boards
ขั้นตอนที่ 5: การสร้างเซิร์ฟเวอร์ NFS ในโฮสต์และการคัดลอกไฟล์
ในจุดนี้ เรามีบูตอิมเมจที่จะแฟลชใน dragonboard 410c และ SDCard ที่มีระบบไฟล์ rootfs สำหรับโมดูล บริการ และแอปพลิเคชันของเรา ขั้นตอนต่อไปคือสร้างไดเร็กทอรีระยะไกลเพื่อเชื่อมต่ออุปกรณ์อีเทอร์เน็ต USB เข้ากับระบบไฟล์ HOST rootfs สามารถทำได้โดยใช้แพ็คเกจจาก Ubuntu ชื่อ nfs-kernel-server
แพ็คเกจนี้ติดตั้งบริการ NFS ลงใน Ubuntu เพื่ออนุญาตให้แชร์ไดเร็กทอรีสำหรับอุปกรณ์บางตัวบนเครือข่าย เราสามารถกำหนดค่าไดเร็กทอรีที่จะใช้สำหรับแต่ละอุปกรณ์โดยใช้ IP ของคุณ
มาติดตั้งแพ็คเกจและกำหนดค่ากันเถอะ
$ sudo apt-get ติดตั้ง nfs-kernel-server
บริการ NFS เริ่มทำงานโดยอัตโนมัติ ในการควบคุมบริการ NFS ให้ใช้:
$ sudo service nfs-kernel-server restart // เพื่อรีสตาร์ทหรือใช้ 'stop' หรือ 'start' ตามต้องการ
ในการตรวจสอบสถานะของบริการ NFS จากบรรทัดคำสั่งให้ใช้:
$ sudo service nfs-kernel-server status
nfsd กำลังทำงาน // Service is Up nfsd ไม่ทำงาน // Service is Down
ตอนนี้ มาสร้างไดเร็กทอรีระดับบนสุด /srv/nfs และสร้างไดเร็กทอรีย่อยภายใต้ไดเร็กทอรีย่อยสำหรับแต่ละระบบไฟล์รูทที่ต่อเชื่อมกับ NFS ที่จำเป็น ที่นี่เรารวมระบบไฟล์รูทที่ใช้ร่วมกันเพื่อให้ระบบไฟล์รูทของเรา:
$ sudo mkdir -p /srv/nfs
$ sudo mkdir -p /srv/nfs/rootfs
ตอนนี้ เซิร์ฟเวอร์ NFS ต้องการ /etc/exports เพื่อกำหนดค่าอย่างถูกต้อง เพื่อควบคุมการเข้าถึงไดเร็กทอรีระบบไฟล์ NFS แต่ละรายการไปยังโฮสต์เฉพาะ ในกรณีนี้ โฮสต์จะถูกระบุโดยที่อยู่ IP ของพวกเขา ดังนั้น สำหรับแต่ละระบบไฟล์รูทที่สร้างขึ้น ให้เพิ่มบรรทัดควบคุมการส่งออกไปที่ /etc/exports ปรับสำหรับที่อยู่ IP ในเครื่องของคุณและรูปแบบการตั้งชื่อไดเร็กทอรีหากจำเป็น ในบทช่วยสอนนี้ เราใช้สิ่งนี้เสมอ:
/srv/nfs/rootfs 10.42.0.2(rw, ซิงค์, no_root_squash, no_subtree_check)
ใส่ SDCard ของคุณอีกครั้ง ติดตั้งและคัดลอกระบบไฟล์ rootfs ทั้งหมดลงใน /srv/nfs/rootfs เริ่มบริการ NFS ใหม่เพื่ออัปเดตไดเร็กทอรีโดยใช้ไฟล์ที่คัดลอกใหม่
นอกจากนี้ เราต้องคัดลอกไฟล์โมดูลใหม่ไปยังระบบไฟล์ rootfs เนื่องจากเราคอมไพล์เคอร์เนลในขั้นตอนที่ 2 ดังนั้น คัดลอกไดเร็กทอรีทั้งหมดใน ~/db410c-modules/ ไปยัง /srv/nfs/rootfs
$ sudo cp -R ~/db410c-modules/* /srv/nfs/rootfs/
ตรวจสอบให้แน่ใจว่าบริการ NFS มองเห็นไดเร็กทอรีเหล่านี้ ทั้ง:
$ sudo exportfs -a
ข้อมูลอ้างอิง: ระบบไฟล์รูท TFTP/NFS
ขั้นตอนที่ 6: การอัปเดตอิมเมจบูต Dragonboard 410c และการกำหนดค่าอินเทอร์เฟซเครือข่าย
เราทำทุกขั้นตอนตั้งแต่เนิ่นๆ เพื่อใช้ระบบไฟล์ rootfs ระยะไกล ตอนนี้เราต้องอัปเดตอิมเมจสำหรับบูตภายใน dragonboard 410c เพื่อเชื่อมต่อสาย USB ของคุณบนพีซีและบนตัวเชื่อมต่อ uUSB ของ dragonboard ดังนั้นตรวจสอบให้แน่ใจว่าได้ตั้งค่า fastboot บนคอมพิวเตอร์โฮสต์แล้ว หากไม่ได้ติดตั้งโดยใช้:
$ sudo apt ติดตั้ง fastboot
ตอนนี้เพื่ออัปเดตรูปภาพ ให้เริ่ม de dragonboard ในโหมด fastboot โดยทำตามขั้นตอนนี้:
- กดปุ่ม Vol (-) บน DragonBoard 410c ค้างไว้ นี่คือปุ่ม S4 ไม่ควรเปิด DragonBoard™ 410c
- ขณะกดปุ่ม Vol (-) ค้างไว้ ให้เปิดเครื่อง DragonBoard 410c โดยเสียบปลั๊ก
- เมื่อเสียบปลั๊ก DragonBoard 410c แล้ว ให้ปล่อยปุ่ม Vol (-) ค้างไว้
- รอประมาณ 20 วินาที
- บอร์ดควรบูตเข้าสู่โหมด fastboot
จากหน้าต่างเทอร์มินัลเครื่องโฮสต์ที่เชื่อมต่อ ให้รันคำสั่งต่อไปนี้:
$ sudo อุปกรณ์ fastboot
โดยปกติจะแสดงดังต่อไปนี้
de82318 fastboot
ณ จุดนี้คุณควรเชื่อมต่อกับ DragonBoard 410c ด้วยสาย USB กับ microUSB DragonBoard 410c ของคุณควรบูตเข้าสู่โหมด fastboot และพร้อมที่จะแฟลชด้วยภาพที่เหมาะสม มาอัปเดตอิมเมจสำหรับบูตด้วยอิมเมจสำหรับบูตของเรา:
$ sudo บูตแฟลช fastboot ~/db410remoteroot/kernel/initrd_nfs.img
และรีสตาร์ทบอร์ด
$ sudo fastboot รีบูต
ตอนนี้ HOST ของคุณจะตรวจพบอินเทอร์เฟซใหม่ที่ชื่อ usb0 แต่ยังไม่มี IP ดังนั้น เพิ่ม IP แบบคงที่ให้กับอินเทอร์เฟซนี้โดยใช้:
$ sudo ifconfig usb0 10.42.0.1 netmask 255.255.255.0 ขึ้นไป
หรือป้อนใน "การกำหนดค่า" บน HOST ในรายการ "เครือข่าย" ตั้งค่า USB Ethernet เป็น IP แบบคงที่ไปยังอินเทอร์เฟซนั้น
ตอนนี้ รีสตาร์ท dragonboard อีกครั้ง และตรวจสอบการเริ่มต้นระบบ โดยพยายามเชื่อมต่อโดยใช้ ssh:
$ ssh [email protected]
ข้อมูลอ้างอิง:
- เอกสาร 96boards
- HowtoForge - ไอเทม 6