В чём главное отличие Linux от других операционных систем? Каждый отвечает на этот вопрос по-своему. Лично для меня чрезвычайно важно, что пользователи Linux с самых первых дней его существования находятся в постоянном - и что самое главное, конструктивном - общении между собой.
Сперва, когда Linux был игрушкой программистов-профи, которой занимались в свободное время и из любви к искусству, иначе просто и быть не могло. Над совершенствованием открытого кода системы трудились все сообща, и каждый разбиравшийся с очередной проблемой как можно скорее стремился оповестить об этом окружающих, чтобы облегчить дальнейшую работу им. Быть пользователем Linux означало тогда быть её со-творцом, пусть даже не в самой большой степени. Всё было ново, всё приходилось делать впервые и при постоянном обсуждении.
Понемногу система распространялась всё шире. На Западе, где привыкли и деньги считать, и без нарушения закона обходиться, бесплатный, с открытым кодом Linux сделался прекрасным выбором для оснащения компьютеров университетов и исследовательских институтов. В числе пользователей системы стали появляться именно "пользователи" в прямом значении слова - те, кто запускал в её среде свои приложения, обрабатывал данные, получал возможность общения с коллегами и друзьями через Интернет и по электронной почте, не прилагая усилий к совершенствованию кода ядра, драйверов и приложений. Но и такие люди вливались в сообщества исконных линуксоидов - просто потому, что только там возможно было получить консультацию по большинству практических вопросов. Да, "мануалы" - man-pages, страницы руководств - имелись уже тогда, но, написанные профессионалами для профессионалов, не всегда были сходу доступны начинающим.
Шло время, и пользователей у системы стало гораздо больше, чем творцов. Однако хотя дружественность (графического) интерфейса различных инкарнаций Linux и количество руководств увеличились, бытовое удобство пользования системой, надо признать, заметно ниже, чем у специально создававшегося "для каждой домохозяйки" семейства ОС одной Всеми Любимой корпорации. А что делать - забота об удобствах не была изначальной идеей при разработке Linux, чьими первыми авторами-пользователями стали сплошь профессиональные программисты.
Так что и в наше время квалифицированный совет гуру чрезвычайно важен для любого новичка в системе. Вот только всё относительно: некто, считающий, что хотя бы на своём уровне погружённости в вопрос он усвоил и освоил уже всё, что только можно, неожиданно обнаруживает явную недостаточность своих знаний. И тут на помощь приходит сообщество.
Вернёмся к предмету нашего разговора. В прошлом, пятом, выпуске заметок о Linux, я допустил, мягко говоря, недооценку возможностей ОС в той части, где рассказывал о монтировании внешних файловых систем. Благодаря активному обсуждению вопроса в конференции (кстати, всех призываю участвовать в ней!), я смог прояснить для себя несколько моментов и вношу теперь коррективы в своё изложение - с благодарностью к тем, кто побудил меня к более глубокому прочтению страниц руководства.
Итак, снова о монтировании Windows-разделов под Linux. Давайте посмотрим, как сама система при старте разбирается, что ей монтировать.
Файл /etc/fstab, формируемый при инсталляции системы, содержит инструкции по монтированию. Как можно убедиться, права доступа к этому файлу разрешают его чтение всем пользователям системы (и запускаемым ими процессам), а запись - только суперпользователю, что вполне естественно. Обратите внимание на третий столбец файла: в нём указан тип монтируемой системы. Отыщем строчки, содержащие запись vfat: это знакомые уже нам разделы /dos-c и /dos-d. Четвёртый столбец - данные о дополнительных опциях монтирования, которые в данном случае отсутствуют, судя по записи defaults. Так вот; именно потому, что установки монтирования были стандартными, нам и не удалось насладиться кириллическим видом названия директории C:\Мой компьютер. Не будем же мириться с таким положением дел.
Прежде всего, разрешим формальный, но точки зрения безопасности всё-таки существенный вопрос. А именно: переместим точки монтирования Windows-разделов из корневого каталога / в директорию /mnt, специально для того предназначенную. Необходимо это из тех же соображений, из каких пользовательские файлы хранятся в каталогах вида /home/имя_пользователя, а не прямо в корне системы. Если уж один из подмонтированных разделов (или домашняя директория одного из пользователей) окажутся скомпрометированными (compromised), заразе или взломщику не так просто будет подняться по дереву каталогов. Ведь правом создавать новые директории в корневой (/) обладает только root.
Итак, исходное состояние: в корневом каталоге находятся точки монтирования разделов Windows C и D - /doc-c и /dos-d соответственно. В каталоге же /mnt - точки монтирования только внешних устройств: флоппи-дисковода, приводов CD и DVD. Приступим.
Начнём с того, что убедимся: да, прямо сейчас, после загрузки системы, в соответствии со сформированным при установке файлом /etc/fstab, раздел Windows C подмонтирован именно в каталог /dos-c. И, как и прежде, русские буквы в названиях директорий и файлов отображаются вопросительными знаками. Хорошо же. Отмонтируем оба логических диска Windows при помощи команды umount (обратите внимание: имя команды отличается от английского термина "размонтировать" - unmount - отсутствием буквы n после u). Теперь, как нетрудно удостовериться, /dos-c преобразовался в банальный пустой каталог - свободную точку монтирования.
Теперь заведём директории /mnt/c и /mnt/d, более соответствующие требованиям безопасности, и смонтируем соответствующие Windows-разделы в них чуть грамотнее, чем делали это в прошлый раз. Команда создания директории - mkdir от make directory - обладает самоочевидным синтаксисом. Кстати, обратите внимание: исполнив директиву "mkdir /mnt/c", то есть указав в качестве аргумента абсолютный (от самого корневого каталога системы прописанный) путь, мы создаём директорию именно там, где рассчитываем. А вот команда "mkdir c" создаст директорию c в текущем каталоге - по умолчанию для пользователя root это /root, то есть в итоге получится директория /root/c. И, значит, можно было бы сперва переместиться в каталог /mnt - при помощи команды cd, нам уже знакомой, - а потом уже отдать приказ mkdir c. В результате мы получили бы ту же самую директорию /mnt/c.
Директории /mnt/c и /mnt/d созданы: самое время приниматься за монтирование. Вот оно, пожалуйста: команда mount, судя по аргументам, назначает устройству /dev/hde1 (а это как раз и есть Windows-диск C) точку монтирования /mnt/c. При этом указан тип файловой системы (ключ –t) vfat. Всё правильно. Но что за опции следуют за ключом -o?
Опция codepage указывает на кодовую страницу монтируемой файловой системы, а iocharset - на кодировку набора символов, используемую для ввода-вывода. Поскольку стандартная для Linux файловая система ext2 (и её расширение ext3) не делает никаких предположений о кодировке символов, и просто хранит имена файлов в восьмибитном представлении, указывать на то, как их отображать, - задача пользователя. Что мы, собственно, только что и сделали.
Как видим, разум в очередной раз восторжествовал над косной материей, и наименование директории "Мой компьютер" можно теперь с лёгкостью прочитать. Больше того - ей можно свободно пользоваться.
Подмонтируем сначала оставленный пока без внимания диск D. Он занимает (как мы помним из листинга команды df в предыдущей статье) раздел /dev/hde5, то есть первый из вторичных разделов данного жёсткого диска. Откуда такое обозначение? Имена /dev/hd* система присваивает логическим IDE-дискам (в отличие от SCSI-разделов, обозначаемых как /dev/sd*). Буками английского алфавита обозначается размещение физического диска на IDE-канале: так, /dev/hda - винчестер, установленный как master на первый IDE-контроллер, /dev/hdb - его slave, /dev/hdc и /dev/hdd - master и slave на втором контроллере. Мой диск именуется /dev/hde потому, что стоит мастером на ATA-100 контроллере HPT 370, интегрированном в материнскую плату, а "обычные" IDE-интерфейсы занимают CD-RW и DVD-приводы.
Жёсткий диск может быть разбит на 4 primary-раздела: первый из них обозначается в данном случае /dev/hde1 - на нём-то как раз установлена Windows. Прочее пространство диска представляет собой расширенный раздел (extended partition), где размещаются диск D Windows (именуемый в Linux /dev/hde5, поскольку стоит первым из расширенных: номера со 2 по 4-й зарезервированы для других primary-разделов, которых на диске нет), а также все собственно Linux-разделы.
Окончательно разобравшись с тем, как монтировать Windows-разделы, давайте в них немножечко порезвимся. Самое простое - научиться переходить из каталога в каталог: команда ls прекрасно работает с кириллическими именами файлов, как показано на предыдущем рисунке. Для того, чтобы пробел в названии был верно воспринят командным интерпретатором, мы "экранируем" его в процессе набора обратной косой чертой. А если имя каталога или файла набирать с применением автодополнения (клавиша табуляции, помните?), то в случае однозначного указания на нужное имя экранировку пробелов командный интерпретатор произведёт автоматически. Переключение между латинскими и русскими буквами осуществляется в консоли одновременным нажатием правых клавиш Shift и Ctrl - если, конечно, при установке системы вы выбрали поддержку русского языка.
Ну что же, пришло время внедриться в файловое пространство FAT32 и оставить там след. Создадим небольшой текстовый файл, назовём его по-русски и запишем туда кириллический же текст. А потом посмотрим, что получится.
Самый простой путь создания коротких текстовых файлов - команда echo. Наберите имя команды, следом в двойных кавычках - текст, который планируете поместить в файл, затем поставьте правую треугольную скобку (знак "больше") и имя файла. Желательно, абсолютный путь, иначе придётся сперва переместиться в нужную директорию. Нажимаем клавишу Enter - файл создан. Убедимся, что он присутствует в указанном каталоге, исполнив команду ls. А команда cat позволит нам просмотреть содержимое этого файла - как видно, и имя его записано по-русски, и внутри находится русский текст. Загляденье.
Обращу ваше внимание на то, что при помощи echo можно не только создавать файлы, но и дополнять существующие: если вместо одной треугольной скобки вправо (>) поставить две (>>), то являющаяся аргументом echo строка будет приписана в конец файла, а прежнее его содержимое останется нетронутым. Если же файла с указанным именем ранее не существовало, то и >, и >> создадут его.
Разобравшись с дисковыми файловыми системами, обратимся к removable media - а именно, к CD-приводу и дискам. Установим диск в привод и посмотрим, не стало ли его содержимое доступным в той директории, которая назначена в файле /etc/fstab соответствующей точкой монтирования - в /mnt/cdrom. Нет, действовать надо вручную (если работа идёт в консольном режиме, конечно; в графической оболочке по умолчанию активировано автомонтирование CD и DVD).
Монтировать привод будем без особых параметров - все, что могут в данном случае понадобиться, уже досконально перечислены в файле /etc/fstab. Можно даже не называть имя устройства, которое предназначено для монтирования в точку /mnt/cdrom: получив такую сокращённую директиву, система сама обратится к /etc/fstab и воспользуется соответствующей строчкой.
Давайте ещё немного поиграем с опциями монтирования. Установим в флоппи-привод дискетку и сделаем её доступной системе. Допустим, что нам захочется потом поработать с ней в Windows, поэтому команду mount исполним с указанием устройства (/dev/fd0, то есть первый флоппи-привод), точки монтирования и типа файловой системы.
Дальше скопируем на дискету только что созданный на диске С файл с кириллическим именем и содержимым; убедимся, что он объявился на новом месте, и отмонтируем дискету. А теперь остановимся на минуту и задумаемся: зачем нам нужен исполняемый текстовый файл?
Монтирование внешних файловых систем осуществляется в Linux с правами, подразумевающими для размещённых на них файлов и чтение, и запись, и исполнение; владельцем при этом оказывается root - если в файле не прописана опция owner или user. С владельцем мы ещё разберёмся: понятно, что в общем случае допускать монтирование сторонних систем от имени суперпользователя - это, вообще говоря, опрометчиво. По-хорошему, для Windows-систем следует завести отдельную группу пользователей (например, winusers), куда и приписать всех тех, кому могут понадобиться Windows-разделы. Однако операции с пользователями и группами мы с вами освоим чуть позже; пока же давайте разберёмся хотя бы с правами.
Среди прочих опций команды mount (man mount - настоятельно рекомендую!) есть и такая, как umask. С её помощью определяется маска прав, с которыми монтируются все файлы и каталоги системы. Что такое права, мы уже знаем; что же такое маска? Давайте по порядку.
В данный момент нас интересуют права на чтение, запись и исполнение файлов (чтение содержимого, запись и перемещение внутрь каталога - соответственно). Таких групп - три: обратите внимание на расширенный (с опцией –l) листинг команды ls. Первая группа (rwx) обозначает наличие соответствующих прав для владельца файла (если буква стоит на своём месте, право имеется), вторая - для группы, и третья - для всех прочих пользователей компьютера. Таким образом, получаем набор из трёх групп по три бита информации: каждое право может только наличествовать либо отсутствовать (буква - прочерк, единица - ноль). Значит, вместо, скажем, rwx rw- r-- можно записать 111 110 100 (пробелы между группами я добавил для наглядности). Переведём эти группы чисел из двоичной системы в десятичную: 111 - это два во второй степени плюс два в первой плюс два в нулевой, то есть 4+2+1=7; 110 - соответственно, 6, и 100 - 4. Значит, вместо rwxrw-r--, то есть 111110100, сведения о правах на файл можно отобразить короче - как 764.
Всё это замечательно, и всё это нам ещё пригодится, когда мы займёмся непосредственным управлением правами файлов. Но что же такое маска? А очень просто: это дополнение текущих (или желаемых) прав файла до 111111111 в двоичной системе. То есть, в нашем примере, для прав файла 111110100=764 маска (в которой на местах нулей должны стоять единицы, и наоборот) будет 000001011=013.
Возвращаемся к параметрам команды mount. Опция umask задаёт маску прав файлов и каталогов в монтируемой файловой системе. Давайте смонтируем теперь флоппи-диск снова, но уже так, чтобы находящиеся на нём файлы не были исполняемыми, то есть чтобы бит x, последний в каждой тройке битов прав, обращался у них в ноль. В итоге мы собираемся получить права rw-rw-rw-, иначе 110110110. Значит, маска должна быть 001001001, то есть 111. Её и укажем.
Получилось! Как видим, созданный нами файл отображается теперь не ярко-зелёным, как это принято в цветной консоли для исполняемых файлов, а нейтральным серым цветом. И команда ls -l подтверждает - да, бит x из прав файла пропал для всех трёх категорий пользователей. Обратите внимание: мы добились этого одними только опциями монтирования, никак не воздействуя непосредственно на сам файл! Вообще говоря, мы и не смогли бы на него воздействовать: Windows не знает подобного инструментария, и в её файловой системе невозможно присвоить файлам некие постоянные права. Они наличествуют у подмонтированных файлов только в то время, пока с ними оперирует Linux. И это можно поставить себе на службу - например, ограничивать число пользователей, которым из-под Linux будут доступны даже подмонтированные Windows-разделы, просто указав в опциях монтировки такую маску, которая запретит доступ к этим разделам всем, кроме членов некой определённой группы. Но этим, повторюсь, мы займёмся чуть погодя.
Ну что же; оставим на время гостеприимную территорию Linux и вернёмся в землю, увереннее обетованную, - перезагрузимся в Windows, иными словами. Команда reboot, выполненная от имени root, подойдёт. Кстати: вы ведь не стали удалять прежние точки монтирования /dos-c и /dos-d, верно? (Вопрос о том, какой командой это сделать, я пока оставлю за кадром.) И очень правильно, поскольку файл /etc/fstab остался у нас прежним. Как (и как именно) его править, поговорим в следующий раз, кстати. И поскольку он остался, каким и был, система при очередном входе в Linux будет пытаться смонтировать Windows-разделы на указанные там места - и чрезвычайно удивится, не отыскав ожидаемых точек монтирования. Не надо её пока разочаровывать.
Пока мы обсуждали тут с вами отвлечённые материи, система уже перезагрузилась, надеюсь; давайте убедимся, что трудолюбиво созданный нами в разделе FAT32 из-под Linux файл благополучно наличествует в корне директории C, как, собственно, и ожидалось.
Вот, правда, с содержимым всё будет не так просто. Автоперевода кодировки koi8-r в cp1251 мы с вами не получим, указывая даже самые верные параметры монтирования. Текст в нашем файле, набиравшийся в Linux на хорошем литературном русском, из-под Windows читается патетически знакомым по множеству коряво кодированных электронных писем образом. То есть практически не читается. Без перекодировщика не обойтись.
Ещё урок: давайте обратимся к дискете (помните, мы записывали на неё тот же самый файл?) и посмотрим, что у нас там? А там у нас - замечательное свидетельство невнимания, типичной и главной ошибки в Linux (да, наверное, и в компьютерном деле вообще). Помните, с какими опциями мы монтировали дискету? –t vfat. И всё. Ни codepage, ни iocharset указаны не были - вот почему наименование файла, для диска C нормально переведённое на лету из koi8-r, в котором мы набирали его в консоли, для дискеты переведено не было.
Отсюда мораль: внимательным в Linux нужно быть всегда. Конечно, даже самый матёрый системщик - не Господь бог, и ошибаться может тоже, хотя и реже, чем обычные люди. Вот почему системщики предпочитают на всякий повторяющийся случай жизни писать скрипты (некий аналог .bat-файлов в старом добром MS-DOS) и делать это со всем тщанием, а потом уже со спокойной душой запускать их, не думая ни о чём. Но вот это уже точно - совсем другая история.