আমার আরআরআরডি কেন কেবল একটি ডিরেক্টরি আছে, যথা 'কার্নেল'?


29

আমি বুটযোগ্য সিস্টেমটিতে কাজ করতে ডেবিয়ান লাইভ-বিল্ড ব্যবহার করছি। প্রক্রিয়া শেষে আমি লাইভ সিস্টেম বুট করার জন্য ব্যবহৃত সাধারণ ফাইলগুলি পাই: একটি স্কোয়াশফ ফাইল, কিছু GRUB মডিউল এবং কনফিগার ফাইল এবং একটি initrd.img ফাইল।

আমি nel ফাইলগুলি ব্যবহার করে সূক্ষ্মভাবে বুট করতে পারি, কার্নেলের মাধ্যমে আরআরআরটি দিয়ে

initrd=/path/to/my/initrd.img

বুটলোডার কমান্ড লাইনে। তবে যখন আমি আমার আরআরডি চিত্রের সামগ্রীগুলি পরীক্ষা করার চেষ্টা করি তখন:

$file initrd.img
initrd.img: ASCII cpio archive (SVR4 with no CRC)
$mkdir initTree && cd initTree
$cpio -idv < ../initrd.img

আমি যে ফাইল ট্রি পেয়েছি তা দেখতে এমন দেখাচ্ছে:

$tree --charset=ASCII
.
`-- kernel
    `-- x86
        `-- microcode
            `-- GenuineIntel.bin

আদর্শ / বিন, / ইত্যাদি, / এসবিন ... সহ বুট চলাকালীন প্রকৃত ফাইল সিস্টেমের গাছটি কোথায়?


1
'Lsinitramfs' কমান্ড এটির জন্য ডিজাইন করা হয়েছিল।
আর্লগ্রি

উত্তর:


32

প্রদত্ত সিপিও ব্লক স্কিপ পদ্ধতি নির্ভরযোগ্যভাবে কাজ করে না। এটি কারণ যে আমি নিজে যা করছিলাম সেই ইআরআরডি চিত্রগুলিতে 512 বাইটের সীমানায় দুটি সংরক্ষণাগার লেখা ছিল না।

পরিবর্তে, এটি করুন:

apt-get install binwalk
legolas [mc]# binwalk initrd.img 
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             ASCII cpio archive (SVR4 with no CRC), file name: "kernel", file name length: "0x00000007", file size: "0x00000000"
120           0x78            ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86", file name length: "0x0000000B", file size: "0x00000000"
244           0xF4            ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode", file name length: "0x00000015", file size: "0x00000000"
376           0x178           ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/GenuineIntel.bin", file name length: "0x00000026", file size: "0x00005000"
21004         0x520C          ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"
21136         0x5290          gzip compressed data, from Unix, last modified: Sat Feb 28 09:46:24 2015

শেষ সংখ্যাটি (21136) ব্যবহার করুন যা আমার জন্য 512 বাইট সীমানায় নেই:

legolas [mc]# dd if=initrd.img bs=21136 skip=1 | gunzip | cpio -tdv | head
drwxr-xr-x   1 root     root            0 Feb 28 09:46 .
drwxr-xr-x   1 root     root            0 Feb 28 09:46 bin
-rwxr-xr-x   1 root     root       554424 Dec 17  2011 bin/busybox
lrwxrwxrwx   1 root     root            7 Feb 28 09:46 bin/sh -> busybox
-rwxr-xr-x   1 root     root       111288 Sep 23  2011 bin/loadkeys
-rwxr-xr-x   1 root     root         2800 Aug 19  2013 bin/cat
-rwxr-xr-x   1 root     root          856 Aug 19  2013 bin/chroot
-rwxr-xr-x   1 root     root         5224 Aug 19  2013 bin/cpio
-rwxr-xr-x   1 root     root         3936 Aug 19  2013 bin/dd
-rwxr-xr-x   1 root     root          984 Aug 19  2013 bin/dmesg

সত্যিই, আপনার উত্তর আমার মার। সারিবদ্ধতা একটি সমস্যা হতে পারে তা আমি কখনও ভাবিনি। আমি ভাবছি, যদিও সিপিও যদি আরও কিছু আকর্ষণীয় আউটপুট দেয় তবে মাল্টি-ইমেজ ফাইলের মধ্যে থাকা প্রথম চিত্রটি 512 বি-রেখাযুক্ত না হত।
ব্যবহারকারী986730

