Этот проект демонстрирует, как быстро создать компактную и полностью функциональную операционную систему Linux. Адрес проекта https://github.com/superconvert/smart-os

Почему мы выбираем версию сервера для производства?
Версия сервера не содержит большинство пакетов, от которых зависит система оконной системы; Если система поставляется с этими пакетами, возникнут проблемы с несколькими версиями пакета, проблем с компиляцией, проблемами зависимостей, задачами связи и задачами времени выполнения, которые приведут к большому вмешательству в нашу работу. Более того, решение этих проблем не имеет смысла, нам нужны чистые версии пакетов зависимостей
Почему оконная система работает такой большой?
Все пакеты (кроме инструментов), которые мы устанавливаем с помощью APT, теоретически нам нужно скомпилировать исходный код, включая зависимости и спайки пакета, которые необходимо решить. Это чрезвычайно огромная рабочая нагрузка. В новой системе ничего нет, в новой системе нет ничего, и необходимо предоставить необходимую среду. Project A зависит от пакета B, пакет B зависит от пакета C, пакета C и пакета C зависит от пакета D. Все, что нам нужно сделать, это составить все пакеты!
Этот сценарий был сделан на Ubuntu 18.04. Другие системы не должны сильно измениться. Друзья, которые это нужно, могут изменить его сами.
Подготовьте системную среду. Поскольку ядро должно быть составлено, вам необходимо установить среду, необходимую для сборника ядра. Поскольку BusyBox должен быть скомпилирован, вы можете установить необходимую среду самостоятельно по мере необходимости.
./00_build_env.shСкомпилируйте исходный код (ядро, Glibc, Busybox, GCC, Binutils)
./01_build_src.shСоздайте системный диск (важно, этот шаг устанавливает систему в системный файл)
./02_build_img.shЗапустите систему Smart-OS
./03_run_qemu.sh 或 ./04_run_docker.shЛегко ли сделать операционную систему? Дисковое пространство может быть расширено произвольно, можно получить доступ к Интернету и может быть расширено по мере необходимости. Я успешно пробовал и запускал потоковой сервер smart_rtmpd в 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, это в значительной степени зависит от динамического библиотечного загрузчика/линкера 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 в элемент запуска Grub. В то же время, 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 Мы успешно выполняем программу ./test, и обычно сообщаем об ошибке, аналогичной этой/Lib64/libc.so.6: Версия `glibc_2.28 'не найден или не найдено или программные сегменты напрямую. На самом деле, это причина, по которой нет указанного динамического библиотечного загрузчика/линкера и системной среды. Обычно, когда мы составляем библиотеку 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 busybox, даже если используются параметры ядра Grub, невозможно пройти переменные среды. init Businesbox автоматически генерирует путь переменной среды по умолчанию, поэтому исходный код должен быть изменен для поддержки настраиваемых путей. Конечно, режим входа в оболочки будет читать /и т. Д. /Профиль. Для режима, не являющегося логином, этот режим недействителен, поэтому есть ограничения для прохождения /и т. Д. /Профиль.
Это знание включает в себя относительно большие знания. Существует относительно мало статей, которые специально вводят компиляцию и использование XFCE4 в Китае, в том числе за границей. Я также пересек реку, чувствуя камни, и попытался ясно продемонстрировать это знание. Я открою специальную главу, чтобы объяснить это. Для трансплантации XFCE4 в Smart-OS она выявит секреты графической системы китайцам. Для получения подробной информации, пожалуйста, обратитесь к XFCE4.MD.
Рабочая нагрузка по интеграции всей графической системы особенно огромна, включая все аспекты системы. В этом аспекте за рубежом есть относительно небольшая систематическая информация и почти меньше в Китае. Цель состоит в том, чтобы сделать все возможное, чтобы все среды и личные проекты с открытым исходным кодом, чтобы вся графическая система работала нетронутой. Smart-OS не первый, но это в основном тройка. Я еще не знаю. Весь процесс интеграции очень длинный, и я столкнулся с множеством проблем. Я не буду говорить об этих повторяющихся задачах посредством непрерывной отладки и компиляции. Рабочая нагрузка особенно огромна. Я почти много описываю свою работу. Это абсолютно не преувеличение, чтобы описать мою работу. Во -вторых, я столкнулся с большим количеством знаний, многие из которых были изучены и проданы немедленно. Мне нужно было быстро понять рабочий механизм, вызвать проблему, а затем решить проблему. Давайте примерно поговорим об общей идее, которая облегчит новым ученым быстро понять идеи, предоставить руководство по техническому обслуживанию системы и предоставить модель для решения проблем системы.
Справочник USR подробно описывает сокращение системного ресурса USR = UNIX. Библиотека /LIB-это библиотека уровня ядра, /USR /LIB-это библиотека системы, а /usr /local /lib-библиотека уровня приложения; /LIB содержит много библиотек, используемых исполняемыми программами в /bin && /sbin. /USR/LIB Практически все библиотеки, на которые ссылаются программы исполнения системы, и/USR/Local/Bin Многие библиотеки, на которые ссылаются исполняемые программы на уровне приложения, размещены здесь
ramfs:
RAMFS - это очень простая файловая система. Он непосредственно использует существующий механизм кэша ядра Linux (поэтому его код реализации очень мал. По этой причине функция RAMFS не может быть заблокирована с помощью параметров конфигурации ядра. Это естественное свойство ядра). Он использует физическую память системы для создания файловой системы на основе памяти с динамическим размером. Система не будет перерабатывать его, и ее используют только root -пользователи.
TMPFS:
TMPFS - это производная RAMFS, которая добавляет ограничения емкости и позволяет записать данные к свопам на основе RAMFS. Из -за добавления этих двух функций обычные пользователи также могут использовать TMPFS. TMPFS занимает виртуальную память, а не все ОЗУ, и ее производительность может быть не такой высокой, как RAMFS
Рамдиск:
Ramdisk - это технология, которая использует часть области в памяти в качестве физического диска. Можно также сказать, что Ramdisk - это блочное устройство, созданное в кусочке памяти для хранения файловых систем. Для пользователей Ramdisk можно относиться одинаково с обычным деком. Система также будет хранить соответствующий кэш в памяти, загрязняя кэш ЦП, плохую производительность и потребует соответствующей поддержки драйвера.
rootfs:
ROOTFS является экземпляром конкретных RAMFS (или TMPF, если включен TMPFS), он всегда существует в системах Linux2.6. ROOTFS не может быть удалена (вместо того, чтобы добавлять специальный код для поддержания пустых связанных списков, лучше всегда добавлять узлы rootfs, поэтому он удобен для технического обслуживания ядра. ROOTFS - это пустой экземпляр RAMFS и занимает очень мало места). Большинство других файловых систем установлены на ROOTFS, а затем игнорируют их. Это инициализация запуска ядра корневой файловой системы.
Rootfs делятся на виртуальные корневые и реальные корневые плоты.
Виртуальные rootf создаются и загружаются самим ядром и существуют только в памяти (последующие инициалисты также реализуются на этой основе), а его файловая система имеет тип TMPFS или тип RAMFS.
Реальные rootfs означает, что корневая файловая система существует на устройстве хранения. Во время процесса запуска ядро будет установить это устройство для хранения на виртуальных корневых областях, а затем переключите узел / каталог на это устройство хранения. Таким образом, файловая система на устройстве хранения будет использоваться в качестве корневой файловой системы (на этой основе реализуется последующий initramdisk), а типы файловых систем более богаты, которые могут быть EXT2, YAFFS, YAFFS2 и т. Д., Которые определяются типом конкретного устройства хранения.
Наша файловая система стартапов на самом деле предназначена для подготовки файлов для ROOTFS, чтобы ядро было выполнять по своему желанию. В ранних системах Linux только жесткие диски или дискеты обычно использовались в качестве устройств хранения для корневой системы Linux, поэтому легко интегрировать драйверы этих устройств в ядро. Однако в сегодняшних встроенных системах корневая файловая система может быть сохранена на различных устройствах хранения, включая SCSI, SATA, U-диск и т. Д. Поэтому, очевидно, не очень удобно компилировать весь код драйвера этих устройств в ядро. В механизме автоматической загрузки модуля ядра UDEV мы видим, что UDEVD может реализовать автоматическую загрузку модуля ядра, поэтому мы надеемся, что если драйвер устройства хранения, хранящий корневую файловую систему, также может реализовать автоматическую загрузку, это будет здорово. Однако здесь есть противоречие. UDEVD - это исполняемый файл. Невозможно выполнить UDEVD до установки корневой файловой системы. Однако, если UDEVD не запускается, драйвер, который сохраняет устройство корневой файловой системы, не может быть автоматически загружен, а соответствующий узел устройства не может быть установлен в каталоге /dev. Чтобы разрешить это противоречие, появился инициализированный RAM-диск на основе Ramdisk (инициализировал RAM-загрузчик. Initrd является уплотненным малым корневым каталогом. Этот каталог содержит необходимые модули драйверов, исполняемые файлы и сценарии запуска на стадии запуска, а также включает UDEVD (демон, который реализует механизм UDEV). Когда система запускается, загрузчик будет читать файл initrd в память, а затем передаст адрес начала и размер файла initrd в памяти в ядро. Во время процесса инициализации ядро декомпрессирует файл initrd, затем установит неопунктный initrd в качестве корневого каталога, а затем выполнит сценарий /init в корневом каталоге (init в формате CPIO IS /init, в то время как initRd в формате изображения <также известный как initrd устройств старых блоков или initRd в традиционном формате File Mirror> IS /initRC). Вы можете запустить UDEVD в файловой системе initrd в этом скрипте, пусть он автоматически загружает драйверы REALF (реальная файловая система) для хранения устройства и установить необходимые узлы устройства в каталоге /dev. После того, как UDEVD автоматически загружает драйвер диска, вы можете установить реальный корневый каталог и переключиться на этот корневой каталог.