मैं एक अलग आर्किटेकचर के साथ फाइलसिस्टम में कैसे काट सकता हूं?


38

मैं chrootएक आर्क लिनक्स ARMफाइल सिस्टम से में कोशिश कर रहा हूँ x86_64

मैंने देखा है कि qemuबाइनरी को क्रियोट सिस्टम में कॉपी करके स्टेटिक का उपयोग करना संभव है:

$ 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 स्थिर पैकेज आर्क रिपॉजिटरी में दिखाई नहीं देते हैं।
जीवों

2
क्षमा करें, मैं आर्क का उपयोग नहीं करता हूं, लेकिन आपको -staticलिंकर विकल्पों में जोड़कर एक स्थिर qemu पैकेज बनाने में सक्षम होना चाहिए
Ulrich Dangel

जवाबों:


15

आप विभिन्न वास्तुकला में नहीं घूम सकते। चेरोटिंग करके, आप अपने आर्किटेक्चर पर बायनेरिज़ (चेरोट से) निष्पादित कर रहे हैं। ARM86 को x86 (और उस मामले में x86_64) पर निष्पादित करने से "Exec प्रारूप त्रुटि" हो जाएगी।

यदि आप अलग-अलग आर्किटेक्चर से बायनेरी चलाना चाहते हैं, तो आपको एक एमुलेटर की आवश्यकता होगी। Qemu इसके लिए एक अच्छा उम्मीदवार है, लेकिन आपको इसका उपयोग करने का तरीका सीखने की आवश्यकता होगी। इसमें रूटएफएस बनाना और एआरएम के लिए कर्नेल संकलित करना शामिल होगा। एआरएम बायनेरिज़ (और कर्नेल) को संकलित करने के लिए आपको एक टूलचैन की आवश्यकता होगी। एक बात सुनिश्चित है: चेरोट विधि को भूल जाओ, आप x86 (x86_64) पर ARM के लिए संकलित बायनेरिज़ को नहीं चला सकते।

संपादित करें: @UrichDangel के साथ छोटी सी बात के बाद, मुझे एहसास हुआ कि, चेरू-उपयोगकर्ता कार्यक्रमों (इस मामले में qemu-arm) के साथ चेरोट वातावरण में प्रवेश करना संभव है। चेरोट को आपके मेजबान आर्किटेक्चर के लिए संकलित किए जाने वाले qemu-arm को निष्पादित करना चाहिए, फिर qemu-arm आपके / bin / sh (हाथ के लिए संकलित) को निष्पादित कर सकता है।


6
आपको binfmtगैर-मूल लक्ष्यों को चलाने के लिए संयोजन में उपयोग और qemu करने में सक्षम होना चाहिए - wiki.debian.org/QemuUserEmulation
उलरिच

2
मुझे पता है कि अनुकरण के लिए क्यूमू का उपयोग कैसे किया जाता है। जाहिरा तौर पर आप इसे चेरोट के साथ उपयोग कर सकते हैं, हालांकि स्पष्ट रूप से मैं कैसे काम नहीं कर सकता।
जिविंग्स

@UlrichDangel, हाँ, यह एक अच्छी जानकारी है। लेकिन मुझे लगता है कि ओपी समाधान के इस राजा की तलाश में नहीं थे। एक बार जब उसने क्यूमू-आर्म इम्यूलेशन के साथ क्यूमू को ठीक से स्थापित कर लिया, तो बीनमट संभव होगा, लेकिन मेरा मानना ​​है कि वह अपने एआरएम इम्यूलेशन वातावरण (जैसे रास्पबेरी पाई) में प्रवेश करना चाहता है, जहां उसे क्यूमू-सिस्टम-आर्म की आवश्यकता होगी।
0xAF

@ 0xAF लेकिन binfmt/ qemu-userसमाधान बिल्कुल वही है जो ओपी ने वर्णित किया है, एक हाथ चेरोट में घुसने और एक समर्पित रूटफुट बनाने की आवश्यकता के बिना कमांड चलाने में सक्षम है आदि
उलरिच डेंगल

