আরআরডি শেননিগানস
আপনি যদি initrd বা initramfs ব্যবহার করছেন তবে নিম্নলিখিত বিষয়গুলি মনে রাখবেন:
rdinit= পরিবর্তে ব্যবহৃত হয় init=
যদি rdinit=না দেওয়া হয় চেষ্টা ডিফল্ট পাথ আছেন: /sbin/init, /etc/init, /bin/initএবং /bin/shকিন্তু/init
Initrd ব্যবহার না /initকরার সময়, প্রথম পাথটি চেষ্টা করা হয়, অন্যরা অনুসরণ করে।
v4.15 আরটিএফএস: https://github.com/torvalds/linux/blob/v4.15/init/main.c ফাইলের মধ্যে সমস্ত কিছু রয়েছে ।
প্রথমে আমরা এটি শিখি:
execute_comand যা যা পাস তা হ'ল: init=
ramdisk_execute_command যা যা পাস তা হ'ল: rdinit=
হিসাবে দেখা যেতে পারে:
static int __init init_setup(char *str)
{
unsigned int i;
execute_command = str;
/*
* In case LILO is going to boot us with default command line,
* it prepends "auto" before the whole cmdline which makes
* the shell think it should execute a script with such name.
* So we ignore all arguments entered _before_ init=... [MJ]
*/
for (i = 1; i < MAX_INIT_ARGS; i++)
argv_init[i] = NULL;
return 1;
}
__setup("init=", init_setup);
static int __init rdinit_setup(char *str)
{
unsigned int i;
ramdisk_execute_command = str;
/* See "auto" comment in init_setup */
for (i = 1; i < MAX_INIT_ARGS; i++)
argv_init[i] = NULL;
return 1;
}
__setup("rdinit=", rdinit_setup);
যেখানে __setupকমান্ড লাইন প্যারামিটার আপ পরিচালনার একটি যাদু উপায়।
start_kernel, কার্নেল "এন্ট্রি পয়েন্ট", কল করে rest_init, যা kernel_initকোনও থ্রেডে "কল" করে:
pid = kernel_thread(kernel_init, NULL, CLONE_FS);
তারপরে, kernel_initকরে:
static int __ref kernel_init(void *unused)
{
int ret;
kernel_init_freeable();
[...]
if (ramdisk_execute_command) {
ret = run_init_process(ramdisk_execute_command);
if (!ret)
return 0;
pr_err("Failed to execute %s (error %d)\n",
ramdisk_execute_command, ret);
}
[...]
if (execute_command) {
ret = run_init_process(execute_command);
if (!ret)
return 0;
panic("Requested init %s failed (error %d).",
execute_command, ret);
}
if (!try_to_run_init_process("/sbin/init") ||
!try_to_run_init_process("/etc/init") ||
!try_to_run_init_process("/bin/init") ||
!try_to_run_init_process("/bin/sh"))
return 0;
panic("No working init found. Try passing init= option to kernel. "
"See Linux Documentation/admin-guide/init.rst for guidance.");
}
এবং kernel_init_freeableকরে:
static noinline void __init kernel_init_freeable(void)
{
[...]
if (!ramdisk_execute_command)
ramdisk_execute_command = "/init";
if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {
ramdisk_execute_command = NULL;
prepare_namespace();
}
টোডো: বুঝুন sys_access।
এছাড়াও নোট করুন যে রাম ইনসাইট এবং নন-র্যাম ইনাইটের মধ্যে আরও পার্থক্য রয়েছে, যেমন কনসোল হ্যান্ডলিং: এম্বেড থাকা বনাম বাহ্যিক থ্রিম্রামগুলির সাথে আরকি প্রয়োগের ক্ষেত্রে পার্থক্য?
init? তারা সম্ভবত কমান্ড লাইনটিকে উপেক্ষা করছে ... আপনি initrd পরীক্ষা করতে এবং স্ক্রিপ্টগুলি আসলে কী করছে তা দেখতে চাইতে পারেন ।