এম্বেড থাকা বনাম বাহ্যিক থ্রিমফের সাথে আর আইকে কার্যকর করার ক্ষেত্রে পার্থক্য?


10

আমি একটি খুব ন্যূনতম লিনাক্স সিস্টেম তৈরি করছি যা কেবলমাত্র কার্নেল (v4.1-rc5) এবং ব্যস্তবক্স (v1.23.2) দ্বারা পপুলেটেড একটি initramfs নিয়ে গঠিত। এটি বেশিরভাগ অংশের জন্য সূক্ষ্মভাবে কাজ করে, তবে আমি / initে কমান্ড প্রয়োগের আচরণের মধ্যে একটি পার্থক্য লক্ষ্য করি যে আমি একটি এম্বেডেড থ্রিমফ বনাম একটি বাহ্যিক ব্যবহার করছি কিনা।

/ Init স্ক্রিপ্টটি হ'ল:

#!/bin/sh

dmesg -n 1

mount -t devtmpfs none /dev
mount -t sysfs none /sys
mount -t proc none /proc
echo "Welcome"
while true
do
    setsid cttyhack /bin/sh
done

তারপরে আমি কার্নেলের সিএনএফআইজিপিআইপিআইটিআরএএমএফএসএসসিআরইসি বিকল্পটি সেট করেছিলাম। থ্রিমারফের জন্য সমস্ত ফোল্ডার সম্বলিত ডিরেক্টরিতে কনফিগ করুন, বা আমি চালাচ্ছি

find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz

এটি নির্মাণ।

আমি যখন তখন কার্নেলটি সিএনএফআইজিপিআইআইটিআরএএমএফএসএসসিআরইসি সেট সহ বা ছাড়াই সংকলন করি তখন আমি আমার সিস্টেমের দুটি রূপ দিয়ে শেষ করি:

  1. BZI छवि এম্বেড এম্বার দিয়ে

  2. bzI छवि + rootfs.cpio.gz (বাহ্যিক initramfs)

যখন আমি এখন তাদের ব্যবহার শুরু করি qemu

qemu-system-x86_64 -enable-kvm -kernel bzImage

অথবা

qemu-system-x86_64 -enable-kvm -kernel bzImage -initrd rootfs.cpio.gz

আমি আচরণের মধ্যে নিম্নলিখিত পার্থক্য পেয়েছি:

সংস্করণ 2 সহ (বাহ্যিক উদ্যোগ) সমস্ত কিছু ঠিকঠাকভাবে কাজ করে, "স্বাগতম" প্রদর্শিত হয় এবং আমি একটি প্রম্পট পাই। সংস্করণ 1 সহ তবে (এম্বেডেড initramfs) আমি সতর্কতা পেয়েছি

unable to open an initial console

"স্বাগতম" প্রদর্শিত হয় না এবং আমি আমার প্রম্পটটি পাই।

আমি যতক্ষণ না প্রক্রিয়াটি বুঝতে পারি, ইনি্রামফের এই দুটি সংস্করণে একই ফাইল থাকা উচিত, যেহেতু আমি একটি অভিন্ন ফোল্ডার থেকে এটি তৈরি করেছি (বা কার্নেল এটি তৈরি করেছি)।

আমি ভাবছি কেউ যদি এই আচরণের ব্যাখ্যা দিয়ে আমাকে সহায়তা করতে পারে?

* হালনাগাদ *

মাইকজার্ভ মন্তব্যগুলিতে যেমন বলেছিলেন, কার্নেলটিতে ডিফল্টর মধ্যে একটি ন্যূনতম এমবেডড ইন্ট্রামফ অন্তর্ভুক্ত রয়েছে। বাহ্যিকটি ব্যবহার করার সময় এটি এখনও উপস্থিত রয়েছে, তবে আপনি নিজের এম্বেড করলে ওভাররাইট হয়ে যায়। আমি স্পেসিফিকেশনের বিপরীতে দেখতে পেয়েছি, এটি প্রকৃতপক্ষে খালি নয়, তবে এতে একটি ডিভ ফোল্ডার, একটি রুট ফোল্ডার এবং / dev / কনসোল ডিভাইস রয়েছে। এই ডিভাইসটি বাহ্যিক initramfs ব্যবহার করার পরে ব্যবহৃত হবে, তবে আপনি নিজের এম্বেড করলে ওভাররাইট করে ten সুতরাং mknod -m 622 initramfs_src/dev/console c 5 1আপনার নিজের এম্বেড করার সময় আপনাকে / init / কনসোল ডিভাইসটি আপনার initramfs উত্সে অন্তর্ভুক্ত করতে হবে ।

মাইক্রোজার, ফ্রস্টচুটজ এবং জেডিবিপি-কে আমার চারপাশে আমার মাথা পেতে সাহায্য করার জন্য অনেক ধন্যবাদ!


/dev/consoleআপনার অন্তর্নির্মিতটিতে কীসের জন্য অনুমতি সেট করা আছে ? আমি মনে করি পার্থক্য সম্পর্কে হতে পারে যারা দুই মামলার প্যাকিং করে।
মাইকজার্ভ

একটি অনুরূপ প্রশ্ন অবশ্যই stackoverflow.com/questions/10437995
জেডিবিপি

@ মাইকজারভ কনসোল ডিভাইসের উভয় বিল্ডে অভিন্ন অনুমতি এবং মালিকানা রয়েছে।
ক্লো

