يوضح هذا المشروع كيفية إنشاء نظام تشغيل Linux مضغوط يعمل بالكامل. عنوان المشروع هو https://github.com/superconvert/smart-os

لماذا نختار إصدار الخادم للإنتاج؟
لا يحتوي إصدار الخادم على معظم الحزم التي يعتمد عليها نظام النوافذ ؛ إذا جاء النظام مع هذه الحزم ، فستكون هناك مشاكل في إصدارات متعددة من الحزمة ، ومشاكل التجميع ، ومشاكل التبعية ، ومشاكل الارتباط ، ومشاكل وقت التشغيل ، مما سيؤدي إلى الكثير من التداخل في عملنا. علاوة على ذلك ، فإن حل هذه المشكلات لا معنى له ، نحتاج إلى إصدارات نقية من حزم التبعية
لماذا يعمل نظام النوافذ بشكل كبير؟
جميع الحزم (باستثناء الأدوات) التي نقوم بتثبيتها باستخدام APT ، من الناحية النظرية ، نحتاج إلى تجميع التعليمات البرمجية المصدر ، بما في ذلك التبعيات والالتصاق بالحزمة ، والتي تحتاج إلى حل. هذا عبء عمل ضخم للغاية. لا توجد طريقة ، لا يوجد شيء في النظام الجديد ، ويجب توفير البيئة المطلوبة من قبلنا. يعتمد المشروع A على الحزمة B ، ويعتمد الحزمة B على الحزمة C والحزمة C والحزمة C تعتمد على الحزمة D. كل ما علينا فعله هو تجميع جميع الحزم!
تم إجراء هذا البرنامج النصي على Ubuntu 18.04. لا ينبغي تغيير الأنظمة الأخرى كثيرًا. يمكن للأصدقاء الذين يحتاجون إليها تعديله بأنفسهم.
إعداد بيئة النظام. نظرًا لأن kernel تحتاج إلى تجميع ، فأنت بحاجة إلى تثبيت البيئة المطلوبة لتجميع kernel. نظرًا لأن Busybox يحتاج إلى تجميع ، يمكنك تثبيت البيئة المطلوبة بنفسك حسب الحاجة.
./00_build_env.shترجمة رمز المصدر (kernel ، glibc ، businbox ، gcc ، binuTils)
./01_build_src.shقم بإنشاء قرص نظام (مهم ، تقوم هذه الخطوة بتثبيت النظام في ملف نظام)
./02_build_img.shقم بتشغيل نظام Smart-OS
./03_run_qemu.sh 或 ./04_run_docker.shهل من السهل إنشاء نظام تشغيل؟ يمكن توسيع مساحة القرص بشكل تعسفي ، ويمكن الوصول إليها عبر الإنترنت ، ويمكن توسيعها حسب الحاجة. لقد جربته بنجاح وقم بتشغيل Smart_RTMPD Server Server في Smart-OS
+----------------------------------------------------------------+-----------------------------------------+-----------------------------------------+
| Host | Container 1 | Container 2 |
| | | |
| +------------------------------------------------+ | +-------------------------+ | +-------------------------+ |
| | Newwork Protocol Stack | | | Newwork Protocol Stack | | | Newwork Protocol Stack | |
| +------------------------------------------------+ | +-------------------------+ | +-------------------------+ |
| + + | + | + |
| ............... | .................... | ........................... | ................... | ..................... | .................... | .................... |
| + + | + | + |
| +-------------+ +---------------+ | +---------------+ | +---------------+ |
| | 192.168.0.3 | | 192.168.100.1 | | | 192.168.100.6 | | | 192.168.100.8 | |
| +-------------+ +---------------+ +-------+ | +---------------+ | +---------------+ |
| | eth0 | | br0 | < --- > | tap0 | | | eth0 | | | eth0 | |
| +-------------+ +---------------+ +-------+ | +---------------+ | +---------------+ |
| + + + | + | + |
| | | | | | | | |
| | + +------------------------------+ | | |
| | +-------+ | | | |
| | | tap1 | | | | |
| | +-------+ | | | |
| | + | | | |
| | | | | | |
| | +-------------------------------------------------------------------------------------------+ |
| | | | |
| | | | |
+--------------- | ------------------------------------------------+-----------------------------------------+-----------------------------------------+
+
Physical Network (192.168.0.0/24)نظرًا لأن SMART-OS يقوم بتثبيت مكتبة GLIBC الديناميكية ، فإن هذا يعتمد بشكل كبير على محمل المكتبة/LINCER LD-LINUX-X86-64.SO.2. نظرًا لأن التطبيقات مرتبطة من خلال التجميع الديناميكي ، عندما يتم تحميل تطبيق يتطلب ربطًا ديناميكيًا بواسطة نظام التشغيل ، يجب على النظام تحديد موقع جميع ملفات المكتبة الديناميكية وتحميلها. يتم هذا العمل بواسطة ld-linux.so.2. عند تحميل البرنامج ، سيقوم نظام التشغيل بتسليم التحكم إلى LD-Linux.SO بدلاً من عنوان الدخول العادي للبرنامج. سيبحث Ld-linux.so.2 عن جميع ملفات المكتبة المطلوبة وتحميلها ، ثم تسليم التحكم إلى بوابة بدء التطبيق. LD-Linux-X86-64.SO.2 هي في الواقع سلسلة ناعمة من ld-linux.so.2. يجب أن توجد تحت /lib64/ld-linux-x86-64.so.2. خلاف ذلك ، يعتمد Busybox الذي تم تجميعه ديناميكيًا على مكتبة GLIBC. يتطلب تحميل مكتبة GLIBC LD-Linux-X86-64.SO. إذا لم يكن موجودًا في دليل /lib64 ، فسوف يتسبب ذلك في حدوث نظام مباشرة. هذه القضية تحتاج إلى عناية خاصة! ! !
QEMU عموما لديها نافذة صغيرة بعد بدء التشغيل. بمجرد حدوث خطأ ، لا توجد طريقة في الأساس لقراءة سجل الخطأ. ثم تحتاج إلى إضافة وحدة تحكم = ttys0 إلى عنصر بدء التشغيل. في الوقت نفسه ، يضيف QEMU-System-X86_64 إخراج المنفذ التسلسلي إلى ملف الملفات: ./ qemu.log ، لذلك فإن تصحيح الأخطاء أكثر ملاءمة. بعد تصحيح الأخطاء ، تحتاج إلى إزالة وحدة التحكم = ttys0. خلاف ذلك ، لا يجوز عرض المحتوى في /etc/init.d/rcs.
عادةً ما يكون إصدار GLIBC الذي جمعناه أعلى من الإصدار الذي يأتي مع النظام. يمكننا كتابة برنامج اختبار Main.c لاختبار ما إذا كان يتم تجميع GLIBC بنجاح. على سبيل المثال:
# include < stdio.h >
int main () {
printf ( " Hello glibc n " );
return 0 ;
}نتجمع
gcc -o test main.c -Wl,-rpath=/root/smart-os/work/glibc_install/usr/lib64 نقوم بتنفيذ البرنامج. في الواقع ، هذا هو السبب في عدم وجود محمل/رابط وبيئة نظام ديناميكي محدد. عادةً عندما نرسل مكتبة GLIBC ، سيقوم دليل التجميع تلقائيًا بإنشاء ملف نص testrun.sh ، ونقوم بتنفيذ البرنامج في دليل التجميع.
./testrun.sh ./test عادة ما يتم ذلك بنجاح. يمكننا أيضًا حفظ الجملة التالية في برنامج نصي ، ومن الجيد أيضًا تنفيذ الاختبار.
exec env /root/smart-os/work/glibc_install/lib64/ld-linux-x86-64.so.2 --library-path /root/smart-os/work/glibc_install/lib64 ./testكيف يمكننا تتبع المكتبات التي تم تحميلها بواسطة برنامج قابل للتنفيذ؟ فقط استخدم ld_debug = libs ./test. نحن نتحمل المكتبة ونجبر المكتبة على استخدام ld_preload لإجبار المكتبة على التحميل المسبق للمكتبة
عندما نجمع القاهرة ، نواجه عادة العديد من المشاكل. ماذا يجب أن نفعل إذا كانت هناك مشكلة في تجميع القاهرة؟ يصعب البحث على بعض رسائل الخطأ على الإنترنت لرؤية ملف config.log الذي تم إنشاؤه أثناء التجميع. رسائل الخطأ مفصلة للغاية! يمكنك حل المشكلة وفقًا للمعلومات السريعة
حول متغيرات نظام init في Businbox ، حتى لو تم استخدام معلمات نواة Grub ، فلا يمكن تمرير متغيرات البيئة. ستقوم Interbox الخاصة بإنشاء مسار متغير البيئة الافتراضي تلقائيًا ، لذلك يجب تغيير التعليمات البرمجية المصدر لدعم المسارات المخصصة. بالطبع ، سيتم قراءة وضع تسجيل الدخول للقذيفة /إلخ /ملف تعريف. بالنسبة لوضع عدم اللوجينات ، يكون هذا الوضع غير صالح ، لذلك هناك قيود على تمرير /إلخ /الملف الشخصي.
هذه المعرفة تنطوي على معرفة كبيرة نسبيا. هناك عدد قليل نسبيا من المقالات التي تقدم على وجه التحديد تجميع واستخدام XFCE4 في الصين ، بما في ذلك في الخارج. كما عبرت النهر بالشعور بالحجارة وحاولت إظهار هذه المعرفة بوضوح. سأفتح فصلًا خاصًا لشرح هذا. بالنسبة لزرع XFCE4 في SMART-OS ، سوف يكشف عن أسرار نظام الرسومات للصينيين. للحصول على التفاصيل ، يرجى الرجوع إلى XFCE4.MD.
عبء عمل تكامل نظام الرسومات بأكمله ضخم بشكل خاص ، والذي يتضمن جميع جوانب النظام. هناك معلومات منهجية قليلة نسبيًا عن هذا الجانب في الخارج ، وحتى أقل في الصين تقريبًا. الهدف من ذلك هو DIY جميع البيئات ومشاريع المصادر المفتوحة الشخصية لجعل نظام الرسومات بأكمله يعمل سليما. SMART-OS ليس الأول ، لكنه في الأساس الثلاثة الأولى. أنا لا أعرف حتى الآن. عملية التكامل بأكملها طويلة جدًا ، واجهت العديد من المشكلات. لن أتحدث عن هذه المهام المتكررة من خلال التصحيح المستمر والتجميع. عبء العمل ضخم بشكل خاص. يمكنني أن أصف عملي بجد تقريبًا. إنه ليس على الإطلاق مبالغة لوصف عملي. ثانياً ، واجهت الكثير من نقاط المعرفة ، والتي تم تعلم الكثير منها وبيعها على الفور. كنت بحاجة إلى فهم آلية العمل بسرعة ، والتسبب في المشكلة ، ثم حل المشكلة. دعنا نتحدث عن الفكرة العامة تقريبًا ، والتي ستسهل العلماء الجدد لفهم الأفكار بسرعة ، وتوفير إرشادات بشأن صيانة النظام ، وتوفير نموذج لحل مشاكل النظام.
تفاصيل دليل USR اختصار usr = مورد نظام UNIX. مكتبة /lib هي مكتبة على مستوى النواة ، /usr /lib هي مكتبة على مستوى النظام ، و /usr /local /lib هي مكتبة على مستوى التطبيق ؛ /lib يحتوي على العديد من المكتبات المستخدمة من قبل البرامج القابلة للتنفيذ في /bin && /sbin. /usr/lib تقريبا جميع المكتبات المشار إليها من قبل البرامج القابلة للتنفيذ النظام مثبتة هنا ، و/usr/محلية/bin العديد من المكتبات المشار إليها بواسطة البرامج القابلة للتنفيذ على مستوى التطبيق هنا
تدخل:
Radfs هو نظام ملفات بسيط للغاية. يستخدم مباشرة آلية ذاكرة التخزين المؤقت الموجودة في kernel Linux (لذلك رمز التنفيذ الخاص به صغير جدًا. لهذا السبب ، لا يمكن حظر ميزة Radfs من خلال معلمات تكوين kernel. إنها خاصية طبيعية للنواة). يستخدم الذاكرة الفعلية للنظام لإنشاء نظام ملفات قائم على الذاكرة بحجم ديناميكي. لن يقوم النظام بإعادة تدويره ، ولا يستخدمه مستخدمو الجذر إلا.
TMPFS:
TMPFS هو مشتق من RAPFs ، مما يضيف حدود السعة ويسمح بكتابة البيانات لمقايضات بناء على RAPFs. نظرًا لإضافة هاتين الميزتين ، يمكن للمستخدمين العاديين أيضًا استخدام TMPFS. تحتل TMPFS ذاكرة افتراضية ، وليس كل ذاكرة الوصول العشوائي ، وقد لا يكون أدائها مرتفعًا مثل Radss
رامديسك:
Ramdisk هي تقنية تستخدم منطقة في الذاكرة كقرص فعلي. يمكن القول أيضًا أن Ramdisk هو جهاز كتلة تم إنشاؤه في جزء من الذاكرة لتخزين أنظمة الملفات. بالنسبة للمستخدمين ، يمكن التعامل مع Ramdisk بالتساوي مع قسم القرص الصلب المعتاد. سيقوم النظام أيضًا بتخزين ذاكرة التخزين المؤقت المقابلة في الذاكرة ، وتلويث ذاكرة التخزين المؤقت لوحدة المعالجة المركزية ، وضعف الأداء ، ويتطلب دعم السائق المقابل.
rootfs:
ROOTFS هو مثيل لربطات محددة (أو TMPFS ، إذا تم تمكين TMPFS) ، فهو موجود دائمًا في أنظمة Linux2.6. لا يمكن إلغاء تثبيت ROUTFs (بدلاً من إضافة رمز خاص للحفاظ على القوائم المرتبطة الفارغة ، من الأفضل دائمًا إضافة عقد ROOTFS ، لذلك فهي مريحة لصيانة kernel. ROOTFs هي مثيل فارغ من RADFs ويشغل مساحة صغيرة جدًا). يتم تثبيت معظم أنظمة الملفات الأخرى على RootFs ثم تجاهلها. إنه تهيئة بدء تشغيل kernel لنظام ملفات الجذر.
تنقسم ROUTFs إلى ROUTFs الظاهرية و ROUTFs الحقيقية.
يتم إنشاء ROUTFs الظاهرية وتحميلها بواسطة kernel نفسها ولا توجد إلا في الذاكرة (يتم تنفيذ initRAMFs اللاحقة أيضًا على هذا الأساس) ، ونظام الملفات الخاص به من نوع TMPFS أو نوع RAFFS.
الجذر الحقيقي يعني وجود نظام ملفات الجذر على جهاز التخزين. أثناء عملية بدء التشغيل ، ستقوم kernel بتركيب جهاز التخزين هذا على RootFs الظاهرية ، ثم قم بتبديل عقدة / الدليل إلى جهاز التخزين هذا. وبهذه الطريقة ، سيتم استخدام نظام الملفات الموجود على جهاز التخزين كنظام ملفات الجذر (يتم تطبيق initramdisk اللاحقة على هذا الأساس) ، وأنواع نظام الملفات الخاصة به أكثر ثراءً ، والتي يمكن أن تكون Ext2 ، Yaffs ، Yaffs2 ، وما إلى ذلك ، والتي يتم تحديدها حسب نوع جهاز التخزين المحدد.
نظام ملفات بدء التشغيل لدينا هو في الواقع إعداد ملفات لـ ROTHFs ، بحيث يمكن تنفيذ النواة كما نرغب. في أنظمة Linux المبكرة ، تم استخدام الأقراص الصلبة أو الأقراص المرنة فقط كأجهزة تخزين لنظام ملفات الجذر Linux ، لذلك من السهل دمج برامج تشغيل هذه الأجهزة في النواة. ومع ذلك ، في الأنظمة المضمنة اليوم ، يمكن حفظ نظام ملفات الجذر في أجهزة التخزين المختلفة ، بما في ذلك SCSI و SATA و U-DISK ، وما إلى ذلك ، لذلك من الواضح أنه ليس من المناسب تجميع جميع رمز برنامج تشغيل هذه الأجهزة في النواة. في وحدة التحميل التلقائية في وحدة Kernel ، نرى أن UDEVD يمكن أن يدرك التحميل التلقائي لوحدة kernel ، لذلك نأمل أنه إذا كان برنامج تشغيل جهاز التخزين الذي يخزن نظام ملفات الجذر يمكن أن يدرك أيضًا التحميل التلقائي ، فسيكون ذلك رائعًا. ومع ذلك ، هناك تناقض هنا. UDEVD هو ملف قابل للتنفيذ. من المستحيل تنفيذ UDEVD قبل تثبيت نظام ملفات الجذر. ومع ذلك ، إذا لم يتم تشغيل UDEVD ، فلا يمكن تحميل برنامج التشغيل الذي يخزن جهاز نظام ملفات الجذر تلقائيًا ، ولا يمكن إنشاء عقدة الجهاز المقابلة في دليل /DEV. من أجل حل هذا التناقض ، ظهر initrd المستند إلى RAMDISK (قرص RAM المهيمن). initrd هو دليل جذر صغير مضغوط. يحتوي هذا الدليل على وحدات برنامج التشغيل الضرورية والملفات القابلة للتنفيذ والبرامج النصية بدء التشغيل في مرحلة بدء التشغيل ، ويتضمن أيضًا UDEVD (شيطان الذي ينفذ آلية UDEV). عند بدء تشغيل النظام ، سيقوم جهاز تحميل التشغيل بقراءة ملف initrd في الذاكرة ، ثم تمرير عنوان البدء وحجم ملف initrd في الذاكرة إلى kernel. أثناء عملية التهيئة ، ستقوم kernel بإلغاء ضغط ملف initrd ، ثم قم بتركيب initrd غير المصدفة كدليل الجذر ، ثم تنفيذ البرنامج النصي /init في دليل الجذر (init بتنسيق cpio هو /init ، في حين أن initrd في تنسيق الصورة <المعروف أيضًا باسم initrd لأجهزة الكتلة القديمة أو مبدئي في نموذج مرآة الملف التقليدي). يمكنك تشغيل UDEVD في نظام ملفات initrd في هذا البرنامج النصي ، والسماح لها تلقائيًا بتحميل برامج تشغيل REALFS (نظام الملفات الحقيقي) لتخزين الجهاز وإنشاء عقد الجهاز اللازمة في دليل /dev. بعد تحميل UDEVD تلقائيًا برنامج تشغيل القرص ، يمكنك تركيب دليل الجذر الحقيقي والتبديل إلى هذا الدليل الجذر.