Создание файловой системы freebsd. Логика файловой системы. Удаление существующей разметки

Создание формы обратной связи

О проблемах с кодировкой файлов

При создании формы обратной связи частенько возникают проблемы с кодировкой файлов, из-за чего приходящее на E-mail письмо состоит из замечательных квадратиков, ромбиков и других "кракозяблов".

Рассмотрим это вопиющее недоразумение подробнее. Как известно, кодировка (charset) - это метод представления символов для их передачи. В конце концов, любая информация, циркулирующая в компьютере - это последовательность нулей и единиц. Кодировка символов состоит из нескольких байтов, обычно от 1 до 4. Кодировок существует множество, и браузер должен правильно определить, в какой из них написана открываемая страничка сайта.

В большинстве случаев современные браузеры успешно справляются с этой задачей самостоятельно. Однако для правильного определения кодировки принято в HTML-коде давать подсказку с помощью мета-тега, например,
или
.
.

Начинающие веб-дизайнеры иногда ошибочно считают, что достаточно вставить нужный мета-тег в начало страницы - и всё будет ОК! Это заблуждение. Как справедливо писал Козьма Прутков: "Если на клетке со слоном увидишь надпись "Буйвол" – не верь глазам своим." Необходимо не только написать, к примеру, charset=utf-8, но и проследить, что страница реально сделана в указанной кодировке .

Истинную кодировку страницы проще всего узнать, открыв её в любом браузере и выбрав в меню пункт Вид - Кодировка . Изменяя кодировки, определите, при какой из них страница отображается правильно - это и будет ваша реальная кодировка. Её и указывайте в мета-теге. Если вы хотите изменить кодировку, то для этого необходимо зайти в установки программы, с помощью которой вы создаете сайт, и задать требуемую кодировку. Например, в программе Adobe Dreamweaver для этого надо выбрать раздел меню Редактировать - Установки...- Создать документ - Кодировка по умолчанию . Обычно используют кодировки charset=utf-8 или charset=windows-1251 .

