Làm thế nào tôi có thể chroot vào một hệ thống tập tin với một kiến ​​trúc khác nhau?


38

Tôi đang cố gắng chrootvào một ARMhệ thống tập tin Arch Linux từ x86_64.

Tôi đã thấy rằng có thể sử dụng tĩnh qemubằng cách sao chép nhị phân vào hệ thống chroot:

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

Nhưng mặc dù vậy, tôi luôn nhận được lỗi sau:

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

Tôi biết điều này có nghĩa là các kiến ​​trúc khác nhau. Tôi có làm điều gì sai?


2
Bạn phải định cấu hình binfmttrước, hãy xem wiki.debian.org/QemuUserEmulation để giới thiệu ngắn gọn. Có thể tìm thấy một ví dụ để định cấu hình binfmt_misc tại svn.kju-app.org/trunk/qemu/qemu/qemu-binfmt-conf.sh
Ulrich Dangel

Các gói tĩnh Qemu dường như không có trong kho Arch.
Jivings

2
Xin lỗi tôi không sử dụng vòm, nhưng có lẽ bạn có thể xây dựng gói qemu tĩnh bằng cách thêm -staticvào các tùy chọn liên kết
Ulrich Dangel

Câu trả lời:


15

Bạn không thể chroot vào kiến ​​trúc khác nhau. Bằng cách chroot, bạn đang thực hiện các nhị phân (từ chroot) trên kiến ​​trúc của bạn. Thực thi các nhị phân ARM trên x86 (và x86_64 trong vấn đề đó) sẽ dẫn đến "lỗi định dạng Exec".

Nếu bạn muốn chạy nhị phân từ các kiến ​​trúc khác nhau, bạn sẽ cần một Trình giả lập. Qemu là một ứng cử viên tốt cho việc này, nhưng bạn sẽ cần học cách sử dụng nó. Điều này sẽ liên quan đến việc tạo RootFS và biên dịch kernel cho ARM. Bạn sẽ cần một chuỗi công cụ để biên dịch các nhị phân ARM (và kernel). Một điều chắc chắn là: Quên phương thức chroot, bạn không thể chạy nhị phân được biên dịch cho ARM trên x86 (x86_64).

Chỉnh sửa: Sau cuộc nói chuyện nhỏ với @UrichDangel, tôi nhận ra, có thể vào môi trường chroot với các chương trình người dùng qemu (qemu-arm trong trường hợp này). Chroot nên thực thi qemu-arm được biên dịch cho kiến ​​trúc máy chủ của bạn, sau đó qemu-arm có thể thực thi / bin / sh của bạn (được biên dịch cho arm).


6
Bạn có thể binfmtkết hợp sử dụng và qemu để chạy các mục tiêu không phải là bản địa - wiki.debian.org/QemuUserEmulation
Ulrich Dangel

2
Tôi biết cách sử dụng Qemu để thi đua. Rõ ràng bạn có thể sử dụng nó với chroot, mặc dù rõ ràng tôi không thể tìm ra cách.
Jivings

@UlrichDangel, Vâng, đây là một thông tin tốt. Nhưng tôi nghĩ OP không tìm kiếm vị vua của giải pháp này. binfmt sẽ có thể một khi anh ta đã cài đặt qemu đúng cách với mô phỏng qemu-arm, nhưng tôi tin rằng anh ta muốn vào môi trường giả lập ARM của mình (ví dụ Raspberry Pi), nơi anh ta sẽ cần qemu-system-arm.
0xAF

@ 0xAF nhưng giải pháp binfmt/ qemu-userchính xác là những gì OP mô tả, có thể chroot vào một cánh tay đòn và chạy các lệnh mà không cần phải xây dựng một rootfs chuyên dụng, v.v.
Ulrich Dangel

1
@UlrichDangel, bây giờ là một giây, tôi tin rằng bạn đúng. Có thể nhập chroot giả lập với cánh tay qemu (hoặc nên). Tôi sẽ chỉnh sửa nhận xét của tôi về điều đó.
0xAF

33

Thỉnh thoảng tôi sử dụng một chroot ARM: điện thoại của tôi chạy Linux Deploy và hình ảnh sẽ chết ngay bây giờ. Sau đó tôi sao chép nó vào máy tính của mình và kiểm tra tình huống với chroot như thế này:

# 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

Cái này hoạt động, nhưng sau khi chroot, tất cả các lệnh không cung cấp tệp hoặc thư mục như vậy. Tôi đang sử dụng Fedora 24, vấn đề selinux? Cần giúp đỡ xin vui lòng
Supermaniji

