Файловая система содержит ошибки макета из-за перекрывающихся файлов

Обновлено: 07.07.2024

Используйте следующую информацию, чтобы решить проблемы, с которыми вы можете столкнуться при работе с Amazon FSx for Lustre.

Темы

Монтирование файловой системы сразу завершается ошибкой

Команда монтирования файловой системы сразу завершается ошибкой. В следующем коде показан пример.

Эта ошибка может возникнуть, если вы используете неправильное значение имени монтирования при монтировании постоянной или временной файловой системы 2 с помощью команды mount. Вы можете получить значение mountname из ответа на команду CLI AWS описать-файловые-системы или операцию API DescribeFileSystems.

Монтирование файловой системы зависает, а затем завершается ошибкой тайм-аута

Команда монтирования файловой системы зависает на минуту или две, а затем завершается с ошибкой тайм-аута.

В следующем коде показан пример.

Эта ошибка может возникнуть из-за неправильной настройки групп безопасности для экземпляра Amazon EC2 или файловой системы.

Действие

Убедитесь, что ваши группы безопасности для файловой системы имеют правила входящего трафика, указанные в группах безопасности Amazon VPC.

Сбой автоматического монтирования, и экземпляр не отвечает

В некоторых случаях может произойти сбой автоматического монтирования файловой системы, и ваш инстанс Amazon EC2 может перестать отвечать на запросы.

Эта проблема может возникнуть, если параметр _netdev не был объявлен. Если _netdev отсутствует, ваш инстанс Amazon EC2 может перестать отвечать на запросы. Это связано с тем, что сетевые файловые системы необходимо инициализировать после запуска вычислительного экземпляра в сети.

Действие

В случае возникновения этой проблемы обратитесь в службу поддержки AWS.

Сбой монтирования файловой системы во время загрузки системы

Сбой монтирования файловой системы во время загрузки системы. Монтирование выполняется автоматически с помощью /etc/fstab. Если файловая система не смонтирована, в системном журнале отображается следующая ошибка для временного интервала загрузки экземпляра.

Эта ошибка может возникнуть, если порт 988 недоступен. Если экземпляр настроен на монтирование файловых систем NFS, возможно, что монтирование NFS привяжет его клиентский порт к порту 988

Действие

Эту проблему можно обойти, по возможности настроив параметры noresvport и noauto mount клиента NFS.

Сбой монтирования файловой системы с использованием DNS-имени

Неправильно настроенные имена службы доменных имен (DNS) могут привести к сбоям при монтировании файловой системы, как показано в следующих сценариях.

Сценарий 1. Ошибка монтирования файловой системы, использующей имя службы доменных имен (DNS). В следующем коде показан пример.

Действие

Проверьте конфигурацию виртуального частного облака (VPC). Если вы используете собственное VPC, убедитесь, что настройки DNS включены. Дополнительную информацию см. в разделе «Использование DNS с вашим VPC» в Руководстве пользователя Amazon VPC.

Чтобы указать DNS-имя в команде mount, выполните следующие действия:

Убедитесь, что экземпляр Amazon EC2 находится в том же облаке VPC, что и ваша файловая система Amazon FSx for Lustre.

Подключите свой экземпляр Amazon EC2 внутри VPC, настроенного на использование DNS-сервера, предоставленного Amazon. Дополнительную информацию см. в разделе Наборы параметров DHCP в Руководстве пользователя Amazon VPC.

Убедитесь, что в Amazon VPC подключаемого инстанса Amazon EC2 включены DNS-имена хостов. Дополнительную информацию см. в разделе «Обновление поддержки DNS для вашего VPC» в Руководстве пользователя Amazon VPC.

Сценарий 2. Ошибка монтирования файловой системы, использующей имя службы доменных имен (DNS). В следующем коде показан пример.

Действие

Убедитесь, что к группам безопасности VPC клиента применяются правильные правила исходящего трафика. Эта рекомендация верна, особенно если вы не используете группу безопасности по умолчанию или если вы изменили группу безопасности по умолчанию. Дополнительные сведения см. в разделе Группы безопасности Amazon VPC.

Вы не можете получить доступ к своей файловой системе

Существует ряд возможных причин невозможности доступа к вашей файловой системе, каждая из которых имеет собственное разрешение, как показано ниже.

Эластичный IP-адрес, прикрепленный к гибкому сетевому интерфейсу файловой системы, был удален

Amazon FSx не поддерживает доступ к файловым системам из общедоступного Интернета. Amazon FSx автоматически отсоединяет любой эластичный IP-адрес, то есть общедоступный IP-адрес, доступный из Интернета, который присоединяется к эластичному сетевому интерфейсу файловой системы.

Эластичный сетевой интерфейс файловой системы был изменен или удален

Вы не должны изменять или удалять эластичный сетевой интерфейс файловой системы. Изменение или удаление сетевого интерфейса может привести к необратимой потере соединения между вашим VPC и вашей файловой системой. Создайте новую файловую систему и не изменяйте и не удаляйте эластичный сетевой интерфейс FSx. Дополнительные сведения см. в разделе Управление доступом к файловой системе с помощью Amazon VPC.

Невозможно проверить доступ к корзине S3 при создании связи с хранилищем данных

Создание ассоциации репозитория данных (DRA) из консоли Amazon FSx или с помощью команды CLI create-data-repository-association (CreateDataRepositoryAssociation — это эквивалентное действие API) завершается сбоем со следующим сообщением об ошибке.