Замечание : мета-тег указания кодировки желательно размещать в самом начале HTML-кода сразу за тегом , чтобы браузер выбрал правильную кодировку уже перед выводом названия страницы (тег ...), которое показывается на синей полосе вверху окна браузера. В противном случае, вместо мы можем увидеть всё те же замечательные квадратики и ромбики.</p> </blockquote> <p>Абсолютно не нужные нам проблемы с кодировкой возникают и тогда, когда страничка сайта состоит из нескольких файлов, например, вставки фреймов, скриптов <b>JavaScript </b> и т.п. Необходимо следить, чтобы все эти части были созданы в одной кодировке. Кстати, именно для этого случая в почтовых программах, например, на mail.ru , обычно есть несколько кнопок ручного переключения кодировок, так как автоматически определить, в какой кодировке написано приходящее на почту письмо, иногда бывает затруднительно.</p> <p>Возвращаясь к нашей форме обратной связи , следует учесть, что данные о кодировке сообщения могут измениться при пересылке. Упрощенно, механизм доставки письма с формы на ваш E-mail выглядит следующим образом. Сначала письмо попадает на промежуточный <a href="/services/videt-vo-sne-pochtovyi-yashchik-pochtovyi-yashchik-po-sonniku-k-chemu.html">почтовый ящик</a> на сервере вашего хостинга, а уже с него посылается на указанный вами в РНР-файле адрес. Этот промежуточный ящик вы легко найдете, заглянув в панели управления вашего сайта в раздел <b>Почта </b>. Весь этот процесс происходит под управлением РНР-программы. Следовательно, в ней тоже полезно лишний раз указать правильную кодировку вашего файла.</p> <p>Для этого необходимо в РНР-файле (в нашей форме <a href="/phone/chto-takoe-forma-obratnoi-svyazi-forma-obratnoi-svyazi-v-joomla-uspeshno-vashe.html">обратной связи</a> это <b>mail.php </b>) добавить строку заголовков (<b>headers </b>), которая служит для определения в <a href="/services/server-ishodyashchei-pochty-ukr-net-dlya-drugih-pochtovyh-programm-i-pochtovyh.html">почтовой программе</a> некоторых <a href="/services/sistemnye-trebovaniya-dlya-ustanovki-vindovs-7-32-posredstvom-komandnoi.html">дополнительных параметров</a> письма: тип документа <b>text/plain </b> (простой текст), адрес отправителя, кодировку и др. Для нашего случая добавим <a href="/internet/kak-vkontakte-pereiti-na-sleduyushchuyu-strochku-kak-pereiti-v-vk-na-druguyu-strochku.html">следующую строчку</a> заголовков(<b>headers </b>)с указанием кодировки:<br> $to = "pupkin@rambler.ru "; //Здесь укажите свой адрес<br> $headers = "Content-type: text/plain; charset=utf-8";<br> $subject = "Сообщение с вашего сайта";<br> $message = "Имя пославшего: $name \nЭлектронный адрес: $email \nСообщение: $mess";<br> $send = mail ($to, $subject, $message, $headers);</p> <p>Так же неплохо сообщить браузеру о правильной кодировке добавлением в РНР-страницу отправки формы обратной связи (см. "Создание формы обратной связи ") заголовка с мета-тегом<br> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />.</p> <p>Проблемы с кодировкой возникают и в том случае, если вы используете на странице скрипты для вывода какого-либо текста, например, бегущей строки, даты и т.п. Для изменения кодировки скрипта можно воспользоваться <b><a href="/services/prilozhenie-microsoft-word-osnovnye-vozmozhnosti-programmy-microsoft-word-viewer-vord.html">Microsoft Word</a> </b>. Для этого откройте документ, задайте нужную кодировку, если он выводится неверно (как это сделать, смотрите в "<a href="/rates/obuchenie-vorld-ofis-kursy-obucheniya-ms-office-excel-dlya-chainikov---izuchaem-excel.html">Справке Word</a>"), а затем сохраните его следующим путем: <b>Файл - Сохранить как - <a href="/internet/kak-ubrat-razryv-razdela-na-tekushchei-stranice-razryvy-posle-obychnogo.html">Обычный текст</a> - Сохранить </b>. В открывшемся окне вы можете задать необходимую кодировку, совпадающую с кодировкой вашей страницы.<br></p> <p>К сожалению, описанные простые приемы указания кодировки не всегда избавляют от ошибок при её определении. Иногда требуется серьезное хирургическое вмешательство в работу РНР-машины. <a href="/rates/poslednie-besedy-vk-kak-naiti-nuzhnuyu-informaciyu-v-perepiske.html">Нужную информацию</a> о таких операциях вы без труда, но при наличии желания, найдете в справочнике под названием "Интернет" - мышь вам в руки!</p> <p><i> 18.03.2011 г. </i></p> <ul> Ещё статьи по теме "Создание, оптимизация и раскрутка сайта": </ul> <p>Если последовательность бит не выглядит разумной(с точки зрения человека), то это случай, когда документ скорее всего был неверно сконвертирован в определенный момент. К примеру мы берем текст ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ, и, не придумав ничего лучше, сохраняем его в UTF-8. Текстовый редактор предположил, что он правильно прочитал текст с кодировкой Mac Roman и теперь его надо сохранить в другой кодировке. В конце концов, все эти символы валидны в Unicode. В смысле, в Unicode есть пункт для É, для G, и так далее. Так что мы просто сохраняем его в UTF-8: </p><blockquote>11000011 10001001 01000111 11000011 10001001 11000011 10101100 11000011 10001001 01010010 11000011 10000101 01011011 11000011 10001001 01100110 11000011 10001001 01000010 11000011 10001001 11000011 10101100 11000011 10001001 01001111 11000011 10000111 11000011 10010101 11000011 10101100 11000011 10010100 11000011 10000111 11000010 10110101 11000011 10000111 11100010 10001001 10100000 11000011 10000111 11000010 10111011 11000011 10000111 11000010 10100010 <br></blockquote><br><p>Вот так теперь текст ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ представляется последовательностью бит UTF-8. Эта битовая последовательность совершенно оторвана от того, что было в изначальном документе. В какой бы кодировке мы не открывали эту последовательность, нам ни за что не видать <a href="/settings/ustanovka-rpm-paketov-v-linux-tradicionnyi-sposob-ustanovki---ustanovka-iz.html">исходный текст</a> エンコーディングは難しくない. Он просто потерян. Его можно было бы восстановить, знай мы изначальную кодировку Shift-JIS и то, что мы расценили текст как Mac Roman, а затем сохранили его в UTF-8. Но такие чудеса редко встречаются. </p><p>Множество раз конкретная битовая последовательность оказывается неверной в конкретной кодировке. Если бы мы попытались открыть изначальный документ в ASCII, то увидели бы, что часть символов распозналась, а часть – нет. Программа, который вы пользуетесь, могла бы решить просто выбросить байты, которые не подходят под текущую кодировку, или заменить их на знаки вопроса. Или на специальный символ замены в Unicode: � (U+ FFFD). Если после процедуры изъятия неподходящих символов вы сохраните документ, то потеряете их навсегда. </p><p>Если вы неверно угадали кодировку, а потом сохранили ее еще в одну, то вы испортите документ. Можно пытаться исправить его, но эти попытки обычно успехом не оканчиваются. Магия с битовым сдвигом обычно остается неработающей магией: как мертвому припарки. </p><h5>И как же правильно менять кодировки?</h5><p>Это правда просто! Нужно знать кодировку конкретного кусочка текста(битовой последовательности) и применить ее для расшифровки. Это все, что нужно сделать. Если вы пишете программу, которая принимает от пользователя текст, определите в какой кодировке она будет это делать. Любое текстовое поле должно знать, в какой кодировке оно принимает данные. Для любого типа файла, который пользователь может загрузить в программу должна быть определена кодировка. Или должен существовать способ спросить об этом пользователя. Информацию может предоставлять формат файла или пользователь(большинство из них вряд ли знают, пока конечно не дочитают статью). </p><p>Если нужно перегнать текст из одной кодировки в другую, применяйте специальные инструменты. Конвертация – утомительный труд по сравнению двух кодовых страниц и решению, что символ 152 в кодировке А совпадает с символом 4122 в кодировке B с последующим изменением битов. Не нужно изобретать этот велосипед: в каждом распространенном языке программирования есть абстрактные от битов и кодовых страниц инструменты для конвертации текста из кодировки в кодировку.</p><p>Скажем, ваше приложение должно принимать файлы в GB18030, но внутри вы работает в UTF-32. Инструмент iconv может в одну строку сделать конвертацию: iconv("GB18030", "UTF-32", $string). Символы останутся неизменным, несмотря на то, что битовое представление измененилось.</p><blockquote>character GB18030 encoding UTF-32 encoding<br> 縧 10111111 01101100 00000000 00000000 01111110 00100111 </blockquote><p>Вот и все. Содержание строки в его человеческом понимании не изменилось, но теперь это правильная строка в UTF-32. Если вы продолжите работать с ней в UTF-32, у вас не будет никаких проблем с нечитаемыми символами. Однако, как мы обсуждали ранее, не все кодировки способны отображать все символы. Невозможно закодировать символ 縧 в любой из кодировок для европейских языков. И может случится нечто ужасное.</p><h5>Все в Unicode</h5><p>Именно поэтому не существует оправдания в 21 веке не использовать Unicode. Некоторые специализированные кодировки для европейских языков могут более производительны, чем Unicode для конкретных языков. Но пока вам не приходится работать с терабайтами специального текста(а это ОЧЕНЬ много), вам не о чем беспокоиться. Проблемы, вытекающие из-за несовместимости кодировок, гораздо страшнее, чем потерянный гигабайт. И этот аргумент станет только весомей с ростом и удешевлением хранения данных и ширины канала. </p><p>Если системе нужно работать с иными кодировками, сконвертируйте текст в Unicode прежде всего, и перегоните обратно, если его нужно куда-нибудь вывести. Иначе придется очень внимательно следить за каждым случаем обращения к данным и проводить необходимые конвертации, если это возможно без потери информации.</p><h5>Счастливые случайности</h5><blockquote><i>У меня был сайт подключенный к БД. Мое приложение обрабатывала все как UTF-8 и в БД хранила его так, и все было супер, но когда я зашел в админку БД, я ничего не мог понять. </i><br> - анонимный быдлокодер </blockquote><p>Возникают ситуации, когда кодировки обрабатываются неверно, но все по прежнему работает нормально. Часто бывает, что кодировка базы данных выставлена в latin-1, а приложение работает с UTF-8(или любой другой). Вобщем-то, любая комбинация 1 и 0 допустима в однобайтной latin-1. Если база данных получает от приложения данные вида 11100111 10111000 10100111, то оно с радостью сохраняет их, думая, что приложение имело ввиду 縧. Почему бы и нет? Позже бд возвращает те же самые биты приложению, которое счастливо, ведь получило символ UTF-8 縧, который и задумывался. Но интерфейс администрирования бд знает, что используется latin-1, и вот результат: ничего не возможно понять. <br> Глупец просто выиграл лотерею, хотя звезды были не на его стороне. Любая операция над текстом в бд может сработать, но может и выполниться не как задумано, так как бд неправильно воспринимает текст. В худшем случае, бд ненароком уничтожит весь текст, выполняя произвольную операцию 2 года спустя после установки из-за неверной кодировки(и конечно, никакого тебе бэкапа).</p><h5>UTF-8 и ASCII</h5><p>Гениальность UTF-8 в бинарной совместимости с ASCII, которая является де-факто основой для всех кодировок. Все <a href="/rates/upravlyayushchie-simvoly-ascii-kodirovka-ascii-american-standard-code-for-information-interchange---bazovaya.html">символы ASCII</a> занимают максимум байт в UTF-8 и используют те же биты, что и в ASCII. Иными словами, ASCII может быть отражено 1:1 в UTF-8. Любой символ не из ASCII занимает 2 или более байт в UTF-8. Большинство языков программирования, использующих ASCII в качестве кодировки исходного кода, позволяет включать текст в UTF-8 прямо в текст:</p><p>Сохранение в UTF-8 даст последовательность:</p><blockquote>00100100 01110011 01110100 01110010 01101001 01101110 01100111 00100000<br> 00111101 00100000 00100010 11100110 10111100 10100010 11100101 10101101<br> 10010111 00100010 00111011 </blockquote><p>Только 12 байт из 17(те, что начинаются с 1) являются символами UTF-8(2 символа по 3 байта). Прочие символы находятся в ASCII. Парсер прочитает следующее:</p><blockquote>$string = «11100110 10111100 10100010 11100101 10101101 10010111»; </blockquote><p>Парсер воспринимает все за кавычкой как последовательность бит, которую нужно трактовать как есть, все, вплоть до другой кавычки. Если вы просто выведете эту последовательность, вы выведете текст в UTF-8. Не нужно делать ничего больше. Парсеру не нужно специально поддерживать utf-8, нужно просто воспринимать строки буквально. Простые парсеры могут поддерживать Unicode именно так, на самом деле не поддерживая Unicode. Однако многие языки программирования явно поддерживают Unicode. </p><h5>Кодировки и PHP.</h5><p>PHP не поддерживает Unicode. Правда, он поддерживает его достаточно хорошо. Предыдущий параграф показывает, как включать символы UTF-8 прямо в текст программы без каких-либо проблем, ибо UTF-8 обратно совместима с ASCII, и это все, что нужно PHP. Однако утверждение, что «PHP не поддерживает Unicode» истинно, ибо вызывает множество затруднений в сообществе PHP.</p><h6>Ложные обещания</h6><p>Одной моей мозолью стали функции utf8_encode и utf8_decode. Я часто вижу глупости наподобии «Чтобы использовать Unicode в PHP, нужно вызвать utf8_encode для вводимого текста и utf8_decode для выводимого». Эти две функции обещают некую автоматическую конвертацию текста UTF-8, которая якобы обязательна, ибо «PHP не поддерживает Unicode». Если вы читаете эту статью не по диагонали, то знаете, что</p><ol><li>Ничего специфического нет в UTF-8</li> <li>Вы не можете закодировать текст в UTF-8 постфактум</li> </ol><p>Поясню пункт 2: любой текст уже чем-то закодирован. Когда вы вставляете строки в исходный код, они уже имеют кодировку. Точнее, ту кодировку, которую сейчас использует ваш текстовый редактор. Если вы получаете их из бд, они уже закодированы. Если вы читаете их из файла… уже знаете, да?</p><p>Текст либо закодирован в UTF-8, либо не закодирован. Если нет, то он закодирован в ASCII, ISO-8859-1, UTF-16 или как-нибудь еще. Если он не в UTF-8, но предполагается, что он содержит «UTF-8 символы», то у вас когнитивный диссонанс. Если текст все же содержит нужные символы, закодированные в UTF-8, то он в UTF-8. </p><p>Так что же, черт возьми, делает utf8_encode? </p><blockquote>«Переводит строку ISO-8859-1 в кодировку UTF-8» </blockquote><p>Ага! Автор хотел сказать, что функция конвертирует текст из ISO-8859-1 в UTF-8. Вот она для чего. Такое ужасное название ей наверно дал какой-нибудь непредусмотрительный европеец. Тоже самое касается и utf8_decode. Эти функции неприменимы ни для чего, кроме конвертации из ISO-8859-1 в UTF-8. Если вам нужна другая пара кодировок, используйте iconv.<br> utf8_encode – это вам не волшебная палочка, которой нужно махать над каждым словом потому что «PHP не поддерживает Unicode». Она вызывает <a href="/settings/na-kanaly-kotorye-vam-nravyatsya-c-chego-nachat-novichku-vesti-svoi.html">больше проблем</a>, чем решает – скажите спасибо тому европейцу и невежам-программистам.</p><h6>Нативный-шмативный</h6><p>Так что имеют ввиду, когда говорят, что язык поддерживает Unicode? Важно, предполагает ли язык, что один символ занимает один байт, или нет. Так, PHP позволяет получить доступ до выбранного символа, трактуя строку как символьный массив:</p><p>Если $string имеет однобайтную кодировку, то она отдаст нам первый символ. Но только потому, что «character» совпадает с «byte» в однобайтной кодировке. PHP просто отдает первый байт без единой мысли о символах. Строки для PHP – не более, чем последовательности байт, ни больше, ни меньше. Эти ваши «читаемые символы» - не более, чем выдумка человека, PHP на них наплевать.</p><blockquote>01000100 01101111 01101110 00100111 01110100<br> D o n " t<br> 01100011 01100001 01110010 01100101 00100001<br> c a r e ! </blockquote><p>Тоже касается и многих <a href="/rates/chem-aifon-otlichaetsya-ot-telefona-i-plansheta-vot-nekotorye-standartnye-funkcii.html">стандартных функций</a>, таких как substr, strpos, trim и прочих. Поддержка прекращается там, где кончается соответствие между байтом и символом:</p><blockquote>11100110 10111100 10100010 11100101 10101101 10010111<br> 漢 字 </blockquote><p> $string для <a href="/internet/znachenie-v-kvadratnyh-skobkah-css3-selektory-atributov-znachenie-atributa.html">указанной строки</a> отдаст опять же только первый байт, равный 11100110. Другими словами, третий байт символа 漢. Последовательность 11100110 неверна для UTF-8, так что строка теперь тоже неверна. Если вам тоже так кажется, можете попробовать другую кодировку, в которой 11100110 будет каким-нибудь допустимым <a href="/internet/generiruem-parol-onlain-generator-sluchainyh-parolei-randomnye-simvoly.html">случайным символом</a>. Можете веселиться, только не на боевом сервере.</p><p>Вот и все. «PHP не поддерживает Unicode» означает, что большинство функций в языке предполагают, что один байт равен одному символу, что ведет к обрезке многобайтных символов или неверному подсчету длины строки. Это не означает, что вы не можете использовать Unicode в PHP, или что любой текст надо прогонять через utf8_encode, или еще какую-нибудь глупость.</p><p>К счастью, существует <a href="/phone/liv-tv-zablokirovali-chto-delat-specialnye-versii.html">специальное расширение</a>, которое добавляет все важные строковые функции, но с поддержкой многобайтных кодировок. mb_substr($string, 0, 1, ‘UTF-8’) на вышеупомянутой строке совершенно правильно вернет последовательность 11100110 10111100 10100010, соответствующую символу 漢. Из-за того, что функции нужно думать о том, что она делает, ей нужно передать кодировку. Поэтому эти функции принимают параметр $encoding. К слову, кодировку можно задать глобально для всех функции mb_ с помощью mb_internal_encoding. </p><h6>Употребление и злоупотребление обработкой ошибок PHP</h6><p>Вся проблема (не-)поддержки Unicode в PHP в том, что интерпретатору плевать. Последовательности байт, ха. Нет дела до того, что они значат. Не делается ничего, кроме хранения строк в памяти. У PHP даже понятия такого нет – кодировка. И пока не нужно манипулировать строками, это и не важно. Делается работа с последовательностями байт, которые могут быть всопринятыми кем-то как символы. PHP требует от вас только сохранять исходный код в чем-нибудь, совместимом с ASCII. Парсер PHP ищет конкретные символы, которые говорят ему что делать. 00100100 говорит: «объяви переменную», 00111101 – «присвой», 00100010 – начало или конец строки и т.д. Все, что не важно парсеру, воспринимаются как литералы байтовых последовательностей. Это касается и всего, что заключено в кавычки. Это значит:</p><ol><li>Вам не удастся сохранить исходник с PHP в несовместимую с ASCII кодировку. Например в UTF-16 знак кавычик кодируется как 00000000 00100010. Для PHP, который все воспринимает как ASCII, это NUL-байт, за которым следует кавычка. PHP наверно бы икал на каждый символ оказывался бы NUL.</li> <li>Вы можете сохранить PHP в совместимую с ASCII кодировку. Если первые 128 пунктов кодировки совпадают с ASCII, PHP съест их. Все значимые символы для PHP лежат в пределах первых 128 пунктов, определенных ASCII. Если строковые литералы содержат что-то выходящие за этот предел, PHP не обратит внимание. Вы может сохранить исходник в ISO-8859-1, Mac Roman, UTF-8 или любую другую кодировку. Строковые литеры в вашем коде получат ту кодировку, в которой вы сохраняете файл.</li> <li>Любой внешний файл для PHP может иметь произвольную кодировку. Если парсеру не надо обрабатывать файл, то он останется довольным. <blockquote>$foo = file_get_contents("bar.txt"); </blockquote><p>Написанное выше просто засунет байты из bar.txt в переменную $foo. PHP не будет пытаться ничего интерпретировать, кодировать или совершать другие махинации с содержимым. Файл может содержать бинарные данные или картинку, PHP все равно.</p></li> <li>Если внешняя и внутрення кодировки должны совпадать, то они действительно должны. Обыденным случаем является локализация: в коде вы пишете что-то типа echo localize(‘Foobar’), а во внешем файле это:<blockquote>msgid «Foobar»<br> msgstr "フーバー"<br></blockquote><p>Обе строки Foobar должны иметь идентичное битовое представление. Если исходный код в ASCII, а локализционный – в UTF-16, вам не повезло. Нужно проводить дополнительную конвертацию.</p></li> </ol><p>Проницательный читатель может спросить, скажем, можно ли сохранить последовательно байт UTF-16 в литерал исходного файла в ASCII, и ответ будет всегда такой: конечно.</p><blockquote>01100101 01100011 01101000 01101111 00100000 00100010<br> e c h o "<br> 11111110 11111111 00000000 01010101 00000000 01010100<br> (UTF-16 marker) U T<br> 00000000 01000110 00000000 00101101 00000000 00110001<br> F - 1<br> 00000000 00110110 00100010 00111011<br> 6 " ; </blockquote><p>Первая строка и последние 2 байта – из ASCII. Остальное представлено в UTF-16 2 байтами на символ. Ведущие 11111110 11111111 на второй строке – это маркер начала текста в UTF-16(требует по стандарту, PHP об этом ни черта не слышал). Этот скрипт выводит строку “UTF-16”, закодированную в UTF-16, потому что просто выводит байты между двух кавычек, что и выливается в текст «UTF-16», закодированный в UTF-16. C другой стороны, исходник не является полностью корректным ни в ASCII, ни в UTF-16, так что можете открыть редактор и повеселиться.</p><h6>Итого</h6><p>PHP поддерживает Unicode, или точнее, любую кодировку довольно точно до тех пор, пока вы можете заставить парсер выполнять его работу, а разработчика – понимать, что он делает. Нужно быть внимательным только при работе со строками: деление, удаление пробелов, подсчет и все другие операции, требующие работать с символами, а не байтами. Если ничего не делать со строками, кроме чтения и вывода, то вряд ли возникнут проблемы, которых нет в других языках.</p><h5>Языки с поддержкой кодировок</h5><p>Так что же тогда для языка значит поддерживать Unicode? Javascript например поддерживает Unicode. На самом деле любая строка в Javascript кодирована в UTF-8. И это единственная кодировка, с которой работает Javascript. Вам просто не получить в <a href="/settings/prostoi-primer-sozdaniya-massiva-v-javascript-poleznye-pri-my.html">Javascript строку</a> не в UTF-8. Javascript поклоняется Unicode в такой степени, что в ядре языка просто нет инструментов для работы с другой кодировкой. Раз уж Javascript чаще всего исполняется в браузере, у вас не возникает проблем: браузер способен исполнить тривиальную логику кодирования и декодирования ввода-вывода.</p><p>Прочие языки просто поддерживают кодировки. <a href="/services/laboratornaya-rabota-izmerenie-eds-i-vnutrennego-soprotivleniya-istochnika-toka--.html">Внутренняя работа</a> проводится в какой-то одной кодировке, часто в UTF-16. Но это значит, что им нужно подсказывать в какой кодировке текст, или они сами будут пытаться ее определить. Необходимо указывать в какой кодировке сохранен исходный код, в какой кодировке сохранен файл, который будет прочитан, в какой кодировке нужно осуществлять вывод. Язык проведет конвертацию налету, если будет указано, что нужно использовать Unicode. Они делают все то, что в PHP нужно делать в полуавтоматическом режиме где-то на втором плане. Не лучше и не хуже, чем в PHP, просто по-другому. Хорошая новость в том, что строковые функции наконец просто работают, и вам не нужно думать, содержит ли строка многобайтные символы или не содержат, какие функции выбирать для работы и прочие вещи, которые нужно было бы делать в PHP.</p><h5>Дебри Unicode</h5><p>Раз уж Unicode решает столько различных проблем и работает в множестве различных сценариев, приходится платить за это копанием в дебрях. К примеру, в стандарте Unicode содержится инфорация о решении таких проблем, как унификации иеороглифоф ЯКК . Множество символов, общих для Японии, Китая и Кореи, изображены немного по разному. Или проблемы конвертации символов из нижнего регистра в верхний, наоборот или туда-обратно, которая оказывается не всегда такой простой, как с кодировками западно-европейских языков. Некоторые символы могут быть представлены разными пунктами. Буква ö к примеру может быть представлена пунктом U+00F6(«ЛАТИНСКАЯ МАЛЕНЬКАЯ БУКВА О С ДИЕРЕЗИСОМ») или как два пункта U+006F(«МАЛЕНЬКАЯ БУКВА O») И U+0308(«ПОДСТАВЛЯЕМЫЙ ДИАРЕЗИС»), что значит буква o с ¨. В UTF-8 это либо 2 байта, либо 3 байта, которые в обоих случаях представляют собой нормальный символ. Поэтому есть правила нормализации в стандарте, т.е. как конвертировать эти формы из одной в другую. Это и многое другое находится вне материалов статьи, но об этих моментах нужно знать. </p><h5>Опять ниасилил!</h5><ol><li>Текст – это всегда последовательность бит, которую нужно переводить на естественный язык с помощью таблиц. Неверная таблица – неверный символ.</li> <li>Нельзя работать напрямую с текстом – вы всегда работаете с битами, которые свернуты в абстракции. Ошибки связаны с ошибками в одной из абстракций.</li> <li>Системы, передающие друг другу информацию всегда должны указывать рабочую кодировку. Сайт например говорит браузеру, что он отдает информацию в UTF-8.</li> <li>В наше время UTF-8 обратно совместим с ASCII, несмотря на то, что может кодировать практически любой символ, и тем не менее относительно эффективен в большинстве случаев. Другие кодировки тоже находят применение, но должна быть <a href="/internet/samoproizvolnoe-otklyuchenie-televizora-televizor-vklyuchaetsya-i.html">серьезная причина</a>, чтобы мучиться с кодировками, которые поддерживают только часть Unicode.</li> <li>С проблемой соответствия байта и символа должны разбираться оба: и программа, и программист.</li> </ol><p>Теперь нечего оправдываться, когда вы вновь испортите текст.</p><p>Теги: Добавить метки</p> <p>Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье мы разобрали <span>создание таблиц в html </span> . В данной статье я бы хотел рассказать о проблеме, с которой вы обязательно столкнетесь (если ещё не столкнулись) в своей практике. А проблема эта связана с <b>кодировкой на сайте </b>. Нередко бывает такая ситуация: ты сидишь, что-то придумываешь, в итоге твои мысли выражаются в написанный код. Открываешь своё творение в браузере, а там написана полная ерунда, или как обычно данную ерунду называют — "кракозябры" . Тут очевидно одно, что <b>проблема с кодировкой на сайте </b>. Скорее всего у вас по умолчанию стоит кодировка <span>windows-1251 (кирилица) </span>, а браузер пытается открыть ваш файл в кодировке utf-8 . Кратко о том, что такое кодировка. Кодировка — это некая таблица, которая каждому символу ставит в соответствие какой-то <a href="/settings/programmirovanie-v-mashinnyh-kodah-i-na-yazyke-assemblera-direktivy.html">машинный код</a>. Соответственно наши русские буквы в одной кодировке имеют один код, в других — другой код. Друзья, используйте везде кодировку utf-8 и будет вам счастье. По-другому utf-8 называется Юникод .</p> <p>Давайте создадим тестовый документ в Notepad++ и запишем следующий код.</p><p> <html> <meta charset="utf-8"/> <head><title>Проблемы с кодировкой

