Введение¶
Операционные системы окружают нас повсюду – это основное программное обеспечение персональных компьютеров, серверов, мобильных устройств, сетевых устройств (роутеры, коммутаторы) и даже современных автомобилей (борт-компьютер), телевизоров и прочего. Перечислять можно очень долго, ведь они требуются практически в каждой компьютерной системе.
Любой компьютер представляет собой связанную совокупность: процессора, памяти и устройств ввода-вывода.
Рис. 1. Общее представление архитектуры компьютера
Более подробная структура архитектуры ПК
Сама по себе, аппаратура умеет делать только очень простые, базовые операции — по типу: сложить два числа, перейти к адресу, записать по адресу и тд.
Например, процессор умеет выполнять только четыре базовых типа инструкции:
Получается, что непосредственное создание и управление сложными процессами (приложениями) на аппаратуре становится крайне неэффективным и неудобным. То есть, например, создать и запустить на исполнение программу-браузер исключительно с помощью данных инструкций становится крайне сложной задачей. Особенно при условии, что помимо этого процесса (браузера) существуют и другие процессы, которые также пользуются ресурсами вычислительной машины.
Возникает вопрос — Как заставить всё это слаженно и эффективно работать, сделав пользование компьютером удобным как для обычного человека, так и для прикладного программиста?
Чтобы ответить на этот вопрос более последовательно, немного заглянем туда, откуда всё начиналось.
Установка Linux рядом с Windows 10 UEFI
На всех современных ноутбуках, выпускаемых с Windows 8, 8.1, 10 используется технология UEFI. Это новая прогрессивная технология, которая пришла на смену устаревшей BIOS
Первое важное и самое заметное изменение — использование таблицы разделов GPT, вместо устаревшей MBR, а также создание отдельного раздела диска для загрузчиков операционных систем. Многие пользователи боятся, что UEFI усложнит установку Linux с Windows 10 на их ноутбук
И зря — в большинстве случаев нет ничего сложного. Если у вас уже установлена Windows, то, скорее всего, раздел efi уже был создан, и во время разметки диска нужно просто выбрать его для установки загрузчика. Раздел efi, как правило, создается с файловой системой fat32 и занимает около 30 Мегабайт памяти:
Если же у вас чистый винчестер, нужно создать таблицу разделов GPT. Это можно сделать с помощью той же Gparted, открыв меню Devices -> Create Partition Table:
Дальше необходимо создать efi раздел, делаем тоже с помощью Gparted, создаем обычный раздел, с файловой системой fat32 и меткой EFI:
Потом указываем этот раздел во время установки Linux вместе с windows 10, для него нужно указать точку монтирования /boot/EFI. Вот и все сложности с установкой в UEFI. Вообще, установку в UEFI поддерживают все дистрибутивы, работающие в Grub2.
Реализация многозадачности¶
Осуществляется при помощи следующих механизмов:
-
- Прерывание таймера
-
- Переключение контекста
- План блокировок, при наличии нескольких CPU
- Освобождение ресурсов при завершении процесса
Контекст процесса — это состояние регистров, при его выполнении на процессоре.
Следовательно, переключение контекста — это смена контекста одного процесса, на контекст другого, без потери данных сменяемого процесса — то есть, чтобы его потом можно было восстановить с того момента, где он был переключён.
Примечание
Например, у нас на процессоре в данный момент времени выполняется «процесс 1» — в регистрах хранятся данные, которые относятся к этому процессу.
Но происходит прерывание и «процесс 1» снимается с выполнения на процессоре, чтобы вместо него выполнялся «процесс 2». Следовательно, нужно заполнить регистры уже теми данными, что относятся к «процессу 2».
Однако, «процесс 1» ещё не выполнился полностью, и для дальшейнего исполнения ему нужны те данные, что хранились в регистрах при прерываний, то есть необходим его контекст. Операционная система должна обеспечивать подобные смены контекстов без потери данных.
- При переключений контекста возникает три важных вопроса:
-
- Как?
- Когда?
- Между кем и кем?
Как?
В целом, смена контекста происходит между состояниями «Готов», «Ожидает» и «Исполняется».
Одна из основных проблем с которыми может столкнуться такая система с вытесняющей многозадачностью — порядок доступа процессов к их общим ресурсам.
Возникают, так называемые, критические секции – участки исполняемого кода программы, в которых производится доступ к общему ресурсу (данным или устройству), который не должен быть одновременно использован более чем одним потоком выполнения.
Рис 12. Критические секции в потоках процесса
Может возникнуть такая ситуация, когда один поток, «потребитель», начинает использовать данные, которые должен подготовить другой поток, «производитель», но этот производитель ещё не закончил их подготовку и снялся с исполнения. Таким образом, «потребитель» использует некорректные данные, что с высокой долей вероятности приведёт к ошибке.
Данная проблема решается с помощью механизма блокировок – когда поток, получивший доступ к ресурсу, блокирует его, не давая другим потокам пользоваться этим захваченным ресурсом до разблокировки. То есть, если один поток хочет захватить (заблокировать) ресурс, а он уже занят другим потоком, то первый будет ожидать пока этот другой поток-владелец сам не освободит этот ресурс.
Примечание
Все эти механизмы обеспечиваются операционной системой
Чтобы лучше это понять, можно обратиться к аналогии с туалетом — им может пользоваться только один человек. Если другой хочет им воспользоваться, то ему нужно дождаться когда его освободит уже им пользующийся.
Windows не даёт возможности попасть в фирмварь, не приняв EULA[править]
Если попался ноутбук с трудносъёмным диском и неактивированной win8, который не даёт возможности попасть в фирмварь, не приняв EULA — можно попробовать его жёстко выключить либо:
- возможно, переключиться на ENG комбинацией при помощи Alt-Shift;
- нажать Shift-F10;
- в полученном приглашении cmd.exe сказать shutdown /s;
- при включении, не теряя времени, «топтаться» по F12/F2/Del или какие ещё клавиши могут быть на этой модели.
Создание загрузочной записи UEFI вручнуюправить
Например, для создания загрузочной записи на /dev/sda4 надо дать команду:
efibootmgr -c -d /dev/sda -p 4 -L "ALTLinux" -l "\EFI\altlinux\grub64.efi"
Самостоятельная сборка установочного образа для установки c UEFIправить
Достаточно хорошая поддержка сборки UEFI-загружаемых гибридных образов добавлена в текущий mkimage; в качестве образца можно использовать example4 из документации пакета, а суть требуемых изменений в профиле сводится к:
- добавлению в инсталер dosfstools (efibootmgr будет вытянут текущим alterator-grub);
- добавлению в базовую устанавливаемую систему grub2-efi и installer-feature-efi-stage3;
- добавлению в modules для propagator kernel/drivers/firmware ради efivars.ko;
- передаче mkimage переменной EFI_BOOTLOADER со значением elilo либо refind.
Для сборки образов требуется свежий Sisyphus либо p7/branch, в т.ч.:
- mkimage 0.2.5+ (для SB — 0.2.12+)
- syslinux 4.04-alt5+
- evms 2.5.5-alt30+
- guile-evms 0.4-alt14+
- alterator-vm 0.4.2-alt1+
- Основная статья: mkimage-profiles
Загрузка компьютера
Если вы сделали всё правильно в настройках BIOS или в меню загрузки, то начнется загрузка Ubuntu с установочного носителя, и в нижней части экрана появится пиктограмма:
В этот момент нажимаем любую клавишу на клавиатуре, чтобы выбрать язык установщика и нажимаем «Enter»:
Так как нам нужна установка Ubuntu, выберем пункт «Установка Ubuntu после чего начнется загрузка:
На самом деле, можно выбрать и первый пункт «Запустить Ubuntu без установки». В этом случае система загрузится полностью. Это позволит немного с ней познакомится. Затем с рабочего стола можно запустить установщик как обычное приложения и во время установки Ubuntu, продолжить пользоваться ПК (работать в приложениях и т.п.). Такой вариант может быть даже удобнее, но мы пошли путем попроще.
Чтобы пропустить проверку файловой системы во время загрузки, нажмем Ctrl+C.
Когда вы будете запускать компьютер с UEFI, то первым, что появится, будет меню загрузчика GRUB
Оставляем активным первый пункт и нажимаем Enter. Ждем пока ОС загрузится и затем в левой колонке ищем свой язык и выбираем «Установить Ubuntu
Решение.
Учтите, что весь алгоритм построен для ОС Linux Mint. В других Линуксах (не основанных на Ubuntu или Debian) названия каталогов и команды могут несколько отличаться.
- Установить Линукс рядом с Windows, используя для этого соответствующую опцию в одном из первых шагов установки или (если данная опция не появилась) разметив жесткий диск должным образом (заслуживает отдельной статьи, на убунту-вики про это тоже уже написано).
- НЕ ПЕРЕЗАГРУЖАТЬ компьютер после установки. Если перезагрузили — ничего страшного, просто снова придется загрузиться с live-cd\usb\dvd (ведь линукс-то у вас не запускается?).
- На всякий случай в консоли выполнить команду sudo update-grub (введя пустой пароль при запросе).
- Открыть консоль\терминал или иными средствами (например, с помощью менеджера программ в Ubuntu\Linux Mint) установить mc. В консоли (для систем с apt) это делается следующим образом: sudo apt-get install mc (после чего потребуется ввод пароля, напомню, в лайв-режиме пароля нет, просто жмем Enter и соглашаемся на установку).
- Запустить mc от имени рута: sudo mc (и снова пустой пароль, если спросит).
- Найти в файловой системе следующий каталог: /boot/efi/EFI.
- Переименовать каталог (комбинация ctrl+F6 в mc) Microsoft во что-нибудь другое, например в Microsoft2.
- Создаем новый каталог с именем Microsoft (клавиша F7).
- Заходим в только что созданный каталог Microsoft и частично (см.далее) создаем внутри его иерархию папок аналогичную старому Microsoft (тому, что переименовали). В моем случае он имел такую структуру папок: /boot/, затем куча папок и файл bootmgfw.efi рядом с ними. Нужно воссоздать структуру папок ровно до этого файла. Т.е. всё, что лежит рядом с ним — не нужно, а всё, что идет до него (т.е. родительские папки, соседние с ними тоже не нужны) воссоздаем в нашей новой папке Microsoft. В моем случае понадобилось создать только папку boot, итоговый путь до нового каталога вышел таким: /boot/efi/EFI/Microsoft/boot .
- Находим в каталоге из шага 6 папку с именем нашего дистрибутива линукса, в нашем случае это ubuntu. Копируем (оригиналы файлов и папку ubuntu на всякий случай оставляем, не помешают) все файлы из данной в папки в итоговый каталог, созданный на предыдущем шаге (в /boot/efi/EFI/Microsoft/boot).
- В получившейся файловой системе (в созданном на 9-ом шаге каталоге и перемещенных в него на 10-ом шаге файлах) находим файл grubx.efi или grubx64.efi (будет только один из них: в зависимости от разрядности установленного линукса). Переименовываем его в bootmgfw.efi .
- Находим файл /boot/grub/grub.cfg . Открываем его для редактирования (клавиша F4). Внутри него находим (клавиша F7 вызывает форму поиска по тексту) слово «Microsoft» в контексте строки, начинающейся с «chainloader» и заменяем это слово (должно быть только одно вхождение и именно в строке с «chainloader», так что не ошибетесь) на название каталога, в который мы переименовали Microsoft на 7-ом шаге (т.е. на Microsoft2 в нашем примере). Сохраняем изменения в файле (клавиша F2 — сохранить).
Вот и всё. Выглядит очень сложно, но если выполнять всё точно по шагам (которые расписаны максимально подробно!), то всё получится без каких-либо проблем. И, после перезагрузки и последующей загрузки уже с жесткого диска (а не с лайв-носителя) мы увидим вожделенный экран с меню выбора ОС. Ура, товарищи!
Что такое ядро в ОС
Теперь, когда мы знаем, что это основная программа в ОС, следует также знать, что это первая программа, которая загружается после загрузчика. Затем он выполняет все переговоры между оборудованием и программным обеспечением или приложениями. Поэтому, если вы запускаете программу, пользовательский интерфейс отправляет запрос в ядро. Затем ядро отправляет запрос в ЦП, память, чтобы назначить вычислительную мощность, память и другие вещи, чтобы приложение могло бесперебойно работать во внешнем интерфейсе.
Вы можете представить Kernel в качестве переводчика. Он преобразует запросы ввода / вывода от программного обеспечения в набор инструкций для ЦП и ГП. Проще говоря, это слой между программным обеспечением и оборудованием, который делает все возможное. Ядро управляет следующим:
- CPU / GPU
- объем памяти
- Устройства ввода / вывода или ввода-вывода
- Управление ресурсами
- Управление памятью
- Управление устройством
- Системные вызовы.
Пользовательские процессы могут получить доступ к пространству ядра только с помощью системных вызовов. Если программа пытается получить доступ напрямую, это приведет к ошибке.
Безопасность и защита ядра
Ядро также защищает оборудование. Если нет защиты, любая программа сможет выполнить любую задачу на компьютере, включая сбой вашего компьютера, повреждение данных и т. Д.
В современных компьютерах безопасность реализована на аппаратном уровне. Например, Windows не будет загружать драйверы, которые получены не из надежного источника и сертифицированы с использованием подписи. Безопасная загрузка и надежная загрузка — классические примеры.
Безопасная загрузка: Это стандарт безопасности, разработанный представителями индустрии ПК. Он помогает защитить вашу систему от вредоносных программ, не позволяя запускать неавторизованные приложения во время запуска системы. Эта функция гарантирует, что ваш компьютер загружается с использованием только программного обеспечения, которому доверяет производитель ПК. Таким образом, всякий раз, когда ваш компьютер запускается, микропрограмма проверяет подпись каждой части загрузочного программного обеспечения, включая драйверы микропрограмм (дополнительные ПЗУ) и операционную систему. Если подписи проверены, компьютер загружается, и микропрограммное обеспечение передает управление операционной системе.
Надежная загрузка: Он использует модуль Virtual Trusted Platform Module (VTPM) для проверки цифровой подписи ядра Windows 10 перед его загрузкой. В свою очередь, он подтверждает все остальные компоненты процесса запуска Windows, включая загрузочные драйверы, файлы запуска и ELAM. Если файл был изменен или изменен в какой-либо степени, загрузчик обнаруживает его и отказывается загрузить, распознавая его как поврежденный компонент. Короче говоря, он обеспечивает цепочку доверия для всех элементов во время загрузки.
Вводная информация
Исходные данные и цель
В этой статье я рассмотрю один из самых распространённых случаев, когда на компьютере с UEFI, например, на ноутбуке, установлена операционная система Windows 10, в которой есть два раздела, т.е. диск C и D, и Вы захотели установить Linux, в частности дистрибутив Debian 10, второй операционной системой, таким образом, чтобы при включении компьютера у Вас была возможность выбора системы, в которую необходимо загрузиться.
Сразу хотелось бы отметить, что, для того чтобы установить Debian рядом с Windows 10 на компьютере с UEFI, не нужно выполнять никаких особых предварительных действий с существующими параметрами компьютера, в частности нет необходимости отключать UEFI Secure Boot. Debian, начиная с 10 версии, поддерживает безопасную загрузку, о том, что еще нового появилось в этой версии, можете почитать в материале – Обзор Debian 10.
Почему в экспертном режиме?
В связи с тем, что по умолчанию установщик Debian устанавливает загрузчик в область UEFI согласно всем спецификациям, а Windows нет, это не позволяет Debian загружаться даже после успешной установки, так как UEFI просто не будет запускать загрузчик Debian. Как результат, Вы успешно установили Debian, но по умолчанию загружается все равно Windows 10, загрузчик GRUB просто не запускается.
Поэтому установку Debian 10 необходимо производить в экспертном режиме, чтобы принудительно установить загрузчик в нужную область (removable media path), так же как это делает Windows и некоторые другие дистрибутивы Linux, например, Ubuntu, но такой подход создает предпосылки конфликта с любыми другими установщиками, что плохо и неправильно. Вот почему в Debian не делают этого по умолчанию.
Варианты установки Linux
У вас есть несколько вариантов установки Linux на компьютер с режимом Secure Boot:
- Выберите дистрибутив, в котором поддерживается режим Secure Boot: современные версии Ubuntu, начиная с Ubuntu 12.04.2 LTS и 12.10, будет загружаться и нормально устанавливаться на большинстве ПК с включенным режимом Secure Boot. Это объясняется тем, что загрузчик EFI первоначального этапа загрузки в Ubuntu подписан фирмой Microsoft. Впрочем, , что загрузчик в Ubuntu не подписан ключом, который необходим согласно процессу сертификации Microsoft, а просто одним из ключей, о которых говорят, что он «рекомендован» фирмой Microsoft. Это означает, что Ubuntu не обязана загружаться на всех компьютерах с UEFI. Для того, чтобы использовать Ubuntu на некоторых компьютерах, пользователям, возможно, придется отключить режим Secure Boot.
- Отключение режима Secure Boot: Режим Secure Boot можно отключить, что позволит позволить превратить преимущество безопасной загрузки в возможность иметь что-нибудь свое для загрузки компьютера точно также, как это делается на старых компьютерах с традиционным BIOS. Это также потребуется сделать, если вы хотите установить старую версию Windows, которая не разрабатывалась с врозможностью использовать режим Secure Boot, например, Windows 7.
- Добавить в прошивку UEFI подписанный ключ: Некоторые дистрибутивы Linux позволяют подписывать свои загрузчики с помощью их собственного ключа, который вы можете добавить в свою прошивку UEFI. На данный момент, это, кажется, не является обычной практикой.
Вы должны проверить, какой из этих вариантов рекомендуется использовать для вашего дистрибутива Linux. Если вам нужно загрузить старый дистрибутив Linux, в котором нет никакой информации об этом, вы нужно будет просто отключить режим Secure Boot.
На большинстве новых компьютеров у вас должна иметься возможность устанавливать без каких-либо проблем текущие версии Ubuntu — либо релиз LTS, либо последний релиз. Инструкции о том, как загружаться со сменного носителя, смотрите в последнем разделе.
Ссылки и дополнительная информация
-
Информационные веб-страницы
- На моей странице рассказывается об имеющихся загрузчиках EFI и о менеджерах загрузки.
- Страница может оказаться полезной при настройке загрузчика или менеджера загрузки под эту платформу.
- На странице в общих чертах описывается загрузка систем с EFI.
- На описывается, как настроить прошивку EFI из Windows 8.
- Мэтью Дж. Гарретт (Matthew J. Garrett), разработчик загрузчика shim для управления режимом Secure Boot, поддерживает , в котором он часто пишет о проблемах EFI.
- Если вы интересуетесь самостоятельной разработкой программного обеспечения EFI, то моя страничка может помочь вам начать это делать.
-
Дополнительные программы
-
Общение
- Сайты pastebin, например, , предоставляют пользователя веб-форумов возможность обмениваться большими текстовыми файлами.
Загрузка системы и первоначальная настройка Ubuntu
Теперь, когда компьютер будет загружаться, у Вас будет появляться окно загрузчика GRUB, в котором Вы можете выбрать, в какую операционную систему Вам нужно загрузиться.
В моем случае:
- Ubuntu – это как раз операционная система Linux Ubuntu;
- Windows Boot Manager (на /dev/sda2) – это Windows 10.
, , , Твиттер
А сейчас давайте загрузимся в Ubuntu и выполним первоначальную настройку системы.
При первом запуске мы можем подключить сетевые учетные записи, но если Вы этого не хотите, то сразу жмите «Пропустить».
Затем если Вы хотите, чтобы система отправляла некоторые сведения о системе в компанию, которая разрабатывает Ubuntu, то отметьте пункт «Да, отправлять сведения в Canonical», если не хотите, то второй пункт, и нажимайте «Далее».
Далее, если Вы хотите, чтобы Ubuntu автоматически определяла Ваше местоположение, Вы можете включить соответствующую службу, нажимаем «Далее».
Все готово к работе! Нажимаем кнопку «Готово».
Если открыть файловую систему компьютера, то мы увидим, что наш диск D, который мы примонтировали как «Windows», нам доступен, и мы можем им пользоваться.
Если Вам нужно загрузиться в Windows 10, то выключите компьютер и загрузитесь снова, только в меню выбирайте пункт, соответствующий Windows 10.
Вот мы с Вами и рассмотрели процесс установки Linux Ubuntu на компьютер рядом с Windows 10, учитывая при этом UEFI.
Особенности установки[править]
- начальный загрузчик EFI не похож на обычный, надо уметь находить в нём установщик;
- язык установщика по умолчанию — английский, иной надо выбирать вручную на первом шаге установки;
- остальные разделы — и файловая система, и своп — имеют GPT-тип basic data; актуальный тип раздела задаётся отдельно;
- модуль установки загрузчика предложит вариант «EFI», с которым стоит согласиться.
Следует устанавливать 64-битные дистрибутивы; запуск 32-битного дистрибутива возможен в режиме BIOS/CSM (Compatibility Support Module), а в режиме EFI такая установка не будет сочтена загрузочной. При установке 64-битного дистрибутива в режиме BIOS/CSM будет невозможна двойная загрузка с UEFI Windows (обычно 8 и новее).
При загрузке с образа в EFI-режиме загрузчиком будет графический rEFInd либо совсем текстовое ELILO, в BIOS-режиме — синяя текстовая либо брендированная графическая менюшка SYSLINUX.
После собственно загрузки и логина именем root в EFI-режиме должны отработать команды
modprobe efivars efibootmgr
— в BIOS-режиме вторая из них скажет
Fatal: Couldn't open either sysfs or procfs directories for accessing EFI variables. Try 'modprobe efivars' as root.
При загрузке установленной системы типичным на сегодня будет почти обычный grub2-efi.
Установка Ubuntu
Снова запустите компьютер с DVD или USB-накопителя, как описано на стр. 85. В режиме Live CD нажмите на иконку Рабочего стола «Установить Ubuntu 16.04 LTS». Следуйте указаниям Мастера, выбрав сначала язык. Подключитесь через LAN или Wi-Fi к Интернету, чтобы сразу же получить обновления.
Быстрый запуск Windows 8 и 10 необходимо отключить перед параллельной установкой Ubuntu
Ключевым моментом при установке станет «Тип установки». В данном случае следует выбрать «Установить Ubuntu рядом с Windows Boot Manager». Далее задайте стандартные установки, например местоположение и учетную запись.
Если Ubuntu распознает установленную Windows, она автоматически предлагает параллельную установку
В завершение установки вам предлагается два варианта: оставаться в режиме Live CD или перезагрузить компьютер. Выберите «Продолжить знакомство» и откройте командную строку комбинацией клавиш «Ctrl+Alt+T».
При проблемах с загрузкой Ubuntu приложите руку к созданию разделов при установке
Командой «sudo apt-get install efibootmgr» запускается небольшой инструмент для настройки порядка загрузки. Команда «efibootmgr» позволит вывести информацию о загрузочных записях. Помимо строчки «Windows Boot Manager» должна появиться запись «Ubuntu». Командой «sudo efibootmgr –o x,y» измените порядок загрузки, где «x» предназначена для цифр перед записью Ubuntu, а «y» — для цифр перед Windows Boot Manager.
Настройка grub.cfg
В GRUB2 можно получить UUID раздела с помощью модуля probe, поэтому он должен быть в сборке. За основу была взята сборка GRUB2 с установочного диска Debian, для загрузки нам понадобятся следующие файлы:
Их необходимо скопировать на EFI-раздел USB-диска:
Далее необходимо создать конфигурационный файл \EFI\debian\grub.cfg.
В cfg-файле всё достаточно очевидно, только обращу внимание, что VHD-файл имеет название debefi.vhd, и система будет искать его в корне всех найденных разделов. Для исключения ошибок название файла необходимо сделать уникальным для загружаемой системы
Ну и «gpt2» используется потому, что Linux установлен на втором разделе внутри VHD.