Вы также можете получить указанную выше ошибку при создании файловой системы Scratch 1, Scratch 2 или Persistent 1, которая связана с репозиторием данных (корзина S3 или префикс) с помощью консоли Amazon FSx или интерфейса командной строки create-file-system. команда (CreateFileSystem является эквивалентным действием API).

Действие

Если файловая система FSx for Lustre находится в той же учетной записи, что и корзина S3, эта ошибка означает, что роль IAM, которую вы использовали для запроса на создание, не имеет необходимых разрешений для доступа к корзине S3. Убедитесь, что у роли IAM есть разрешения, указанные в сообщении об ошибке. Эти разрешения поддерживают связанную с сервисом роль Amazon FSx for Lustre, которая используется для доступа к указанной корзине Amazon S3 от вашего имени.

Если файловая система FSx for Lustre находится в другой учетной записи, чем корзина S3 (случай с несколькими учетными записями), в дополнение к тому, что используемая роль IAM имеет необходимые разрешения, политика корзины S3 должна быть настроена так, чтобы разрешить доступ из учетной записи, в которой создан FSx for Lustre. Ниже приведен пример политики корзины,

Дополнительную информацию о разрешениях для корзины S3 для разных учетных записей см. в разделе Пример 2. Владелец корзины, предоставляющий разрешения для корзины для нескольких учетных записей в Руководстве пользователя Amazon Simple Storage Service.

Невозможно создать файловую систему, связанную с корзиной S3

Если при создании новой файловой системы, связанной с корзиной S3, появляется сообщение об ошибке, подобное следующему.

Эта ошибка может произойти, если вы попытаетесь создать файловую систему, связанную с корзиной Amazon S3, без необходимых разрешений IAM. Требуемые разрешения IAM поддерживают связанную с сервисом роль Amazon FSx for Lustre, которая используется для доступа к указанной корзине Amazon S3 от вашего имени.

Действие

Убедитесь, что ваш объект IAM (пользователь, группа или роль) имеет соответствующие разрешения для создания файловых систем. Это включает в себя добавление политики разрешений, которая поддерживает роль, связанную с сервисом Amazon FSx for Lustre. Дополнительную информацию см. в разделе Добавление разрешений на использование репозиториев данных в Amazon S3.

Дополнительную информацию о ролях, связанных с сервисом, см. в разделе Использование ролей, связанных с сервисом, для Amazon FSx for Lustre.

Устранение неполадок неправильно настроенного связанного сегмента S3

В некоторых случаях корзина S3, связанная с файловой системой FSx for Lustre, может иметь неправильно настроенное состояние жизненного цикла репозитория данных.

Возможная причина

Эта ошибка может возникнуть, если Amazon FSx не имеет необходимых разрешений AWS Identity and Access Management (IAM), необходимых для доступа к связанному хранилищу данных. Требуемые разрешения IAM поддерживают связанную с сервисом роль Amazon FSx for Lustre, которая используется для доступа к указанной корзине Amazon S3 от вашего имени.

Действие

Убедитесь, что ваш объект IAM (пользователь, группа или роль) имеет соответствующие разрешения для создания файловых систем. Это включает в себя добавление политики разрешений, которая поддерживает роль, связанную с сервисом Amazon FSx for Lustre. Дополнительную информацию см. в разделе Добавление разрешений на использование репозиториев данных в Amazon S3.

С помощью интерфейса командной строки или API Amazon FSx обновите AutoImportPolicy файловой системы с помощью команды CLI update-file-system (эквивалентное действие API — UpdateFileSystem) следующим образом.

Дополнительную информацию о ролях, связанных с сервисом, см. в разделе Использование ролей, связанных с сервисом, для Amazon FSx for Lustre.

Возможная причина

Эта ошибка может возникнуть, если связанный репозиторий данных Amazon S3 имеет существующую конфигурацию уведомлений о событиях с типами событий, которые пересекаются с конфигурацией уведомлений о событиях Amazon FSx ( s3:ObjectCreated:* , s3:ObjectRemoved:* ).

Это также может произойти, если конфигурация уведомлений о событиях Amazon FSx в связанной корзине S3 была удалена или изменена.

Действие

Удалите все существующие уведомления о событиях в связанной корзине S3, которые используют один или оба типа событий, используемых конфигурацией событий FSx, s3:ObjectCreated:* и s3:ObjectRemoved:* .

Убедитесь, что в связанной корзине S3 есть конфигурация уведомлений о событиях S3 с именем FSx , типами событий s3:ObjectCreated:* и s3:ObjectRemoved:* , и отправьте в тему SNS с ARN: topic_arn_returned_in_API_response .

Повторно примените конфигурацию уведомлений о событиях FSx в корзине S3 с помощью интерфейса командной строки или API Amazon FSx, чтобы обновить AutoImportPolicy файловой системы. Сделайте это с помощью команды CLI update-file-system (UpdateFileSystem — эквивалентное действие API), как показано ниже.

Устранение неполадок с хранилищем

В некоторых случаях у вас могут возникнуть проблемы с хранилищем файловой системы. Вы можете устранить эти проблемы с помощью команд lfs, таких как команда lfs migrate.

Ошибка записи из-за отсутствия места в целевом хранилище

Вы можете проверить использование хранилища вашей файловой системы с помощью команды lfs df -h, как описано в разделе Структура хранилища файловой системы. Поле filesystem_summary сообщает об общем использовании хранилища файловой системы.

Если использование диска файловой системой составляет 100 %, рассмотрите возможность увеличения емкости файловой системы. Дополнительную информацию см. в разделе Управление хранилищем и пропускной способностью.

Если использование хранилища файловой системы не равно 100 %, а ошибки записи по-прежнему возникают, возможно, файл, в который вы записываете, имеет чередование в заполненном OST.

