سلام جناب دراگون
initramfs shell رو آوردم بالا هارد رو شناسایی کرده بود .
راستی الان دقت کردم اون اول بوت شدن هم یه خطایی داده که جلوش نوشته bug اون چی باز .
تو همون محیط initramfs shell دستور exit زدم که بیاد بیرون باز افتاد تو همون چاله ی خطا به هارد
چنتا هارد دارید؟ ۷ تا هارد شناسایی کرده ولی فکر میکنم یه جاییش مشکل داره.
در مورد اینکه وقتی از اون محیط خارج میشید، دوباره همون خطاها نمایان میشن اینه که یه پوسته برای شما باز شده و بعد از بسته شدن اون پوسته، ادامه مراحل داخل initramfs از سر گرفته میشه.
احتمالا وقتی initramfs سعی میکنه فایلسیستم روت رو سوار کنه، این مشکل پیش میاد.
میتونید توی زمانهای مختلفی، initramfs رو متوقف کنید تا ببینید کجا مشکل پیش میاد.
وقتی که با initramfs-tools، فایل initramfs ساخته بشه، به ترتیب مقاطع زیر اجرا میشن
init-top
init-premount
local-top
local-block
local-premount
local-bottom
init-bottom
با توجه به تنظیمات و شرایط سیستم، ممکنه بعضی از مقاطع بالا توی initramfs وجود نداشته باشن.
مثلا توی initramfs من، init-premount وجود نداره.
udev توی init-top اجرا میشه.
udev برنامهای هست که تغییرات توی سختافزارها رو متوجه میشه و با توجه با اون تغییرات، ممکنه برنامههای دیگه رو از تغییر با خبر کنه، فایلها و لینکهای داخل /dev/ رو تغییر بده یا یه کار خاصی انجام بده، مثل اجرای یه اسکریپت یا برنامه.
توی initramfs بیشتر به این دلیل اجرا میشه تا لینکها و فایلهای داخل /dev/ رو ایجاد کنه.
با دادن break یا break=SOMETHING به خط فرمان کرنل، میشه کاری کرد تا قبل از بعضی مراحل، initramfs متوقف بشه و یه پوسته در اختیار شما قرار بده.
شما میتونید قبل از اجرای اسکریپتهای init-top، قبل از اینکه یه سری ماژولها بارگذاری بشه، قبل از اجرای اسکریپتهای init-premount، قبل از اجرای اسکریپتهای مربوط به سوار کردن فایلسیستم روت، قبل از سوار شدن فایلسیستم روت، قبل از اجرای اسکریپتهای init-bottom و همینطور قبل از اینکه init system (توی اکثر مواقع systemd) اجرا بشه، initramfs رو متوقف کنید تا برای شما یه پوسته باز کنه. بعد از خارج شدن از پوسته، ادامه مراحل توی initramfs انجام میشه.
اگه break خالی بدید، پوسته قبل از اجرای اسکریپتهای مقطع init-premount باز میشه. اگه break=SOMETHING بدید و اون SOMETHING معتبر باشه، initramfs قبل از انجام کارهای مربوط به اون مرحله، یه پوسته برای شما باز میکنه.
نمیدونم چی میشه اگه break رو چند بار مشخص کنید یا مقدار نامعتبر بهش بدید. توی مورد دوم، احتمالا مقادیر نامعتبر نادیده گرفته میشن، کامل مطمئن نیستم.
چیزهایی که میتونه جلوی مساوی قرار بگیره اینها هست:
top برای متوقف شدن قبل از اجرای اسکریپتهای مقطع init-top
modules برای متوقف شدن قبل از بارگذاری بعضی ماژولهای کرنل
premount برای متوقف شدن قبل از اجرای اسکریپتهای مقطع init-premount
mount برای متوقف شدن قبل از اجرای اسکریپتهای مربوط به فایلسیستم روت
mountroot برای متوقف قبل از سوار شدن فایلسیستن روت
bottom برای متوقف شدن قبل از اجرای اسکریپتهای مقطع init-bottom
و در نهایت init برای متوقف شدن قبل از اجرای init system و شروع سیستم اصلی.
مراحل بالا، به همون ترتیبی که نوشتم اجرا میشن. مقاطع local-top و local-block و هر چی که که اینجا نیست، یه جایی بین مراحل بالا اجرا میشن. ترتیب اونها رو یادم نیست.
توی مثالهای پایین، اولی باعث میشه که initramfs قبل از مرحله بارگذاری بعضی از ماژولهای کرنل، متوقف بشه.
دومی باعث میشه قبل از سوار شدن فایلسیستم روت، initramfs متوقف بشه.
break=modules
break=mountroot
break و break=premount معادل هم هستند.
در صورتی که بخواهید initramfs توی چندین مرحله متوقف بشه، میتونید اون مراحل رو با کاما از هم جدا کنید. مثلا break=top,bottom,init باعث میشه initramfs قبل از اجرای اسکریپتهای مقطع init-top، قبل از اجرای اسکریپتهای مقطع init-bottom و همینطور قبل از اینکه init system رو اجرا کنه و کنترل سیستم رو به اون بده، متوقف بشه و یه پوسته برای شما باز کنه.
هر بار که یه پوسته برای شما باز میشه و بعد شما اون رو میبندید، ادامه فرایندهای توی initramfs انجام میشه.
ممکنه جاهای دیگه هم initramfs متوقف بشه و به شما یه پوسته بده. معمولا مواقعی که یه خطای قابل توجه پیش میاد، این اتفاق میافته.
برای اطلاعات بیشتر درباره initramfs-tools و نحوه عملکرد اون، صفحات man زیر رو میتونید ببینید.
initramfs-tools
mkinitramfs
update-initramfs
lsinitramfs
unmkinitramfs
initramfs.conf
update-initramfs.conf
میتونید اسکریپت زیر رو مشاهده کنید تا دقیقا ببینید فرایندها به چه ترتیبی و چجوری توی initramfs انجام میشن.
/usr/share/initramfs-tools/init
اسکریپت بالا توی روتِ initramfs کپی میشه و کارها رو انجام میده. اسکریپت بالا اولین چیزی هست که کرنل لینوکس، بعد از باز کردن initramfs، اجرا میکنه.
به طور کلی، کرنل لینوکس به طور پیشفرض سعی میکنه بعد از باز کردن initramfs، اولین چیزی که اجرا کنه، فایل زیر باشه
/init
توی مراحل اول بوت، initramfs به عنوان به فایلسیستم روتِ مجازی سوار میشه تا کارهای لازم انجام بشه و بعد فایلسیستم اصلی روت سوار، و init system اصلی اجرا بشه.
اکثر چیزهایی که بالا در مورد initramfs گفتیم، (به غیر از مورد آخر) وقتی صادقه که از initramfs-tools برای ساخت initramfs استفاده شده باشه.
توی دبیان و توزیعهای مبتنی بر اون، اینطوری هست. بقیه توزیعها، عموما از dracut برای ساخت initramfs استفاده میکنند. dracut به طور پیشفرض توی دبیان نصب نیست (ولی توی مخازن وجود داره). نحوه عملکرد dracut متفاوته و چیزهای بالا، الزاما توی dracut یکسان نیست. dracut توسط redhat ساخته شده و توسه پیدا میکنه.
آرچ از mkinitcpio استفاده میکنه، نحوه کار اون هم با dracut و initramfs-tools متفاوته. ولی همه اونها، شباهتهایی با هم دارند.
الان که در مورد break توی initramfs اطلاعات بدست آوردید، initramfs رو توی مراحل مختلف متوقف کنید تا بفهمید بین کدوم دو مرحله مشکل پیش میاد. بعد از این باید اتفاقاتی که بین اون دو مرحله انجام میشه رو بررسی کرد و همینطور اینکار رو انجام داد تا به مشکل رسید.
دقت کنید موقعی که break رو به خط فرمان کرنل میدید، panic هم توی خط فرمان نباشه. چون باعث میشه مستقیم کامپیوتر راهاندازی مجدد بشه یا اگه راهاندازی مجدد ممکن نبود، کرنل panic کنه و سیستم غیر قابل استفاده بشه؛ تا زمانی که به زور کامپیوتر رو راهاندازی مجدد یا خاموش کنید.
طبق مستنداتِ initramfs-tools، این یه پارامتر امنیتی هست تا دسترسی به پوسته بازیابی توی initramfs، مسدود بشه.
یه چیز دیگه احتمالا به این ربط نداره ؟ :
https://forum.ubuntu-ir.org/index.php?topic=153182.0
شاید؛ مطمئن نیستم.
تو گیت هابشون مشکل رو ثبت کردم اینطور جواب داده :
damentz commented 5 hours ago
Looks like some type of bad interaction with MG-LRU. However, considering 5.15 is near end of life, I'm not sure if this is worth doing anything about until I rebase Liquorix to kernel 5.16 with a more mature patch set.
I'll keep this open and remind you once a new version is out that may fix it.
جوابتون رو توی ارسال بالا دادند.
گفته به نظر میاد مشکل از MG-LRU باشه. در ادامه گفته، نسخه 5.15 آخرای پشتیبانیش هست. (چون 5.16 امده و 5.15 نسخه lts نیست) به همین دلیل من مطمئن نیستم ارزش داشته باشه کاری درباره اون انجام داد یا نه؛ تا زمانی که Liquorix رو بر اساس 5.16 پیاده کنم، همراه وصلههایی بهتر.
در آخر گفته من این مشکل رو باز میذارم و وقتی یه نسخه جدید بیاد که شاید مشکل رو حل کنه، به شما یادآوری میکنم.