ฉันจะ chroot ลงในระบบไฟล์ที่มีส่วนประกอบที่แตกต่างกันได้อย่างไร


38

ฉันพยายามที่จะchrootเป็น Arch Linux ระบบแฟ้มจากARMx86_64

ฉันได้เห็นว่าเป็นไปได้ที่จะใช้ static qemuโดยการคัดลอกไบนารีลงในระบบ chroot:

$ cp /usr/bin/qemu-arm archarm-chroot/usr/bin    

แต่อย่างไรก็ตามฉันได้รับข้อผิดพลาดต่อไปนี้:

chroot: failed to run command ‘/bin/bash’: Exec format error

ฉันรู้ว่านี่หมายถึงสถาปัตยกรรมที่แตกต่าง ฉันกำลังทำอะไรผิดหรือเปล่า?


2
คุณต้องกำหนดค่าbinfmtก่อนดูที่wiki.debian.org/QemuUserEmulationเพื่อการแนะนำสั้น ๆ อย่างเงียบ ๆ ตัวอย่างสำหรับการกำหนดค่า binfmt_misc สามารถดูได้ที่svn.kju-app.org/trunk/qemu/qemu/qemu-binfmt-conf.sh
Ulrich Dangel

แพ็คเกจสแตติก Qemu ดูเหมือนจะไม่อยู่ในที่เก็บของ Arch
Jivings

2
ขออภัยฉันไม่ได้ใช้ arch แต่คุณควรจะสามารถสร้างแพ็คเกจ qemu แบบคงที่ได้ด้วยการเพิ่ม-staticตัวเลือก linker
Ulrich Dangel

คำตอบ:


15

คุณไม่สามารถ chroot เป็นสถาปัตยกรรมที่แตกต่างกัน โดย chrooting คุณกำลังรันไบนารี (จาก chroot) บนสถาปัตยกรรมของคุณ การดำเนินการไบนารีของ ARM ใน x86 (และ x86_64 ในเรื่องนั้น) จะนำไปสู่ ​​"ข้อผิดพลาดของรูปแบบ Exec"

หากคุณต้องการรันไบนารีจากสถาปัตยกรรมที่แตกต่างกันคุณจะต้องมี Emulator Qemu เป็นตัวเลือกที่ดีสำหรับเรื่องนี้ แต่คุณจะต้องเรียนรู้วิธีการใช้งาน สิ่งนี้จะเกี่ยวข้องกับการสร้าง RootFS และรวบรวมเคอร์เนลสำหรับ ARM คุณจะต้องใช้ toolchain ในการรวบรวม ARM binaries (และ kernel) สิ่งหนึ่งที่แน่นอนคือ: ลืมวิธีการ chroot คุณไม่สามารถเรียกใช้ไบนารีที่รวบรวมสำหรับ ARM ใน x86 (x86_64)

แก้ไข: หลังจากพูดคุยเล็ก ๆ กับ @UrichDangel ฉันรู้ว่ามันเป็นไปได้ที่จะเข้าสู่สภาพแวดล้อม chroot ด้วยโปรแกรม qemu-user (qemu-arm ในกรณีนี้) Chroot ควรดำเนินการ qemu-arm ที่คอมไพล์สำหรับสถาปัตยกรรมโฮสต์ของคุณจากนั้น qemu-arm สามารถดำเนินการ / bin / sh ของคุณ (รวบรวมสำหรับแขน)


6
คุณควรใช้binfmtและ qemu ร่วมกันเพื่อเรียกใช้เป้าหมายที่ไม่ใช่เจ้าของภาษา - wiki.debian.org/QemuUserEmulation
Ulrich Dangel

2
ฉันรู้วิธีใช้ Qemu เพื่อการจำลอง เห็นได้ชัดว่าคุณสามารถใช้กับ chroot ได้ แต่ชัดเจนว่าฉันไม่สามารถอธิบายได้
Jivings

@UlrichDangel ใช่นี่เป็นข้อมูลที่ดี แต่ฉันคิดว่า OP ไม่ได้มองหาวิธีแก้ปัญหานี้ binfmt จะเป็นไปได้เมื่อเขาติดตั้ง qemu อย่างเหมาะสมด้วยการเลียนแบบ qemu-arm แต่ฉันเชื่อว่าเขาต้องการเข้าสู่สภาพแวดล้อมการจำลอง ARM ของเขา (เช่น Raspberry Pi) ซึ่งเขาต้องการระบบ qemu-arm
0xAF