Действие

Если многие из ваших OST заполнены, увеличьте емкость файловой системы. Проверьте наличие несбалансированного хранилища в OST, выполнив действия, описанные в разделе Несбалансированное хранилище в OST.

Несбалансированное хранилище в OST

Amazon FSx for Lustre равномерно распределяет новые полосы файлов по OST. Однако ваша файловая система все еще может стать несбалансированной из-за шаблонов ввода-вывода или схемы хранения файлов. В результате некоторые целевые хранилища могут быть заполнены, а другие остаются относительно пустыми.

Действие

Используйте команду lfs df -h, чтобы определить доступную емкость, оставшуюся в каждом целевом хранилище.

Используйте команду lfs find для определения файлов, которые можно перенести в другие целевые хранилища. Например, следующая команда возвращает все файлы размером более 1 ТБ и имеющие хотя бы 1 объект в OST 2 . Будет возвращен любой файл, разделенный на несколько OST и использующий OST 2.

Используйте команду lfs migrate для перемещения файлов из одного целевого хранилища в другое целевое хранилище или в несколько целевых хранилищ. Следующая команда показывает пример перемещения файла из текущего целевого хранилища.

Если вы хотите изменить схему хранения файла, например, разделить файл с одной цели хранения на несколько целей хранения (например, 4 цели хранения), вы можете использовать команду, подобную следующей:

Если файл очень большой, распределите его по нескольким целевым хранилищам. Дополнительную информацию см. в разделе «Обработка полных саундтреков» на веб-сайте Lustre.

Вы также можете рассмотреть возможность изменения конфигурации чередования вашей файловой системы или каталога, чтобы новые файлы распределялись по нескольким целевым хранилищам. Дополнительную информацию см. в разделе Чередование данных в вашей файловой системе.

По умолчанию при монтировании файловой системы, поддерживающей расширенные атрибуты, контекст безопасности для каждого файла получается из расширенного атрибута файла security.selinux. Файлам в файловых системах, которые не поддерживают расширенные атрибуты, назначается единый контекст безопасности по умолчанию из конфигурации политики в зависимости от типа файловой системы.

Используйте команду mount -o context, чтобы переопределить существующие расширенные атрибуты или указать другой контекст по умолчанию для файловых систем, которые не поддерживают расширенные атрибуты. Это полезно, если вы не доверяете файловой системе в предоставлении правильных атрибутов, например съемным носителям, используемым в нескольких системах. Команду контекста mount -o также можно использовать для поддержки маркировки файловых систем, которые не поддерживают расширенные атрибуты, такие как таблица размещения файлов (FAT) или тома NFS. Контекст, указанный с параметром context, не записывается на диск: исходные контексты сохраняются и видны при монтировании без контекста, если файловая система изначально имела расширенные атрибуты.

4.9.1. Контекстные подключения

Вновь созданные файлы и каталоги в этой файловой системе имеют контекст SELinux, указанный с помощью -o context . Однако, поскольку эти изменения не записываются на диск, контекст, указанный с помощью этой опции, не сохраняется между монтированиями. Поэтому этот параметр необходимо использовать с одним и тем же контекстом, указанным при каждом монтировании, чтобы сохранить требуемый контекст. Информацию о том, как сделать монтирование контекста постоянным, см. в Раздел 4.9.5, «Создание постоянного монтирования контекста».

Type Enforcement — это основной элемент управления разрешениями, используемый в целевой политике SELinux. По большей части пользователей и роли SELinux можно игнорировать, поэтому при переопределении контекста SELinux с помощью -o context используйте роль пользователя SELinux system_u и object_r и сосредоточьтесь на типе. Если вы не используете политику MLS или безопасность с несколькими категориями, используйте уровень s0.

Примечание

Если файловая система монтируется с опцией контекста, пользователям и процессам запрещается изменять контекст. Например, запуск команды chcon в файловой системе, смонтированной с параметром контекста, приводит к ошибке «Операция не поддерживается».

4.9.2. Изменение контекста по умолчанию

Как упоминалось в Разделе 4.8, «Типы file_t и default_t», в файловых системах, поддерживающих расширенные атрибуты, при доступе к файлу, не имеющему контекста SELinux на диске, он обрабатывается так, как если бы он имел определенный контекст по умолчанию. в соответствии с политикой SELinux. В общих политиках этот контекст по умолчанию использует тип file_t.Если желательно использовать другой контекст по умолчанию, смонтируйте файловую систему с параметром defcontext.

В следующем примере вновь созданная файловая система на /dev/sda2 монтируется в только что созданный каталог test/. Предполагается, что в /etc/selinux/targeted/contexts/files/ нет правил, определяющих контекст для каталога test/:

параметр defcontext определяет, что system_u:object_r:samba_share_t:s0 является «контекстом безопасности по умолчанию для немаркированных файлов» [5] .

при монтировании корневой каталог ( test/ ) файловой системы обрабатывается так, как будто он помечен контекстом, заданным defcontext (эта метка не хранится на диске). Это влияет на маркировку файлов, созданных в test/ : новые файлы наследуют тип samba_share_t, и эти метки сохраняются на диске.

файлы, созданные во время тестирования/, когда файловая система была смонтирована с параметром defcontext, сохраняют свои метки.

4.9.3. Подключение тома NFS

Поскольку эти изменения не записываются на диск, контекст, указанный с помощью этой опции, не сохраняется между монтированиями. Поэтому этот параметр необходимо использовать с одним и тем же контекстом, указанным при каждом монтировании, чтобы сохранить требуемый контекст. Информацию о том, как сделать монтирование контекста постоянным, см. в Раздел 4.9.5, «Создание постоянного монтирования контекста».