Тестируем проблемы с кодировкой

В меню Notepad++ проверьте, чтобы наверху стояло "Кодировки" — "Кодировать в ANSI". Мы сейчас с вами искусственно создадим проблему с кодировкой. Попробуйте сейчас открыть данный файл в браузере. Мы увидим иероглифы. Дело здесь в том, что мы создали наш файл в кодировке ANSI (кирилица), а браузеру сообщили, что наш файл в кодировке utf-8 () .

Причины, по которым возникают проблемы с кодировкой на сайте :

1) Неправильное значение атрибута charset у мета-тега.

2) В меню Notepad++ проверьте, чтобы кодировка файла была utf-8. Это нужно сделать "Кодировки" — "Кодировать в UTF-8 (без BOM)". В интернете можно найти определение, что такое "BOM", но оно малопонятное. Как я понял, в начале документа, ставится неразрывный пробел с нулевой шириной. Он нам не нужен, поэтому всегда ставьте "без BOM".

3) Бывает такое, что первые два пункта выполнены, но на страницах сайта всё равно появляется ерунда. Здесь проблема может быть в настройках сервера,т.е. хостинг напрямую передаёт заголовки для наших файлов и выставляет кодировку по умолчанию. Давайте попробуем отучить его это делать. В корневой директории сайта должен быть файл .htaccess . С помощью этого файла можно вносить корректировки в работу хостинга. Если данного файла у вас нет, то его нужно создать. Удобно это сделать в редакторе Notepad++. В данном файле необходимо написать следующий код:

