অভ্যন্তরীণভাবে একটি লিনাক্স কার্নেলের সিস্টেম শাটডাউন কীভাবে কাজ করে?


28

সিস্টেম শটডাউনে ইউজারস্পেস এবং ডিআইএন-সিস্টেম (এটি ক্লাসিক আরম্ভের সিএসভি / আপস্টার্ট / সিস্টেমড হওয়া) কীভাবে কাজ করে সে সম্পর্কে আমার একরকম ধারণা রয়েছে। (মূলত "থামুন!", "দয়া করে এখনই থামুন সত্যিই", "থামার জন্য আপনাকে হত্যা করার দরকার আছে এমন প্রক্রিয়া" এবং অপেক্ষা ... জিনিসগুলি চলছে এর অর্ডার উত্তরসূরি রয়েছে)।

কার্নেলের মধ্যে সিস্টেম শাটডাউন কীভাবে কাজ করে (যেখানে অবশ্যই সেখানে প্রচুর পরিমাণে কাজ করতে হবে) তা সম্পর্কে আমি কোনওভাবেই অসচেতন?

আমি কার্নেল ডকুমেন্টেশন https://www.kernel.org/doc/htmldocs/ সন্ধান করার চেষ্টা করেছি এবং এমনকি এটি কীভাবে কাজ করে তা সন্ধানের জন্য আমাকে একটি শুরুর জন্য এনএসএর পাল অনুসন্ধান সরঞ্জামটি ব্যবহার করেছিল ।

এছাড়াও আমি এসই ইউ + এল তে অনুসন্ধান করেছি এবং কিছুই পাইনি (আমি কি এটি উপেক্ষা করেছি?)

যাইহোক, যদিও প্রশ্নটি সম্ভবত কিছুটা চ্যালেঞ্জিং, তবে এই প্রশ্নোত্তর নেটওয়ার্কটিতে একটি উত্তর দেওয়া সম্ভব হবে কারণ আমি ধরে নিয়েছি যে শাটডাউন করার সময় লিনাক্স কার্নেলের মধ্যে কী ঘটে যায় তার জন্য একটি স্কেচ পেতে আরও বেশি লোক আগ্রহী।

সম্ভবত আরও কিছু বিস্তারিত ব্যাখ্যার সাথে লিঙ্ক করতেও পরিবর্তন রয়েছে।

একটি উত্তরে সম্ভবত কোন সিস্টেম-কল এবং কোন কর্নাল সিগন্যাল ব্যবহৃত হয় তা অন্তর্ভুক্ত থাকতে পারে?

https://github.com/torvalds/linux/blob/b3a3a9c441e2c8f6b6760de9331023a7906a4ac6/arch/x86/kernel/reboot.c পুনরায় বুট সম্পর্কিত x86 ব্যবহৃত ফাইল বলে মনে হচ্ছে (ইতিমধ্যে বন্ধ হয়ে গেছে, তাই?)

সম্ভবত এখানে স্নিপেট পাওয়া গেছে http://lxr.free-electrons.com/source/kernel/reboot.c#L176 একটি ব্যাখ্যা দিতে ব্যবহার করা যেতে পারে

176 শূন্য কার্নেল_শক্তি_অফ (শূন্য)
177 {
178 কার্নেল_শুটডাউন_প্রিয়প্রে (SYSTEM_POWER_OFF);
179 যদি (বিকাল_শক্তি_অফ_প্রেপার)
180 বিকাল_শক্তি_আর_প্রিয় ();
181 মাইগ্রেট_ টু_রেবুট_সিপু ();
182 সিসকোর_শুটডাউন ();
183 pr_emerg ("পাওয়ার ডাউন \ n");
184 কিলোমিটার_ডাম্প (কেএমএসজি_ডাম্প_পোভারফ);
185 মেশিন_পাওয়ার_অফ ();
186}
187 এক্সপোর্টT_SYMBOL_GPL (কর্নেল_শক্তি_অফ);

8
ইউনিকর্ন আপনার সাথে থাকতে পারে
কিউই