В качестве альтернативы монтированию файловых систем с параметрами контекста можно включить логические значения, чтобы разрешить службам доступ к файловым системам, помеченным типом nfs_t. См. часть II, «Управление ограниченными службами», где приведены инструкции по настройке логических значений, чтобы разрешить службам доступ к типу nfs_t.

4.9.4. Несколько монтирований NFS

При монтировании нескольких монтирований из одного экспорта NFS попытка переопределить контекст SELinux каждого монтирования другим контекстом приводит к сбою последующих команд монтирования. В следующем примере сервер NFS имеет один экспорт, export/, который имеет два подкаталога, web/ и database/. Следующие команды пытаются выполнить два монтирования из одного экспорта NFS и пытаются переопределить контекст для каждого из них:

Чтобы смонтировать несколько монтирований из одного экспорта NFS, при этом каждое монтирование имеет свой контекст, используйте параметры -o nosharecache,context. В следующем примере выполняется монтирование нескольких монтирований из одного экспорта NFS с различным контекстом для каждого монтирования (предоставляя доступ одной службе к каждому):

Важно

Параметры nosharecache позволяют монтировать один и тот же подкаталог экспорта несколько раз в разных контекстах, например, монтировать /export/web/ несколько раз. Не монтируйте один и тот же подкаталог из экспорта несколько раз в разных контекстах, так как это создает перекрывающееся монтирование, при котором файлы доступны в двух разных контекстах.

4.9.5. Обеспечение постоянного монтирования контекста

Чтобы сделать монтирование контекста постоянным при повторном монтировании и перезагрузке, добавьте записи для файловых систем в файл /etc/fstab или карту автоматического монтирования и используйте требуемый контекст в качестве параметра монтирования. В следующем примере в файл /etc/fstab добавляется запись для монтирования контекста NFS:

Призрачный скрипт ESP 815.02

Призрачный скрипт ESP 815.02

Призрачный скрипт ESP 815.02

Призрачный скрипт ESP 815.02

Призрачный скрипт ESP 815.02

Призрачный скрипт ESP 815.02

Призрачный скрипт ESP 815.02

Призрачный скрипт ESP 815.02

Призрачный скрипт ESP 815.02

Призрачный скрипт ESP 815.02

Призрачный скрипт ESP 815.02

Призрачный скрипт ESP 815.02

Призрачный скрипт ESP 815.02

Призрачный скрипт ESP 815.02

Призрачный скрипт ESP 815.02

Призрачный скрипт ESP 815.02

Библиотека Adobe PDF 8.0

