• Linux kernel को सीधे build करके और न्यूनतम user space तैयार करके ‘माइक्रो Linux डिस्ट्रिब्यूशन’ बनाने की प्रक्रिया को चरण-दर-चरण समझाया गया है
  • ऑपरेटिंग सिस्टम kernel की भूमिका, Linux डिस्ट्रिब्यूशन के घटक, और kernel तथा user space के संबंध को बुनियाद से समझाया गया है
  • उदाहरण के लिए RISC-V आर्किटेक्चर (QEMU की riscv64 virt मशीन) का उपयोग किया गया है, लेकिन x86 जैसी अन्य आर्किटेक्चर पर भी वही सिद्धांत लागू होते हैं
  • init process, initramfs, और Go में लिखे गए एक सरल shell सहित सीधे चलने योग्य न्यूनतम Linux वातावरण का निर्माण किया गया है
  • अंत में u-root प्रोजेक्ट की मदद से वास्तव में उपयोगी माइक्रो डिस्ट्रिब्यूशन बनाने का तरीका दिखाया गया है, और इसे Linux सिस्टम की समग्र संरचना समझने के लिए एक शुरुआती गाइड के रूप में पूरा किया गया है

ऑपरेटिंग सिस्टम kernel क्या है

  • kernel, हार्डवेयर संसाधनों के प्रबंधन और प्रोग्राम execution control के लिए जिम्मेदार ऑपरेटिंग सिस्टम का मुख्य घटक है
    • single-core वातावरण में भी कई प्रोग्राम एक साथ चलते हुए दिखें, इसके लिए multitasking management सुविधा देता है
  • kernel, input/output devices के control को abstract करता है ताकि application को हार्डवेयर के address या register values सीधे न संभालने पड़ें
    • उदाहरण के लिए, कोई प्रोग्राम सिर्फ “standard output पर message लिखो” का अनुरोध करता है, और kernel वास्तविक हार्डवेयर interaction संभालता है
  • filesystem interface के जरिए उच्च-स्तरीय डेटा access का तरीका देता है
    • file केवल disk data नहीं होती, बल्कि kernel से संवाद करने वाला एक logical interface भी होती है
  • kernel, process isolation और communication model उपलब्ध कराता है, ताकि हर application स्वतंत्र रूप से चल सके या सहयोग कर सके
  • Linux kernel open source है, कई तरह की आर्किटेक्चर पर चल सकता है, और दुनिया में सबसे व्यापक रूप से उपयोग होने वाले kernels में से एक है

Linux डिस्ट्रिब्यूशन क्या है

  • केवल Linux kernel से उपयोगकर्ता web browser या GUI app नहीं चला सकता; इसके ऊपर software infrastructure की कई परतों की जरूरत होती है
  • network setup, IP assignment, VPN management जैसे काम kernel नहीं बल्कि ऊपरी user space programs संभालते हैं
  • इसलिए Linux डिस्ट्रिब्यूशन को kernel + user space infrastructure के संयोजन के रूप में परिभाषित किया जाता है
  • डिस्ट्रिब्यूशन में kernel की बुनियादी क्षमताओं के ऊपर packages, tools, settings, initialization process (init) आदि शामिल होते हैं
  • डिस्ट्रिब्यूशन की जटिलता अलग-अलग हो सकती है; Arch Linux जैसी न्यूनतम संरचना से लेकर Ubuntu जैसी user-friendly संरचना तक

kernel के बाहर की infrastructure: user space और init process

  • kernel के boot पूरा करने के बाद सबसे पहले PID 1 process यानी init चलाया जाता है
    • init, बाद में चलने वाले सभी user space processes का ancestor होता है और सिस्टम की services व tools को क्रम से चलाता है
  • init द्वारा चलाए जाने वाले processes और tools का समूह ही Linux डिस्ट्रिब्यूशन का वास्तविक घटक बनता है
  • जैसे-जैसे डिस्ट्रिब्यूशन जटिल होते हैं, अनावश्यक features जुड़ते जाते हैं और उन्हें “bloated” कहकर आलोचना भी मिलती है
  • इसके उलट, custom माइक्रो डिस्ट्रिब्यूशन बनाकर केवल जरूरी features वाला हल्का सिस्टम तैयार किया जा सकता है

RISC-V के लिए Linux kernel build करना

  • x86 वातावरण में cross-compilation toolchain का उपयोग करके RISC-V के लिए kernel build किया जाता है
    • kernel.org से linux-6.5.2.tar.xz source डाउनलोड करने के बाद make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- defconfig चलाएँ
  • menuconfig के जरिए kernel settings को visual तरीके से edit किया जा सकता है
  • make -j16 से parallel build करने पर arch/riscv/boot/Image बनता है
  • QEMU में qemu-system-riscv64 -machine virt -kernel arch/riscv/boot/Image से boot किया जा सकता है
    • boot logs में SBI layer detection, UART initialization, printk activation जैसे संदेश देखे जा सकते हैं