AddDefaultCharset UTF-8

Данной инструкцией мы говорим серверу, что у нас кодировка по умолчанию "utf-8". Если это не помогло, то нужно написать в этом же файле следующий код:

Charsetdisable on AddDefaultCharset Off

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

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

Логика файловой системы

Логически файловая система FreeBSD (как и любой Unix-системы) организована по древовидному принципу: в основании ее лежит корень (корневой каталог, обозначаемый символом / и именуемый также root-каталогом; последнее не должно путать с каталогом /root , который выполняет роль домашнего для суперпользователя).

От корневого каталога, который можно уподобить скорее стволу дерева, отходят ветви - вложенные в него подкаталоги, и побеги - обычные файлы. Последних, правда, немного: в версиях FreeBSD это некий энтропийный файл (/entropy) и файл с описанием авторских прав на систему /COPYRIGHT .

А вот подкаталогов в корневом каталоге довольно много, и некоторые из них устроены внутри весьма сложно, содержа в себе изрядное количество вложенных подкаталогов более глубоких уровней.

В принципе иерархия каталогов во всех Unix-системах похожа, поскольку регламентируется, во-первых, многолетней традицией, во-вторых - всякого рода стандартизирующими документами, в частности, FHS (Filesystem Hierarchy Standard), который ныне доступен в русском переводе (за который спасибо Виктору Костромину).