1
@ কিউই পরামর্শের জন্য ধন্যবাদ। সম্ভাব্য আরও ভাল উত্তর আসার জন্য কিছু সময় পার হওয়ার পরে আমি গ্রহণ করব। তবে কমপক্ষে কিছু উত্তর এখন আছে।
humanityANDpeace

আমাকে ধন্যবাদ দেবেন না, ইউনিকর্নকে ধন্যবাদ!
কিউই

সচেতন যে / একটি ছিল হউন আউট উইন্ডো লাফ বিকল্পে shutdown(8)অর্থাৎ অবচিত -n এক যা আমি মনে করি পড়তেন পুরাতন UNIX ডকুমেন্টেশন মধ্যে " সিস্টেমটি বন্ধ করে নিজেদেরকে - কোর ইউনিট আগুন হয় " কার্যকরভাবে একটি নোংরা সিস্টেম হত্যা-সুইচ যা / মেঝে জুড়ে বিট বিট ছেড়ে দিতে পারে (বা কমপক্ষে একটি দুর্নীতিগ্রস্থ অবস্থায় ফাইল-সিস্টেমগুলি) - একটি কল্পনা করে যে এটি একটি মূল-ফ্রেম টাইপ সিস্টেমের জন্য ব্যবহার করা হবে যেখানে কেউ শীতল পাখায় কেবল তাদের হাত ধরেছে। 🕱
স্লাইভেন

উত্তর:


26

লিনাক্স কার্নেলটি কীভাবে কাজ করে তা বোঝার প্রধান সংস্থানগুলি:

  1. ডকুমেন্টেশন
  2. লিনাক্স সাপ্তাহিক নিউজ নিবন্ধ
  3. উৎস. এটি একটি জটিল জন্তু যা লিনাক্সের ক্রস-রেফারেন্স, LXR এর মাধ্যমে ধরা সহজ to Lxr.linux.no এ চলমান এলএক্সআর বৈকল্পিক অন্যদের চেয়ে ভাল, তবে এটি প্রায়শই ডাউন হয়।

এই ক্ষেত্রে, আমি ডকুমেন্টেশনে বা এলডাব্লুএন-তে কেন্দ্রীয়ভাবে প্রাসঙ্গিক কিছু খুঁজে পাচ্ছি না, সুতরাং এটি LXR।

