কার্নেল থেকে init = / পাথ / টু / প্রোগ্রাম পাস করার ফলে প্রোগ্রামটি আরডি হিসাবে শুরু করা যায় না?


13

আমি লিনাক্স সিস্টেমে একটি init স্ক্রিপ্ট ডিবাগ করার চেষ্টা করছি; আমি init=/bin/shআরম্ভ shনা করেই এটি শুরু করার জন্য কার্নেলটি দিয়ে যাওয়ার চেষ্টা করছি initযাতে আমি নিজেই আর ডি ক্রমটি চালিয়ে যেতে পারি run

আমি যা পেয়েছি তা হ'ল কার্নেলটি initযেভাবেই শুরু হচ্ছে । বুটআপের সময়, মুদ্রণ বার্তাগুলির মধ্যে একটি হ'ল কমান্ড লাইন এবং এটি দেখায় যে লাইনটি সঠিকভাবে সেট করা হচ্ছে; তদতিরিক্ত, আমি কার্নেল কমান্ড লাইন ব্যবহার করে অন্যান্য জিনিসগুলিকেও প্রভাবিত করতে পারি। আমি পথটি বিদ্যমান তা নিশ্চিত করার জন্য পরীক্ষা করে দেখেছি; এটা করে.

এটি একটি ব্যস্তবক্স সিস্টেম এবং আর ডিজে ব্যস্তবক্সে একটি সিমিলিংক; সুতরাং ব্যস্তবক্সটি যখন এর পিআইডি 1 হয় তখন অদ্ভুত যাদু না করে তা নিশ্চিত করার জন্য, আমি init হিসাবে নন-ব্যস্তবক্স প্রোগ্রাম চালানোর চেষ্টাও করেছি; যে কাজ করে না। দেখে মনে হচ্ছে যে আমি যাই করি না কেন, init চালানো হয়।

এই আচরণের কারণ কী হতে পারে?


ব্যাসবক্সটি বেস বেসটি কীসের জন্য ব্যবহার করছে init? তারা সম্ভবত কমান্ড লাইনটিকে উপেক্ষা করছে ... আপনি initrd পরীক্ষা করতে এবং স্ক্রিপ্টগুলি আসলে কী করছে তা দেখতে চাইতে পারেন ।
অ্যারন ডি মারাকো

এটি কোনও ডিসট্রো নয় - এটি আমার নিজস্ব বিল্ড; যে কারণে আমি init স্ক্রিপ্টগুলি ডিবাগ করার চেষ্টা করছি।
শন জে গফ

উত্তর:


3

লিনাক্স কার্নেলের উত্সের দিকে তাকালে আমি দেখতে পাচ্ছি যে ফাইল / init উপস্থিত থাকলে কার্নেল সর্বদা এটি রমডিস্ক বুট করছে এমন অনুমানের সাথে চালানোর চেষ্টা করবে। আপনার সিস্টেমে / init উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখুন, যদি তা থাকে তবে সম্ভবত এটিই আপনার সমস্যা।


প্রকৃতপক্ষে, এটি execute_commandপ্রথমে পরীক্ষা করে , যা কার্নেল কমান্ড লাইন init=প্যারামিটার থেকে আসে । এটি যদি এটি কার্যকর করতে না পারে তবে এটি একটি সতর্কতা প্রিন্ট করে initএবং বিভিন্ন জায়গায় চালানোর চেষ্টা করে । এটি init/main.cফাংশনে রয়েছে init_post()। আমি কার্নেল প্রিন্টক বার্তাগুলি সন্ধান করেছি এবং আমার কার্নেলের আউটপুটে সতর্কতাটি পেয়েছি, সুতরাং এখনই আমি কেন এটি / বিন / এস বা অন্য যে কোনও কিছু শুরু করতে চাইছি তা সনাক্ত করতে হবে।
শন জে। গফ

আমি যে কোডটি দেখেছি (v3.2.2 আমি মনে করি) সেট করে ramdisk_execute_command টি পরীক্ষা করা আছে যদি এটি সেট না করে থাকে এবং তারপরে এটি চালানোর চেষ্টা করা হয়, সুতরাং আপনার অবশ্যই বর্তমান হওয়া উচিত নয়। খুব খারাপ, কারণ আমি এর বাইরে অন্য কিছু দেখলাম না যা এর ব্যাখ্যা দেবে।
কাইল জোন্স

আপত্তিজনকভাবে র‌্যামডিস্কrdinit থেকে বুট করার সময় আপনার অবশ্যই ব্যবহার করা উচিত : unix.stackexchange.com/a/430614/32558
Ciro

8

আরআরডি শেননিগানস

আপনি যদি 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

এছাড়াও নোট করুন যে রাম ইনসাইট এবং নন-র্যাম ইনাইটের মধ্যে আরও পার্থক্য রয়েছে, যেমন কনসোল হ্যান্ডলিং: এম্বেড থাকা বনাম বাহ্যিক থ্রিম্রামগুলির সাথে আরকি প্রয়োগের ক্ষেত্রে পার্থক্য?


4

চালু

https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

আমি পেয়েছি:

একটি সাধারণ রুট ফাইল সিস্টেমটি ডিবাগ করার সময়, "init = / bin / sh" দিয়ে বুট করতে সক্ষম হওয়াই ভাল। Initramfs সমতুল্য হ'ল "rdinit = / bin / sh" এবং এটি ঠিক ততটাই কার্যকর।

সুতরাং সম্ভবত মুছে ফেলার চেষ্টা করুন = / বিন / শ


0

আপনি আপনার লিনাক্স কার্নেলটি কাস্টম করতে পারেন এবং এটি পুনরায় সংকলন করতে পারেন। ৪.৯ কার্নেলের জন্য, init / main.c তে "kernel_init" ফাংশনটি সম্পাদনা করুন এবং নীচের লাইনটি প্রথমে চালনার চেষ্টা করুন:

try_to_run_init_process("/bin/sh")

এছাড়াও, এটি বুটলোডার দ্বারা চালিত কার্নেল পরামিতিগুলির কারণে ঘটতে পারে।

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