একই ফোল্ডার শ্রেণিবিন্যাসের সাথে সংশোধন করার পরে কীভাবে এটিকে আবার ফিরিয়ে আনতে হবে (মূল অবস্থায় ফিরিয়ে আনুন)?
এডিডি

2
শুধু cdডিরেক্টরি যেখানে আপনি আপনার cpio সংরক্ষণাগার, রান নিষ্কাশিত মধ্যে find | cpio -H newc -o > /tmp/my_archive.cpio, তারপর সঙ্গে এটি gzip gzip /tmp/my_archive.cpioএবং পরিশেষে, সঙ্গে এটি concatenate মাইক্রো-ইমেজের সাথে আপনি এক ছিল: cat my_microcode_image.cpio /tmp/my_archive.cpio.gz > mynewinitrd.img। আপনার যদি মাইক্রোকোড চিত্র না থাকে তবে আপনি কেবল আপনার বুটলোডার
তে

এই উত্তরটি পড়ার সময় এটি সুস্পষ্ট বলে মনে হয় কেবলমাত্র যদি কাজটি করা ফাইলটি জিজেপড বিষয়বস্তুগুলি অর্ধেক হয়ে যায়। অন্যথায়, আপনার ব্লকসাইজটি 1 এ পরিবর্তন করা উচিত এবং এড়িয়ে যাওয়ার জন্য বাইটের সংখ্যাতে স্কিপ সেট করা উচিত। সবসময় তা না করার কোনও কারণ?
TamaMcGlinn

দ্বিতীয়ত, কেবলমাত্র তাদের কয়েকটি তালিকা তৈরি করার পরিবর্তে ফাইলগুলি লেখার জন্য পাইপের মধ্যে চূড়ান্ত কমান্ডটি cpio -iপরিবর্তে পরিবর্তিত করুন cpio -tdv | head
TamaMcGlinn

22

আপনি যদি জানেন যে আপনার initrd.imgকোনও সঙ্কুচিত সিপিও সংরক্ষণাগার রয়েছে যার পরে জিজেড-সংকুচিত সিপিও সংরক্ষণাগার রয়েছে, আপনি আপনার বর্তমান কার্যনির্বাহী ডিরেক্টরিতে (ফাইল পরীক্ষিত) সমস্ত ফাইল (উভয় সংরক্ষণাগার থেকে) বের করার জন্য নিম্নলিখিতটি ব্যবহার করতে পারেন:

(cpio -id; zcat | cpio -id) < /path/to/initrd.img

উপরের কমান্ড লাইনটি initrd.imgস্ট্যান্ডার্ড ইনপুট হিসাবে বিষয়বস্তুগুলিকে একটি সাব-শেলের মধ্যে পাস করে যা দুটি আদেশ cpio -idএবং zcat | cpio -idক্রমানুসারে কার্যকর করে। cpio -idপ্রথম সিপিও সংরক্ষণাগারভুক্ত সমস্ত ডেটা পড়ার পরে প্রথম কমান্ড ( ) সমাপ্ত হয়। এরপরে অবশিষ্ট সামগ্রীটি পরে দেওয়া হয় zcat | cpio -id, যা দ্বিতীয় আর্কাইভটিকে ডিকম্প্রেস করে এবং আনপ্যাক করে।


1
দ্বারা পর্যন্ত পরিষ্কার সমাধান মত এই সৌন্দর্য
velis

1
এটি সুন্দরভাবে কাজ করে
TurboHz

রহস্যজনকভাবে, @ উলপুলের সূক্ষ্ম উত্তর হ'ল ব্যবহারকারীরা পোস্ট করেছেন এমন একমাত্র উত্তর। এটা স্টাইল। আপনি যদি আপনার পুরো স্ট্যাক এক্সচেঞ্জের ক্যারিয়ারের সময় কেবল একটি উত্তর পোস্ট করতে যাচ্ছিলেন তবে এর আগে এর চেয়ে কোনও পোস্ট দেওয়ার চেয়ে আপনি আর খুব ভালই করতে পারেন। ওপি এইটির গ্রহণযোগ্য উত্তর পরিবর্তন করতে পারে ।
th

16

এটি দেবিয়ানের লাইভ-বিল্ড দ্বারা উত্পাদিত আরআরআরডিটি ঘুরে দেখা গেছে (এবং আমার আশ্চর্যের বিষয়, কার্নেল দ্বারা গৃহীত) আসলে দুটি চিত্রের সংমিশ্রণ:

  • প্রসেসরে প্রয়োগ করার জন্য মাইক্রোকোড আপডেটযুক্ত সিপিআইও সংরক্ষণাগার;
  • একটি gzip-ed cpio সংরক্ষণাগার, যা আসলে initrd ফাইল ট্রি ধারণ করে (/ etc / bin / sbin / dev সহ ... ডিরেক্টরিগুলি যা প্রত্যাশিত ছিল)।

