Монтирование файловых систем из устройств и файлов
Материал из Bryansk Linux Users Group.
1. Введение
Погружаясь в мир Unix/Linux систем вы рано или поздно сталкнетесь с проблемой монтирования файловых систем, расположенных на различных физических устройствах или, даже, внутри обычных файлов. Дискета, CD-диск, раздел на винчестере, flash-drive, цифровой фотоаппарат, Zip drive, iso-образ или просто замаскированная под файл файловая система, хранящая, возможно, некоторую секретную информацию. Для работы со всеми этими файловыми системами требуется подключить информацию об этих файловых системах к операционной системе (ОС). Выполнение такой операции необходимо в любой операционной системе, но ОС ориентированные на пользователя, могут скрывать эту операцию путем автоматизации процесса.
В автоматизации нет ничего плохого, пока вы не сталкиваетесь с необходимостью выполнения каких-либо необычных операций. В этом случае "правильная" ОС должна предоставлять возможность ручного управления операциями. Существующие ОС, на данный момент, далеки от идеала. Windows просто не позволяет выполнение нестандартных операций пользователем. Проблему может попытаться решить программист бессонными ночами, но всегда ли стоит "овчинка выделки"? Абсолютно рациональные Unix клоны, наоборот, негативно относятся к автоматизации предоставляя широчайшие возможности ручных операций. Причем, за счет четкого разделения функциональности в различных архитектурных слоях системы, мы получаем поистине неисчерпаемые комбинаторные возможности. Как программист занимающийся автоматизацией я не верю в автоматизацию, точнее уверен в ее ограниченности по сравнению с ручными операциями. Поэтому, раз уж мы говорим о Unix/Linux, я бы не рекомендовал вам использовать различные средства автоматизации для такой многовариантной операции как монтирование файловых систем. Помните две вещи. Во-первых, такая ОС как Windows сильно ограничена в рамках поддерживаемых форматов файловых систем, поэтому автоматизация монтирования этих систем может быть четко отлажена. Во-вторых, сложно только то, чего не умеешь и не понимаешь, а цель данной статьи как раз познакомить вас с таким многовариантным процессом как монтирование.
2. Терминология
Начнем с определения файловой системы. В рамках данного материала нас не интересует четкое определение этого понятия. Вполне приемлемым и понятным будет следующее: "Файловая система это логическая организация данных, определяющая способ хранения файлов и их заголовков". Таким образом любая файловая система состоит как минимум из двух частей - в одной части хранятся собственно файлы, а в другой - их заголовки.
Существуют и находятся в разработке большое количество файловых систем (несколько десятков). Многие файловые системы исторически вымерли. Так, популярная в 80-х операционная система CP/M имела около двух сотен вариантов собственной файловой системы. Файловые системы различаются по относительному размещению и организации области заголовков и данных. Также они различаются по возможным связям между областью данных и заголовков. Кроме того, некоторые из них учитывают особенности физических устройств, на которых они размещаются.
С точки зрения математической науки различают три типа файловых систем: линейные, иерархические и сетевые. Иерархические системы, до недавнего времени, были наиболее распространены. Они позволяют организовать систему каталогов и подкаталогов для удобной файловой классификации. Самыми распространенными реализациями такой математической модели были файловые системы FAT и начальные версии NTFS. Линейные файловые системы являются наиболее простыми и не поддерживают структуру каталогов. Такие системы использовались, например, в ОС CP/M и DOS версии 1.х. Наиболее сложными файловыми системами являются сетевые. Помимо поддержки структуры каталогов они позволяют организовывать произвольные связи между связанными цепочками данных каждого из файлов и системой заголовков. Т.е. одна и та же цепочка данных физического файла может иметь множество различных, и, даже, одинаковых имен в системе заголовков. Причем, имена не не имеют приоритетов друг перед другом и физическое удаление файла происходит после удаления его последнего имени. Unix был рожден в концепции сетевых файловых систем и сильно зависит от этой абстракции. Последнии версии NTFS также построены на основе сетевой модели, но, пока, использование такой модели не является для Windows принципиальным.
Наверное для любой файловой системы вводится логическое определение кластера как неделимого элемента для хранения данных. Файл всегда занимает целое число кластеров. Например, если размер кластера равен 4096 байт, а файл содержит всего один байт данных, он будет занимать кластер целиком. Соответственно, чем меньше размер кластера, тем более эффективно будет расходоваться физическое пространство носителя файловой системы. Файловые системы различаются по возможным значениям размера кластера. Обычно, размер кластера кратен 512 байт, т.е. значению наиболее распространненого размера сектора, используемого при форматировании физических носителей.
Все большую популярность, в данное время, приобретают журналируемые файловые системы. Такие системы, помимо разделов для данных и оглавления имеют еще и раздел журнала, для записи производимых с файлами операций. Журналирование операций позволяет увеличить надежность файловой системы за счет расхода дополнительного места на носителе.
Одной из проблем возникающей при реализации поддержки большого количества файловый систем является локализация. Возможно, в вашей голове уже крутится вопрос о том какая кодовая страница используется в разделе заголовков файлов файловой системы для отображения национальных символов в именах файлов. Наверное вам известно, что для отображения только киррилицы существует десяток кодировок, наиболее известными из которых, помимо Unicode, являются cp866, cp1251, iso8859-5 и koi8-r. Все это усложняется тем, что Unix системы могут использовать произвольную локализацию в локали. Под локалью понимается кодировка используемая для вывода системных сообщений, в том числе имен файлов. В общем, проблем намечается в достатке. В следующем разделе мы познакомимся с методами их решения. А сейчас приведем примеры наиболее распространненых файловых систем:
FAT - File Allocation Table - общее название файловых систем используемых в DOS и начальных версиях Windows. FAT-12 Содержит 2 в 12 степени кластеров. Используется для форматирования дискет в DOS, Windows. FAT-16 Содержит 2 в 16 степени кластеров. Используется для форматирования дисковых разделов емкостью до 2 ГБ в DOS/Windows. FAT-32 Содержит 2 в 32 степени кластеров. Используется для форматирования дисковых разделов емкостью от 512 МБ начиная с поздних версий Windows 95. NTFS New Technology File System - общее название файловых систем используемых в Windows построенных на технологии NT (New Technology) NTFS-5 Эта версия NTFS, используемая в Windows XP отличается поддержкой сетевой модели и ведением журнала файловых операций. ISO9660 Фундамент для файловых систем, используемых для записи большинства CD-ROM, CD-RW. Как правило, не используется в чистом виде. Для поддержки линных имен Windows используется расширение Joliet. Для поддержки сетевой Unix модели расширяется с помощью спецификации RockRidge. Вообще, существует множество расширений для iso9660. О них можно почитать в man mkisofs.
Приведенный выше список это все, что может быть понято Windows системой (за исключением RockRidge расширения для iso9660). Список файловых "родных" для Unix/Linux настолько обширен, что привести хотя бы его половину будет достаточно утомительным. Излишне говорить, что помимо "родных" файловых систем Unix/Linux поддерживает множество "чужих" систем. Приведем наиболее популярные в Linux файловые системы:
ext2 Это наверное основная для Linux файловая система. Ее можно встретить как на дискетах, так и на разделах жесткого диска, flash drive, и,
даже в файлах, содержащих "тайные" файловые системы.
ext3 Журналируемый вариант ext2. По умолчанию предлагается в большинстве дистрибутивов Linux при разметке дисков.
ReiserFS Последнее время эта журналируемая файловая система от Ганса Райзера приобретает все большую популярность. Оптимизирована под размещение большого количества мелких файлов.
Наверное понятно, что проблематично реализовать автоматическую модель для поддержки такого широкого спектра файловых систем, особенно с учетом их постоянного расширения. Наиболее правильным и надежным решением этой проблемы будет реализация гибкого ручного механизма монтирования файловых систем. На основе четкой слойной Unix архитектуры такой механизм реализуется достаточно просто и понятно. Кроме того, следуя лучшим традициям Unix, драйвера файловых систем не содержат в своем коде политики управления, предоставляя администратору системы использовать общие высокоуровневые механизмы разделения доступа к монтируемым устройствам и файловым системам.
3. Утилиты mount и umount
Для монтирования файловых систем используется системная утилита mount. Подробности по применению этой утилиты вы можете прочитать в man mount или info mount. Рассмотрим основной формат ее использования:
# mount -t <тип_файловой_системы> -o <опции_монтирования> <что_монтируем> <куда_монтируем>
Тип файловой системы. Приведем наиболее часто используемые значения типов. ext2, ext3, reiserfs - для одноименных файловых систем. FAT разделы жесткого диска использующие длинные имена файлов обозначаются типом vfat - virtual FAT. Дело в том, что оригинальный FAT предназначен для хранения имен файлов в формате 8.3. Расширение FAT для хранения длинных имен файлов, использующих национальные символы, называется виртуальным FAT. Для монтирования оригинального FAT с форматом имен 8.3 используют значение msdos для обозначения типа файловой системы. Значение ntfs используется для монтирования различных NTFS разделов. Для монтирования CD дисков с данными на основе спецификации ISO9660 используют значение iso9660. Достаточно часто возникает потребность в монтировании разделенных сетевых ресурсов. Unix/Linux системы, как правило, предоставляют сетевую файловую систему NFS (Network File System) обозначаемую значением nfs для типа файловой системы. Сетевая модель Windows систем прочно связана со спецификацией SMB (Simple Message Block), и для монтирования таких ресурсов используют значение smbfs. Для успешного монтирования локальных файловых систем необходимо, чтобы ядро Unix/Linux было скомпилировано с поддержкой соответствующего драйвера. При этом, драйвер для монтирования корневой файловой системы должен обязательно находится в ядре, иначе система не загрузится. Драйвера для дополнительных файловых систем используемых в вашей работе могут быть собраны как в составе ядра, так и в виде отдельных модулей. Будьте внимательны. Так, например, оригинальное ядро предлагаемое компанией ASPLinux в версиях дистрибутивов 9.0 и 9.2 не содержит в ядре поддержку ReiserFS, поэтому не пытайтесь использовать этот тип для корневой файловой системы при установке Linux с этого дистрибутива. Для монтирования сетевых файловых систем вы должны иметь соответствующие клиенты, взаимодействующие с сетевыми серверами файловых систем. Так, для взаимодействия с файловым сервером Windows вам необходимо иметь smbclient, входящий в состав программного комплекса samba, разработанного для сетевого взаимодействия с Windows платформой. Если тип файловой системы не указан, то, по умолчанию, используется значение ext2. Обратите внимание, что файловая система ext3 может быть смонтирована как ext2 без поддержки журнала файловых операций. Иногда такая возможность жизненно необходима. Возвращаясь к сборкам ASPLinux следует указать на еще одну неприятность, кроющуюся в недрах этого дистрибутива. Ядро предлагаемое для аварийной загрузке с первого диска дистрибутива не содержит даже поддержки ext3. Поэтому, в случае аварии, загружаясь с этого диска приходится монтировать корневую ext3 файловую систему без поддержки журнала. Это не смертельно, но это нужно иметь в виду.
Опции монтирования прямиком зависят от типа монтируемой файловой системы. Поэтому рассмотрим эти опции позже на конкретных примерах.
Что монтируем. Монтировать можно файловые системы расположенные где угодно: на физических носителях (накопители на жестких и мягких магнитных дисках, CD диски, цифровые фотоаппараты, flash drive и пр.), в сети (NFS, SMB), и даже в файлах (iso-образы, и просто файлы содержащие скрытые файловые системы). В примерах, мы рассмотрим монтирование различных файловых систем на устройствах и в файлах.
Куда монтируем. Здесь необходимо указать точку монтирования, т.е. пустой каталог в который "вольется" монтируемая файловая система. Обратите внимание, что в отличие от DOSWindows в Unix не назначается отдельная корневая литера (A:, C:, D: и т.д. до Z:) для каждой монтируемой файловой системы. В UnixLinux системах используется единый логический корень для всей файловой системы. Таким образом, с точки зрения пользователя существует только одна файловая система, реально состоящая из любого количества примонтированных к различным каталогам систем. Причем, все, что было примонтировано теряет свою природу. Т.е. файлы примонтированные с CD-ROM или iso-образа неотличимы от файлов примонтированных по сети с Unix или Windows машины, или от файлов с локального корневого диска системы. Корень файловой системы Unix/Linux обозначается знаком "/" (слэш). По принятому соглашению, дополнительные (не системные) файловые системы монтируются в подкаталоги каталога /mnt. Нужно заметить, что Windows системы используют понятие метакорня файловой системы, называемом "Мой компьютер". Разница корня и метакорня прежде всего в прозрачности - в метакорне сохраняется природа файловых систем (CD-ROM отличим от раздела на жестком диске).
Для того, чтобы отмонтировать некую файловую систему от общего файлового дерева Unix/Linux используется утилита umount. Обратите внимание - umount, а не umount. Подробности можно почитать в man umount или info umount. Наиболее часто используется следующая форма вызова этой утилиты:
# umount <точка_монтирования>
В качестве точки монтирования необходимо передать полный путь на каталог куда была примонтирована та файловая система, которую требуется отмонтировать.
4. Понятие интерфейсов устройств
Известно, что устройствами управляют драйвера. В Unix/Linux все устройства представляются в виде файлов. Поэтому, с каждым драйвером в Unix системах связаны особые типы файлов, называемые файловыми интерфейсами устройств. Такие файлы создаются специальной командой mknod. Файловые интерфейсы устройств, в принципе, могут располагаться где угодно, но, обычно, лежат в специально отведенном для них каталоге /dev. С каждым таким интерфейсом связаны два числа - старший (major) и младший (minor) номера устройств. При обращении к файловому интерфейсу, ядро ищет драйвер, за которым закреплен старший номер соответствующего файлового интерфейса. Таким образом ядро операционной системы обрабатывает только старший номер устройства. Младший номер передается драйверу. Один драйвер может обслуживать множество однотипных устройств, различаемых по младшему номеру.
Итак, важнымы для понимания является следующие факты. Не имеет значение имя файлового интерфейса устройства - оно может быть любым - вы можете использовать удобные для себя псевдонимы и символические ссылки на существующие имена этих интерфейсов. Значение имеют только старший и младшие номера устройства. Старший номер имеет значение для ядра - по нему определяется драйвер, связанный с данным устройством. Младший номер передается драйверу, и имеет значение только для него - по нему уточняется устройство, с которым драйверу предстоит работать.
Изучите каталог /dev с помощью команды ls -l /dev. Пятая и шестая колонки в выводе этой команды отображают соответсвенно старший и младший номера устройств. Обратите внимание, что один и тот же драйвер (старший номер) часто обслуживает множетсво однотипных устройств, различаемых по младшему номеру.
К сожалению, в Unix/Linux системах существует множество нотаций, используемых для обозначения файловых интерфейсов устройств - имя не имеет значение. Это не является проблемой для опытных пользователей, но может испугать новичков. Приведем разъяснение одной из наиболее популярных нотаций, используемых для обозначения устройств, работающих на шине IDE (винчестеры и CD приводы).
В качестве первых двух литер используется абревиатура hd - hard disk. Дальше в зависимости от способа подключения:
/dev/hda primary master /dev/hdb primary slave /dev/hdc secondary master /dev/hdd secondary slave
На лазерном диске не существует понятия разделов, поэтому с CD приводами все просто. Расширение этой нотации существует только для разделов на жестком диске. Известно, что на жестком диске, независимо от операционной системы, можно создать не более четырех первичных разделов, имеющий номера от 1 до 4. Дополнительный (extended) раздел являющийся контейнером для логических дисков должен занимать один из этих четырех номеров. Логические диски, расположенные в дополнительном разделе нумеруются начиная с номера 5. Например:
/dev/hdb Интерфейс для обращения к primary slave диску целиком.
Используется, например, программой fdisk для разметки
этого диска, или для установки и исследования загрузчика,
расположенного в mbr. Если к этому primary slave
интерфейсу подключен CD привод, то /dev/hdb будет
использоваться для физического обращения к CD диску.
/dev/hdb1 Интерфейс для обращения к первому разделу primary slave
диска.
/dev/hdb2 Интерфейс для обращения ко второму разделу primary slave
диска.
/dev/hdb5 Интерфейс для обращения к первому логическому диску
расположенного в дополнительном разделе primary slave
диска.
Выполните от суперпользователя команду fdisk -l для просмотра списка (list) всех доступных системе IDE и SCSI дисков.
5. Примеры монтирования
При использования этих примеров вам потребуются права суперпользователя.
5.1. Монтирование ext3 Linux раздела локального диска
Предположим, что раздел, который вы желаете подмонтировать находится на устройстве /dev/hdb1, и вы хотите примонтировать его в точку /mnt/archive, тогда команда монтирования может выглядеть следующим образом:
# mount -t ext3 /dev/hdb1 /mnt/archive
Все! Это настолько просто, что, наверное, не нуждается в комментариях.
5.2. Монтирование FAT раздела локального диска
Предположим, что монтируемый FAT-раздел находится на устройстве /dev/hda1, и мы хотим подмонтировать его в точку /mnt/c, тогда команда монтирования может выглядеть, например, следующим образом:
# mount -t vfat -o codepage=866,iocharset=cp1251,umask=0 /dev/hda1 /mnt/c
Итак, мы монтируем виртуальный FAT. Поясним опции монтирования. Обратите внимание, что перечисление опций производится через запятую БЕЗ пробелов.
codepage=866 - означает, что данная файловая система использует кодировку CP866, для записи русских символов в именах файлов. Кодировка CP866 была предложена компанией IBM и использовалась компанией Microsoft для DOS систем в качестве локали и для записи русских символов в именах файлов FAT разделов. Microsoft Windows использует в качестве локали кодировку CP1251, специально разработанную компанией Microsoft для кодировки кириллицы. Но используя еще DOS-овский FAT Microsoft не стал менять кодировку для записи файлов в FAT системы. Поэтому Windows, при подключении FAT-систем, автоматически конвертирует кодировку CP866 в записи файлов на диске в кодировку CP1251, используемую для отображения имен этих файлов на устройствах вывода.
iocharset=cp1251 - означает, что данная Unix/Linux система использует в своей локали кодировку CP1251. Такую кодировку в локали, по разным туманным причинам, использую я. Возможно, что вы использует другую локаль, тогда параметр для iocharset в вашей системе должен быть другим. Узнать используемую в вашей локали кодировку можно с помощью команды locale. Если, например, в вашей локали используется популярная кодировка KOI8-R, то данная опция монтирования для вашей системы должна иметь вид iocharset=koi8-r. Тогда, при отображении русских имен примонтированного FAT-раздела ваша система будет использовать преобразование из CP866 в KOI8-R.
umask=0 - такое нехитрое значение маски атрибутов доступа позволит любому пользователю редактировать данные на подключаемом FAT-разделе. Подробности смотрите в man mount или info mount.
5.3. Монтирование FAT раздела с дискеты
Наверное, в большинстве систем устройство дисковода связано с файлом интерфейсом /dev/fd0 соответствующего драйвера. В некоторых Linux дистрибутивах, существует символическая ссылка /dev/floppy на файловый интерфейс драйвера гибкого диска. Наличие такой символической ссылки можно проверить с помощью команды ls -l /dev/floppy. Если такая ссылка существует, то вы увидите на какой файловый интерфейс она указывает: /dev/fd0, /dev/fd1 или на что-то другое. Предположим, что мы хотим примонтировать дискету к каталогу /mnt/floppy, тогда команда монтирования может выглядеть следующим образом:
# mount -t vfat -o codepage=866,iocharset=cp1251,umask=0 /dev/fd0 /mnt/floppy
Наверное, следует заметить, что оригинальные DOS дискеты следует монтировать с типом -t msdos. Опции монтирования такие-же как и при монтировании FAT разделов локального жесткого диска.
Важное замечание: Надо заметить, что монтирование DOS/Windows дискет не всегда проходит гладко. Если дискетка или дисковод чуть подпорчен, то при монтировании такой дискеты вы увидите кучу мусора вместо реальной файловой системы. Это постоянно случается у меня на работе со старыми дисководами. Существует, пока необъяснимый для меня, способ монтирования таких дискет в подобных случаях. Для Linux систем разработан специальный пакет mtools (msdos tools), используя который можно работать с DOS/Windows дискетами без монтирования. В него включены некоторые продвинутые варианты DOS утилит для работы с дискетами в DOS стиле (mdir, mcopy, mformat и пр.). Так вот, если перед монтированием такой дискеты выполнить команду mdir из этой msdos tools коллекции, то монтирование проходит без проблем. Я связываю этот феномен с мелкими недоработками в драйвере FAT. В действительности, FAT система не "родная" для Linux, и, поэтому, мало интересная. Чтобы избежать подобных неприятностей используйте "родную" для Linux файловую систему ext2 для форматирования дискет.
5.4. Монтирование ext2 раздела с дискеты
Если используете ext2 Linux файловую систему на дискете, то ее монтирование можно будет произвести следующей командой:
# mount /dev/fd0 /mnt/floppy
В этом случае, вам не придется указывать тип файловой системы, т.к. -t ext2 используется по умолчанию. Конечно, не исключено, что умолчание изменится, или уже изменилось для вашего дистрибутива. Тогда тип монтируемой файловой системы придется указать явно.
5.5. Монтирование NTFS разделов Windows
Предположим, что монтируемый NTFS раздел расположен на устройстве /dev/hda1, и мы хотим примонтировать его в точку /mnt/c. Тогда команда монтирования может выглядеть следующим образом:
# mount -t ntfs -o iocharset=cp1251,ro,umask=0 /dev/hda1 /mnt/c
Как и при монтировании FAT разделов, необходимо указать кодировку вашей локали. При использовании CP1251 необходимо использовать опцию iocharset=cp1251.
Обратите внимание на опцию ro (read only). Такая опция предотвратит попытки записи в NTFS раздел. Дело в том, что спецификация на NTFS остается закрытой и существующие драйвера на NTFS в Linux не вызывают доверия. Поэтому, если вы не хотите полностью разрушить свой Windows раздел, то не открывайте эти разделы на запись. Сам я уже давно не пользуюсь Windows системами и у меня не было возможность проверить запись в NTFS разделы из Linux, но по слухам это плохо кончается. Возможно, для ядер Linux 2.6.x эта проблема уже решена, но мне ничего об этом не известно.
С umask=0 явный перебор (просто не хочется считать корректную маску). Использование приведенной маски позволяет полный доступ к файлам NTFS разделов для всех пользователей. Попытки записи будут предотвращены использованием опции ro.
Настройка NTFS для чтения/записи
5.6. Монтирование CD дисков с данными
В большинстве Linux дистрибутивов существует символическая ссылка /dev/cdrom указывающая на файловый интерфейс устройства вашего CD привода. Вы можете проверить наличие такой ссылки командой ls -l /dev/cdrom. Если такая ссылка существует, то вы увидите файловый интерфейс на который она указывает. Это может быть /dev/hdb, /dev/hdc, /dev/hdd или что-то другое. Предположим, что ваш CD привод установлен как secondary master и имеет, соответственно файловый интерфейс /dev/hdc (конечно, по возможности, вы можете воспользоваться символической ссылкой /dev/cdrom). Если, при этом, мы хотим примонтировать файловую систему с CD диска в каталог /mnt/cdrom, то команда монтирования может выглядеть следующим образом:
# mount -t iso9660 -o codepage=866,iocharset=cp1251 /dev/hdc /mnt/cdrom
В качестве типа файловой системы мы указываем тип iso9660, который является базовым для большинства, используемых сегодня на практике расширений.
Опции монтирования указаны для расширения Joliet, которое используется для записи дисков в Windows системах. Если вы создаете свой собственный диск не в принятой для Windows спецификации, то опции монтирования могут оказаться другими. Мы не будем вести разговор о таком необычном случае, т.к. если вы знаете как собрать необычный диск, то, наверняка, знаете как его примонтировать. Подробности об опциях монтирования codepage=866 и iocharset=cp1251 смотрите в подразделе о монтировании FAT разделов с локальных дисков.
5.7. Создание и монтирование ISO образов
Для того, чтобы создать ISO образ в Unix/Linux системе вам не понадобится какая-то специальная программа, коих в Windows системах наблюдается превеликое множество. Я боюсь говорить что-либо хорошее или плохое об этих Windows программах, так как никогда ими не пользовался и, даже, боюсь ошибиться в их названиях. Наверняка сказать могу только то, что их появление связано с тем печальным фактом, что в Windows системах закрыты интерфейсы устройств, поэтому требуется серьезное вмешательство программистов для исправления подобных неприятностей. Излишне говорить, что программисты, иногда, требуют оплаты своего труда. Таким образом, закрыв интерфейсы устройств, Microsoft создала дополнительную финансовую нишу для своей системы. Еще одна неприятность таких программ заключается в том, что не каждая из них, собственно, создает ISO образы. Правильнее сказать, что эти программы создают некие файлы внутри которых содержится информация о данных с CD диска. Формат этих файлов может быть далек от ISO образа и понимается только специальными программами. Таким образом, программисты конкретных систем, связывают пользователей со своим продуктом, спекулируя на неспособности Windows простым образом работать с устройствами.
Одним из замечательных особенностей Unix является максимальное использование файловой абстракции. Все является файлами, в том числе и устройства. Таким образом, CD диск в CD приводе тоже является файлом, и его можно скопировать с помощью обычной (или "необычной" dd) команды копирования cp.
Вообще, если быть до конца честным, то нужно сказать следующее. Unix действительно необычайно широко применяет файловую абстракцию ко всему, что есть в системе. Проблема заключается в слое драйверов. Не каждый драйвер может поддержать обращение к своему устройству на чтение или запись. Это дело разработчика конкретного драйвера. Так, например, драйвер, обслуживающий CD привод, на данный момент, не поддерживает операцию записи ISO образа на лазерный диск, и, поэтому, требуется специальная программа cdrecord для реализации этой возможности.
Итак, предположим, что ваш CD привод имеет файловый интерфейс /dev/hdc. Тогда для создания файла ISO образа с названием my.iso в текущем каталоге можно исполнить следующую команду:
cp /dev/hdc my.iso
Все! Что может быть проще? Копируем один файл (устройство) в другой файл обычной командой копирования. Обратите внимание, что системная команда копирования cp ничего не знает о том, что она копирует устройство. В файловой абстракции Unix /dev/hdc для команды копирования не более чем просто файл. А вот драйвер обслуживающий файловый интерфейс /dev/hdc передаст в вызывающую его программу физический поток данных из устройства. В устройстве лежит диск, записанный в формате ISO9660, значит физическая копия и будет не чем иным как iso-образом. Интересным еще является то, что такое физическое копирование обходит множество защит установленных на некоторых лицензионных дисках. Программа просто не знает о том, что в потоке данных кроется что-то, защищающее этот диск от копирования.
Не пугайтесь, если для некоторых дисков команда копирования выдаст сообщение "Input/Output error" в конце процесса. Это означает не более чем чтение за пределами физически размеченной области.
Итак iso-образ, или полная физическая копия вашего CD диска готова. Теперь можно отправить ее на запись командой cdrecord для клонирования, или примонтировать к общей файловой системе как нечто, содержащее в себе файловую систему ISO9660.
Утилита монтирования работает с блочными файловыми интерфейсами устройств, поэтому нам понадобиться блочный файловый интерфейс для представления нашего файла iso-образа в виде такого блочного устройства. Блочное устройство это еще один вид Unix абстракции, применяемый к устройствам для обслуживания которых системе требуется создание специального буфера. Кроме того, блочные устройства в отличие, например, от символьных устройств поддерживают операцию свободного перемещения файлового указателя по области данных, принадлежащих устройству. Представление нашего iso-образа в виде блочного устройства можно сделать разными способами. Самым простым из них является применение опции loop для утилиты монтирования.
Итак, предположим, что мы хотим примонтировать созданный нами iso-образ к каталогу /mnt/iso. Тогда команда монтирования может выглядеть следующим образом:
# mount -t iso9660 -o loop,codepage=866,iocharset=cp1251 my.iso /mnt/iso
Как вы видете это мало отличается от монтирования оригинального CD диска. Более подробно о монтировании файлов содержащих в себе файловые системы смотрите в разделе "Создание и монтирование файлов содержащих в себе файловые системы". Сейчас, пока, имейте в виду только то, что для выполнения подобных операций ваше ядро должно быть собрано с поддержкой loop устройств.
5.8. Создание и монтирование образов дискет
Наверное, если вы внимательно прочитали раздел о создании и монтировании iso-образов, то вы уже догадались как выполнить операции создания и монтирования дискет.
Предположим, что ваш дисковод обслуживается файловым интерфейсом /dev/fd0, тогда для создания образа дискеты достаточно выполнить следующую команду:
cp /dev/fd0 my.img
В результате выполнения этой команды в текущем каталоге появится файл my.img содержащий в себе физическую копию вашей дискеты.
Теперь, если вы хотите создать клон для этой дискеты, то достаточно выполнить обратную команду:
cp my.img /dev/fd0
Если же вы хотите подмонтировать образ вашей дискеты в каталог /mnt/img общей файловой системы, то можно воспользоваться следующей командой:
# mount -t vfat -o loop,codepage=866,iocharset=cp1251 my.img /mnt/img
В вышеприведенном примере предполагалось, что вы делали копию DOS/Windows дискеты. Если же вы использовали дискету, отформатированную в другой файловой системе, например, в ext2, то замените -t vfat на -t ext2.
5.9. Создание и монтирование файлов, содержащих в себе файловые системы
В общих чертах мы уже касались этого вопроса в разделах посвященных созданию и монтированию образов CD дисков и дискет. В этом разделе мы ближе познакомимся с понятием и использованием loop устройств, и научимся создавать и форматировать файловые системы из обычных файлов.
Как уже говорилось, для выполнения подобных операций необходимо, чтобы используемое вами ядро было скомпилировано с поддержкой loop устройств. Такие программные устройства выполнены в виде специального драйвера, который будучи подключенный к обычному файлу представляет его в системе как обычное блочное устройство, поддерживающее блочные операции. Другими словами, если мы подключим какой-нибудь файл к такому драйверу, то через файловый интерфейс loop устройства мы будем работать с этим файлом как, например, с разделом жесткого диска или с дискетой.
Количество доступных системе loop устройств настраивается при подготовке ядра, и по умолчанию равно 16. Если вы имеете в системе 16 loop устройств, то файловые интерфейсы для них обозначаются начиная с /dev/loop0, и заканчивая /dev/loop15. Для управления loop устройствами служит утилита losetup. Для полного ознакомления с ее возможностями читайте man losetup.
Приступим к практическому созданию файла, содержащего в себе файловую систему. Удобнее всего будет разместить в таком файле файловую систему ext2, т.к. FAT системы капризны к размеру тех разделов на которых они должны быть установлены.
Сначала создадим пустой файл желаемого размера. Предположим, что нам понадобиться "тайный" 20 МБ раздел. Познакомившись с man dd мы может выполнить, например, такую команду для достижения нашей цели:
# dd if=/dev/zero of=secret_fs bs=1024 count=20000
В качестве входного файла (if - input file) мы выбрали устройство /dev/zero, из которого можно доставать нули до посинения. В качестве выходного файла (of - output file) установили файл secret_fs, который будет создан в текущем каталоге. Размер блока (bs - block size) выбран равным 1КБт = 1024Бт произвольно. Вы можете использовать любой другой, нравящийся вам размер. И наконец, количество блоков (count) равное 20000 позволит при размере одного блока в 1КБт создать результирующий файл размером в 20МБ.
Итак, файл состоящий из нулей создан. Теперь объявим его блочным устройством подключив с свободному loop интерфейсу. Предположим, что интерфейс /dev/loop0 совершенно свободен, тогда добъемся своей цели с помощью следующей команды:
# losetup /dev/loop0 secret_fs
Все! Наш файл теперь неотличим от любого другого блочного устройства. Сформатируем его, т.е. положим на него выбранную нами ранее файловую систему ext2. Почитаем man mkfs и man mkfs.ext2 и выполним следующую команду:
# mkfs.ext2 /dev/loop0
Теперь, учитывая, что наше устройство содержит файловую систему ext2, подмонтируем эту систему к каталогу /mnt/floppy нашего общего файлового дерева. Каталог /mnt/floppy выбран для соблюдения "полной секретности" - чтоб никто не догадался.
# mount /dev/loop0 /mnt/floppy
Запись в смонтированное таким образом устройство будет разрешена только суперпользователю. Для расширения прав используйте, например, опцию umask. Теперь запишем в нашу тайную файловую систему "совершенно секретные данные" и, скорее, отмонтируем ее, чтобы вездесущие хакеры не подсмотрели наши секреты.
# umount /mnt/floppy
Ну, кажется успели. Теперь скорее освободим loop устройство.
# losetup -d /dev/loop0
На этом операции над нашей потайной файловой системой закончены. Единственно, что для поддержания секретности можно переименовать наш файл и спрятать его туда, где никто не догадается. Главное, чтобы самому не забыть.
В завершении этого раздела поясним одну деталь, используемую нами при монтировании образов CD диска и дискет. Там, мы монтировали файлы, содержащие файловые системы, использую просто опцию loop в утилите монтирования mount. При использовании этой опции, утилита mount самостоятельно ищет свободное loop устройство, подключает к нему файл и производит монтирование выбранного loop устройства в заданый каталог. При размонтировании, подключенной таким образом файловой системы, производится автоматическое освобождение loop устройства. Таким образом, мы можем подцепить к loop устройству и смонтировать, созданный нами файл, secret_fs более простым способом:
# mount -o loop secret_fs /mnt/floppy
5.10. Монтирование flash дисков и цифровых фотоаппаратов
Наверное все цифровые аппараты последних моделей имеют USB интерфейс неотличимый от интерфейса обычных flash (или pen) drive. Если вам не повезло, то для подключения такого фотоаппарата потребуется специальный драйвер. Хороший набор драйверов есть в специальной программе gtkam, предназначенной для работы с цифровыми аппаратами. Мне, например, однажды не повезло - принесенный мне фотоаппарат не подружился с моей Linux системой. В общем, как бы там не было, дальнейший рассказ будет посвящен подключению flash дисков (для фотоаппаратов все тоже самое).
Файловым интерфейсом, обслуживающим flash диски, является интерфейс /dev/sdXY, где X - буквенный индекс устройства (a, b, c и т.д.), а Y - номер раздела на устройстве (1, 2, 3, ...). Наиболее вероятно, что первый раздел, впервые подключаемого вами flash диска будет доступен через интерфейс /dev/sda1. Интерфейс /dev/sda будет закреплен за данным flash диском некоторое время, поэтому подключение физически другого flash диска будет обслуживать уже через интерфейс /dev/sdb. И т.д. С течением времени, если flash диск за которым закрепился интерфейс /dev/sda не подключался к системе, то этот интерфейс будет освобожден и сможет быть использован для других flash дисков.
Итак, предположим, что ваш flash диск распознается через интерфейс /dev/sda, и мы хотим примонтировать первый раздел этого диска к каталогу /mnt/usb1, а второй раздел - к /mnt/usb2. Тогда, для монтирования этих разделов воспользуемся следующими командами:
# mount -t vfat -o codepage=866,iocharset=cp1251,umask=0 /dev/sda1 /mnt/usb1 # mount -t vfat -o codepage=866,iocharset=cp1251,umask=0 /dev/sda2 /mnt/usb2
Заметьте, что flash диски обычно используют FAT систему, что увеличивает их межплатформенность. Конечно, могут быть исключения. Например, так как я не использую Windows ни дома, ни на работе, а у моих друзей Linux стоит второй системой, то резона использовать FAT мне нет никакого - сплошние неудобства из-за отсутствия поддержки Linux атрибутов. Кроме того, мой flash диск глючил с момента его покупки, поэтому я запустил fdisk /dev/sda (читайте man fdisk) и переразметил ее на ext3. Удивительно, но ext2 мой flash диск тоже держать отказался, а с ext3 работает превосходно. Далее я выполнил команду mkfs.ext3 /dev/sda1 и имею счастье по сей день. Вас я к этому не призываю, т.к. каким бы погруженным линуксоидом вы не были, все равно рано или поздно встретите Windows машину, которая, по определению, не будет дружить с вашим flash диском, содержащем "вражескую" файловую систему. Я, обычно, монтирую свой flash диск одной из следующих команд:
# mount -t ext3 /dev/sda1 /mnt/knz_a # mount -t ext3 /dev/sdb1 /mnt/knz_b
5.11. Монтирование сетевых файловых систем предоставляемых NFS Unix/Linux сервером
Если в вашей Unix/Linux сети есть машины разделяющие файловые системы через сервер NFS (Network File System), то вам наверняка захочется использовать, эти разделенные в сети ресурсы. Предположим, что сервер с host-именем server-1 разделяет файлы из своего каталога /video, тогда, если вы захотите примонтировать этот сетевой ресурс к своему каталогу /mnt/server-1-video, то вы можете воспользоваться следующей командой:
# mount -t nfs server-1:/video /mnt/server-1-video
Все очень просто. В качестве монтируемого ресурса следует указать host-имя требуемого сервера, и разделяемый сервером каталог. Host-имя отделяется от имени разделяемого каталого двоеточием. Если, по каким-то причинам host-имя сервера не распознается на вашем локальном компьютере (не работает DNS-сервер (Domain Names Server), или вам лень отредактировать файл /etc/hosts), то вы можете воспользоваться IP-адресом NFS сервера. Предположим, что IP-адрес интересующего вас NFS-сервера равен 192.1.1.1, тогда команда монтирования может выглядеть следующим образом:
# mount -t nfs 192.1.1.1:/video /mnt/server-1-video
5.12. Монтирование сетевых файловых систем предоставляемых SMB Windows сервером
Как это не покажется кому-нибудь странным, но в сетях еще встречаются Windows машины. Сетевая модель Windows исторически сложилась на несколько ограниченном сетевом протоколе NetBIOS, специально разработанным компанией Sytek Inc. для небольших компьютерных сетей, используемых раньше IBM. Если вы изучали сетевые модели, то возможно знаете, что NetBIOS представляет собой интерфейс сеансового уровня, используемый приложениями для коммуникаций с NetBIOS-совместимыми транспортами, такими как фреймовый протокол NetBEUI (NBF). Часто, в качестве транспортного протокола Windows машины используют собственную реализацию TCP/IP протокола, разработанного в середине 70-х Берклеевским университетом в рамках гранта от DARPA (Американское Министерство поддерживающее перспективные технологии) для Unix систем. Таким образом семейство протоколов TCP/IP было разработано в Unix и Unix системы не используют никакой другой вид сетевого транспорта.
Предположим, что Windows машина, с которой вы хотите связаться использует в качестве транспорта TCP/IP. Если же она использует NetBEUI, то ничего не получиться - попробуйте переключить Windows на родной для Unix вид сетевого транспорта. Далее останется одна проблема - сетевые файловые редиректоры Windows являются приложениями NetBIOS, поэтому вам потребуется реализация этого протокола в вашей Linux системе. NetBIOS приложения передают через сетевой транспортный канал SMB (Server Message Block) блоки. Для работы с такими блоками в Linux разработан программный комплекс SAMBA. Именно он вам и понадобиться для сетевой работы с Windows системой.
Однако, следует заметить, что в гетерогенных сетях всегда есть дополнительные проблемы, отсутствующие в сетях гомогенных - оставьте Windows-у Windows-ово, а Unix-у Unix-ово. Это одна из причин, по которой Windows системы не суются в "чужие монастыри". И с каким бы уважением, я не относился к постоянно развивающемуся программному комплексу SAMBA, должен признать, что сталкивался с проблемами в Windows-Linux сетях. А так как Windows в принципе не понимает ничего "чужого", то все камни летели в Linux машины. Поэтому совет - работайте, по возможности, в гомогенных сетях. Тем более, что у вас есть Linux, а сетевые возможности Unix/Linux систем поразят, при близком знакомстве, любого Windows специалиста (если он не из разряда религиозных фанатиков).
Однако, раз уж вы решились на "кровосмешение" с Windows машинами, и поставили себе программный комплекс SAMBA, то засучим рукава и начнем работать.
Если вы хотите, чтобы Windows машины видели разделяемые вами ресурсы, то вам необходимо настроить SAMBA-сервер. Если же вы хотите использовать разделяемые Windows ресурсы, то есть два пути - использование демона LISA, или монтирование разделяемых Windows сетевых ресурсов к вашей файловой системе.
Заметьте, что Windows машины, в отличие от Unix машин имеют два совпадающих между собой сетевых имени. Основным является NetBIOS имя, называемое, также, как "Имя компьютера". Если же Windows машина использует в качестве сетевого транспорта Unix протокол TCP/IP, то у нее появляется второе имя, называемое, в Unix традициях, host-именем, и которое полностью совпадает с основным NetBIOS именем Windows машины. Поэтому, при построении Windows сети приходится настраивать две системы разрешения имен. DNS-сервер, или системный файл hosts, разрешает host-имена на IP-адреса машин в данной сети или домене, а WINS (Windows Internet Names Server), или системный файл lmhosts, разрешает NetBIOS имена в IP-адрес.
Предположим Windows машина, имеющая сетевое host-имя win-1 разделяет диск D:, имеющий сетевое имя D. Тогда для монтирования этого сетевого ресурса в каталог /mnt/win-1-d можно воспользоваться следующей командой:
mount -t smbfs -o codepage=cp866,iocharset=cp1251,username="knzsoft",password="iamknz12345" //win-1/d /mnt/win-1-d
При монтировании сетевой файловой системы -t smbfs утилита mount опирается на работу утилиты smbmount из пакета SAMBA. В нее же передаются все переданные для mount опции. Смотрите man smbmount для подробного ознакомления.
Обратите внимание на значение передаваемое в опцию codepage. При монтировании локальных FAT систем мы использовали значение 866. Теперь, при монтировании сетевой файловой системы Windows с помощью smbmount необходимо использовать значение cp866.
Через опции username и password передаются данные для аутентификации пользователя на Windows машине. Параметр password можно не вводить явно, тогда он запросится позже и будет скрыт от глаз вражеских шпионов.
Обратите внимание на обозначение host-имени Windows машины. Оно вводится двумя знаками слэша "/". После host-имени машины, через один слэш, вводится имя разделяемого сетевого ресурса.
6. Файл /etc/fstab
Данный файл, являющийся конфигурационным для утилиты mount, используется для автоматического монтирования некоторых файловых систем при загрузке компьютера или при использовании mount -a. Кроме того, файловые системы, прописанные в этом файле, могут быть смонтированы вызовом утилиты mount с передачей в нее только точки монтирования. В этом случае, утилита mount отыскивает в этом файле строку содержащую заданную точку монтирования и выполняет монтирование с полным набором ключей, заданных в этом файле для данной файловой системы. Администратор системы может использовать этот файл для определения политики использования устройств, содержащих файловые системы, непривилегированными пользователями. Для более полной информации об использовании этого файла смотрите man fstab. Данный мануал содержит информацию для программиста, но почитать ее полезно и обычному пользователю.
Файл состоит из записей по шесть полей каждая. Каждая запись должна размещаться на отдельной строке. Поля в записи должны быть разделены либо пробелами, либо символами табуляции. Интересны, наверное, только первые четыре поля в записи. Поля пятое и шестое, обычно либо опускаются, либо содержат нули (что одно и тоже, в данном контексте).
Первое поле содержит информацию о том, что должно быть смонтировано. Здесь указывается либо интерфейс блочного устройства, либо сетевой ресурс подлежащий монтированию.
Во втором поле указывается точка монтирования, т.е. каталог, в который должна быть смонтирована файловая система с указанного блочного интерфейса или сетевого ресурса.
В третьем поле содержится информация о типе монтируемой файловой системы.
В четвертом, и последнем интересным для нас, поле перечисленны через запятую опции монтирования для заданной файловой системы. Основной ошибкой начинающих является использование пробелов при перечислении опций. Помните, что пробелами разделяются поля в записи о монтировании файловых систем.
Приведем примеры записей о монтировании файловых систем из файла /etc/fstab.
/dev/hda1 /mnt/c ntfs noauto,users,ro,iocharset=cp1251,umask=0 /dev/hda2 /mnt/d vfat users,codepage=866,iochaset=cp1251,umask=0 /dev/hda5 /mnt/archive ext3 /dev/fd0 /floppy auto noauto,users,codepage=866,iocharset=cp1251,umask=0 /dev/cdrom /mnt/cdrom iso9660 noauto,users,codepage=866,iocharset=cp1251 /dev/sda1 /mnt/usb-a vfat noauto,codepage=866,iocharset=cp1251,umask=0 /dev/sdb1 /mnt/usb-b vfat noauto,codepage=866,iocharset=cp1251,umask=0 server-1:/video /mnt/server-1-video nfs
Опция noauto предотвращает автоматическое монтирование данной файловой системы при загрузке компьютера.
Опция users позволяет производить монтирование и размонтирование данной файловой системы непривилегированному пользователю.
Значение auto в поле определения типа файловой системы означает, что утилите mount предоставляется возможность самостоятельно распознать тип файловой системы на устройстве. Обычно это значение используется для дискет, которые могут содержать в себе как FAT, так и ext2 файловые системы.
Теперь, если запись о монтировании есть в файле /etc/fstab, то монтирование, например, CD диска можно произвести, следующей простой командой:
# mount /mnt/cdrom
7. Supermount - система автоматического монтирования устройств
Supermount - это относительно новая система, позволяющая производить автомантическое монтирование и размонтирование файловых систем совершенно прозрачно для пользователя - почти как в DOS/Windows. Под словом "почти" я подразумеваю то, что это работает несколько иначе, чем в Windows, и, к тому же, менее надежно. Так, например, если вы сталкиваетесь с проблемой ненадежного монтирования дискет, о котором я упоминал в соответсвующем подразделе, то лучше и не думать об использовании данной системы. Помните, что если вы хорошо работаете с клавиатурой, то на операции ручного монтирования дискеты, с последующем копированием данных и отмонтированием, вы потратите меньше времени, чем ваш сосед, производящей эту операцию в Windows проводнике путем замысловатых "мышиных" манипуляций.
Система supermount распространяется как patch к разным версиям ядра серий 2.4.x и 2.6.x. Сайт этого проекта находится по адресу http://supermount-ng.sf.net. Скачав необходимый patch и пропатчив ядро, отконфигурируйте и скопмилируйте ядро с поддержкой supermount. Если вы хотите иметь автоматическое монтирование для дискеты и CD дисков, то внесите следующие строчки в файл /etc/fstab (удалив, предварительно, старые записи о монтировании этих устройств):
none /mnt/cdrom supermount /dev/cdrom,fs=auto,--,codepage=866,iocharset=cp1251 none /mnt/floppy supermount /dev/fd0,fs=auto,--,codepage=866,iocharset=cp1251,sync,umask=0
Первое и третье поле, которые должны содержать информацию о монтируемом устройстве и его типе, теперь сообщают системе, что речь идет о некотором виртуальном устройстве с типом файловой системы supermount. Таким образом (это очень важно), речь идет о том, что это виртуальное supermount-устройство всегда примонтировано к соответсвующим каталогам, определенным во втором поле каждой из записей.
Четвертое поле, которое в оригинале должно содержать опции монтирования для драйвера обслуживающего данную файловую систему, теперь разделено знаком "--" на две части: первая часть для драйвера supermount, а вторая - как и ранне - для драйвера файловой системы. В первой части сообщается о контролируемом файловом интерфейсе блочного устройства и указывается тип файловой системы (в нашем случае используется тип auto). Вторая часть содержит уже знакомые нам опции, за исключением опции sync для дискеты. Эту опцию вы можете использовать и при обычном монтировании дискеты, а означает она синхронизацию работы программы, передающей данные на запись в устройство, и драйвера, осуществляющего непостредственную запись этих данных в устройство. Если эти процессы синхронизированы, то пользовательская программа сообщит об окончании процесса записи только тогда, когда данные действительно будут записаны в устройство. В противном случае, программа пользователя сообщит о завершении процесса записи по завершении передачи данных в буфер, связанный с данным устройством. А передача данных из буфера произойдет либо при относительной незанятости системы, либо при отмонтировании устройства. Поэтому, если вынуть дискету из дисковода до ее отмонтирования, то на ней может не оказаться записанных данных. Понятно, что при использовании supermount, опция sync жизненно необходима.

