লিনাক্স কার্নেল initrd সঠিকভাবে খুঁজে পাচ্ছে না


11

আমি একটি লিনাক্স কার্নেল সংকলন করেছি এবং আমি কিউইইউইউতে এটি ডিবাগ করতে চেয়েছিলাম। কমান্ডগুলি দিয়ে বুট করার জন্য একটি ফাইল তৈরি করেছি

$ qemu-img create -f raw disk.img 200M
$ mkfs.ext2 -F disk.img
# mkdir /mnt/rootfs
# mount -o loop disk.img /mnt/rootfs

তারপরে আমি করেছি qemu -kernel bzImage -initrd disk.imgএবং নীচে স্ক্রিন পেয়েছি যা বলে:

Kernel panic - not syncing: VFS: unable to mount root fs on unknown block

আমার কিউইএমইউ স্ক্রিন

আমি কী ভুল করেছি এবং এটি সংশোধন করার জন্য আমি কী করতে পারি?



একই ত্রুটির বার্তা এটি, তবে তিনি পৌঁছানোর জন্য তিনি কী পদক্ষেপ নিয়েছেন তা নির্দিষ্ট করে না: unix.stackexchange.com/questions/48302/…
Ciro Santilli

উত্তর:


8

কার্নেল আপনাকে বলছে যে কোনও ডিভাইসটি রুট ফাইল সিস্টেমটি ধারণ করে তা এটি জানেন না । আপনার লুপ মাউন্ট প্রয়োজনীয় নয়। (চালিয়ে যাওয়ার আগে এটি আনমাউন্ট করুন)।

একটি কমান্ড চেষ্টা করুন

qemu -kernel bzImage -hda disk.img -append root=/dev/sda

-hda disk.imgপরামিতি QEMU বলে একটি ডিস্ক আপনার এর উপর ভিত্তি ডিভাইস অনুকরণ disk.img

-append root=/dev/sdaসুইচ QEMU দ্বারা ব্যবহৃত হয় এটা রুট ডিভাইস সম্পর্কে কার্নেল বলতে। এটি root=/dev/sdaকার্নেল কমান্ডলাইনে যুক্ত করে করা হয়। আপনি এটিকে নিজের কার্নেলের কার্নেল কমান্ডলাইনের সাথে তুলনা করতে পারেন cat /proc/cmdline(এটি নিরাপদ)। rootআপনারও সেখানে একটি প্যারামিটার দেখতে হবে ।


আমি কীভাবে ফাইলগুলি আনমাউন্ট করব?
কোডার 404

umount /mnt/rootfs
t-8ch

যখন আমি এটি করি যে আমি অ্যামাউন্টটি পাই: / এমএনটি / রুটফগুলি মাউন্ট করা হয় না (এমটিএবি অনুযায়ী)
কোডার 404

সম্ভবত কোডার 404 machine মেশিনে কোনও ডিস্ক সংযুক্ত করতে চায় না এবং কেবল এটিতে চালিত initকরে initrd। এখানে আপনি disk.imgউভয়কেই একটি হার্ড ডিস্ক হিসাবে পাস করছেন এবং initrdএটির কোনও অর্থ নেই।
স্টাফেন চেজেলাস

@ স্টেফেন চ্যাজেলাস -initrdযে ইঙ্গিতটি এখানে ছিল না সে সম্পর্কে ধন্যবাদ ।
t-8ch

8

যা ঘটছে তা হ'ল আপনি "অপ্রচলিত" উপায়ে লিনাক্স বুট করার চেষ্টা করছেন। সেই initrdস্থানেই একটি র‌্যামডিস্ক একটি সংক্ষেপিত সিপিও আর্কাইভের বিপরীতে র‌্যামফসে কর্নেল দ্বারা প্যাকবিহীন এবং শেষ ডিভাইসে স্যুইচ করার পুরানো উপায় সহ।

এই মোডে, কার্নেল ডিস্ক.আইএমগকে একটি র‌্যামডিস্ক হিসাবে রুট ফাইল সিস্টেম হিসাবে মাউন্ট করে এবং তারপরে /linuxrcসেখানে চালায় । আপনার ক্ষেত্রে সম্ভবত এটির কোনও ফাইল নেই। যখন /linuxrc(যা আসল রুট ফাইল সিস্টেমের জন্য ব্লক ডিভাইসটি আনার জন্য যা কিছু করা প্রয়োজন বলে মনে করা হয়) বেরিয়ে যায়, তখন কার্নেলটি আসল রুট ফাইল সিস্টেমকে মাউন্ট করে।