শেষ জিনিস userland কোড আছে কল rebootসিস্টেম কল । এটি 4 টি যুক্তি লাগে, সুতরাং SYSCALL_DEFINE4(rebootLXR এ অনুসন্ধান করুন, যা বাড়ে kernel/reboot.c। : আহ্বানকারী এর বিশেষাধিকার এবং আর্গুমেন্ট চেক পরে, প্রাপ্ত syscall এন্ট্রি পয়েন্ট বিভিন্ন ফাংশন এক কল kernel_restartপুনরায় বুট করার, kernel_haltএকটা সংকুচিত লুপ উপর স্থগিত, kernel_poweroffক্ষমতায় সিস্টেমটি বন্ধ, kernel_kexecথেকে একটি নতুন এক দ্বারা কার্নেল প্রতিস্থাপন (যদি এর মধ্যে কম্পাইল করা), অথবা hibernateপাওয়ার বন্ধ হওয়ার আগে মেমরিটি ডিস্কে সংরক্ষণ করতে।

kernel_restart, kernel_haltএবং kernel_power_offমোটামুটি মিল:

  1. দিয়ে যান reboot_notifier_list, যা আঙ্গুলসমূহ যে কার্নেল উপাদান পারেন একটি তালিকা রয়েছে রেজিস্টার করো powerdown কোডটি চালানো। এই পর্যায়ে কয়েকটি ড্রাইভারের কোড চালানো দরকার, বেশিরভাগ ওয়াচডগ।
  2. system_stateভেরিয়েবল সেট করুন ।
  3. কোনও ব্যবহারকারী কোড আর শুরু করা হবে না তা নিশ্চিত করার জন্য ব্যবহারকারীমোড -সহায়ককে অক্ষম করুন । (এই পর্যায়ে এখনও বিদ্যমান প্রক্রিয়া থাকতে পারে।)
  4. device_shutdownসিস্টেমে সমস্ত ডিভাইস মুক্তি বা পাওয়ার ডাউন করার জন্য কল করুন । প্রচুর চালক এই পর্যায়ে এসেছেন।
    নোট করুন যে কোনও ফাইল সিস্টেম যা এখনও এই মুহুর্তে মাউন্ট করা কার্যকরভাবে জোর করে আনমাউন্ট করা হয়। সিস্টেম কলের কলকারী যে কোনও পরিষ্কার আনমাউন্ট করার জন্য দায় গ্রহণ করে।
  5. কেবল পাওয়ার অফের জন্য, যদি এসিপিআই কনফিগার করা থাকে তবে সম্ভবত এসিপিআই রাষ্ট্র এস 5 (সফট পাওয়ার) বন্ধ করে প্রস্তুত করার জন্য কোড কার্যকর করুন ।
  6. একটি মাল্টি-সিপিইউ মেশিনে কোডটি যে কোনও সিপিইউতে চলতে পারে, যে কোনও সিস্টেম কলের জন্য আবেদন করেছিল। migrate_to_reboot_cpuএকটি নির্দিষ্ট সিপিইউতে স্যুইচ করতে এবং সিপিইউগুলিতে সিডিয়ুলার কোড প্রেরণে বাধা দেওয়ার ক্ষেত্রে যত্ন নেয়। এই পয়েন্টের পরে, কেবলমাত্র একটি সিপিইউ চলছে।
  7. syscore_shutdownনিবন্ধিত সিস্কোর অপারেশনshutdown পদ্ধতি কল । আমি মনে করি এটি বেশিরভাগ বাধা নিষ্ক্রিয় করার বিষয়ে; কয়েকটি হুকের একটি পদ্ধতি আছে।shutdown
  8. একটি তথ্য বার্তা লগ ইন - রাজহাঁসের গান।
  9. অবশেষে কল করে machine_restart, machine_haltবা machine_power_off। দ্বারা কিছু মেশিন-নির্ভর উপায়ে বিশ্রামে যান ।

শীতযাপনতা কোড নিম্নলিখিত পদক্ষেপগুলি মাধ্যমে যায়:

  1. পাওয়ার ম্যানেজমেন্ট হুকের মাধ্যমে আইট্রেট করুন ।
  2. ফাইল সিস্টেম সিঙ্ক করুন।
  3. সমস্ত ব্যবহারকারীর কোড স্থির করুন
  4. ডিভাইস হটপ্লাগিং প্রতিরোধ করুন
  5. অদলবদলের জায়গায় সিস্টেমের অবস্থা ডাম্প করুন।
  6. সবকিছু সফল হলে, হার্ডওয়্যার হাইবারনেট করুন । এর মধ্যে কলিং kernel_restart, kernel_haltবা kernel_power_off, বা কোনও প্ল্যাটফর্ম-নির্দিষ্ট হাইবারনেশন পদ্ধতি জড়িত থাকতে পারে ।

সিস্টেমটি বন্ধ করার আলাদা উপায় machine_emergency_restart। এটি যাদু SysRq কীB দ্বারা চালিত হয়েছেOকী ভিন্নভাবে কাজ করে: এটা কলkernel_power_off

সিস্টেম একটি শাট ডাউন করতে পারেন আতঙ্ক , একটি অপুনরুদ্ধারযোগ্য ত্রুটি অর্থাৎ। আতঙ্কিত করে কোনও বার্তা লগ করার চেষ্টা করা হয়, তারপরে সিস্টেমটি পুনরায় বুট করুন (হয় একটি হার্ডওয়্যার ওয়াচডগ বা জরুরী পুনঃসূচনা মাধ্যমে)।


+1 ধন্যবাদ! @ গিলস যদি আপনি এমন কোনও কোড প্রয়োগ করেন যা মেশিনের র‌্যামকে লাস্টস্টেপ হিসাবে মুছে ফেলবে / স্যানিটাইজ করবে আপনি তার জন্য সিসকোর অপারেশনটি নিবন্ধন করবেন syscore_shutdown(অর্থাত এটি আমার অন্যান্য প্রশ্নের সমাধান করবে ইউনিক্স.স্ট্যাকেক্সেক্সঞ্জ / কিউ / १२২৪৪০ / ২৪৯৪৪ ) । পদক্ষেপ (১) এবং পদক্ষেপ ()) উভয়ই শাটডাউন করার সময় স্টাফগুলিকে নিবন্ধিত করার অনুমতি দেয়, কী কী তা শিউর না করে + (১) এবং ()) -তে এই কলব্যাকগুলির কার্যকর করার আদেশটি আমি প্রভাবিত করতে পারি না! আপনার উল্লিখিত দস্তাবেজগুলি আমি করব, তবে যদি আপনি জানেন! ধন্যবাদ!
humanityANDpeace