0000 п 0000044922 00000 п 0000045698 00000 п 0000047290 00000 п 0000059124 00000 п 0000059412 00000 п 0000059700 00000 п 0000059990 00000 п 0000060270 00000 п 0000060559 00000 п 0000060848 00000 п 0000061147 00000 п 0000061424 00000 п 0000061710 00000 п 0000062004 00000 п 0000062307 00000 п 0000062593 00000 п 0000062879 00000 п 0000063174 00000 п 0000063456 00000 п 0000063731 00000 п 0000064012 00000 п 0000064308 00000 п 0000064605 00000 п 0000064901 00000 п 0000065170 00000 п 0000073637 00000 п 0000073933 00000 п 0000078358 00000 п 0000078656 00000 п 0000078962 00000 п 0000079243 00000 п 0000079578 00000 п 0000079868 00000 п 0000079919 00000 п 0000080160 00000 п 0000086795 00000 п 0000093199 00000 п 0000093483 00000 п 0000093577 00000 п 0000093962 00000 п 0000100987 00000 п 0000101269 00000 п 0000102046 00000 п 0000103090 00000 п 0000111741 00000 п 0000112004 00000 п 0000112285 00000 п 0000112592 00000 п 0000112879 00000 п 0000113173 00000 н 0000113445 00000 н 0000113757 00000 н 00001 14050 00000 п 0000114346 00000 п 0000114616 00000 п 0000114913 00000 п 0000115214 00000 п 0000115518 00000 п 0000115783 00000 п 0000116080 00000 п 0000116355 00000 п 0000116657 00000 п 0000116929 00000 п 0000117224 00000 п 0000117520 00000 п 0000144221 00000 п 0000154246 00000 п 0000154522 00000 п 0000154846 00000 п 0000155125 00000 п 0000155403 00000 п 0000156180 00000 п 0000156801 00000 п 0000164686 00000 п 0000165463 00000 п 0000166071 00000 п 0000172642 00000 п 0000173419 00000 п 0000173862 00000 п 0000180552 00000 п 0000180578 00000 п 0000180882 00000 п 0000181659 00000 п 0000182202 00000 п 0000190066 00000 п 0000190092 00000 п 0000190426 00000 п 0000191203 00000 п 0000196631 00000 п 0000212283 00000 п 0000212559 00000 п 0000212856 00000 п 0000213124 00000 п 0000242257 00000 п 0000242570 00000 п 0000243660 00000 п 0000243950 00000 п 0000245090 00000 п 0000245372 00000 п 0000245657 00000 п 0000249079 00000 п 0000249345 00000 п 0000249642 00000 н 0000269241 00000 н 0000269535 00000 п 0000275959 00000 п 0000289297 00000 п 0000289594 00000 п 0000289860 00000 п 0000290134 00000 п 0000290433 00000 п 0000290736 00000 п 0000291031 00000 п 0000291331 00000 п 0000291597 00000 п 0000291866 00000 п 0000292159 00000 п 0000292477 00000 п 0000292775 00000 п 0000293077 00000 п 0000293275 00000 п 0000293550 00000 п 0000293853 00000 п 0000294155 00000 п 0000294418 00000 п 0000294729 00000 п 0000295026 00000 п 0000295313 00000 п 0000295609 00000 п 0000295875 00000 п 0000296155 00000 п 0000296403 00000 п 0000296676 00000 п 0000296981 00000 п 0000297303 00000 п 0000297602 00000 п 0000297883 00000 п 0000298165 00000 п 0000298466 00000 п 0000298757 00000 п 0000299057 00000 п 0000299354 00000 п 0000299644 00000 п 0000299923 00000 п 0000300172 00000 п 0000300484 00000 п 0000300763 00000 п 0000301041 00000 п 0000301348 00000 п 0000301644 00000 п 0000301838 00000 п 0000302144 00000 п 0000302171 00000 п 0000302507 00000 п 0000303285 00000 0000303731 00000 0000310315 00000 0000310342 00000 п 0000310678 00000 п 0000310705 00000 п 0000311010 00000 п 0000311788 00000 п 0000312250 00000 п 0000319340 00000 п 0000320118 00000 п 0000320552 00000 п 0000327120 00000 п 0000327898 00000 п 0000329069 00000 п 0000337915 00000 п 0000337942 00000 п 0000338298 00000 п 0000340002 00000 п 0000340234 00000 п 0000340304 00000 п 0000340481 00000 п 0000340508 00000 п 0000340851 00000 п 0000341260 00000 п 0000341487 00000 п 0000341557 00000 п 0000341695 00000 п 0000341722 00000 п 0000342019 00000 п 0000342797 00000 п 0000343204 00000 п 0000350581 00000 п 0000351359 00000 п 0000351779 00000 п 0000359981 00000 п 0000384647 00000 п 0000384901 00000 п 0000384971 00000 п 0000385241 00000 п 0000385268 00000 п 0000385659 00000 п 0000386437 00000 п 0000386862 00000 п 0000393303 00000 п 0000394081 00000 п 0000394129 00000 п 0000394176 00000 п 0000394457 00000 п 0000394711 00000 п 0000401398 00000 п 0000401871 00000 п 0000402050 00000 п 0000402314 00000 н 0000406263 00000 н 0000406664 00000 н 000 0410464 00000 п 0000411078 00000 п 0000411148 00000 п 0000411554 00000 п 0000411784 00000 п 0000411926 00000 п 0000412054 00000 п 0000412313 00000 п 0000414416 00000 п 0000414648 00000 п 0000414835 00000 п 0000414905 00000 п 0000415033 00000 п 0000415163 00000 п 0000415293 00000 п 0000415423 00000 п 0000415553 00000 п 0000415683 00000 п 0000415813 00000 п 0000450483 00000 п 0000450738 00000 п 0000451199 00000 п 0000451333 00000 п 0000452526 00000 п 0000452618 00000 п 0000452696 00000 п 0000452788 00000 п 0000452841 00000 п 0000453036 00000 п 0000453090 00000 п 0000453260 00000 п 0000453314 00000 п 0000453366 00000 п 0000453418 00000 п 0000453471 00000 п 0000453524 00000 п 0000453577 00000 п 0000453630 00000 п 0000453683 00000 п 0000453736 00000 п 0000453790 00000 п 0000453844 00000 п 0000453898 00000 п 0000453952 00000 п 0000454006 00000 п 0000454060 00000 п 0000454132 00000 п 0000454235 00000 п 0000454334 00000 п 0000454436 00000 п 0000457869 00000 n трейлер > startxref 116 %%EOF

Виртуальные файловые системы — это волшебная абстракция, которая делает возможной философию Linux «все есть файл».

Подача бумаг и документов

Что такое файловая система? По словам одного из первых разработчиков Linux и автора Роберта Лава, «файловая система — это иерархическое хранилище данных, придерживающееся определенной структуры». Однако это описание в равной степени применимо к VFAT (виртуальная таблица размещения файлов), Git и Cassandra (база данных NoSQL). Так что же отличает файловую систему?

Основы файловой системы

Ядро Linux требует, чтобы сущность была файловой системой, а также реализовывала методы open(), read() и write() для постоянных объектов, имена которых связаны с ними. С точки зрения объектно-ориентированного программирования ядро ​​рассматривает универсальную файловую систему как абстрактный интерфейс, а эти функции «большой тройки» являются «виртуальными» и не имеют определения по умолчанию. Соответственно, реализация файловой системы ядра по умолчанию называется виртуальной файловой системой (VFS).

Если мы можем открыть(), закрыть() , read() и write(), это файл, как показывает этот сеанс консоли». ширина=

Если мы можем открыть(), прочитать() и записать(), это будет файл, как показано в этом сеансе консоли.

VFS лежит в основе известного наблюдения, что в Unix-подобных системах "все является файлом". Подумайте, как странно, что маленькая демонстрация выше с символьным устройством /dev/console действительно работает. На изображении показан интерактивный сеанс Bash на виртуальном телетайпе (tty). Отправка строки на виртуальное консольное устройство приводит к ее отображению на виртуальном экране. У VFS есть и другие, еще более странные свойства. Например, в них можно искать.

Дополнительные ресурсы по Linux

