При монтировании устройства в target в качестве корневой файловой системы произошла ошибка
В зависимости от использования системой BIOS или UEFI - различаются и процедуры запуска системы.
BIOS или Basic Input / Output System - это микрокод, хранящийся в энергонезависимой памяти на материнской плате, он выполняется каждый раз при включении компьютера. В процессе загрузки BIOS предполагает, что первые 440 байт в первом хранилище дисковой подсистемы - следуя порядку, находящемуся в настройках BIOS (автоматически определяется по очерёдности разъёмов подключения на плате) - являются первым этапом загрузчика. Первые 512 байт хранилища называются главной загрузочной записью MBR (Master Boot Record) . Master Boot Record использует стандартную схему разделов DOS и дополняет первый этап загрузчика таблицей разделов файловой системы.
Итак, основные шаги загрузки системы с BIOS :
- Процесс POST (power-on self-test) выполняется для выявления простых отказов оборудования сразу после включения системы.
- BIOS подключает базовые компоненты системы для загрузки - видеовывод, клавиатура и дисковые носители.
- BIOS передает управление загрузчику находящемуся в MBR (первые 440 байт на первом носителе).
- Первый этап загрузчика вызывает вторую ступень, отвечающую за представление параметров загрузки ядру и его вызов.
UEFI или Unified Extensible Firmware Interface - имеет отличия от BIOS в некоторых ключевых моментах. Как и BIOS, UEFI также является микрокодом ( firmware ) и находится на материнской плате. Однако он может идентифицировать разделы и умеет работать с многими файловыми системами. UEFI не работает напрямую с MBR , а использует только настройки находящиеся в его энергонезависимой памяти ( NVRAM ). Хранимые настройки указывают на расположение UEFI -совместимых программ, называемых EFI-applications , которые будут выполняться автоматически или вызываться из меню загрузки. Приложения EFI могут быть загрузчиками, средствами выбора операционной системы, инструментами для диагностики и восстановления системы и так далее. Они должны находиться на обычном разделе устройства хранения и в совместимой файловой системе. Стандартные совместимые файловые системы - это FAT12, FAT16, FAT32 и вроде с недавнего времени exFAT(fat64) для блочных устройств и ISO-9660 для оптических носителей. Всё это в совокупности позволяет значительно проще использовать более сложные инструменты диагностики, так как не надо писать новый загрузчик для того чтобы, к примеру, протестировать оперативную память.
Раздел, содержащий приложения EFI , называется системным разделом EFI или просто ESP (efi system partition) . Этот раздел не должен использоваться совместно с другими системными файловыми системами. Каталог EFI в разделе ESP содержит приложения, на которые указывают записи, сохраненные в NVRAM .
Основные шаги для загрузки системы с UEFI :
- POST (самотестирование при включении) процесс выполняется для выявления простых отказов оборудования сразу после включения машины.
- UEFI подключает базовые компоненты системы для загрузки - видеовывод, клавиатура и дисковые носители.
- UEFI считывает определения, хранящиеся в NVRAM , чтобы выполнить предопределенное приложения EFI , хранящегося в файловой системе раздела ESP . Обычно предопределенное приложение EFI является загрузчиком.
- Если предопределенное приложение EFI является загрузчиком, он загружает ядро для запуска операционной системы.
Стандарт UEFI также поддерживает функцию Secure Boot , которая позволяет выполнять только лицензированные приложения, то есть приложения EFI , авторизованные производителем оборудования. Эта функция повышает защиту от вредоносного программного обеспечения, но может затруднить установку операционных систем, на которые не распространяется гарантия производителя.
The Bootloader
Самый популярный загрузчик для Linux на архитектуре x86 - GRUB (Grand Unified Bootloader) . Как только он вызывается BIOS ом или UEFI, GRUB отображает список операционных систем, доступных для загрузки. Если список не выводится автоматически, то его можно вызвать, нажав Shift , во время вызова BIOSом GRUB . Если система использует UEFI то для вызова списка операционных системы можно использовать Esc .
В меню GRUB можно выбрать, какое из установленных ядер должно быть загружено, и передать ему новые параметры. Большинство параметров ядра это key/value значения. Пример нескольких параметров ядра.
acpi - Включает / отключает поддержку ACPI. acpi=off отключит поддержку ACPI .
init - Изменяет точку входа в систему. К примеру вы можете выставить init=/bin/bash установит оболочку Bash в качестве точки входа. полезно для ремонта системы.
systemd.unit - Устанавливает цель systemd для активации. Например, systemd.unit=graphical.target. Systemd также принимает числовые уровни запуска, определенные для инициализации в стиле SysV . Например, чтобы активировать уровень выполнения 1, необходимо включить только цифру 1 или букву S (сокращение от "single") в качестве параметра ядра.
mem - Устанавливает объем доступной оперативной памяти для системы. Этот параметр полезен для виртуальных машин, для ограничения оперативной памяти гостевым системам.
maxcpus - Ограничивает количество процессоров (или ядер процессора), видимых системе.
vga - Выбирает режим видео. Параметр vga=ask покажет список доступных режимов на выбор.
root - Устанавливает корневой раздел, отличный от предварительно настроенного в загрузчике. Например, root=/dev/sda3 .
rootflags - Mount параметры для корневой файловой системы.
ro - Выполняет первоначальное монтирование корневой файловой системы доступным только для чтения.
rw - Разрешает запись в корневую файловую систему во время первоначального монтирования.
Изменение параметров ядра обычно не требуется, но может быть полезно для обнаружения и решения проблем, связанных с операционной системой. Параметры ядра необходимо добавить в файл /etc/default/grub в строке GRUB_CMDLINE_LINUX , чтобы сделать их постоянными при перезагрузках. Новый файл конфигурации для загрузчика должен создаваться каждый раз при изменении /etc/default/grub , что выполняется командой grub-mkconfig -o /boot/grub/grub.cfg . После запуска операционной системы параметры ядра, используемые для загрузки текущего сеанса, доступны для чтения в файле /proc/cmdline .
System Initialization
Помимо ядра, операционная система зависит от других компонентов, которые предоставляют функции операционной системы. Многие из этих компонентов загружаются в процессе инициализации системы, как скрипты, так и как полноценные программы и демоны. Скрипты часто используются для выполнения краткосрочных задач, которые будут выполняться и завершаться в процессе инициализации системы. Службы, также известные как демоны, могут быть активны все время, поскольку они могут нести ответственность за внутренние аспекты операционной системы.
Исторически сложилось, что существует множество способов запуска скриптов и демонов, вследствие чего появилось несколько способов инициализации системы. Хотя в принципе в текущий момент всё свелось к единому systemd .
Инициализация операционной системы начинается, когда загрузчик загружает ядро в ОЗУ. Затем ядро берет на себя управление и начинает конфигурировать основные части операционной системы, такие как базовая конфигурация оборудования и адресация памяти.
Далее ядро монтирует initramfs. Initramfs - это временная файловая система используемая для загрузки операционной системы. В initramfs содержится минимально необходимые модули чтобы ядро могло получить доступ к корневой файловой системе и продолжить загрузку оттуда.
Как только будет доступна корневая файловая система, ядро смонтирует все точки монтирования в файловой системе, которые оно возьмёт из файла /etc/fstab , а затем передаст управление системе указанной как точка входа, стандартной - утилите с именем init . Программа init отвечает за запуск всех сценариев инициализации и системных демонов. Существуют различные реализации таких системных инициаторов, помимо традиционного init , такие как systemd и Upstart (на самом деле всё кроме systemd безнадежно устарело). После загрузки программы init файл initramfs удаляется из ОЗУ.
Понимание процедуры загрузки в Linux RHEL7/CentOS
Следующие шаги суммируют, как процедура загрузки происходит в Linux.
1. Выполнение POST: машина включена. Из системного ПО, которым может быть UEFI или классический BIOS, выполняется самотестирование при включении питания (POST) и аппаратное обеспечение, необходимое для запуска инициализации системы.
2. Выбор загрузочного устройства: В загрузочной прошивке UEFI или в основной загрузочной записи находится загрузочное устройство.
3. Загрузка загрузчика: с загрузочного устройства находится загрузчик. На Red Hat/CentOS это обычно GRUB 2.
4. Загрузка ядра: Загрузчик может представить пользователю меню загрузки или может быть настроен на автоматический запуск Linux по умолчанию. Для загрузки Linux ядро загружается вместе с initramfs . Initramfs содержит модули ядра для всего оборудования, которое требуется для загрузки, а также начальные сценарии, необходимые для перехода к следующему этапу загрузки. На RHEL 7/CentOS initramfs содержит полную операционную систему (которая может использоваться для устранения неполадок).
5. Запуск /sbin/init: Как только ядро загружено в память, загружается первый из всех процессов, но все еще из initramfs . Это процесс /sbin/init , который связан с systemd . Демон udev также загружается для дальнейшей инициализации оборудования. Все это все еще происходит из образа initramfs .
6. Обработка initrd.target: процесс systemd выполняет все юниты из initrd.target , который подготавливает минимальную операционную среду, в которой корневая файловая система на диске монтируется в каталог /sysroot . На данный момент загружено достаточно, чтобы перейти к установке системы, которая была записана на жесткий диск.
7. Переключение на корневую файловую систему: система переключается на корневую файловую систему, которая находится на диске, и в этот момент может также загрузить процесс systemd с диска.
8. Запуск цели по умолчанию (default target): Systemd ищет цель по умолчанию для выполнения и запускает все свои юниты. В этом процессе отображается экран входа в систему, и пользователь может проходить аутентификацию. Обратите внимание, что приглашение к входу в систему может быть запрошено до успешной загрузки всех файлов модуля systemd . Таким образом, просмотр приглашения на вход в систему не обязательно означает, что сервер еще полностью функционирует.
На каждом из перечисленных этапов могут возникнуть проблемы из-за неправильной настройки или других проблем. Таблица суммирует, где настроена определенная фаза и что вы можете сделать, чтобы устранить неполадки, если что-то пойдет не так.
Передача аргементов в GRUB 2 ядру во время загрузки
Если сервер не загружается нормально, приглашение загрузки GRUB предлагает удобный способ остановить процедуру загрузки и передать конкретные параметры ядру во время загрузки. В этой части вы узнаете, как получить доступ к приглашению к загрузке и как передать конкретные аргументы загрузки ядру во время загрузки.
Когда сервер загружается, вы кратко видите меню GRUB 2. Смотри быстро, потому что это будет длиться всего несколько секунд. В этом загрузочном меню вы можете ввести e, чтобы войти в режим, в котором вы можете редактировать команды, или c, чтобы ввести полную командную строку GRUB.
После передачи e в загрузочное меню GRUB вы увидите интерфейс, показанный на скриншоте ниже. В этом интерфейсе прокрутите вниз, чтобы найти раздел, начинающийся с linux16 /vmlinuz , за которым следует множество аргументов. Это строка, которая сообщает GRUB, как запустить ядро, и по умолчанию это выглядит так:
После ввода параметров загрузки, которые вы хотите использовать, нажмите Ctrl + X, чтобы запустить ядро с этими параметрами. Обратите внимание, что эти параметры используются только один раз и не являются постоянными. Чтобы сделать их постоянными, вы должны изменить содержимое файла конфигурации /etc/default/grub и использовать grub2-mkconfig -o /boot/grub2/grub.cfg , чтобы применить изменение.
Когда у вас возникли проблемы, у вас есть несколько вариантов (целей), которые вы можете ввести в приглашении загрузки GRUB:
■ rd.break Это останавливает процедуру загрузки, пока она еще находится в стадии initramfs .
Эта опция полезна, если у вас нет пароля root.
■ init=/bin/sh или init=/bin/bash Указывает, что оболочка должна быть запущена сразу после загрузки ядра и initrd . Это полезный вариант, но не лучший, потому что в некоторых случаях вы потеряете консольный доступ или пропустите другие функции.
■ systemd.unit=rescue.target Команда запускает еще несколько системных юнитов, чтобы привести вас в более полный рабочий режим. Требуется пароль root.
Чтобы увидеть, что загружено только очень ограниченное количество юнит-файлов, вы можете ввести команду systemctl list-units .
Запуск целей(targets) устранения неполадок в Linux
1. (Пере)загружаем Linux. Когда отобразиться меню GRUB, нажимаем e ;
2. Находим строку, которая начинается на linux16 /vmlinuz. В конце строки вводим systemd.unit=rescue.target и удаляем rhgb quit ;
3. Жмем Ctrl+X, чтобы начать загрузку с этими параметрами. Вводим пароль от root;
4. Вводим systemctl list-units и смотрим. Будут показаны все юнит-файлы, которые загружены в данный момент и соответственно загружена базовая системная среда;
5. Вводим systemctl show-environment . Видим переменные окружения в режиме rescue.target;
6. Перезагружаемся reboot ;
7. Когда отобразится меню GRUB, нажимаем e . Находим строку, которая начинается на linux16 /vmlinuz. В конце строки вводим systemd.unit=emergency.target и удаляем rhgb quit ;
8. Снова вводим пароль от root;
9. Система загрузилась в режиме emergency.target;
10. Вводим systemctl list-units и видим, что загрузился самый минимум из юнит-файлов.
Устранение неполадок с помощью загрузочного диска Linux
Еще один способ восстановления работоспособности Linux использовать образ операционки.
Если вам повезет меньше, вы увидите мигающий курсор в системе, которая вообще не загружается. Если это произойдет, вам нужен аварийный диск. Образ восстановления по умолчанию для Linux находится на установочном диске. При загрузке с установочного диска вы увидите пункт меню "Troubleshooting". Выберите этот пункт, чтобы получить доступ к параметрам, необходимым для ремонта машины.
- Install CentOS 7 in Basic Graphics Mode: эта опция переустанавливает систему. Не используйте её, если не хотите устранить неполадки в ситуации, когда обычная установка не работает и вам необходим базовый графический режим. Как правило, вам никогда не нужно использовать эту опцию для устранения неисправностей при установке.
- Rescue a CentOS System: это самая гибкая система спасения. Это должен быть первый вариант выбора при использовании аварийного диска.
- Run a Memory Test: если вы столкнулись с ошибками памяти, это позволяет пометить плохие микросхемы памяти, чтобы ваша машина могла нормально загружаться.
- Boot from local drive: здесь я думаю всё понятно.
Пример использования "Rescue a CentOS System"
1. Перезагружаем сервер с установочным диском Centos 7. Загружаемся и выбираем "Troubleshooting".
2. В меню траблшутинга выбираем "Rescue a CentOS System" и загружаемся.
3. Система восстановления теперь предлагает вам найти установленную систему Linux и смонтировать ее в /mnt/sysimage . Выберите номер 1, чтобы продолжить:
4. Если была найдена правильная установка CentOS, вам будет предложено, чтобы система была смонтирована в /mnt/sysimage . В этот момент вы можете дважды нажать Enter, чтобы получить доступ к оболочке восстановления.
5. Ваша система Linux на данный момент доступна через каталог /mnt/sysimage . Введите chroot /mnt/sysimage . На этом этапе у вас есть доступ к корневой файловой системе, и вы можете получить доступ ко всем инструментам, которые необходимы для восстановления доступа к вашей системе.
Переустановка GRUB с помощью аварийного диска
Одна из распространенных причин, по которой вам нужно запустить аварийный диск, заключается в том, что загрузчик GRUB 2 не работает. Если это произойдет, вам может понадобиться установить его снова. После того, как вы восстановили доступ к своему серверу с помощью аварийного диска, переустановить GRUB 2 несложно, и он состоит из двух этапов:
- Убедитесь, что вы поместили содержимое каталога /mnt/sysimage в текущую рабочую среду.
- Используйте команду grub2-install , а затем имя устройства, на котором вы хотите переустановить GRUB 2. Если это виртуальная машина KVM используйте команду grub2-install /dev/vda и на физическом сервере или виртуальная машина VMware, HyperV или Virtual Box, это grub2-install /dev/sda .
Повторное создание Initramfs с помощью аварийного диска
Иногда initramfs также может быть поврежден. Если это произойдет, вы не сможете загрузить свой сервер в нормальном рабочем режиме. Чтобы восстановить образ initramfs после загрузки в среду восстановления, вы можете использовать команду dracut . Если используется без аргументов, эта команда создает новый initramfs для загруженного в данный момент ядра.
Кроме того, вы можете использовать команду dracut с несколькими опциями для создания initramfs для конкретных сред ядра. Существует также файл конфигурации с именем /etc/dracut.conf , который можно использовать для включения определенных параметров при повторном создании initramfs .
- /usr/lib/dracut/dracut.conf.d/*.conf содержит системные файлы конфигурации по умолчанию.
- /etc/dracut.conf.d содержит пользовательские файлы конфигурации dracut.
- /etc/dracut.conf используется в качестве основного файла конфигурации.
Исправление общих проблем
В пределах статьи, подобной этой, невозможно рассмотреть все возможные проблемы, с которыми можно столкнуться при работе с Linux. Однако есть некоторые проблемы, которые встречаются чаще, чем другие. Ниже некоторые наиболее распространенные проблемы.
Переустановка GRUB 2
Код загрузчика не исчезает просто так, но иногда может случиться, что загрузочный код GRUB 2 будет поврежден. В этом случае вам лучше знать, как переустановить GRUB 2. Точный подход зависит от того, находится ли ваш сервер в загрузочном состоянии. Если это так, то довольно просто переустановить GRUB 2. Просто введите grub2-install и имя устройства, на которое вы хотите его установить. У команды есть много различных опций для точной настройки того, что именно будет установлено, но вам, вероятно, они не понадобятся, потому что по умолчанию команда устанавливает все необходимое, чтобы ваша система снова загрузилась. Становится немного сложнее, если ваш сервер не загружается.Если это произойдет, вам сначала нужно запустить систему восстановления и восстановить доступ к вашему серверу из системы восстановления. После монтирования файловых систем вашего сервера в /mnt/sysimage и использования chroot /mnt/sysimage , чтобы сделать смонтированный образ системы вашим корневым образом: Просто запустите grub2-install , чтобы установить GRUB 2 на желаемое установочное устройство. Но если вы находитесь на виртуальной машине KVM, запустите grub2-install /dev/vda , а если вы находитесь на физическом диске, запустите grub2-install /dev/sda .
Исправление Initramfs
В редких случаях может случиться так, что initramfs будет поврежден. Если вы тщательно проанализируете процедуру загрузки, вы узнаете, что у вас есть проблема с initramfs , потому что вы никогда не увидите, как корневая файловая система монтируется в корневой каталог, и при этом вы не увидите запуска каких-либо системных модулей. Если вы подозреваете, что у вас есть проблема с initramfs , ее легко создать заново. Чтобы воссоздать его, используя все настройки по умолчанию (что в большинстве случаев нормально), вы можете просто запустить команду dracut --force . (Без --force команда откажется перезаписать ваши существующие initramfs .)
При запуске команды dracut вы можете использовать файл конфигурации /etc/dracut.conf , чтобы указать, что именно записывается в initramfs . В этом файле конфигурации вы можете увидеть такие параметры, как lvmconf = «no» , которые можно использовать для включения или выключения определенных функций. Используйте эти параметры, чтобы убедиться, что у вас есть все необходимые функции в initramfs .
Восстановление после проблем с файловой системой
Монтирование в Linux позволяет получить доступ к содержимому диска и организовать структуру файловой системы. С помощью монтирования также можно открыть для работы образ диска (например, созданного с помощью программы dd), а также открыть для доступа и редактирования самые разные файловые системы и образы дисков (например, образы дисков виртуальных машин); даже удалённые сетевые директории могут быть смонтированы, в результате чего они станут доступны как будто бы файлы на любом другом локальном хранилище.
Кроме того, что с помощью монтирования можно работать с образами дисков, правильные настройки монтирования необходимы для компьютера к которому подключается диск для криминалистического анализа — например, этот диск не должен автоматически монтироваться с правами записи (чтобы не быть испорченным).
В Linux есть такое понятие как «монтирование» диска. Чтобы получить доступ к файлам на этом диске, его нужно сначала смонтировать. Может возникнуть вопрос, зачем такие сложности? Монтирование это мощнейшая вещь, которая позволяет поразительно гибко настроить файловую систему!
Суть монтирования в том, что в файловой системе создаётся новая директория (обычная папка), допустим, это папка /mnt/disk_d. А затем командой mount указывается, что теперь, например, диск /dev/sda смонтирован в директорию /mnt/disk_d. После этого можно получить доступ к файлам диска /dev/sda открыв папку /mnt/disk_d в любом менеджере файлов:
С помощью такого подхода — когда любой диск может быть любой папкой в системе, можно делать очень гибкую настройку. Самый частый пример, встречающийся на практике: файлы пользователя хранятся в папке /home/имя_пользователя/, например, у меня это папка /home/mial/. При установке операционной системы я могу сделать так, что мой второй или третий диск (а не системный) будет смонтирован в точку /home/mial/. То есть вся операционная система будет располагаться на одном диске, а все мои пользовательские файлы — на другом. Что это даёт? В случае переустановки системы, я вновь настрою монтирование диска с моими файлами в папку /home/mial/ и в результате в новой, только что установленной системе, уже будут на месте все мои документы, фотографии и прочее!
Ещё монтирование позволяет выбрать различные режимы, например, диск можно смонтировать в режиме «только чтение» - в результате с него можно будет просматривать файлы, но испортить этот диск невозможно.
В общем, несмотря на то, что монтирование является чем-то непривычным для пользователей Windows, это потрясающая функция! Причём ничего сложного в этом нет, если понять суть.
Как увидеть точки монтирования
Для просмотра устройств и точек их монтирования, выполните команду:
Эта команда отображает целевую точку монтирования (TARGET), исходное устройство (SOURCE), тип файловой системы (FSTYPE) и соответствующие параметры монтирования (OPTIONS) для каждой файловой системы, как показано на скриншоте. Подробности смотрите в статье «Команда findmnt для просмотра смонтированных файловых систем в Linux».
Команда findmnt без опций покажет больше данных:
Но среди вывода будут различные виртуальные файловые системы, которые нужны не всегда.
Команда mount также может показывать список точек монтирования, но эта функция в ней поддерживается только для обратной совместимости. Тем не менее, для вывода смонтированных реальных файловых систем вы можете использовать команду:
А для показа всех точек монтирования, запустите команду следующим образом:
Вы можете наблюдать процесс монтирования и размонтирования в реальном времени. К примеру, для отслеживания любых действий по монтированию и размонтированию в файловой системе используйте команду:
Как смонтировать диск
Общая команда монтирования диска имеет вид:
- ОПЦИИ — опции утилиты mount или опции монтирования
- УСТРОЙСТВО — блочное устройство или файл образа, который мы хотим подключить к файловой системе
- ДИРЕКТОРИЯ — папка, где будут доступны файлы со смонтированного устройства
Среди ОПЦИЙ можно указать, например, тип файловой системы или режим только для чтения (по умолчанию монтирование выполняется для чтения и для записи). Существует большое количество опций, некоторые из которых применимы для всех файловых систем, а некоторые из которых специфичны только для определённых файловых систем. Программа mount имеет свои опции, которые относятся к поведению этой утилиты, а также имеются опции, которые относятся к файловым системам, такие опции указываются после -o.
Некоторые опции можно указать любым из этих способов, например, опцию -w, которая означает монтирование для чтения и записи (её псевдонимы --rw, --read-write), также можно указать как «-o rw».
Справочная информация по опциям будет приведена в конце данной статьи.
На самом деле, если вы хотите смонтировать диск для чтения и записи, то можно не указывать никакие опции.
Поэтому обычно для монтирования используется команда вида:
Допустим, я хочу, чтобы новый диск с именем /dev/sda был подключён (смонтирован) к папке /mnt/disk_d (название папки можно выбрать любое, а точка монтирования необязательно должна быть в директории /mnt/ - можно сделать в домашней папке или в любой другой).
Начинаем с создания директории, в которую будет смонтирован диск:
Монтируем диск /dev/sda:
Разрешаем доступ всем в этот диск, чтобы обычный пользователь также мог смотреть и записывать туда файлы:
На самом деле, права доступа можно настроить более тонко — без полного разрешения для всех.
Как смонтировать диск только для чтения
Для монтирования диска с правами записи, используется любая из опций: -w, --rw, --read-write, -o rw. На самом деле, ни одну из них указывать не нужно, поскольку монтирования с правами записи является поведением по умолчанию.
Чтобы смонтировать диск только с правами чтения, используйте любой из вариантов опции: -r, --read-only, -o ro.
Обратите внимание, что, в зависимости от типа файловой системы, состояния и поведения ядра, система все ещё может записывать данные на устройство. Например, ext3 и ext4 будут использовать журнал, если файловая система загрязнена. Чтобы предотвратить такой доступ для записи, вы можете смонтировать файловую систему ext3 или ext4 с параметрами монтирования ro,noload или установить само блочное устройство в режим только для чтения с помощью команды blockdev:
Обратите внимание, что эффект команды blockdev проявится только если устройство не смонтировано. Если оно уже смонтировано, то изменения вступят в силу после перемонтирования.
Программа hdparm также позволяет установить флаг read-only устройства. Когда значение read-only установлено на 1, Linux не разрешает операции записи на устройство.
Чтобы установить флаг read-only:
Чтобы снять флаг read-only (устройство станет доступным для записи):
Чтобы проверить текущее состояние флага read-only:
Пример проверки значения флага read-only для диска /dev/nvme0n1:
Вывод (режим только чтение отключён, то есть возможна запись на устройство):
Альтернативный (классический) способ создания монтирования привязки только для чтения — использовать операцию повторного монтирования, например:
О привязке (bind) и перемонтировании будет далее.
Как размонтировать диск
Для размонтирования диска используется любая из двух команд:
Частой ошибкой является когда указывают с командой umount одновременно имя диска и точку монтирования — нужно указать только что-то одно.
Если вы получили ошибку, что диск занят, это означает, что какая-то программа держит открытым файл на этом диске. Чтобы выяснить, какая программа препятствует операции размонтирования/перемонтирования, можно использовать программу lsof следующим образом:
Как переместить точку монтирования
Можно переместить точку монтирования в другую директорию, для этого используется команда вида:
Это приведёт к тому, что содержимое, которое ранее отображалось в СТАРАЯ_ДИРЕКТОРИЯ, теперь будет доступно в НОВАЯ_ДИРЕКТОРИЯ. Физическое расположение файлов не меняется. Обратите внимание, что СТАРАЯ_ДИРЕКТОРИЯ должен быть точкой монтирования.
Также обратите внимание, что перемещение монтирования, находящегося под общим монтированием, недопустимо и не поддерживается. Используйте команду findmnt, чтобы увидеть текущие флаги распространения:
Как перемонтировать диск
Можно перемонтировать уже смонтированную файловую систему. Обычно это используется для изменения флагов монтирования файловой системы, особенно для того, чтобы сделать файловую систему доступной для записи. Это не меняет устройство или точку монтирования. Эта операция отличается от предыдущих двух: от привязки и перемещения она отличается тем, что не создаётся новая точка монтирования и не перемещается точка монтирования, но меняются опции монтирования.
Функциональность повторного монтирования соответствует стандартному способу работы команды mount с параметрами из fstab. Это означает, что mount не читает fstab (или mtab) только тогда, когда указаны и устройство, и каталог.
Команда перемонтирования имеет общий вид:
К примеру, чтобы перемонтировать диск, смонтированный в /mnt/disk_d, установив права доступа на «только для чтения»:
Можно также указать одновременно устройство и точку монтирования:
Пример перемонтирования корневой файловой системы с опцией «чтение и запись»:
Опция «чтение и запись» может быть помещена в опцию строки команды -o, например:
После этого вызова все старые параметры монтирования заменяются, а произвольные данные из fstab (или mtab) игнорируются, за исключением параметра loop=, который генерируется внутри и поддерживается командой mount.
После этого вызова mount читает fstab и объединяет эти параметры с параметрами из командной строки (-o). Если в fstab не найдена точка монтирования, разрешается повторное монтирование с неуказанным источником.
mount позволяет использовать --all для повторного монтирования всех уже смонтированных файловых систем, соответствующих указанному фильтру (-O и -t). Например, команда:
перемонтирует все уже смонтированные файловые системы vfat в режим только для чтения. Каждая файловая система перемонтируется семантикой «mount -o remount,ro /dir». Это означает, что команда mount считывает fstab или mtab и объединяет эти параметры с параметрами из командной строки.
Как узнать имя диска для монтирования
Чтобы смонтировать диск (или файл образа) достаточно указать имя устройства и папку, куда его смонтировать (где будут доступны файлы с этого диска). Как мы уже выяснили, не нужно даже указывать тип файловой системы.
Но чтобы смонтировать нужный диск, нужно правильно указать его название или название его раздела.
Отсюда возникает вопрос, как узнать имя раздела для монтирования? Устройства в Linux имеют имена вида /dev/*. Большинство дисков и USB накопителей имеют имена вида /dev/sd*, где в качестве * (звёздочки) используются буквы от a и далее, то есть b, c, d… Номер буквы соответствует порядковому номеру диска в системе. Если диск разбит на разделы, то после буквы идёт цифра раздела, например, /dev/sda1, /dev/sda2 и так далее. Если диск не разбит на разделы, то его можно смонтировать по имени без цифры, например, /dev/sda. Если же диск разбит на разделы, то нужно указать его имя с цифрой раздела, например, /dev/sda3.
В зависимости от используемой технологии дисков, у них могут быть другие имена. Пример имени диска NVMe: /dev/nvme0n1. В этом случае нумерация разделов также не подчиняется описанным выше правилам, первый и второй разделы имеют имена /dev/nvme0n1p1 и /dev/nvme0n1p2 соответственно.
Итак, необходимо правильно определить имя диска (или имя раздела, если диск разбит на разделы).
Обзорную информацию о дисках в системе может дать команда:
Эта команда показала, что в системе есть диски трёх типов: SCSI (внутренний жёсткий диск), [SAT], ATA (жёсткий диск, подключённый по USB переходнику к компьютеру), NVMe (внутренний твердотельный диск).
На самом деле, вывод команды неполный (пропущена USB флешка) и в нём полностью отсутствует информация о разделах. Тем не менее она может помочь вам сориентироваться в присутствующих на вашей системе дисках.
Хорошим вариантом является следующая программа:
Она выводит информацию о каждом диске и каждом разделе. В информации присутствует модель диска, размер и тип разделов — основываясь на этих данных можно найти название нужного раздела.
Если вы всё равно не можете разобраться, то со съёмными носителями (внешними USB дисками и флешками), вы можете поступить так: выполнить команду fdisk -l до подключения диска, затем подключить диск/флешку, выполнить команду fdisk -l ещё раз и посмотреть, какой диск добавился.
Если диск монтируется автоматически, то его имя можно увидеть с помощью команда мониторинга:
Ещё одна команда, показывающая обзорную информацию об именах дисках, их файловых системах, ярлык и занятое пространство (в процентах) и доступный объём свободного места (в гигабайтах):
Возможно вы сможете найти полезную информацию в LABEL разделов, чтобы показать сразу все разделы, выполните:
Если вы уже почти определились с разделом и хотите подтвердить свою правоту, то информацию по конкретному разделу можно получить командой вида:
Команда file также может рассказать много интересного про раздел:
Разбираемся со способностью systemd запускать контейнеры для восстановления корневой файловой системы поврежденной системы.
До тех пор пока будут существовать системы GNU/Linux, системным администраторам будет необходимо восстанавливаться после повреждения корневой файловой системы, случайных изменений конфигурации или других ситуаций, которые не дают системе загрузиться в «нормальное» состояние.
Обычно дистрибутивы Linux предлагают одну или несколько опций меню во время загрузки (например, в меню GRUB), которые можно использовать для восстановления поврежденной системы; зачастую они загружают систему в однопользовательском режиме с отключением большинства системных служб. В худшем случае пользователь может изменить командную строку ядра в загрузчике, чтобы использовать стандартную оболочку в качестве процесса init (PID 1). Этот метод является наиболее сложным и чреват затруднениями, которые могут привести к потере времени и фрустрации, в то время как система нуждается в восстановлении.
Самое главное, что все эти методы предполагают, что у поврежденной системы есть какая-либо физическая консоль, но в эпоху облачных вычислений на это уже нельзя полагаться. Без физической консоли есть всего несколько вариантов (если они еще окажутся доступными), чтобы повлиять на процесс загрузки таким образом. Даже физические машины могут оказаться небольшими встроенными устройствами, которые не имеют простой в использовании консоли, а поиск подходящих кабелей и адаптеров последовательного порта и настройка эмулятора терминала, все для использования консоли на последовательном порту в условиях работы с чрезвычайной ситуацией, зачастую достаточно сложны.
Когда доступна другая система (той же архитектуры и в целом аналогичной конфигурации), общий способ упростить процесс восстановления заключается в извлечении запоминающих устройств из поврежденной системы и подключении их к рабочей системе в качестве вторичных устройств. В физических системах это обычно не вызывает затруднений, и большинство платформ облачных вычислений также могут это поддерживать, поскольку они позволяют смонтировать корневой том хранилища поврежденного инстанса в другом инстансе.
После того, как корневая файловая система подключена к другой системе, решение проблемы повреждения файловой системы осуществляется с помощью fsck и других инструментов. Устранение ошибок конфигурации, поврежденных пакетов или других проблем может быть более сложным, поскольку для них требуется монтировать файловую систему и находить и изменять правильные файлы конфигурации или базы данных.
Использование systemd
До появления systemd способом исправления конфигурации на практике было редактирование файлов конфигурации с помощью текстового редактора. Поиск необходимых файлов и понимание их содержимого является отдельной задачей, которая выходит за рамки данной статьи.
Когда система GNU/Linux использует systemd, многие изменения конфигурации лучше всего выполнять с помощью инструментов, которые она предоставляет — например, для включения и отключения служб требуется создание или удаление символических ссылок в различных местах. Инструмент systemctl используется для внесения этих изменений, но для его использования требуется, чтобы экземпляр systemd работал и прослушивал запросы (по шине D-Bus). Когда корневая файловая система смонтирована как дополнительная файловая система на другом компьютере, работающий экземпляр systemd не может быть использован для внесения этих изменений.
Ручной запуск systemd целевой системы также нецелесообразен, поскольку он спроектирован как PID 1 процесс для управления всеми другими процессами, который может конфликтовать с уже запущенным экземпляром в системе, используемой для исправления.
К счастью, systemd имеет возможность запускать контейнеры — полностью инкапсулированные системы GNU/Linux с собственным PID 1 и средой, в которой используется различный функционал пространства имен, предлагаемый ядром Linux. В отличие от таких инструментов, как Docker и Rocket, systemd не требуется образ контейнера для запуска контейнера; он может запустить его с root-правами в любой точке существующей файловой системы. Это делается с помощью инструмента systemd-nspawn, который создаст необходимые пространства имен системы и запустит начальный процесс в контейнере, а затем предоставит консоль. В отличие от chroot, который изменяет только видимый корень файловой системы, этот тип контейнера будет иметь отдельное пространство имен файловой системы, подходящие файловые системы, смонтированные в /dev, /run и /proc, а также отдельное пространство имен процессов и IPC. Посетите основной ресурс systemd-nspawn, чтобы узнать больше о его возможностях.
Пример для демонстрации того, как это работает
В этом примере запоминающее устройство, содержащее корневую файловую систему поврежденной системы, подключено к работающей системе, где оно отображается как /dev/vdc. Имя устройства будет различаться в зависимости от количества существующих запоминающих устройств, типа устройства и метода, используемого для подключения его к системе. Корневая файловая система может использовать все устройство хранения или находиться в разделе внутри устройства; поскольку наиболее распространенная (простая) конфигурация помещает корневую файловую систему в первый раздел устройства, в этом примере будет использоваться /dev/vdc1. Обязательно замените имя устройства в приведенных ниже командах на правильное имя устройства вашей системы.
Поврежденная корневая файловая система также может быть более сложной, чем отдельная файловая система на устройстве; это может быть том в LVM или на наборе устройств, объединенных в RAID-массив. В этих случаях нужно выполнить необходимые шаги для создания и активации логического устройства, содержащего файловую систему, прежде чем оно будет доступно для монтирования. Опять же, эти шаги выходят за рамки этой статьи.
Необходимые приготовления
Во-первых, убедитесь, что установлен инструмент systemd-nspawn — большинство дистрибутивов GNU/Linux не устанавливают его по умолчанию. Он предоставляется пакетом systemd-container в большинстве дистрибутивов, поэтому используйте менеджер пакетов вашего дистрибутива для его установки. Инструкции в этом примере были протестированы с использованием Debian 9, но должны работать аналогично в любом современном дистрибутиве GNU/Linux.
Для использования приведенных ниже команд почти наверняка потребуются root-права, поэтому вам нужно будет либо войти в систему как root, использовать sudo для получения оболочки с root-правами или добавить к каждой команде префикс sudo.
Проверьте и смонтируйте файловую систему
Сначала используйте fsck для проверки структур и содержимого целевой файловой системы:
Теперь создайте временный каталог и смонтируйте в него целевую файловую систему:
Когда файловая система смонтирована, запустите контейнер с ней в качестве корневой файловой системы:
Аргументы командной строки для запуска контейнера:
- --directory /tmp/target-rescue предоставляет путь к корневой файловой системе контейнера.
- --boot ищет подходящую программу инициализации в корневой файловой системе контейнера и запускает ее, передавая ей параметры из командной строки. В этом примере целевая система также использует systemd в качестве PID 1 процесса, поэтому остальные параметры предназначены для него. Если целевая система, которую вы восстанавливаете, использует какой-либо другой инструмент в качестве PID 1 процесса, вам необходимо соответствующим образом настроить параметры.
- — отделяет параметры для systemd-nspawn от тех, которые предназначены для PID 1 процесса контейнера.
- --unit rescue.target сообщает systemd в контейнере имя цели, которую он должен попытаться достичь в процессе загрузки. Чтобы упростить операции восстановления в целевой системе, загрузите ее в режиме «восстановления», а не в обычном многопользовательском режиме.
В этом выводе вы можете увидеть запуск systemd в качестве процесса init в контейнере и определение того, что он выполняется внутри контейнера, чтобы он мог соответствующим образом настроить свое поведение. Для приведения контейнера в рабочее состояние запускаются различные юнит-файлы, затем запрашивается root-пароль целевой системы. Вы можете ввести root-пароль здесь, если вы хотите запросить оболочку с root-правами, или вы можете нажать Ctrl + D, чтобы продолжить процесс запуска, который будет отображать обычное приглашение входа в консоль.
Когда вы выполните необходимые изменения в целевой системе, нажмите Ctrl +] три раза подряд; это завершит работу контейнера и вернет вас в исходную оболочку. Оттуда вы можете выполнить очистку, размонтировав файловую систему целевой системы и удалив временный каталог:
Вот и все! Теперь вы можете извлечь запоминающие устройства целевой системы и вернуть их обратно.
Идея использовать systemd-nspawn таким образом, особенно параметр --boot, возникла из вопроса, опубликованного на StackExchange. Спасибо Shibumi и kirbyfan64sos за полезные ответы на этот вопрос!
Читайте также: