আরআরডি শেননিগানস
আপনি যদি 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 পরীক্ষা করতে এবং স্ক্রিপ্টগুলি আসলে কী করছে তা দেখতে চাইতে পারেন ।