Стандарт FHS был разработан первоначально для упорядочивания структуры каталогов в многочисленных дистрибутивах Linux. И лишь позднее он был приспособлен для других Unix-подобных систем (в том числе и BSD-клана). Однако именно иерархия каталогов FreeBSD может послужить примером для образцового следования духу FHS. А буквально штучные отступления в ней от его буквы всегда функционально обусловлены.

Стандарт FHS покоится на двух основополагающих принципах - четком отделении в файловой иерархии каталогов разделяемых и неразделяемых, с одной стороны, и неизменяемых и изменяемых - с другой.

Противопоставление разделяемых и неразделяемых каталогов обусловлено изначально сетевой природой Unix вообще и FreeBSD в частности. То есть данные, относящиеся к локальной машине (например, файлы конфигурирования ее устройств) должны лежать в каталогах, отдельных от тех, содержимое которых доступны с других машин в сети, локальной или глобальной (примером чему являются не только пользовательские данные, но и программы).

Суть противопоставления неизменяемых и изменяемых каталогов легко пояснить на примере. Так, те же пользовательские программы по природе своей должны быть неизменяемыми (вернее, доступными для модификации только администратору системы, но не самому пользователю, применяющему их в своей работе). В то же время эти программы при своей работе генерируют не только файлы данных, скажем, тексты или изображения (изменяемая их природа ясна без комментариев), но всякого рода служебную информацию, типа log-файлов, временных файлов и тому подобного). Каковая и должна группироваться в каталогах, отделенных от собственно исполнимых файлов программ, необходимых для их запуска библиотек, конфигурационных файлов и т.д.

Четкое следовании концепции отчленения разделяемых и неразделяемых, неизменяемых и неизменяемых каталогов друг от друга позволяет, в рамках единой древовидной файловой иерархии, обособить отдельные ее ветви физически - то есть в виде самостоятельных файловых систем, размещенных на изолированных устройствах (дисках, дисковых слайсах, разделах; в общем случае - и на удаленных, связанных по сети, носителях, но об этом не будет сейчас разговора). Резонов к тому много - и повышение быстродействия, и увеличение надежности, и просто соображения удобства, - но и о них сейчас речь не пойдет. Потому что сейчас для нас важно только то, что эти ветви файлового древа должны быть инкорпорированы в общую файловую систему.

В Unix-системах всякий файл (в том числе и каталог) опознается системой не по ее имени, а по уникальному идентификатору его записи в таблице inodes . Существуют средства для того, чтобы эти файловые идентификаторы просмотреть. Одно из них - команда ls с опцией -i , которая выведет идентификаторы каждого именованного файла. Данная для корневого каталога -

$ ls -i /

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

2 ../ 2 ./ 2 dev/ 2 home/ 2 tmp/ 2 usr/ 2 var/ 3 cdrom/ 4 mnt/ 5 root/ 8257 dist/ 8258 bin/ 8294 proc/ 8295 sbin/ 16512 stand/ 24768 etc/ 24776 boot/

Из этого примера (относящегося к файловой системе машины, на которой эти строки пишутся) видно, что аж 7 каталогов имеют одинаковые цифровые идентификаторы, равные 2. Спрашивается, какая же здесь уникальность?

С первыми двумя элементами списка разобраться легко: ./ представляет собой обозначение текущего каталога (в данном случае корневого), а../ - каталога, родительского по отношению к текущему; а поскольку выше корня в файловой иерархии по определению ничего нет, то последний обозначает самого себя. Так что неудивительно, что./ и../ имеют один и тот же идентификатор - это разные обозначения (жесткие ссылки, или, иначе говоря, дублирующие имена) для одного и того же, корневого, каталога.

А вот то же, как кажется на первый взгляд, значение идентификатора для каталогов /dev , /home , /tmp , /usr , /var требует объяснения. Однако оно - простое: все это каталоги, в которые смонтированы самостоятельные файловые системы, либо расположенные на отдельных устройствах - дисковых партициях, как каталоги /home , /usr , /var , либо виртуальные файловые системы, не надстраивающие какое-либо реальное дисковой устройство (каталог /dev с файловой системой устройств и, в данном случае, каталог /tmp , в который смонтирована файловая система в оперативной памяти, разговор о которых еще предстоит). А поскольку таблица inodes - своя для каждой файловой системы, нет ничего удивительного в том, что корень каждой из них идентифицируется числом 2 - нумерация inodes в них идет в собственной системе отсчета.