আমি এই প্রশ্নটি থেকে অবাক হয়েছি এবং উত্তরটির আরও উত্সাহ নেই।

2

এটি কেবল একটি আংশিক উত্তর এবং আমি নিশ্চিতভাবেই অন্য উত্তরগুলিকে আমন্ত্রণ জানাই, এটি আরও পরিস্কার এবং পরিষ্কার হতে পারে।

এই উত্তরের সামগ্রীটি 3.13 লিনাক্স কার্নেলের kernel/reboot.cফাইল থেকে নেওয়া হয়েছে (নামটি শটডাউন না হওয়ার কারণে এটি প্রথম অনুমান হতে পারে না তবে পুনরায় বুট করুন)

যাইহোক সেখানে সেখানে আমাদের মূলত তিনটি ফাংশন রয়েছে যা সিস্টেমটি বন্ধ করার প্রক্রিয়াটি স্কেচ করে

  • void kernel_halt(void) // যা থামানো অবস্থায় একটি সিস্টেমের সাথে শেষ হয়
  • void kernel_power_off(void) // যা একটি সিস্টেম চালিত বন্ধ দিয়ে শেষ হয়
  • void kernel_restart(char *cmd) // এটি সিস্টেমটিকে পুনরায় আরম্ভ করার জন্য শেষ করে

এই ফাংশনগুলি খুব সংক্ষিপ্ত এবং এহেতু এখানে সম্পূর্ণ আটকানো যায়। তাদের কোডটি সর্বোত্তমভাবে দেখায় যে কার্নেলটি বন্ধ করার পথে কী পদক্ষেপ নেওয়া হয়েছে taken (মন্তব্যগুলি আমার দ্বারা এবং 100% আদর্শ এবং সঠিক নাও হতে পারে, নিশ্চিত হওয়ার জন্য নিজেকে পরীক্ষা করুন It এটি সহজ চেষ্টা।

void kernel_halt(void)

শূন্য কার্নেল_হাল্ট (অকার্যকর)
{
    // প্রথম পদক্ষেপটি করে:
    // এ) রিবুট / শাটডাউন চালানোর জন্য কল ফাংশন / কলব্যাক নিবন্ধিত
    // খ) সিস্টেম_সেটটি SYSTEM_HALT এ সেট করুন
    // সি) ইউজারস্পেসিটোল ইন্টারঅ্যাকশন বন্ধ করুন
    // d) কল করুন ডিভাইস_শটডাউন () ফাংশন
    kernel_shutdown_prepare (SYSTEM_HALT);

    // ২ য় পদক্ষেপ: আমি মনে করি এটি বেশিরভাগই মাল্টি সিপিইউ সিস্টেমগুলির প্রয়োজনীয়তা
    migrate_to_reboot_cpu ();

    // তৃতীয় পদক্ষেপ:
    // syscore_shutdown - নিবন্ধিত সমস্ত সিস্টেমের কোর শাটডাউন কলব্যাকগুলি কার্যকর করুন 
    syscore_shutdown ();

    // চতুর্থ বার্তা
    pr_emerg ("সিস্টেম থামিয়ে দেওয়া \ n");
    kmsg_dump (KMSG_DUMP_HALT);

    // 5 তম কল আর্চ নির্দিষ্ট সিপিইউ-হোল্ট-কোড
    machine_halt ();
}

পুরোপুরি sys_rebootসিস্টেম কল দিয়ে শুরু করা হয়েছিল, এটি কেবল পুনরায় বুট করে না তবে শাটডাউন করে, শটডাউন প্রক্রিয়াটির সাথে কোনওভাবে সংযুক্ত হওয়ার প্রত্যক্ষ জিনিস নয়।

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