@ জেডিবিপি আমি নিশ্চিত নই যে এটি একই রকম, যেহেতু আমি উভয় ক্ষেত্রেই বুট করি, একটি প্রম্পট পাই এবং একটি কনসোল ডিভাইস রাখি। কেবলমাত্র এক সূচনায় এটি প্রতিধ্বনিত করে এবং অন্যটিতে এটি পারে না।
ক্লো

1
আপনি যদি এমনকি তা নাও পেয়ে থাকেন তবে অনুমতিগুলি কীভাবে ইআর্রামফে একই রকম হতে পারে?
মাইকসার্ভ

উত্তর:


2

তারা কি আসলে অভিন্ন?

এখানে অন্তর্নিহিত হিসাবে অন্তর্নিহিত একটি আপনি এটি /usr/src/linux/usr/initramfs_data.cpio.gzbzI छवि থেকে সন্ধান বা নিষ্কাশন করতে পারেন : https://wiki.gentoo.org/wiki/Custom_Initramfs# সালভেজিং

যদি আপনি সেই অন্তর্নির্মিতটি ব্যবহার করেন এবং এর পরিবর্তে এটি বাহ্যিক হিসাবে ব্যবহার করেন, এটি কি কাজ করে?

যদি এটি এখনও আলাদা হয় তবে কার্নেলটি নিজেই অভিন্ন? ( /proc/config.gzউভয়ের জন্য তুলনা করুন )

কিছুটা পার্থক্য থাকা উচিত। আমি সচেতন নই যে কর্নেল উদ্বোধন করেছে যেখান থেকে ইন্ট্রামফগুলি এসেছে। প্যারামিটারটি qemuপাস করার সময় আমি আরও শীঘ্রই বিভিন্ন সেটিংস ব্যবহার করার সন্দেহ করি -initrd...

একপাশে, আপনার /initদেখতে আমার কাছে এটির প্রসারণ অসীম শাঁসের মতো। setsidনা exec। আমি কি ভূল?


1
এই উত্তরটি সমস্ত প্রশ্ন বলে মনে হচ্ছে।
জেডিবিপি

1
@ জেডিবিপি: আপনি চতুর্থ মাত্রিক চিন্তা করছেন না!
frostschutz

1
@ ফ্রস্টসচুটজ আপনার জবাবের জন্য অনেক ধন্যবাদ! যখন আমি কার্নেলটি যেভাবে তৈরি করা initramfs ব্যবহার করি (usr / initramfs_data.cpio.gz) বাহ্যিক হিসাবে এটি ভাল কাজ করে! এছাড়াও, আমি যখন কোনও বহিরাগতের সাথে এম্বেডড ইন্ট্রামফগুলি সংকলিত কর্নেল সরবরাহ করি তখন সতর্কতাটি উপস্থিত হয়, যদিও বহিরাংশকে এমবেড করা ( কর্নেল.আর / ডক / ডকুমেন্টেশন / ফাইলস সিস্টেম / )) ওভাররাইট করা উচিত । সুতরাং এটি সম্ভবত qemu -initrd নয় তবে কার্নেলের মধ্যেই কিছু। আমি তবে অন্য কিছু পরিবর্তন করি না যদিও
CONFIG_INITRAMFS_SOURCE

@ ফ্রস্টসচুটজ আপনার উত্তর On a sidenote, your /init looks like its spawning infinite shells to me. setsid is not exec. Am I wrong?: লুপটি গেট্টি বা অনুরূপ সরঞ্জামের নকল করে, যেহেতু shশেলটি প্রস্থান না হওয়া অবধি কলগুলি ব্লক করে।
স্টিফানজঙ্কার

@ স্টেফানজুনকার এবং সেটি ঠিক আছে, সেটসিড মোটেও ব্লক না করে ...
ফ্রস্টশুটজ

1

আপনি বিল্ড্রুট 2018.02 এটির সাথে কীভাবে আগ্রহী তা সম্পর্কেও আগ্রহী হতে পারেন।

আপনি যখনই initramfs ( BR2_TARGET_ROOTFS_INITRAMFS=y) বা initrd ( BR2_TARGET_ROOTFS_CPIO=n) ব্যবহার করেন, এটি /initআপনার রুটফেসগুলিতে নিম্নলিখিতগুলি যুক্ত করে https://github.com/buildroot/buildroot/blob/2018.02/fs/cpio/init

#!/bin/sh
# devtmpfs does not get automounted for initramfs
/bin/mount -t devtmpfs devtmpfs /dev
exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console
exec /sbin/init "$@"

অনুলিপিটি https://github.com/buildroot/buildroot/blob/2018.02/fs/cpio/cpio.mk করেছেন :

# devtmpfs does not get automounted when initramfs is used.
# Add a pre-init script to mount it before running init
define ROOTFS_CPIO_ADD_INIT
    if [ ! -e $(TARGET_DIR)/init ]; then \
        $(INSTALL) -m 0755 fs/cpio/init $(TARGET_DIR)/init; \
    fi
endef

এটিও জেনে রাখা গুরুত্বপূর্ণ যে init পথটি /initinitramfs এর জন্য, /sbin/initঅন্যথায় বিপরীতে : কার্নেলের কাছে init = / পাথ / টু / প্রোগ্রামটি পাস করার ফলে আরম্ভ হিসাবে প্রোগ্রাম কী শুরু করা যায়?

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