Все знакомые файловые системы, такие как ext4, NFS и /proc, предоставляют определения функций большой тройки в структуре данных языка C, называемой file_operations. Кроме того, определенные файловые системы расширяют и переопределяют функции VFS привычным объектно-ориентированным способом. Как указывает Роберт Лав, абстракция VFS позволяет пользователям Linux беззаботно копировать файлы в и из других операционных систем или абстрактных объектов, таких как каналы, не беспокоясь об их внутреннем формате данных. От имени пользовательского пространства через системный вызов процесс может копировать из файла в структуры данных ядра с помощью метода read() одной файловой системы, а затем использовать метод write() другой файловой системы для вывода данных.< /p>

Определения функций, принадлежащие самому базовому типу VFS, находятся в файлах fs/*.c в исходном коде ядра, а подкаталоги fs/ содержат определенные файловые системы. Ядро также содержит объекты, подобные файловой системе, такие как cgroups, /dev и tmpfs, которые необходимы в начале процесса загрузки и поэтому определяются в подкаталоге ядра init/. Обратите внимание, что cgroups, /dev и tmpfs не вызывают функции большой тройки file_operations, а вместо этого напрямую читают и записывают в память.

На приведенной ниже диаграмме примерно показано, как пользовательское пространство получает доступ к различным типам файловых систем, которые обычно монтируются в системах Linux. Не показаны такие конструкции, как каналы, dmesg и часы POSIX, которые также реализуют struct file_operations и доступ к которым, таким образом, проходит через уровень VFS.

Как пользовательское пространство получает доступ к различным типам файловых систем

VFS — это «прослойка» между системными вызовами и реализаторами конкретных файловых_операций, таких как ext4 и procfs. После этого функции file_operations могут взаимодействовать либо с драйверами конкретных устройств, либо со средствами доступа к памяти. tmpfs , devtmpfs и cgroups не используют file_operations, а обращаются к памяти напрямую.

Существование VFS способствует повторному использованию кода, поскольку базовые методы, связанные с файловыми системами, не нужно повторно реализовывать для каждого типа файловой системы. Повторное использование кода — общепринятая передовая практика разработки программного обеспечения! Увы, если повторно используемый код содержит серьезные ошибки, то от них страдают все реализации, наследующие общие методы.

/tmp: простой совет

Простым способом узнать, какие VFS присутствуют в системе, является ввод mount | grep -v сд | grep -v :/, который выведет список всех смонтированных файловых систем, которые не являются резидентными на диске и не являются NFS на большинстве компьютеров. Одним из перечисленных монтирований VFS наверняка будет /tmp, верно?

Почему не рекомендуется хранить /tmp в хранилище? Потому что файлы в /tmp временные(!), а устройства хранения работают медленнее, чем память, где создаются tmpfs.Кроме того, физические устройства более подвержены износу от частой записи, чем память. Наконец, файлы в /tmp могут содержать конфиденциальную информацию, поэтому их удаление при каждой перезагрузке является функцией.

К сожалению, сценарии установки для некоторых дистрибутивов Linux по-прежнему создают /tmp на устройстве хранения по умолчанию. Не отчаивайтесь, если это произойдет с вашей системой. Следуйте простым инструкциям на всегда отличной Arch Wiki, чтобы решить проблему, имея в виду, что память, выделенная для tmpfs, недоступна для других целей. Другими словами, система с гигантским tmpfs с большими файлами может исчерпать память и выйти из строя. Еще один совет: при редактировании файла /etc/fstab обязательно заканчивайте его новой строкой, иначе ваша система не загрузится. (Угадайте, откуда я знаю.)

/proc и /sys

Помимо /tmp, наиболее знакомыми большинству пользователей Linux виртуальными файловыми файловыми системами являются /proc и /sys. (/dev использует разделяемую память и не имеет файловых_операций). Почему два вкуса? Давайте посмотрим подробнее.

Procfs предлагает моментальный снимок текущего состояния ядра и процессов, которыми оно управляет для пользовательского пространства. В /proc ядро ​​публикует информацию о предоставляемых им возможностях, таких как прерывания, виртуальная память и планировщик. Кроме того, /proc/sys — это место, где параметры, настраиваемые с помощью команды sysctl, доступны для пользовательского пространства. Статус и статистика по отдельным процессам сообщается в /proc/

Console

/proc/ meminfo это пустой файл, который, тем не менее, содержит ценную информацию.

Поведение файлов /proc показывает, насколько непохожими могут быть файловые системы на диске VFS. С одной стороны, /proc/meminfo содержит информацию, представленную командой free. С другой стороны, тоже пусто! Как это может быть? Ситуация напоминает известную статью, написанную физиком Корнельского университета Н. Дэвидом Мермином в 1985 году под названием «Есть ли Луна, когда никто не смотрит? Реальность и квантовая теория». Правда в том, что ядро ​​собирает статистику о памяти, когда процесс запрашивает их из /proc, и на самом деле нет ничего в файлах в /proc, когда никто не смотрит. Как сказал Мермин, «фундаментальная квантовая доктрина заключается в том, что измерение, как правило, не раскрывает ранее существовавшее значение измеряемого свойства». (Ответ на вопрос о луне оставляем в качестве упражнения.)

Полнолуние

Файлы в /proc пусты, если к ним не обращается ни один процесс. (Источник)

Кажущаяся пустота procfs имеет смысл, поскольку доступная там информация является динамической. С sysfs ситуация иная. Давайте сравним, сколько файлов размером не менее одного байта находится в /proc и /sys.

Console

Procfs имеет только одну, а именно экспортированную конфигурацию ядра, которая является исключением, поскольку ее нужно генерировать только один раз за загрузку. С другой стороны, /sys содержит множество файлов большего размера, большинство из которых занимает одну страницу памяти. Как правило, файлы sysfs содержат ровно одно число или строку, в отличие от таблиц информации, созданных при чтении таких файлов, как /proc/meminfo.

Цель sysfs – предоставить пользователю доступ к читаемым и записываемым свойствам того, что ядро ​​называет "kobjects". Единственной целью kobjects является подсчет ссылок: когда последняя ссылка на kobject удаляется, система восстанавливает связанные с ним ресурсы. Тем не менее, /sys составляет большую часть знаменитого «стабильного ABI ядра для пользовательского пространства», который никто и ни при каких обстоятельствах не может «сломать». Это не означает, что файлы в sysfs являются статическими, что противоречит подсчету ссылок на изменчивые объекты.

Стабильный ABI ядра вместо этого ограничивает то, что может отображаться в /sys, а не то, что на самом деле присутствует в любой момент времени. Перечисление прав доступа к файлам в sysfs дает представление о том, как можно установить или прочитать настраиваемые параметры устройств, модулей, файловых систем и т. д. Логика заставляет сделать вывод, что procfs также является частью стабильного ABI ядра, хотя в документации ядра это прямо не указано.

Console

Файлы в sysfs описывают ровно одно свойство для каждого объекта и могут быть доступны для чтения, записи или и того, и другого. «0» в файле означает, что SSD несъемный.

Отслеживание VFS с помощью инструментов eBPF и bcc

Самый простой способ узнать, как ядро ​​​​управляет файлами sysfs, — посмотреть его в действии, а самый простой способ посмотреть на ARM64 или x86_64 — использовать eBPF. eBPF (расширенный пакетный фильтр Беркли) состоит из виртуальной машины, работающей внутри ядра, которую привилегированные пользователи могут запрашивать из командной строки. Исходный код ядра сообщает читателю, что ядро ​​может делать; запуск инструментов eBPF в загруженной системе вместо этого показывает, что на самом деле делает ядро.

К счастью, начать работу с eBPF довольно просто с помощью инструментов bcc, которые доступны в виде пакетов из основных дистрибутивов Linux и подробно задокументированы Бренданом Греггом. Инструменты bcc представляют собой сценарии Python с небольшими встроенными фрагментами C, что означает, что любой, кто знаком с любым языком, может легко их модифицировать. При таком подсчете в bcc/tools содержится 80 скриптов Python, поэтому весьма вероятно, что системный администратор или разработчик найдет существующий сценарий, соответствующий его/его потребностям.

Чтобы получить очень общее представление о том, какую работу VFS выполняют в работающей системе, попробуйте простой vfscount или vfsstat, которые показывают, что каждую секунду происходят десятки вызовов vfs_open() и ее аналогов.

В качестве менее тривиального примера давайте посмотрим, что происходит в sysfs, когда в работающую систему вставляется USB-накопитель.

Консоль при подключении USB

Посмотрите с помощью eBPF, что происходит в /sys при вставке USB-накопителя, на простых и сложных примерах.

В первом простом примере выше скрипт инструментов trace.py bcc выводит сообщение всякий раз, когда выполняется команда sysfs_create_files(). Мы видим, что sysfs_create_files() был запущен потоком kworker в ответ на вставку флешки, но какой файл был создан? Второй пример иллюстрирует всю мощь eBPF. Здесь trace.py печатает обратную трассировку ядра (опция -K) плюс имя файла, созданного с помощью sysfs_create_files(). Фрагмент в одинарных кавычках представляет собой некоторый исходный код C, включая легко распознаваемую строку формата, которую предоставленный сценарий Python вызывает JIT-компилятор LLVM для компиляции и выполнения внутри виртуальной машины в ядре. Полная сигнатура функции sysfs_create_files() должна быть воспроизведена во второй команде, чтобы строка формата могла ссылаться на один из параметров. Ошибки в этом фрагменте C приводят к распознаваемым ошибкам C-компилятора. Например, если параметр -I опущен, результатом будет «Не удалось скомпилировать текст BPF». Разработчики, знакомые с C или Python, сочтут, что инструменты скрытой копии легко расширяются и модифицируются.

Когда USB-накопитель вставлен, появляется трассировка ядра, показывающая, что PID 7711 — это поток kworker, который создал файл с именем «events» в sysfs. Соответствующий вызов с помощью sysfs_remove_files() показывает, что удаление USB-накопителя приводит к удалению файла событий в соответствии с идеей подсчета ссылок. Наблюдение за sysfs_create_link() с eBPF во время вставки USB-накопителя (не показано) показывает, что создается не менее 48 символических ссылок.

Какова цель файла событий? Использование cscope для поиска функции __device_add_disk() показывает, что она вызывает disk_add_events(), и в файл событий может быть записано либо "media_change", либо "eject_request". Здесь блочный уровень ядра информирует пользовательское пространство о появлении и исчезновении «диска». Подумайте, насколько информативен этот метод исследования того, как работает вставка USB-накопителя, по сравнению с попыткой понять процесс исключительно из источника.

Корневые файловые системы только для чтения делают возможными встроенные устройства

Конечно, никто не выключает сервер или настольную систему, выдергивая вилку из розетки. Почему? Поскольку смонтированные файловые системы на физических устройствах хранения могут иметь ожидающие записи, а структуры данных, которые записывают их состояние, могут не синхронизироваться с тем, что записано в хранилище. Когда это произойдет, владельцам систем придется ждать при следующей загрузке, пока не запустится инструмент восстановления файловой системы fsck, и в худшем случае фактически потеряют данные.

Тем не менее, поклонники слышали, что многие IoT и встроенные устройства, такие как маршрутизаторы, термостаты и автомобили, теперь работают под управлением Linux. Многие из этих устройств почти полностью лишены пользовательского интерфейса, и нет никакого способа «разгрузить» их. Подумайте о том, чтобы запустить автомобиль с разряженным аккумулятором, когда питание головного устройства, работающего под управлением Linux, постоянно то увеличивается, то падает. Как получается, что система загружается без длинного fsck, когда двигатель наконец заводится? Ответ заключается в том, что встроенные устройства используют корневую файловую систему только для чтения (сокращенно ro-rootfs).

Ro-rootfs предлагает множество преимуществ, которые менее очевидны, чем неподкупность. Во-первых, вредоносное ПО не может писать в /usr или /lib, если ни один процесс Linux не может туда писать.Другая заключается в том, что в значительной степени неизменяемая файловая система имеет решающее значение для полевой поддержки удаленных устройств, поскольку обслуживающий персонал владеет локальными системами, которые номинально идентичны тем, которые находятся в полевых условиях. Возможно, самым важным (но и самым тонким) преимуществом является то, что ro-rootfs заставляет разработчиков решать на этапе проектирования проекта, какие системные объекты будут неизменяемыми. Работа с ro-rootfs часто может быть неудобной или даже болезненной, как это часто бывает с константными переменными в языках программирования, но преимущества легко компенсируют дополнительные накладные расходы.

Создание корневой файловой системы только для чтения требует дополнительных усилий от разработчиков встраиваемых систем, и здесь на помощь приходит VFS. Linux требует, чтобы файлы в каталоге /var были доступны для записи, и, кроме того, многие популярные приложения, запускаемые встроенными системами, создать конфигурационные dot-файлы в $HOME. Одним из решений для файлов конфигурации в домашнем каталоге обычно является их предварительное создание и встраивание в rootfs. Для /var один из подходов состоит в том, чтобы смонтировать его на отдельном доступном для записи разделе, в то время как сам / монтируется как доступный только для чтения. Еще одна популярная альтернатива — использование привязных или накладных креплений.

Связывание и наложение монтирования и их использование контейнерами

Running man mount — лучшее место, где можно узнать о связывании и наложении монтирования, которые дают разработчикам встраиваемых систем и системным администраторам возможность создавать файловую систему по одному пути, а затем предоставлять ее приложениям по второму пути. Для встраиваемых систем подразумевается, что можно хранить файлы в /var на недоступном для записи флэш-устройстве, но накладывать или связывать путь в tmpfs на путь /var при загрузке, чтобы приложения могли сканировать там до глубины души. восторг. При следующем включении изменения в /var исчезнут. Монтирование с наложением обеспечивает объединение между tmpfs и базовой файловой системой и позволяет явно модифицировать существующий файл в ro-rootfs, в то время как монтирование с привязкой может отображать новые пустые каталоги tmpfs как доступные для записи в путях ro-rootfs. Хотя overlayfs является подходящим типом файловой системы, монтирование с привязкой реализуется средствами пространства имен VFS.

Судя по описанию оверлейных и привязных монтирований, никто не удивится тому, что контейнеры Linux активно их используют. Давайте посмотрим, что происходит, когда мы используем systemd-nspawn для запуска контейнера, запустив инструмент bcc mountsnoop:

Консоль — вызов system-nspawn

Вызов system- nspawn запускает контейнер во время работы mountsnoop.py.

И давайте посмотрим, что получилось:

Консоль — Запуск mountsnoop

Выполнение mountsnoop во время "загрузки" контейнера показывает, что среда выполнения контейнера сильно зависит от монтирования привязки. (Отображается только начало длинного вывода)

Здесь systemd-nspawn предоставляет выбранные файлы в procfs и sysfs хоста контейнеру по путям в его rootfs. Помимо флага MS_BIND, который устанавливает монтирование привязки, некоторые другие флаги, вызываемые системным вызовом «mount», определяют взаимосвязь между изменениями в пространстве имен хоста и в контейнере. Например, bind-mount может либо распространять изменения в /proc и /sys на контейнер, либо скрывать их, в зависимости от вызова.

Обзор

Понимание внутреннего устройства Linux может показаться невыполнимой задачей, поскольку само ядро ​​содержит гигантский объем кода, не считая приложений пользовательского пространства Linux и интерфейса системных вызовов в библиотеках C, таких как glibc. Один из способов добиться прогресса — прочитать исходный код одной подсистемы ядра, уделяя особое внимание пониманию системных вызовов и заголовков, обращенных к пользовательскому пространству, а также основных внутренних интерфейсов ядра, примером которых является таблица file_operations. Операции с файлами — это то, что заставляет принцип «все есть файл» работать на самом деле, поэтому особенно приятно разобраться с ними. Исходные файлы ядра C в каталоге fs/ верхнего уровня представляют собой его реализацию виртуальных файловых систем, которые представляют собой слой-оболочку, обеспечивающий широкое и относительно простое взаимодействие популярных файловых систем и устройств хранения. Связывание и наложение монтирования через пространства имен Linux — это магия VFS, которая делает возможным использование контейнеров и корневых файловых систем только для чтения. В сочетании с изучением исходного кода средство ядра eBPF и его интерфейс bcc делают исследование ядра проще, чем когда-либо прежде.

Большое спасибо Аккане Пек и Майклу Игеру за комментарии и исправления.

Элисон Чайкен представит виртуальные файловые системы: зачем они нам нужны и как они работают на 17-й ежегодной выставке Linux в Южной Калифорнии (SCaLE 17x), которая пройдет с 7 по 10 марта в Пасадене, Калифорния.

Читайте также: