การเข้าถึงระบบไฟล์รูทระยะไกลโดยใช้ DB410 เป็นดองเกิลอีเทอร์เน็ต: 6 ขั้นตอน
การเข้าถึงระบบไฟล์รูทระยะไกลโดยใช้ DB410 เป็นดองเกิลอีเทอร์เน็ต: 6 ขั้นตอน
Anonim
การเข้าถึงระบบไฟล์รูทระยะไกลโดยใช้ DB410 เป็นดองเกิลอีเทอร์เน็ต
การเข้าถึงระบบไฟล์รูทระยะไกลโดยใช้ DB410 เป็นดองเกิลอีเทอร์เน็ต

วัตถุประสงค์:

  • ติดตั้ง toolchain และเคอร์เนลคอมไพล์ใหม่เพื่อแทรกการสนับสนุน USB Ethernet CDC Gadget
  • สร้าง boot.img จาก Linaro เพื่อบูต USB Ethernet CDC;
  • สร้างเซิร์ฟเวอร์ NFS เพื่อโฮสต์ระบบไฟล์รูท
  • การกำหนดค่า IP ใน DEVICE และ HOST

ขั้นตอนที่ 1: ข้อกำหนด

คุณจะต้องมี itens ต่อไปนี้:

  1. DragonBoard™ 410c (ชื่ออุปกรณ์ที่นี่);
  2. พีซีที่ใช้ Ubuntu 16.04.3 ได้รับการอัพเดต (ชื่อ HOST ที่นี่) พร้อมการเชื่อมต่ออินเทอร์เน็ตและช่องเสียบ SDCard
  3. การติดตั้ง Linaro-developer เวอร์ชัน 431 ใหม่ทั้งหมด - ลิงก์: Snapshot Linaro Debian v431
  4. จอภาพ HDMI;
  5. แป้นพิมพ์ USB;
  6. การ์ด SD 8Gb;
  7. สาย 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