@ 0xAF แต่binfmt/ qemu-usersolution เป็นสิ่งที่ OP อธิบายไว้สามารถ chroot เป็น chroot arm และเรียกใช้คำสั่งโดยไม่จำเป็นต้องสร้าง rootfs ที่เจาะจง ฯลฯ
Ulrich Dangel

1
@UlrichDangel ตอนนี้ในวินาทีที่ฉันเชื่อว่าคุณพูดถูก มันเป็นไปได้ที่จะเข้าสู่การจำลอง chroot ด้วยแขน qemu (หรือควรจะเป็น) ฉันจะแก้ไขความคิดเห็นของฉันในเรื่องนั้น
0xAF

33

ฉันใช้ ARM chroot เป็นครั้งคราว: โทรศัพท์ของฉันใช้งาน Linux Deploy และภาพก็ตายทันที ฉันคัดลอกไปยังคอมพิวเตอร์ของฉันและตรวจสอบสถานการณ์ด้วย chroot เช่นนี้:

# This provides the qemu-arm-static binary
apt-get install qemu-user-static

# Mount my target filesystem on /mnt
mount -o loop fs.img /mnt

# Copy the static ARM binary that provides emulation
cp $(which qemu-arm-static) /mnt/usr/bin
# Or, more simply: cp /usr/bin/qemu-arm-static /mnt/usr/bin

# Finally chroot into /mnt, then run 'qemu-arm-static bash'
# This chroots; runs the emulator; and the emulator runs bash
chroot /mnt qemu-arm-static /bin/bash

อันนี้ใช้งานได้ แต่หลังจากคำสั่ง chroot ทั้งหมดให้ไฟล์หรือไดเรกทอรีดังกล่าวไม่ ฉันใช้ Fedora 24 ปัญหาเซลินุกซ์อยู่หรือเปล่า ต้องการความช่วยเหลือโปรด
Superbiji