1
@UlrichDangel, अब एक सेकंड पर, हालांकि मेरा मानना ​​है कि आप सही हैं। क्यूमू-हाथ (या होना चाहिए) के साथ उत्सर्जित चुरोट में प्रवेश करना संभव है। मैं उस पर अपनी टिप्पणी संपादित करूंगा।
0xAF

33

मैं समय-समय पर एक एआरएम चेरोट का उपयोग करता हूं: मेरा फोन लिनक्स डिप्लो चलाता है और छवि अब और फिर मर जाती है। मैं फिर इसे अपने कंप्यूटर पर कॉपी करता हूं और इस तरह से चेरोट के साथ स्थिति की जांच करता हूं:

# 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

यह एक काम करता है, लेकिन चेरोट के बाद सभी कमांड ऐसी कोई फ़ाइल या निर्देशिका नहीं देता है। मैं Fedora 24, selinux समस्या का उपयोग कर रहा हूँ? कृपया मदद की जरूरत है
सुपरबाइजी

@Superbiji रनिंग का /bin/lsकाम करता है ? उस स्थिति में, आपका $PATHवैरिएबल परेशान या विकृत है। कोशिश करो export PATH=/sbin:/usr/sbin:/usr/bin:/bin। अन्य रास्ते भी हो सकते हैं जिन्हें आपको जोड़ना चाहिए, लेकिन यह शायद एक अच्छी शुरुआत है। यदि वह काम नहीं करता है, तो आप शायद बायनेरिज़ को क्रोकेट वातावरण में कॉपी करना भूल गए। आप फ़ाइल सिस्टम के आसपास भी ब्राउज़ करने के लिए बैश का उपयोग कर सकते हैं, जैसे echo /*लगभग बराबर है ls /*। मुझे नहीं पता कि अगर SELinux रास्ते में मिल सकता है, तो कोई अनुभव नहीं है।
ल्यूक

1
यहां तक ​​कि एलएस भी देता है /bin/ls: no such file or directory। निर्यात अच्छा रास्ता दिखाता है। लेकिन गूंज / * काम कर रहा है, गूंज / usr / बिन / qemu- हाथ * फ़ाइल की सूची। मेरे पास sys, proc, dev
सुपरबाइजी

1
मदद के लिए धन्यवाद .. इस समस्या का कारण अवैध रास्ते में द्विभाषी बिंदु में दुभाषिया है
सुपरबाइजी

1
ठीक है, किसी तरह से bla/usr/binइसके बजाय qemu-arm-static की प्रतिलिपि बनाकर हल किया गया था bla/bin। जब मैं which qemu-arm-staticइसे चलाता हूं /bin/usrतो मुझे लगता है कि यह सुसंगत होना चाहिए?
dafnahaktana 18

11

मुझे लगता है कि समस्या यह है कि आप नकल नहीं करनी चाहिए है qemu-armलेकिन qemu-arm-static। यह एक स्थिर संकलित निष्पादन योग्य है जो बिना किसी पुस्तकालयों के चेरोट के अंदर से चलने में सक्षम है।

आप देख सकते हैं /proc/sys/fs/binfmt_miscकि क्या कोई फ़ाइल मौजूद है qemu-arm। यदि सेवा को पुनः आरंभ नहीं किया गया है binfmt_support


मुझे मैन्युअल रूप से चलना था: अपडेट-बिनफ़मेट्स --importdir / var / lib / binfmts / --import तब सब कुछ / proc / sys / fs / binfmt_misc और chroot कार्यों में दिखाई दिया।
मारियानो अलवीरा

7

यह काम करने के लिए मैं स्थापित qemu-static-armऔर binfmt-supportAUR से।

के लिए टिप्पणियाँ पढ़ें qemu-user-static। मुझे PKGBUILDसबसे हालिया डाउनलोड URL और haspkg for hasp को समाप्त करने के लिए अद्यतन करना था।

(AUR से स्थापित करने के लिए टारबॉल डाउनलोड, untar, cd, रन makepkg -i)

ईसाई वुल्फ का जवाब महत्वपूर्ण है। update-binfmtsइन प्रारूपों को सक्षम करने के लिए ठीक से निष्पादित नहीं किया गया है। ऐसा करने के लिए मैं भागा:

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

जैसा कि अद्यतन-द्विपक्ष के लिए मैनपेज में वर्णित है। उसके बाद, cat /proc/sys/fs/binfmt_miscविभिन्न द्विपद दिखाएगा।

फिर qemu-*-staticउस usr/bin/निर्देशिका में प्रतिलिपि बनाना सुनिश्चित करें जिस चीज़ में आप उसे करना चाहते हैं और फिर chrootकाम करना चाहिए।


6

आप निश्चित रूप से एक (घुड़सवार) फाइलसिस्टम में 'क्रोच' को एक अलग आर्किटेक्चर के लिए बना सकते हैं और कुछ सार्थक काम कर सकते हैं, आपको बस सही उपकरण की आवश्यकता है।

PRoot पर एक नज़र डालें, जो कि chroot, Mount --bind, और binfmt_misc का उपयोगकर्ता-स्थान कार्यान्वयन है: https://proot-me.github.io/

QEMU के उपयोगकर्ता मोड एमुलेटर के साथ, आप सभी सेट हैं।

यद्यपि आप आमतौर पर 'पूर्ण' बूट नहीं कर सकते (यानी init और सेवाओं को शुरू करना), यह कुछ बायनेरिज़ को उनके 'प्राकृतिक' स्थान से चलाने के लिए पर्याप्त है, उनकी सभी कॉन्फ़िगरेशन फ़ाइलों तक पहुंच के साथ, कुछ जिसमें बाइंड-माउंटेड हैं 'मेजबान' प्रणाली, आदि।



1

ल्यूक के जवाब में जोड़ना: आपको यह सुनिश्चित करने की आवश्यकता है कि चॉपर में इंटरप्रेटर का स्थान समान है क्योंकि यह मुख्य फाइल सिस्टम में है। ऐसा इसलिए है क्योंकि कर्नेल एक निष्पादन योग्य की वास्तुकला का पता लगाता है और फिर update-binfmts --displayउसे शुरू करने के लिए इंटरप्रेटर के स्थान का उपयोग करता है । तो लाइन

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

वास्तव में होना चाहिए

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

अन्यथा, आप अपने कर्ल के अंदर "नहीं पाया गया" -रियर्स प्राप्त कर सकते हैं क्योंकि आपके कर्नेल को आवश्यक दुभाषिया नहीं मिल सकता है, यदि आपके सिस्टम पर स्थान qemu-arm-staticअंदर नहीं /usr/binहै।


0

मैं बस Ubuntu पर एक ही मुद्दे में भाग गया। मैंने होस्ट सिस्टम पर समान चिरोट-एड पथ को binfmtकॉन्फ़िगर और qemu-arm-staticकॉपी किया था ।

एक घंटे के बाद, मैंने set|grep bashएक मेजबान मशीन पर किया। मैंने पाया कि मेरे पास /bin/bashदो env वैरिएबल हैं: SHELLऔर SUDO_COMMAND। चर की जगह के बाद, एआरएम के लिए मेरे चिरोट ने काम किया:

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

0

मेरा मानना ​​है कि इस ओपी के लिए, उसे बस इतना करना चाहिए कि वह बस से दौड़कर दूरबीन को कॉन्फ़िगर करे:

update-binfmts --enable qemu-arm

इसे चलाने के बाद, आर्म फाइल सिस्टम में चेरोट संभव हो जाता।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.