पहली समस्या: root filesystem नहीं है

  • kernel boot के दौरान VFS: Unable to mount root fs error से kernel panic होता है
    • कारण: root filesystem (initramfs) उपलब्ध नहीं कराया गया
  • filesystem केवल disk पर ही नहीं, बल्कि RAM-आधारित (initramfs) रूप में भी बनाया जा सकता है
  • initramfs को cpio format में package किया जाता है, और QEMU में -initrd option से load किया जा सकता है

initramfs बनाना और “Hello world” चलाना

  • न्यूनतम आवश्यकता है कि /init binary मौजूद हो
    • init.c लिखने के बाद static link (-static) के साथ build करें
    • cpio -o -H newc < file_list.txt > initramfs.cpio से package करें
  • QEMU चलाने पर “Hello world” output के बाद init के समाप्त होने से फिर kernel panic होता है
    • समाधान: init बंद न हो, इसके लिए infinite loop जोड़ें

Go में लिखा एक सरल shell जोड़ना

  • init, fork और execl का उपयोग करके /little_shell चलाता है
  • little_shell.go, user input लेकर command को echo करके दिखाने वाला एक साधारण shell है
    • GOOS=linux GOARCH=riscv64 go build little_shell.go से RISC-V के लिए build करें
  • init और little_shell दोनों UART के जरिए output साझा करते हैं
    • standard input/output file handles के रूप में manage होते हैं और fork के समय inherit होते हैं
  • नतीजतन “Hello from init” और shell input का बारी-बारी से दिखना, एक बुनियादी Linux वातावरण के पूरा होने को दर्शाता है

kernel की भूमिका का सार

  • हार्डवेयर abstraction: user programs को UART या device details जाने बिना भी output देना संभव होता है
  • high-level interface उपलब्ध कराना: filesystem के जरिए दूसरी binary (little_shell) तक access
  • process isolation: init और shell अलग-अलग memory space में चलते हैं
  • kernel, जटिल हार्डवेयर के ऊपर स्थिर और portable execution foundation प्रदान करता है

ऑपरेटिंग सिस्टम की परिभाषा

  • कुछ लोग केवल kernel को ही ऑपरेटिंग सिस्टम मानते हैं, जबकि कुछ पूरे डिस्ट्रिब्यूशन को ऑपरेटिंग सिस्टम मानते हैं
  • महत्वपूर्ण बात है kernel और user space की role boundary और interaction structure को समझना

u-root से वास्तव में उपयोगी माइक्रो डिस्ट्रिब्यूशन बनाना

  • u-root प्रोजेक्ट Go-आधारित user space tools का सेट उपलब्ध कराता है
    • u-root, Linux kernel के ऊपर चलने वाला user space bootloader और shell environment भी शामिल करता है
  • install करने के बाद GOOS=linux GOARCH=riscv64 u-root command से initramfs अपने-आप बन जाता है
    • /tmp/initramfs.linux_riscv64.cpio file को QEMU में चलाया जा सकता है
  • boot के समय “Welcome to u-root!” banner के साथ default shell prompt मिलता है
    • ls, pwd, echo जैसे basic commands और tab completion भी supported हैं

network connection का अभ्यास

  • QEMU में virtio-net-device और virtio-rng-pci devices जोड़े जाते हैं
    • -device virtio-net-device,netdev=usernet -netdev user,id=usernet option का उपयोग
  • u-root के dhclient से DHCP के जरिए IP अपने-आप assign हो जाता है
    • उदाहरण: eth0 को 10.0.2.15/24 assign होना
  • wget http://google.com से external network access सफल होता है, और index.html download होना देखा जा सकता है

package manager और init का महत्व

  • सामान्य डिस्ट्रिब्यूशन package manager के जरिए software को dynamic तरीके से install और update करते हैं
    • यह अभ्यास embedded-style approach का है, इसलिए पूरी image को फिर से build करना पड़ता है
  • init, सिर्फ process launcher नहीं बल्कि device initialization, service management, और system boot control का मुख्य घटक है
    • u-root के init source code में विभिन्न devices (/dev) की setup प्रक्रिया देखी जा सकती है

GitHub repository

  • इस guide का पूरा code और examples popovicu/linux-micro-distro में उपलब्ध हैं
    • initramfs image build और अभ्यास को दोबारा किया जा सकता है

अभी कोई टिप्पणी नहीं है.

अभी कोई टिप्पणी नहीं है.