Так вот, монтирование - это и есть включение файловой с системы в какой-либо из существующих в корневой системе каталог (не обязательно непосредственно в корне, он может быть любой степени вложенности, что проиллюстрируется чуть ниже). Без этого каталоги и файлы такой монтируемой системы просто недоступны. Это важно понимать, когда сталкиваешься выражениями вроде "создать файловую систему /usr ". Из сказанного выше очевидно, что создается-то (командой newfs) просто некая абстрактная файловая система, а свое "имя" она обретает только в момент монтирования в указанный каталог.

Интересно, что и идентификатор каталога для монтирования (он еще именуется точкой монтирования, mount point) обретается только в момент монтирования. Чтобы убедиться в этом, проведем простой эксперимент. В каталоге /mnt , предназначенном специально для монтирования временно подключаемых файловых систем) можно увидеть три подкаталога - /mnt/disk , mnt/iso , /mnt/usb (это в моей системе, я их создал для собственного удобства; изначально каталог /mnt во FreeBSD пуст). При старте системы в них ничего не монтируется, и обычное их состояние - быть пустыми. Если просмотреть их идентификаторы, то можно видеть нечто вроде такого:

$ ls -i /mnt 18 disk/ 24 iso/ 19 usb/

Теперь возьмем и смонтируем в /mnt/usb флэш-накопитель с USB-интерфейсом (именно для этого я его и предназначал) и повторим просмотр. И видим:

18 disk/ 24 iso/ 2 usb/

То есть идентификаторы каталогов, оставшихся пустыми (/mnt/disk и /mnt/iso) не изменились, а идентификатор каталога /mnt/usb волшебным образом изменился на 2. Ибо в момент монтирования он стал корневым для своей собственной файловой системы и точкой отсчета для исчисления inodes всех записанных на ней файлов.

Немного отвлечемся и вспомним о жестких ссылках, посредством которых одному и тому же inode и относящимся к нему блокам данных могут быть присвоены разные имена. Теперь понятно, почему все такие файлы-дублеры должны лежать в одной файловой системе: ведь в разных файловых системах - своя, не совпадающая, нумерация inodes , и идентифицировать их по номерам невозможно (иначе как бы система отличила каталоги /usr и /var из нашего примера - ведь имена файлов ей глубоко до лампочки). Для символических же ссылок, имеющих собственные inode (собственно, и почти ничего, кроме них) со своими идентификаторами, нумеруемыми в системе отсчета файловой системы, в которой они находятся, такого ограничения нет. И могут символические ссылки лежать где угодно (в том числе и на удаленной машине - не только на ином разделе).

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

Практика монтирования

Целям монтирования служит команда mount , выполняемая либо в ходе загрузки системы автоматически, либо - вручную, из командной строки. Собственно, в полном смысле автоматически в любом случае монтируется только корневая файловая система. Не обязательно лежащая на диске - при старте с rescue CD или иного страховочного носителя она может располагаться на виртуальном диске в оперативной памяти.

Однако процесс монтирования корневой файловой системы столь же неизбежен, как победа социализма в мировом масштабе: также, как социализм, не победив в мировом масштабе, просто утрачивает способность к существованию (что мы не так давно и наблюдали), так и ОС без корневой системы существовать не может. В Linux это вызывает kernel panic mode - примерно то состояние, в которое впали наши вожди лет 20 назад. Правда, они оказались крепче Linux"а и оклемались довольно быстро - так что до сих пор нас reboot"ят (или reboot? - а мы крепчаем:)). Впрочем, к делу монтирования, которое я попытаюсь вам сейчас представить, это не относится.

Так вот, для монтирования всех файловых систем, кроме корневой, необходимо предпринять некоторые действия. Сначала мы рассмотрим, как выполнить их руками, а потом - как увековечить в соответствующих конфигурационных файлах.

Итак, команда mount . Собственно, это - целое семейство программ, каждая из которой призвана монтировать файловые системы определенных типов - не только UFS, но и любой из числа поддерживаемых FreeBSD. Список таковых весьма обширен - получить о нем представление можно, просмотрев на сей предмет каталог /sbin:

$ ls -1 /sbin/mount*

что даст нам в ответ

/sbin/mount_cd9660* /sbin/mount_devfs* /sbin/mount_ext2fs* /sbin/mount_fdescfs* /sbin/mount_linprocfs* /sbin/mount_mfs* /sbin/mount_msdosfs* /sbin/mount_nfs* /sbin/mount_nfs4* /sbin/mount_ntfs* /sbin/mount_nullfs* /sbin/mount_procfs* /sbin/mount_std* /sbin/mount_udf* /sbin/mount_umapfs* /sbin/mount_unionfs*

Каждая команда из этого списка отвечает за монтирование своего типа файловой системы, к некоторым из которых мы вернемся дальнейшем. А пока заметим только собственно /sbin/mount , предназначенную для работы с UFS и UFS2.

Вызванная из командной строки, она требует двух аргументов - имени монтируемого устройства и точки монтирования (то есть каталога, в который должна монтироваться лежащая на нем файловая система). Имя устройства должно обозначать уже размеченную на существующем BSD-слайсе патрицию с созданной на ней файловой системой UFS2 (UFS), например,

$ mount /dev/ads0d /usr

смонтирует файловую систему на указанном разделе в каталог /usr корня файлового древа. Если файловая система на устройстве не создана или имеет тип, отличный от UFS/UFS2, последует сообщение об ошибке - указание на incorrect super block: в отличие от одноименной утилиты Linux, сама по себе команда mount во FreeBSD распознавать тип файловой системы не умеет.

К точке монтирования предъявляются следующие требования: а) каталог с таким именем должен существовать к моменту монтирования, и б) быть по возможности пустым. Первое - обязательно, второе же - не совсем. Монтирование в каталог с какими-либо файлами пройдет беспрепятственно (помнится, в Linux не так давно это вызывало крах системы), но все его содержимое станет недоступным вплоть до размонтирования. И если файлы, в нем содержащиеся, имеют играют существенную роль для какой-либо подсистемы, это может вызвать всякие нехорошие последствия. Например, если содержимое каталога /tmp будет блокировано монтированием туда какой-либо файловой системы во время работы оконной системы X, результатом будет скорее всего крах X-сервера. Благо, при необходимости можно осуществить объединенное монтирование (см. ниже).

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

  • async - обеспечит полностью асинхронный режим (не смотря на грозные предупреждения в предыдущих заметках, я потом расскажу о ситуации, когда это может быть оправдано);
  • sync - напротив, включение полностью синхронного режима (правда, не очень представляю, зачем это практически нужно);
  • noatime - очень полезная опция, которая предотвращает обновление атрибута времени последнего доступа к файлам, чем немало способствует производительности;
  • rdonly - монтирует файловую систему в режиме только для чтения (иногда это бывает необходимо);
  • union - та самая опция, которая позволяет выполнить объединенное монтирование, при котором прежнее содержимое каталога mount point остается видимым; правда - с некоторыми ограничениями - см. man (8) mount .

Есть еще несколько значений опции -o , запрещающих размещение на смонтированной файловой системе файлов определенных разновидностей, например, исполняемых (-o noexec), файлов устройств (-o nodev) или файлов с т.н. битом суидности. Однако они имеют практическое значение в основном для администраторов серверов и служат целям безопасности. На настольной же машине обычной формой монтирования будет нечто вроде этой:

$ mount -o noatime /dev/ads0d /usr; $ mount -o noatime /dev/ads0e /var; $ mount -o noatime /dev/ads0f /home

Все сказанное относилось только к монтированию файловых систем FreeBSD. Однако на практике часто возникает необходимость инкорпорации в ее древо каталогов файловых систем других типов. Особенно часто это требуется для ISO9660 (обычная файловая система для всех компакт-дисков, кроме Mac"овских) и FAT"ов разного рода. В этом случае соответствующая случаю команда монтирования должна быть вызвана явно, например,

$ mount_cd9660 /dev/acd0 /cdrom

для монтирования компакта, или

$ mount_msdosfs /dev/ad## /mnt

для FAT"а любого рода (включая FAT32). Впрочем, сделать это можно и косвенно, указанием команде mount опции -t тип_файловой_системы. Так, команда

$ mount -t ext2fs /dev/ad## /mnt/linux

смонтирует файловую систему Linux (если соответствующая возможность включена в ядро). При этом стандартный mount для BSD-разделов просто подменяется командой /mount_ext2fs , призванной монтировать разделы ext2fs (и ext3fs тоже - но, естественно, без всяких функций журналирования). То есть форма

$ mount -t fstype ... ...

будет полным эквивалентом команды

$ mount_fstype ... ...

Все операции по монтированию файловых систем (в том числе и на сменных носителях) во FreeBSD требуют прав суперпользователя. В числе значений опции -o здесь, в отличие от Linux-варианта команды mount , нет параметра -o user , разрешающего монтирование обычным пользователям. Правда, есть несколько способов обойти это, о чем говорится в специальной заметке .

Настройка автоматического монтирования

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

Для автоматического монтирования программа mount запускается в процессе начальной загрузки из инициализационных сценариев. Она отыскивает свой конфигурационный файл - /etc/fstab , и монтирует все, что в нем обнаружит, за некоторыми (оговоренными ниже исключениями).

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

Файл /etc/fstab - это простенькая база данных в текстовом формате (разделение полей - пробелами или табуляцией), включающая следующие поля:

  • Device - имя файла устройства, на котором расположена файловая система, аналогично первому аргументу команды mount при ручном ее использовании;
  • Mountpoint - точка монтирования (соответствует второму аргументу команды mount);
  • FStype - тип файловой системы, указываемый также, как значение опции -t ;
  • Options - дополнительные опции монтирования, аналогично значениям опции -o ;
  • Dump - условия выполнения резервного копирования файловой системы утилитой утилитой dump ;
  • Pass# - условия проверки файловой системы утилитой fsck .

В свежеустановленной FreeBSD /etc/fstab в обязательном порядке будет включать следующие записи (пример для 1-го слайса Master-диска на 1-м IDE-канале):

# Device Mountpoint FStype Options Dump Pass# /dev/ad0s1a / ufs rw 1 1 /dev/ad0s1b none swap sw 0 0

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

/dev/ad0s1d /var ufs rw 0 0 /dev/ad0s1e /usr ufs rw 0 0 /dev/ad0s1f /tmp ufs rw 0 0

/dev/ad0s1g /home ufs rw 0 0

отвечающая за файловую систему с домашними каталогами пользователей.

Очевидно, что в поле Options можно добавить любые доступные (и разумные) значения опции -o (через запятую, без пробелов), например, noatime для всех файловых систем, а для /tmp - еще и async , ведь для содержимого этого каталога не предполагается сохранение после перезагрузки.

Сказанное выше относилось к файловым системам, монтируемым при старте автоматически. Однако никто не мешает сделать в /etc/fstab записи для систем, подключаемым время от времени - в этом случае их можно будет монтировать по упрощенной схеме (именно это я и имел ввиду выше под полуавтоматическим режимом). Так, для CD-накопителя можно добавить строку (на самом деле она автоматически появляется при генерации файла /etc/fstab , если в sysinstall в качестве источника инсталляции выбирался CD)

/dev/acd0 /cdrom cd9660 ro,noauto 0 0

в которой опции, как нетрудно догадаться, предписывают отказ от монтирования при старте (noauto) и режим "только для чтения" (ro). После чего для монтирования CD достаточно будет указать только mount point -

$ mount /cdrom

или. напротив, имя файла устройства

$ mount /dev/acd0

Аналогичные записи можно сделать для всех сменных накопителей (Zip, USB-драйвов, даже флоппи-дисков) и для не-BSD разделов (FAT или Ext2fs). К слову сказать - монтировать файловые системы по упрощенной схеме можно сразу после внесения изменений в /etc/fstab , не дожидаясь перезагрузки машины.

Размонтирование

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

Однако в ряде случаев (например, при подключении или отключении механизма Soft Updates или для выполнения проверки на целостность) возникает необходимость ручного размонтирования (и повторного монтирования) файловых систем, для чего служит команда umount . Она требует единственного аргумента - указания точки монтирования файловой системы, "изымаемой" из древа каталогов, например:

$ umount /tmp

или, как и в случае с полуавтоматическим монтированием, имени файла "выключаемого" устройства:

$ umount /dev/ad#s#?

Одной строкой можно размонтировать несколько файловых систем:

$ umount /usr /var /home

А можно - все смонтированные файловые системы или все файловые системы, перечисленные в файле /etc/fstab (кроме корневой), для чего потребуются опции

$ umount -A

$ umount -a

соответственно. Есть и возможность размонтирования файловых систем определенных типов путем указания значений опции -t . Так, команда

$ umount -t ufs

размонтирует только BSD-разделы, не затронув CD и всего остального, что задействовано в системе.

Файловые системы в момент размонтирования не должны использоваться, то есть не должно быть обращений к находящимся на них файлам. Так, нахождение в каком-либо каталоге файловой системы - достаточное основание для отказа в ее размонтировании (с выдачей сообщения типа device busy), почему ни одной из перечисленных выше команд и не удастся размонтировать корневую файловую систему. Поводом для отказа в размонтировании будет и считывание файла данных какой-либо программой - как и при удалении файла, открытый любым процессом дескриптор файла сделать это не позволит.

Впрочем, можно размонтировать и используемую файловую систему - для этого команду umount потребуется дать с опцией -f (от force - то есть насильно). Правда, это может привести к ошибкам, так что без острой необходимости лучше к ней не прибегать. И на корневую файловую систему опция принудительного размонтирования воздействия не окажет.

Массовое монтирование

Для продолжения работы после выполнения низкоуровневых операций с файловыми системами их потребуется смонтировать обратно. Это можно сделать не только без перезагрузки, но и без нудного индивидуального монтирования. Достаточно прибегнуть к опции -a:

$ mount -a

посредством которой будут смонтированы все файловые системы, для которых имеются записи в /etc/fstab . При этом будет предпринята попытка смонтировать и те из них, которые помечены флагом noauto . Чтобы избежать этого, можно дополнительно определить тип файловой системы. То есть команда

$ mount -a -t ufs

смонтирует только BSD-разделы, не покушаясь на CD или флэш-накопители. А можно, напротив, исключить из процесса глобального монтирования какие-то из перечисленных в /etc/fstab файловых систем, например, ненужные в данный момент FAT"ы:

$ mount -a -t nomsdosfs

Преамбула вместо заключения

К слову сказать, команда mount без опций и аргументов (а в такой форме, в отличие от всех рассмотренных выше случаев, ее может дать и обычный пользователь) выведет список смонтированных в данный момент файловых систем с указанием точки монтирования, условий оного и режима работы. Например, для машины, на которой пишутся эти строки, вывод ее будет выглядеть так:

/dev/ad0s1a on / (ufs, local, noatime, soft-updates) devfs on /dev (devfs, local) /dev/ccd0e on /var (ufs, local, noatime, soft-updates) /dev/ccd1e on /usr (ufs, local, noatime, soft-updates) /dev/ccd2e on /home (ufs, local, noatime, soft-updates) /dev/md0 on /tmp (ufs, local, noatime, async)

Первая строка вывода показывает, что партиция /dev/ad0s1a смонтирована у нас в корневом каталоге, несет на себе файловую систему UFS (конкретно в данном случае - UFS2, но в выводе команды mount они не различаются) с задействованным механизмом Soft Updates, является локальной (то есть расположена на диске этой машины - сетевые диски также монтируются командой mount) и не подвержена обновлению атрибута atime .

$ more /etc/fstab /dev/ad0s1b none swap sw 0 0 /dev/ar0s1b none swap sw 0 0 /dev/ad0s1a / ufs rw,noatime 1 1 /dev/ccd0e /var ufs rw,noatime 2 2 /dev/ccd1e /usr ufs rw,noatime 2 2 /dev/ccd2e /home ufs rw,noatime 2 2 /dev/acd0 /cdrom cd9660 ro,noauto 0 0 /dev/da0s1 /mnt/usb ext2fs rw,noauto,noatime 0 0 /dev/md0 /tmp mfs rw,noatime,async,-s32m 2 0

то увидим, что одной из строк вывода

Devfs on /dev (devfs, local)

вообще нет соответствия среди его записей. Что это за устройства и файловые системы?

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

Подробная инструкция с пояснениями

Выбор имени жесткого диска

Для начала нужно определить имя устройства, которое мы только что добавили. В этом нам поможет следующая команда:

Geom disk list

Или же вот такая команда:

Camcontrol devlist

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

До установки нового устройства мы знали, что наша система установлена на ada0, значит по логике вещей наш новый диск ada1. Это вы можете определить по названию нового устройства, его серийному номеру или же объему.

Теперь проверим, имеется ли разметка на нашем новом диске

Gpart show ada1

Диск не имеет никакой разметки.

Удаление существующей разметки

Если диск уже использовался и есть необходимость удалить с него разметку, просто выполните:

Gpart destroy -F ada1

Создание разметки GPT

Для начала мы должны создать разметку диска. Крайне рекомендую забыть о MBR и перейти на новую, более удобную и функциональную - GPT.

Создаем разметку GPT на диске, затем проверяем, что вышло:

Gpart create -s gpt /dev/ada1 gpart show ada1

Теперь у нас диск имеет разметку GPT. Из вывода можно увидеть, что абсолютно весь диск, начиная с LBA 34 и заканчивая LBA 8388541 пуст. LBA 0−33 - зарезервированы системой под таблицу разделов.

Допустим, нам необходимо создать два раздела на этом диске:

  • swap - раздел подкачки
  • data - раздел типа ufs для хранения каких либо, необходимых нам, данных.

Создание разделов (слайсов)

Если установка производится на современные жесткие диски, у которых размер сектора = 4 кб, то при создании разделов (партиций) необходимо использовать выравнивание. Можно поступить двумя способами: 1) если указываем параметры раздела в блоках, то номер блока вводить кратным 8, например: -b 40 ; 2) если указываем размер раздела в байтах, либо не указываем вообще начало и размер, использовать параметр -a 4k , который подгонит начало и конец раздела под секторы, размером 4 кб. Так как мы в данном примере производим тестовую установку на виртуальный жесткий диск, то этого можно не делать. В любом случае перед созданием разделов нужно точно знать размер сектора вашего накопителя, иначе это выльется жуткими тормозами в работе.