উপরের বার্তাগুলি দেখায় যে এটি র্যাম ডিস্কটি সফলভাবে মাউন্ট করেছে (1,0: 1 এর জন্য ram, তাই /dev/ram0) তবে আসল রুট ফাইল সিস্টেম / ডিভ / এসডিএ নয় (8,1: 8 হ'ল sd, 1 হ'ল a1)। সম্ভবত আপনি যে কোনও কার্নেল কমান্ড লাইন ( -append) নির্দিষ্ট করেন নি , এটি /dev/sda1কার্নেল সংকলনের সময় বা ব্যবহারের সময় পাস হওয়া CONFIG_CMDline থেকে এসেছে rdev

যদি আপনার ডিস্ক.আইএমজি মানে একটি ছোট লিনাক্স ডিস্ট্রিবিউশন /sbin/init... এর মূল ফাইল সিস্টেম থাকে ... তবে আপনি সম্ভবত এটির পরিবর্তে এটি লিখতে চান:

kvm -kernel kernel.img -initrd disk.img -append 'root=/dev/ram0`

তারপরে, কার্নেলটি রাম ডিস্কটিকে আসল রুট ফাইল সিস্টেম হিসাবে বিবেচনা করবে (যদিও আপনি এখনও pivot_rootঅন্যটিতে যেতে পারেন)।

কার্নেল বার্তাগুলি আরও সহজে দেখতে পাওয়ার জন্য, আমি সিরিয়াল আউটপুট ব্যবহার করার পরামর্শ দেব:

kvm -kernel kernel.img -initrd disk.img -nographic -append "root=/dev/ram0 console=ttyS0"

বিকল্প হিসাবে আপনি একটি র‌্যামডিস্কের পরিবর্তে একটি ডিএম র‌্যামফ ব্যবহার করতে পারেন:

mkdir -p RAMFS/{bin,dev} 
cd RAMFS/bin
cp /bin/busybox .
"$PWD/busybox" --install .
cd ..
cp -a /dev/{null,tty,zero,console} dev
printf '%s\n' "#! /bin/sh" "exec /bin/sh" > init
chmod +x init
find . | cpio -oHnewc | gzip > ../initramfs.gz
cd ..
kvm -kernel kernel.img -initrd initramfs.gz

( busyboxএটি স্ট্যাটিকালি লিঙ্কযুক্ত সংস্করণ হিসাবে প্রদান করা হয়েছে) এবং আপনি সেই কার্নেলের মধ্যে একটি শেল এবং অন্যান্য ব্যস্তবক্সের ইউটিলিটি পাবেন get

নোট করুন যে কার্নেলটি এখন সেই মোডের /initবিপরীতে /linuxrcবা তার বিপরীতে চলে /sbin/init


প্রদর্শিত আউটপুটটির লাইন 3 দেখায় যে, কার্নেলটি initramdisk এর ext2 ফাইল সিস্টেমটি মাউন্ট করেছে। সুতরাং এটি সম্ভবত অনুপস্থিত মডিউল নয়।
t-8ch

ওহ হ্যাঁ, আমি এটি মিস করেছি, ধন্যবাদ @ t-8ch। আমি মনে করি আমি জানি কী হচ্ছে এবং আমার উত্তর আপডেট করেছে।
স্টাফেন চেজেলাস

0

CONFIG_BLK_DEV_INITRD=y

এই কার্নেল কনফিগারেশন বিকল্পটিও প্রয়োজনীয়। এটি লিনাক্স কার্নেলে initrd সমর্থন সক্ষম করে support

ভাগ্যক্রমে বিল্ড্রুট যখন BR2_TARGET_ROOTFS_CPIO=yদেওয়া হয় তখন এটি আমাদের জন্য ডিফল্টরূপে সেট করে ।

তারপরে আপনি সিপিআইও কেইউএমইউতে qemu -initrdবিকল্পটি দিয়ে পাস করুন । আমার সম্পূর্ণ কিউইএমইউ কমান্ডটি হ'ল:

./buildroot/output.x86_64~/host/usr/bin/qemu-system-x86_64 -m 128M -monitor telnet::45454,server,nowait -netdev user,hostfwd=tcp::45455-:45455,id=net0 -smp 1  -M pc -append ' nopat nokaslr norandmaps printk.devkmsg=on printk.time=y console=ttyS0' -device edu -device lkmc_pci_min -device virtio-net-pci,netdev=net0 -kernel ./buildroot/output.x86_64~/images/bzImage  -nographic  -initrd './buildroot/output.x86_64~/images/rootfs.cpio'

এখানে একটি সর্বনিম্ন সম্পূর্ণ সম্পূর্ণ স্বয়ংক্রিয়ভাবে বিল্ড্রুট + কিউইএমইউ উদাহরণ রয়েছে: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/b3868a3b009f2ab44fa6d3db3d174930b3cf7b69#initrd

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