@Superbiji Có chạy /bin/lskhông? Trong trường hợp đó, $PATHbiến của bạn không được đặt hoặc bị cắt xén. Hãy thử export PATH=/sbin:/usr/sbin:/usr/bin:/bin. Có thể có những con đường khác mà bạn nên thêm, nhưng đây có lẽ là một khởi đầu tốt. Nếu điều đó không hiệu quả, có lẽ bạn đã quên sao chép nhị phân vào môi trường chroot. Bạn cũng có thể sử dụng bash để duyệt xung quanh hệ thống tập tin, echo /*tương đương với ls /*. Tôi không biết liệu Selinux có thể cản trở, không có kinh nghiệm ở đó không.
Luc

1
Ngay cả ls cũng cho /bin/ls: no such file or directory. xuất khẩu cho thấy con đường tốt. Nhưng echo / * đang hoạt động, echo / usr / bin / qemu-arm * liệt kê tệp. Tôi cũng đã gắn kết sys, Proc, dev
Exclusiviji

1
Cảm ơn vì đã giúp đỡ .. đã tìm ra vấn đề mà nguyên nhân là thông dịch viên trong điểm binfmt dẫn đến đường dẫn không hợp lệ
Expromiji

1
ok, bằng cách nào đó nó đã được giải quyết bằng cách sao chép qemu-arm-static vào bla/usr/binthay vì bla/bin. Khi tôi chạy which qemu-arm-staticnó mang lại cho tôi /bin/usrvì vậy tôi đoán nó phải phù hợp?
dafnahaktana

10

Tôi nghĩ vấn đề là bạn không nên sao chép qemu-armnhưng qemu-arm-static. Đây là một tệp thực thi được biên dịch tĩnh có thể chạy từ bên trong chroot mà không cần bất kỳ thư viện nào.

Bạn cũng có thể xem /proc/sys/fs/binfmt_miscnếu có tệp qemu-arm. Nếu không khởi động lại dịch vụ binfmt_support.


Tôi đã phải chạy thủ công: update-binfmts --importdir / var / lib / binfmts / --import sau đó mọi thứ hiển thị trong / Proc / sys / fs / binfmt_misc và chroot hoạt động.
Mariano Alvira

7

Để làm việc này, tôi đã cài đặt qemu-static-armbinfmt-supporttừ AUR.

Đọc các bình luận cho qemu-user-static. Tôi đã phải cập nhật PKGBUILDURL tải xuống gần đây nhất và băm để makepkg kết thúc.

(Để cài đặt từ AUR, tải tarball, untar, cd, chạy makepkg -i)

Câu trả lời của Christian Wolf rất quan trọng. update-binfmtskhông được thực thi đúng cách để kích hoạt các định dạng này. Để làm như vậy tôi chạy:

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

như được mô tả trong trang dành cho cập nhật-binfmts. Sau đó, cat /proc/sys/fs/binfmt_miscsẽ hiển thị các binfmts khác nhau.

Sau đó, hãy chắc chắn sao chép qemu-*-staticvào usr/bin/thư mục trong điều bạn muốn chroot và sau đó chrootnên hoạt động.


6

Bạn chắc chắn có thể 'chroot' vào một hệ thống tệp (được gắn) có nghĩa là cho một kiến ​​trúc khác và thực hiện một số công việc có ý nghĩa, bạn chỉ cần các công cụ phù hợp.

Hãy xem PRoot, đây là một triển khai không gian người dùng của chroot, mount --bind và binfmt_misc: https://proot-me.github.io/

Cùng với trình giả lập chế độ người dùng của QEMU, bạn đã hoàn tất.

Mặc dù bạn thường không thể thực hiện khởi động 'đầy đủ (nghĩa là bắt đầu init và dịch vụ), nhưng đủ để chạy một số nhị phân từ vị trí' tự nhiên 'của chúng, với quyền truy cập vào tất cả các tệp cấu hình của chúng, bao gồm một số tệp được gắn kết từ hệ thống 'máy chủ', v.v.


2
sudo apt-get update
sudo apt-get install debootstrap qemu qemu-user-static
sudo qemu-debootstrap --arch armhf bionic armhf-chroot
sudo chroot armhf-chroot

uname -m 

1

Thêm vào câu trả lời của Luc: bạn cần đảm bảo vị trí của trình thông dịch là giống nhau trong chroot giống như trong hệ thống tệp chính. Điều này là do kernel phát hiện kiến ​​trúc của một tệp thực thi và sau đó sử dụng vị trí của trình thông dịch như được hiển thị update-binfmts --displayđể khởi động nó. Vì vậy, dòng

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

thực sự nên

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

Mặt khác, bạn có thể nhận được thông báo "Không tìm thấy" bên trong chroot vì kernel của bạn không thể tìm thấy trình thông dịch cần thiết, nếu vị trí của qemu-arm-statickhông nằm trong /usr/binhệ thống của bạn.


0

Tôi vừa gặp vấn đề tương tự trên Ubuntu. Tôi đã binfmtcấu hình và qemu-arm-staticsao chép vào cùng một đường dẫn chroot-ed như trên hệ thống máy chủ.

Sau một giờ, tôi đã làm set|grep bashtrên một máy chủ. Tôi thấy rằng tôi có /bin/bashhai biến env: SHELLSUDO_COMMAND. Sau khi thay thế các biến, chroot của tôi thành ARM đã hoạt động:

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

0

Tôi tin rằng, đối với OP này, tất cả những gì anh ta cần làm là cấu hình binfmts, chỉ đơn giản bằng cách chạy:

update-binfmts --enable qemu-arm

Sau khi chạy nó, chroot vào hệ thống tập tin cánh tay sẽ có thể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.