@Superbiji /bin/lsทำงานหรือไม่ ในกรณีนั้น$PATHตัวแปรของคุณจะไม่ถูกตั้งค่าหรืออ่านไม่ออก ลองexport PATH=/sbin:/usr/sbin:/usr/bin:/binดู อาจมีเส้นทางอื่นที่คุณควรเพิ่ม แต่นี่อาจเป็นการเริ่มต้นที่ดี หากไม่ได้ผลคุณอาจลืมคัดลอกไบนารีไปยังสภาพแวดล้อม chroot คุณสามารถใช้ทุบตีเพื่อเรียกดูรอบระบบแฟ้มเกินไปเช่นเป็นประมาณเทียบเท่ากับecho /* ls /*ฉันไม่รู้ว่า SELinux อาจเข้ามาขวางทางหรือไม่ไม่มีประสบการณ์
Luc

1
แม้คำสั่ง ls /bin/ls: no such file or directoryให้ การส่งออกแสดงเส้นทางที่ดี แต่ echo / * ทำงานได้ echo / usr / bin / qemu-arm * จะแสดงรายการไฟล์ ฉันมีภูเขา sys, proc, dev
Superbiji

1
ขอขอบคุณที่ช่วย .. พบปัญหาที่ทำให้เป็นล่ามในจุด binfmt ไปยังเส้นทางที่ไม่ถูกต้อง
Superbiji

1
ตกลงอย่างใดมันก็แก้ปัญหาโดยการคัดลอก qemu-แขนคงแทนbla/usr/bin bla/binเมื่อฉันวิ่งwhich qemu-arm-staticมันให้ฉัน/bin/usrดังนั้นฉันเดาว่ามันควรจะสอดคล้องกัน?
dafnahaktana

10

ผมคิดว่าปัญหาคือการที่คุณไม่ควรคัดลอกแต่qemu-arm qemu-arm-staticนี่เป็นไฟล์เรียกทำงานแบบคอมไพล์แบบสแตติกที่สามารถเรียกใช้จากภายใน chroot โดยไม่มีไลบรารีใด ๆ

คุณสามารถดู/proc/sys/fs/binfmt_miscว่ามีไฟล์อยู่หรือqemu-armไม่ binfmt_supportถ้าไม่ได้เริ่มบริการ


ฉันต้องเรียกใช้ด้วยตนเอง: update-binfmts --importdir / var / lib / binfmts / - นำเข้าจากนั้นทุกอย่างก็แสดงให้เห็นใน / proc / sys / fs / binfmt_misc และ chroot ทำงาน
Mariano Alvira

7

เพื่อให้ได้งานฉันติดตั้งqemu-static-armและbinfmt-supportจาก AUR

qemu-user-staticอ่านความคิดเห็นสำหรับ ฉันต้องอัปเดตPKGBUILDด้วย URL ดาวน์โหลดล่าสุดและแฮชเพื่อให้ makepkg เสร็จสิ้น

(การติดตั้งจาก AUR ดาวน์โหลด tarball ที่untar, cdวิ่งmakepkg -i)

คำตอบของ Christian Wolf มีความสำคัญ update-binfmtsดำเนินการไม่ถูกต้องเพื่อเปิดใช้งานรูปแบบเหล่านี้ ต้องการทำเช่นนั้นฉันวิ่ง:

update-binfmts --importdir /var/lib/binfmts/ --import

ตามที่อธิบายไว้ใน manpage สำหรับ update-binfmts หลังจากนั้นcat /proc/sys/fs/binfmt_miscจะแสดง binfmts ต่างๆ

จากนั้นตรวจสอบให้แน่ใจว่าได้คัดลอกqemu-*-staticไปยังusr/bin/ไดเรกทอรีในสิ่งที่คุณต้องการ chroot แล้วchrootควรทำงาน


6

แน่นอนที่สุดคุณสามารถ 'chroot' เป็นระบบไฟล์ (เมาท์) ที่มีความหมายสำหรับสถาปัตยกรรมที่แตกต่างและทำงานที่มีความหมายคุณเพียงต้องการเครื่องมือที่เหมาะสม

ดูที่ PRoot ซึ่งเป็นการใช้งานพื้นที่ผู้ใช้ของ chroot, mount --bind และ binfmt_misc: https://proot-me.github.io/

เมื่อใช้ร่วมกับโปรแกรมจำลองโหมดผู้ใช้ของ QEMU คุณพร้อมแล้ว

แม้ว่าโดยปกติคุณจะไม่สามารถทำการบู๊ตแบบ 'เต็ม' (เช่นเริ่ม init และการบริการ) มันก็ดีพอที่จะรันไบนารีบางส่วนจากที่ 'เป็นธรรมชาติ' ด้วยการเข้าถึงไฟล์การตั้งค่าทั้งหมดของพวกเขา ระบบ 'โฮสต์' ฯลฯ



1

การเพิ่มคำตอบของ Luc: คุณต้องแน่ใจว่าตำแหน่งของล่ามเหมือนกันใน chroot เหมือนที่อยู่ในระบบไฟล์หลัก นี่เป็นเพราะเคอร์เนลตรวจพบสถาปัตยกรรมของการปฏิบัติการและจากนั้นใช้ตำแหน่งของล่ามดังที่แสดงโดยupdate-binfmts --displayเพื่อเริ่มต้นขึ้น ดังนั้นสาย

cp $(which qemu-arm-static) /mnt/usr/bin

ควรจะเป็นจริง

cp $(which qemu-arm-static) /mnt/$(which qemu-arm-static)

มิฉะนั้นคุณอาจได้รับข้อความ "ไม่พบ" - ผู้บุกรุกภายใน chroot ของคุณเนื่องจากเคอร์เนลของคุณไม่สามารถหาล่ามที่จำเป็นถ้าตำแหน่งของqemu-arm-staticไม่อยู่/usr/binในระบบของคุณ


0

ฉันเพิ่งพบปัญหาเดียวกันบน Ubuntu ฉันได้binfmtกำหนดค่าและqemu-arm-staticคัดลอกไปยังเส้นทาง chroot-ed เช่นเดียวกับในระบบโฮสต์

หลังจากผ่านไปหนึ่งชั่วโมงฉันก็set|grep bashใช้เครื่องโฮสต์ ฉันพบว่าฉันมี/bin/bashสองตัวแปร env: และSHELL SUDO_COMMANDหลังจากเปลี่ยนตัวแปร chroot ของฉันไปที่ ARM ทำงาน:

SHELL=/bin/sh SUDO_COMMAND=/bin/sh chroot hd

0

ฉันเชื่อว่าสำหรับ OP นี้สิ่งที่เขาต้องทำคือกำหนดค่า binfmts เพียงแค่เรียกใช้:

update-binfmts --enable qemu-arm

หลังจากรันสิ่งนี้ chroot ในระบบไฟล์ arm จะเป็นไปได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.