লাইভ-বিল্ড আউটপুট থেকে সরাসরি আসল আরআরডি.আইএমজি বের করার পরে, আমি এই আউটপুটটি পেয়েছি:

$cpio -idv ../initrd.img
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/GenuineIntel.bin
896 blocks

যার অর্থ সিপিও নিষ্কাশন 512 বাইটের 896 টি ব্লককে পার্স করার পরে শেষ হয়েছে। তবে আসল initrd.img 896 * 512 = 458752B = 448 KB এর চেয়ে অনেক বড় ছিল:

$ls -liah initrd.img
3933924 -r--r--r-- 1 root root 21M Oct 21 10:05 initrd.img

সুতরাং আমি যে আসল আরআরডি চিত্রটি সন্ধান করছিলাম তা প্রথম সিপিও সংরক্ষণাগার (মাইক্রোকোড আপডেটযুক্ত একটি) এর পরে যুক্ত হয়েছিল এবং ডিডি ব্যবহার করে অ্যাক্সেস করা যেতে পারে:

$dd if=initrd.img of=myActualInitrdImage.img.gz bs=512 skip=896

2

আপনি unmkinitramfsinitramfs- সরঞ্জাম> = 0.126 থেকে ব্যবহার করতে পারেন যা দেবিয়ান 9 (প্রসারিত) এবং উবুন্টু 18.04 (বায়োনিক) থেকে অন্তর্ভুক্ত রয়েছে।


1

@ উলপুলের উত্তরে প্রদত্ত ধারণার ভিত্তিতে আমি একটি পুনরাবৃত্ত ফাংশন লিখেছিলাম যা কোনও সিপিও সংরক্ষণাগারটির জন্য কাজ করবে উপসংহারযুক্ত ডেটার ব্যবস্থা নির্বিশেষে এবং বিনওয়াকের মতো কোনও বিশেষ সরঞ্জামের প্রয়োজন নেই। উদাহরণস্বরূপ, আমার মকিনিট্রামস একটি সিপিও; সিপিও; জিজিপ ফাইল তৈরি করছিল। এটি সংক্ষিপ্ত initrd ফাইলের প্রতিটি অংশ বের করে, বাকীটি একটি টেম্পাইলে সংরক্ষণ করে এবং পরবর্তী অংশটি কী করবে তা সিদ্ধান্ত নেওয়ার জন্য "ফাইল" প্রোগ্রাম ব্যবহার করে এটি কাজ করে।

uncpio(){
if [[ $(wc -c $1 | cut -d ' ' -f1) -eq 0 ]]; then
    return
fi

type=$(cat $1 | file -)
local tmpfile=$(date +%s.%N)
echo -e "\n$type"
if [[ $type =~ .*cpio.* ]]; then
    cat $1 | (cpio -id; cat >$tmpfile)
elif [[ $type =~ .*gzip.* ]]; then
    zcat $1 | (cpio -id; cat >$tmpfile)
else
    return
fi
uncpio $tmpfile 
rm $tmpfile
}

ব্যবহার করতে টাইপ করুন: uncpio initrdfilename


0

আপনার যদি এই কাজটি প্রায়শই সম্পাদন করতে হয় তবে আপনি নীচের মতো একটি ছোট বাশ ফাংশন তৈরি করতে চাইতে পারেন (এবং এটি আপনার .bashrc এ যুক্ত করতে পারেন):

initramfs-extract() {
    local target=$1
    local offset=$(binwalk -y gzip $1 | awk '$3 ~ /gzip/ { print $1; exit }')
    shift
    dd if=$target bs=$offset skip=1 | zcat | cpio -id --no-absolute-filenames $@
}

কোডটি মার্কের উত্তরের উপর ভিত্তি করে তৈরি হয়েছে, তবে এটি বিবিওয়াকটি কেবল গিজিপ ফাইলগুলির সন্ধান করবে বলে এটি তাত্পর্যপূর্ণভাবে দ্রুত। আপনি এটির অনুরোধ করতে পারেন:

$ initramfs-extract /boot/initrd.img -v

binwalkএটি কাজ করতে আপনার ইনস্টল করা প্রয়োজন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.