Теперь создадим разделы. Для этого существует команда gpart add с различными параметрами. Первый параметр -t - указывает на тип создаваемой файловой системы. В нашем случае будет использовано два типа: freebsd-swap и freebsd-ufs. Далее идут два необязательных параметра: -b - указывает на номер LBA, начиная с которого необходимо создать раздел. Если не указать данный параметр, то раздел будет создан автоматически с первого свободного LBA. -s - указывает на размер раздела в LBA. Размер одного блока LBA = 512 байт. Желательно указывать в количестве блоков LBA, но можно и в кило/мега/гига/… байтах (суффикс k/M/G). Если не указать данный параметр, то раздел будет создан до максимально возможного LBA в пределах пустой области. Также в качестве параметра можно указать метку раздела, например: -l swap1 - в этом случае будет создана метка /dev/gpt/swap1, по которой можно более удобно обращаться к разделу. Последним обязательным параметром идет путь к диску. В нашем случае: /dev/ada1.

Давайте создадим два раздела, а затем посмотрим, что у нас получилось. Первый раздел будем создавать без указания начального LBA, но с указанием размера 1 Гб (2097152 блоков). Второй раздел создадим без указания начального LBA и без указания размера - таким образом он будет создан на всем свободном пространстве.

Gpart add -t freebsd-swap -s 2097152 /dev/ada1 gpart add -t freebsd-ufs /dev/ada1 gpart show ada1

Размер можно указывать в байтах, а не блоках. Это значительно удобней. Единственный минус - система не всегда может корректно рассчитать количество блоков. Возможны случаи, когда на диске останется пустовать некоторое количество блоков при указании размера раздела в байтах.

Создание файловой системы (форматирование)

Разделы типа swap форматировать нет необходимости. А вот разделы типа ufs перед использованием должны быть отформатированы. Правильнее сказать: на них должна быть создана файловая система.

Для того, чтобы создать файловую систему на втором разделе, достаточно выполнить следующую команду:

Newfs -U /dev/ada1p2

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

Монтирование

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

Для того, чтобы перемонтировать все разделы согласно файла /etc/fstab, просто выполним команду:

Mount -a

Как видно из вывода, раздел /dev/ada1p2 смонтирован. Теперь посмотрим, что произошло с разделом SWAP. Выполним команду:

Как видно, новый раздел SWAP не смонтирован. Чтобы смонтировался SWAP, необходимо его включить специальной командой:

Swapon /dev/ada1p1

Точно так же при помощи команды swapoff нужно отключать раздел SWAP перед тем, как произвести над ним какие-то действия.

На этом все действия по добавлению нового жесткого диска в систему завершены.

Краткая инструкция

Дано : жесткий диск /dev/ada1

Цель : удалить существующую разметку, создать новую разметку GPT, создать два раздела: подкачка и данные и подключить их к рабочей системе.

После каждого действия выполняйте gpart show , чтобы наблюдать за результатом. Последовательность действий:

  1. Удалить существующую разметку: gpart destroy -F ada1
  2. Создать новую разметку: gpart create -s gpt /dev/ada1
  3. Создать два раздела: подкачка и данные: gpart add -t freebsd-swap -s 2097152 /dev/ada1 gpart add -t freebsd-ufs /dev/ada1
  4. Создать файловую систему UFSv2 на втором разделе: newfs -U /dev/ada1p2
  5. Добавить в файл /etc/fstab строки для автомонтирования при загрузке: /dev/ada1p1 none swap sw 0 0 /dev/ada1p2 /mnt ufs rw 2 2
  6. Смонтировать новый раздел (команда монтирует все разделы из файла /etc/fstab): mount -a
  7. Включить в работу новый раздел swap командой: swapon /dev/ada1p1

На этом настройка завершена.




Top