From c6998683560c9d9ddf78eef473aabb9e70321a44 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Mon, 9 Dec 2013 13:37:19 +0300 Subject: [PATCH 01/53] Pidgin: remove mention about using XMPP to chat in vk.com --- desktop-software/internet/im/pidgin/index.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/desktop-software/internet/im/pidgin/index.txt b/desktop-software/internet/im/pidgin/index.txt index 7a010f4..d015c25 100644 --- a/desktop-software/internet/im/pidgin/index.txt +++ b/desktop-software/internet/im/pidgin/index.txt @@ -66,8 +66,7 @@ image::images/pidgin-settings.png[Добавление учётной запис [NOTE] Вы можете использовать Pidgin для общения в социальных сетях. Например, вы можете почитать о том, как настроить Pidgin для -http://www.facebook.com/sitetour/chat.php[Facebook] и -http://vk.com/help.php?page=jabber[Вконтакте]. +http://www.facebook.com/sitetour/chat.php[Facebook]. //application path За дополнительной информацией по использованию Pidgin можно обратиться к From 46ba44f9050bc3ab008873e627191cec11e5cbce Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Thu, 12 Dec 2013 16:21:52 +0300 Subject: [PATCH 02/53] Add description of some developing programs for schools include description about: basic (BASIC-256) pascal (Free Pascal, Lazarus) c/c++ (Code::Blocks) kumir --- school-software/programming/basic/index.txt | 10 ++++++ .../programming/codeblocks/index.txt | 12 +++++++ school-software/programming/index.txt | 8 +++++ school-software/programming/kumir/index.txt | 18 ++++++++++ school-software/programming/pascal/index.txt | 33 +++++++++++++++++++ 5 files changed, 81 insertions(+) create mode 100644 school-software/programming/basic/index.txt create mode 100644 school-software/programming/codeblocks/index.txt create mode 100644 school-software/programming/kumir/index.txt create mode 100644 school-software/programming/pascal/index.txt diff --git a/school-software/programming/basic/index.txt b/school-software/programming/basic/index.txt new file mode 100644 index 0000000..b2b3883 --- /dev/null +++ b/school-software/programming/basic/index.txt @@ -0,0 +1,10 @@ +=== BASIC === + +[float] +==== BASIC-256 ==== + +BASIC-256 — открытая реализация языка программирования Бейсик и одновременно — +интегрированная среда разработки для него. Ориентирована на обучение +программированию школьников. Язык имеет встроенный графический режим, +позволяющий в считанные минуты рисовать на экране картинки, и русскоязычную +документацию. diff --git a/school-software/programming/codeblocks/index.txt b/school-software/programming/codeblocks/index.txt new file mode 100644 index 0000000..ae6b32e --- /dev/null +++ b/school-software/programming/codeblocks/index.txt @@ -0,0 +1,12 @@ +=== С/C++ === + +[float] +==== Code::Blocks ==== + +Code::Blocks — свободная кроссплатформенная среда разработки. Code::Blocks +написана на С++ и использует библиотеку wxWidgets. Имея открытую архитектуру, +может масштабироваться за счёт подключаемых модулей. + +Code::Blocks поддерживает языки программирования С/С++, D (с ограничениями). Включает +в себя встроенный интерфейс под множество компиляторов, как свободных, так и +проприетарных. diff --git a/school-software/programming/index.txt b/school-software/programming/index.txt index 1e52a72..bd56aa8 100644 --- a/school-software/programming/index.txt +++ b/school-software/programming/index.txt @@ -18,3 +18,11 @@ include::kturtle/index.txt[] include::geany/index.txt[] + +include::codeblocks/index.txt[] + +include::pascal/index.txt[] + +include::basic/index.txt[] + +include::kumir/index.txt[] diff --git a/school-software/programming/kumir/index.txt b/school-software/programming/kumir/index.txt new file mode 100644 index 0000000..885aa41 --- /dev/null +++ b/school-software/programming/kumir/index.txt @@ -0,0 +1,18 @@ +=== kumir === + +КуМир (Комплект Учебных МИРов) -- система программирования, предназначенная для +поддержки начальных курсов информатики и программирования в средней и высшей +школе. + +Особенности системы КуМир + +В системе КуМир используется школьный алгоритмический язык с русской лексикой и +встроенными исполнителями Робот и Чертёжник. При вводе программы КуМир +осуществляет постоянный полный контроль ее правильности, сообщая на полях +программы об всех обнаруженных ошибках. При выполнении программы в пошаговом +режиме КуМир выводит на поля результаты операций присваивания и значения +логических выражений. Это позволяет ускорить процесс освоения азов +программирования. Кумир работает в операционных системах Windows или Linux. + +Система Кумир разработана в НИИСИ РАН по заказу Российской Академии Наук и +распространяется свободно на условиях лицензии GNU 2.0. diff --git a/school-software/programming/pascal/index.txt b/school-software/programming/pascal/index.txt new file mode 100644 index 0000000..72bb2cf --- /dev/null +++ b/school-software/programming/pascal/index.txt @@ -0,0 +1,33 @@ +=== Pascal === + +[float] +==== Free Pascal ==== + +Free Pascal (полное название Free Pascal Compiler, часто используется +сокращение FPC) -- свободно распространяемый компилятор языка программирования +Pascal. Помимо компилятора, в дистрибутиве также присутвует консольная +интегрированная среда разработки для Free Pascal. (Запускается из терминала +командой `fp`) + +[float] +==== Lazarus ==== + +Lazarus -- свободная среда разработки программного обеспечения на языке Object +Pascal для компилятора Free Pascal с графическим интерфейсом. Интегрированная +среда разработки предоставляет возможность кроссплатформенной разработки +приложений в Delphi-подобном окружении. + +Функции: + +* поддерживает преобразование проектов Delphi; +* реализован основной набор элементов управления; +* редактор форм и инспектор объектов максимально приближены к Delphi; +* интерфейс отладки (используется внешний отладчик GDB); +* простой переход для Delphi программистов благодаря близости LCL к VCL; +* полностью юникодный (UTF-8) интерфейс и редактор и поэтому отсутствие + проблем с портированием кода, содержащего национальные символы; +* мощный редактор кода, включающий систему подсказок, гипертекстовую + навигацию по исходным текстам, автозавершение кода и рефакторинг; +* форматирование кода «из коробки», используя механизмы Jedi Code Format; +* поддержка множества типов синтаксиса Pascal: Object Pascal, Turbo Pascal, + Mac Pascal, Delphi (поддерживаются со стороны компилятора). From f111a70159c695755b3b884420324f0eac3601c5 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Sat, 14 Dec 2013 17:10:10 +0300 Subject: [PATCH 03/53] Update information about button "Menu xfce" change "Menu xfce" to "Application menu" --- desktop-xfce/index.txt | 6 +++--- system-management/acc/gui/acc-xfce.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/desktop-xfce/index.txt b/desktop-xfce/index.txt index 4dc6828..97a09df 100644 --- a/desktop-xfce/index.txt +++ b/desktop-xfce/index.txt @@ -47,7 +47,7 @@ image::images/desktop-xfce.png[Рабочий стол Xfce 4,align="center"] На левой части панели расположены: -* основное меню -- *Меню Xfce*, обеспечивающее доступ ко всем графическим приложениями и +* основное меню -- *Меню приложений*, обеспечивающее доступ ко всем графическим приложениями и изменениям настроек; * кнопка *Скрыть окна и показать рабочий стол*, которая позволяет свернуть все открытые окна для быстрого доступа к рабочему столу; @@ -72,7 +72,7 @@ image::images/desktop-xfce.png[Рабочий стол Xfce 4,align="center"] == Запуск приложений == В левой части панели рабочего стола Xfce находится меню запуска приложений -Через *Меню Xfce* осуществляется запуск всех приложений, +Через *Меню приложений* осуществляется запуск всех приложений, установленных на ваш компьютер. Меню запуска приложений состоит из нескольких разделов: @@ -86,7 +86,7 @@ image::images/desktop-xfce.png[Рабочий стол Xfce 4,align="center"] == Диспетчер настроек == //application path -Диспетчер настроек находится в *Меню Xfce* в разделе *Настройки*. +Диспетчер настроек находится в *Меню приложений* в разделе *Настройки*. В диспетчере настроек объединены настройки различных компонентов Xfce. Они позволяют настроить Xfce под свои нужды. Все приложения, входящие в состав диспетчера настроек, сопровождаются руководством пользователя. Каждое руководство diff --git a/system-management/acc/gui/acc-xfce.txt b/system-management/acc/gui/acc-xfce.txt index 538c149..1b04b24 100644 --- a/system-management/acc/gui/acc-xfce.txt +++ b/system-management/acc/gui/acc-xfce.txt @@ -1,2 +1,2 @@ //application path -* в графической среде Xfce *Меню Xfce -> Настройки -> Центр управления системой*; +* в графической среде Xfce *Меню приложений -> Настройки -> Центр управления системой*; From 0c48050169e67b639c24d49187488c4280a8aff9 Mon Sep 17 00:00:00 2001 From: Alexandr Boltris Date: Sat, 14 Dec 2013 20:57:41 +0300 Subject: [PATCH 04/53] desktop-kde: update texts --- desktop-kde/index.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/desktop-kde/index.txt b/desktop-kde/index.txt index 06083cd..f483086 100644 --- a/desktop-kde/index.txt +++ b/desktop-kde/index.txt @@ -71,14 +71,14 @@ image::images/kde-panel.png[Панель KDE] Панель KDE может содержать дополнительные виджеты, делающие работу с ней более удобной. Для самостоятельного добавления виджетов на панель щёлкните на кнопке *Инструменты Plasma* (кнопка с желтеющей при наведении на неё курсора мыши каплей -в _правом верхнем_ углу экрана) и выберите *Разблокировать изменение виджетов*. Затем, +в _правом верхнем_ углу экрана) и выберите *Разблокировать виджеты*. Затем, щёлкните по появившейся в _правом нижнем_ углу панели KDE и желтеющей при наведении на неё -курсора мыши кнопке *Настройка панели*. Выберите *Добавить виджеты*. Желаемые +курсора мыши кнопке *Настройка панели*. Выберите *Добавить виджеты...*. Желаемые виджеты появятся на панели при двойном щелчке по ним левой кнопкой мыши. Таким способом вы можете добавлять любые другие понравившиеся вам виджеты. После добавления виджетов заблокируйте их изменение: щёлкните по кнопке *Инструменты Plasma* -и выберите *Заблокировать изменение виджетов*. +и выберите *Заблокировать виджеты*. Кнопка *Настройка панели* с жёлтой каплей в правом нижнем углу экрана служит и для доступа к другим настройкам параметров панели, таким как размер, положение и т.п. @@ -97,7 +97,7 @@ image::images/kde-desktop-with-widgets.png[Виджеты на рабочем с Для того чтобы получить возможность добавлять виджеты на рабочий стол, нужно сначала разблокировать их изменение по аналогии с добавлением виджетов на панель. Нажмите на кнопку *Инструменты Plasma* в правом верхнем углу экрана и выберите -*Разблокировать изменение виджетов*. +*Разблокировать виджеты*. image::images/kde-widgets-unlock.png[Добавление виджетов] @@ -111,7 +111,7 @@ image::images/kde-widgets-select.png[Выбор виджетов] перетащив из списка на область рабочего стола. Если текущий набор виджетов кажется вам недостаточным или вы не нашли в списке нужного вам мини-приложения, можно загрузить дополнительные виджеты из Интернета, выбрав -один из пунктов выпадающего меню *Другие виджеты...*. +один из пунктов выпадающего меню *Получить новые виджеты*. image::images/kde-widgets-rotate.png[Виджет с панелью управления] From 61cbc4a5ccae518ea1f87a78a1e717cb0bbc176e Mon Sep 17 00:00:00 2001 From: Alexandr Boltris Date: Sat, 14 Dec 2013 20:58:21 +0300 Subject: [PATCH 05/53] desktop-software dolphin: update texts --- desktop-software/file-manager/dolphin/index.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/desktop-software/file-manager/dolphin/index.txt b/desktop-software/file-manager/dolphin/index.txt index b70362a..51af299 100644 --- a/desktop-software/file-manager/dolphin/index.txt +++ b/desktop-software/file-manager/dolphin/index.txt @@ -40,8 +40,8 @@ Dolphin, как и прочие приложения KDE, содержит ру //application path [TIP] -По умолчанию основное меню скрыто. Отобразить его можно из меню *Настройки и -управление Dolphin -> Показать меню*. +По умолчанию основное меню скрыто. Отобразить его можно из меню *Управление -> +Показать меню*. ==== Быстрый доступ к нужным файлам ==== @@ -51,7 +51,7 @@ Dolphin, как и прочие приложения KDE, содержит ру популярные папки. Это можно сделать различными способами. Например: * вызвать в свободной области панели *Точки входа* контекстное меню, выбрать в нём пункт - *Добавить...* и заполнить предложенные поля открывшегося диалога; + *Добавить запись...* и заполнить предложенные поля открывшегося диалога; * вызвать контекстное меню на значке папки, которую вы хотите добавить на панель, и выбрать в нём пункт *Добавить в «Точки входа»*. From 9e2ca8518becb681d342e6475c34947848304438 Mon Sep 17 00:00:00 2001 From: Alexandr Boltris Date: Sat, 14 Dec 2013 20:58:41 +0300 Subject: [PATCH 06/53] desktop-software thunderbird: update texts --- desktop-software/internet/mail/thunderbird/index.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop-software/internet/mail/thunderbird/index.txt b/desktop-software/internet/mail/thunderbird/index.txt index f5e6a24..e3c7bee 100644 --- a/desktop-software/internet/mail/thunderbird/index.txt +++ b/desktop-software/internet/mail/thunderbird/index.txt @@ -43,7 +43,7 @@ image::images/thunderbird.png[Почтовый клиент Thunderbird] Добавить дополнительную учётную запись можно также при помощи мастера *Добро пожаловать в Thunderbird*. Вызвать его можно выбрав в левой части окна программы одну из существующих учётных записей, затем нажав кнопку *Создать -учётную запись* в открывшемся в правой части окна списке. +учётную запись: Электронная почта* в открывшемся в правой части окна списке. Если вы имеете почтовый ящик на сервисе Gmail, то вся настройка происходит автоматически -- вам необходимо ввести только имя учётной записи и пароль. From 34399174e8b6578a3ad4665e7d2319265df05d87 Mon Sep 17 00:00:00 2001 From: Alexandr Boltris Date: Sat, 14 Dec 2013 21:23:00 +0300 Subject: [PATCH 07/53] packages/apt-get: update example text --- packages/apt-get.txt | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/packages/apt-get.txt b/packages/apt-get.txt index e1669b1..623315d 100644 --- a/packages/apt-get.txt +++ b/packages/apt-get.txt @@ -327,23 +327,18 @@ Running /usr/lib/rpm/posttrans-filetriggers ---------------------------- # apt-get remove filesystem -Обработка файловых зависимостей... Завершено Чтение списков пакетов... Завершено Построение дерева зависимостей... Завершено Следующие пакеты будут УДАЛЕНЫ: -basesystem filesystem ppp sudo -Внимание: следующие базовые пакеты будут удалены: -В обычных условиях этого не должно было произойти, надеемся, вы точно -представляете, чего требуете! -basesystem filesystem (по причине basesystem) -0 пакетов будет обновлено, 0 будет добавлено новых, 4 будет -удалено(заменено) и 0 не будет обновлено. -Необходимо получить 0B архивов. После распаковки 588kБ будет -освобождено. -Вы собираетесь совершить потенциально вредоносное действие -Для продолжения, наберите по-английски 'Yes, I understand this may be -bad' -(Да, я понимаю, что это может быть плохо). + ... +ВНИМАНИЕ: Будут удалены важные для работы системы пакеты +Обычно этого делать не следует. Вы должны точно понимать возможные последствия! + ... +0 будет обновлено, 0 новых установлено, 2648 пакетов будет удалено и 0 не будет обновлено. +Необходимо получить 0B архивов. +После распаковки будет освобождено 8994MB дискового пространства. +Вы делаете нечто потенциально опасное! +Введите фразу 'Yes, do as I say!' чтобы продолжить. ---------------------------- Каждую ситуацию, в которой APT выдаёт такой запрос, необходимо рассматривать From b465cec16fb8f56568577f0043e21f66092f28a3 Mon Sep 17 00:00:00 2001 From: Alexandr Boltris Date: Sat, 14 Dec 2013 21:29:33 +0300 Subject: [PATCH 08/53] admin-basics/os-principles: little update --- admin-basics/os-principles/index.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/admin-basics/os-principles/index.txt b/admin-basics/os-principles/index.txt index f4a3bd3..50bf8ed 100644 --- a/admin-basics/os-principles/index.txt +++ b/admin-basics/os-principles/index.txt @@ -60,6 +60,7 @@ DOS/Windows). Текущий каталог обозначается `./`. * `/etc` -- файлы конфигурации; * `/home` -- личные каталоги пользователей; * `/lib` -- системные библиотеки, модули ядра; +* `/lib` -- 64-битный системные библиотеки; * `/media` -- каталоги для монтирования файловых систем сменных устройств; * `/mnt` -- каталоги для монтирования файловых систем сменных устройств и внешних файловых систем; @@ -113,6 +114,8 @@ DOS/Windows). Текущий каталог обозначается `./`. * `/boot` -- место, где хранятся файлы, необходимые для загрузки ядра системы; * `/lib` -- место, где располагаются файлы динамических библиотек, необходимых для работы большей части приложений, и подгружаемые модули ядра; +* `/lib64` -- место, где располагаются файлы 64-битных динамических библиотек, +необходимых для работы большей части приложений; * `/bin` -- минимальный набор программ, необходимых для работы в системе; * `/sbin` -- набор программ для административной работы с системой (программы, необходимые только суперпользователю); @@ -174,7 +177,7 @@ DOS/Windows). Текущий каталог обозначается `./`. * и т.д. Диски обозначаются `/dev/sdX`, где `X` -- `a`, `b`, `c`, `d`, `e`, ... в -зависимости от порядкового номера диска на шине. +порядке обнаружения системой. Раздел диска обозначается числом после его имени. Например, `/dev/sdb4` -- четвертый раздел второго диска. From da93910e8c73999b342e94d3c9671cd5b4b9be09 Mon Sep 17 00:00:00 2001 From: Artem Zolochevskiy Date: Sun, 15 Dec 2013 00:53:35 +0300 Subject: [PATCH 09/53] docs.spec: version 6.0 -> 7.0, add docs-school-teacher distro to Conflicts list --- docs.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs.spec b/docs.spec index 1f6d7e1..ae26d75 100644 --- a/docs.spec +++ b/docs.spec @@ -4,10 +4,10 @@ %define _documentationdir %_defaultdocdir/documentation %define _docsinstalldir %_defaultdocdir/%variant -%define variants docs-office-server docs-backup-server docs-desktop docs-school-master docs-school-junior docs-school-lite docs-school-server docs-kdesktop docs-school-terminal docs-school-newlite docs-centaurus docs-simply-linux docs-lxdesktop docs-lxdesktop-lite +%define variants docs-office-server docs-backup-server docs-desktop docs-school-master docs-school-junior docs-school-lite docs-school-server docs-kdesktop docs-school-terminal docs-school-newlite docs-centaurus docs-simply-linux docs-lxdesktop docs-lxdesktop-lite docs-school-teacher Name: docs-%variant -Version: 6.0 +Version: 7.0 Release: alt1 Summary: %Variant documentation From 3347be8f975e18d5a207300c56b50f388e47a171 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Mon, 16 Dec 2013 15:16:40 +0300 Subject: [PATCH 10/53] remove mention about date of "end of P7 support" fix typos in same file --- whatis-alt/index.txt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/whatis-alt/index.txt b/whatis-alt/index.txt index 47ae4ab..ddace63 100644 --- a/whatis-alt/index.txt +++ b/whatis-alt/index.txt @@ -63,11 +63,8 @@ Sisyphus, в первую очередь, -- открытая лаборатор //даты отсюда http://www.altlinux.org/Branches -Шестая платформа (p6) была создана в мае 2011 года и её поддержка продлится до -конца августа 2013. - -Седьмая платформа (p7) была создана в апреле 2013 года и её поддержка продлится -до конца августа 2015. +//Седьмая платформа (p7) была создана в апреле 2013 года и её поддержка продлится +//до конца августа 2015. [float] ==== Основные новшества в седьмой платформе ==== @@ -76,7 +73,7 @@ Sisyphus, в первую очередь, -- открытая лаборатор * Для 64-битных систем реализована возможность установки и загрузки в системах с UEFI * Добавлена возможность установки на шифрованные разделы -* В дистрибутивах для рабочих станция осуществлён переход на новую системы +* В дистрибутивах для рабочих станций осуществлён переход на новую систему инициализации systemd [float] From a8a835bc471e8a344a00a3123671af364a65b8ff Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Tue, 17 Dec 2013 16:19:18 +0300 Subject: [PATCH 11/53] Add two tables about web-services first table for: school-server second table for: school-junior school-teacher school-master --- school-software/index.txt | 4 ++ school-software/integration/index_client.txt | 29 ++++++++++++ school-software/integration/index_server.txt | 47 ++++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 school-software/integration/index_client.txt create mode 100644 school-software/integration/index_server.txt diff --git a/school-software/index.txt b/school-software/index.txt index 6770287..032dd03 100644 --- a/school-software/index.txt +++ b/school-software/index.txt @@ -19,6 +19,10 @@ Cпецифические и предметные учебные програм для формирования и индивидуальной коррекции предметных знаний и умений посредством реализации различных электронных методик. +include::integration/index_server.txt[] + +include::integration/index_client.txt[] + include::moodle/index.txt[] include::trainingsoft/index.txt[] diff --git a/school-software/integration/index_client.txt b/school-software/integration/index_client.txt new file mode 100644 index 0000000..e21a97b --- /dev/null +++ b/school-software/integration/index_client.txt @@ -0,0 +1,29 @@ +== Веб службы == + +Если ваш (DISTRO) используется в связке с корректно +настроеным Альт Линукс 7.0 Школьный Сервер, тогда вам +должен быть предоставлен доступ к следующим службам: + +[options="autowidth",cols="2"] +|==== +|Адрес +|Название службы + +|https://<сервер>/ +|HTTP-сервер Apache + +|https://<сервер>/wiki/ +|Вики на базе MediaWiki + +|https://<сервер>/moodle/ +|Система управления обучением Moodle + +|https://<сервер>/owncloud/ +|Веб-хранилище файлов Owncloud + +|https://<сервер>/Apps/WebObjects/Rujel/ +|Электронный журнал РУЖЭЛЬ + +|https://<сервер>/cgi-bin/sp/sp.cgi +|Школьный портал +|==== diff --git a/school-software/integration/index_server.txt b/school-software/integration/index_server.txt new file mode 100644 index 0000000..479fc64 --- /dev/null +++ b/school-software/integration/index_server.txt @@ -0,0 +1,47 @@ +== Веб службы == + +Вместе с (DISTRO) устанавливаются полезные веб службы, доступ к которым могут +получать все члены вашей сети. Некоторые службы, например MediaWiki, готовы к +использованию сразу после установки дистрибутива, тем не менее, в целях +безопасности рекомендуется сменить все стандартные пароли. + +В таблице ниже перечислена некоторая информация о службах, которая может +пригодиться для их настройки. + +[options="autowidth",cols="3"] +|==== +|Адрес +|Служба +|Примечания + +|https://<сервер>/ +|http://www.apache.org/[Страница информации о дистрибутиве и +документация в интернете] +|http://forum.altlinux.org/index.php/topic,29114.0.html[См. +также лабораторные работы по настройке Apache] + +|https://<сервер>/wiki/ +|http://www.mediawiki.org/[Вики на базе MediaWiki] +|Администратор: `WikiSysop`, пароль: `пароль +пользователя root` (домен local) + +|https://<сервер>/moodle/ +|http://www.moodle.org/[Система управления обучением Moodle] +|Администратор: `admin`, пароль: `пароль +пользователя root` +В Moodle может потребоваться сменить имя хоста для доступа +извне. + +|https://<сервер>/owncloud/ +|http://owncloud.org/[Веб-хранилище файлов Owncloud] +|Администратор: `root`, пароль: `пароль пользователя root` + +|https://<сервер>/Apps/WebObjects/Rujel/ +|http://www.rujel.net[Электронный журнал РУЖЭЛЬ] +|Для запуска экземпляров приложения потребуется +предварительная настройка + +|https://<сервер>/cgi-bin/sp/sp.cgi +|http://spcms.ru/[Школьный портал] +|Вход по умолчанию: `admin`, пароль: `smenimenya`. *Не забудьте сменить пароль!* +|==== From 5cb4f610dd5b7b4b04296ba96dd5a23afba9dfab Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Tue, 17 Dec 2013 16:46:32 +0300 Subject: [PATCH 12/53] now use file about italk and itest from school-* branch (add 2 notes about server parts of italc and itest) --- school-software/trainingsoft/teacher/index.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/school-software/trainingsoft/teacher/index.txt b/school-software/trainingsoft/teacher/index.txt index ce90067..9b65698 100644 --- a/school-software/trainingsoft/teacher/index.txt +++ b/school-software/trainingsoft/teacher/index.txt @@ -9,6 +9,11 @@ iTest -- это кроссплатформенная система для со * iTestServer -- редактор базы вопросов и экзаменационный сервер. * iTestClient -- клиентская программа для прохождения теста обучающимся. +[NOTE] + +Преподавательская часть пакета iTest (itest-server) будет установлена в системе +при установке дистрибутива для учителя. + iTest упрощает создание и организацию базы данных вопросов и ответов, настройку сервера и принтера, подключение клиентского компьютера для каждого обучающегося, обеспечивающего испытания в соответствии с настройками сервера. @@ -61,6 +66,11 @@ iTalc (аббревиатура iTalc -- интеллектуальное обу iTalc облегчает взаимодействие между преподавателем и учащимся и позволяет учителю вести наблюдение за работой учеников на компьютере. +[NOTE] + +Преподавательская часть пакета iTalc (italc-master) будет установлена в системе +при установке дистрибутива для учителя.. + Если какому-либо учащемуся требуется помощь, преподаватель может удалённо подключиться к его рабочему столу и немедленно уделить внимание решению его проблемы. Преподаватель может передавать изображение со своего монитора на From c8d271fd833b92813d28e8f92377db966ef7050b Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Tue, 17 Dec 2013 16:50:53 +0300 Subject: [PATCH 13/53] Update note about italc: change package name italc-server -> italc2-server --- school-software/trainingsoft/teacher/index.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/school-software/trainingsoft/teacher/index.txt b/school-software/trainingsoft/teacher/index.txt index 9b65698..73b5863 100644 --- a/school-software/trainingsoft/teacher/index.txt +++ b/school-software/trainingsoft/teacher/index.txt @@ -68,7 +68,7 @@ iTalc облегчает взаимодействие между препода [NOTE] -Преподавательская часть пакета iTalc (italc-master) будет установлена в системе +Преподавательская часть пакета iTalc (italc2-master) будет установлена в системе при установке дистрибутива для учителя.. Если какому-либо учащемуся требуется помощь, преподаватель может удалённо From 86f2c009a36a7ba917d786b470c0aa0028fdda55 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Wed, 18 Dec 2013 14:02:22 +0300 Subject: [PATCH 14/53] Add table about "unified state exam" programming languages --- school-software/programming/index.txt | 2 + .../programming/unified_state_exam.txt | 71 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 school-software/programming/unified_state_exam.txt diff --git a/school-software/programming/index.txt b/school-software/programming/index.txt index bd56aa8..fa7254d 100644 --- a/school-software/programming/index.txt +++ b/school-software/programming/index.txt @@ -15,6 +15,8 @@ это разнообразные среды языков программирования, освоение которых направлено на формирование специальных навыков для дальнейшего, более глубокого изучения. +include::unified_state_exam.txt[ЕГЭ по информатике] + include::kturtle/index.txt[] include::geany/index.txt[] diff --git a/school-software/programming/unified_state_exam.txt b/school-software/programming/unified_state_exam.txt new file mode 100644 index 0000000..f982ce3 --- /dev/null +++ b/school-software/programming/unified_state_exam.txt @@ -0,0 +1,71 @@ +[float] +=== (DISTRO) и ЕГЭ по информатике === + +// TODO: ссылка на приказ, закрепляющий список языков + +В (DISTRO) есть все необходимое для подготовки школьников к сдаче +Единого Государственного Экзамена по информатике и ИКТ. + +В КЕГЭ допускается использовать различные языки программирования. Ниже +приведена таблица соответствия языков программирования и пакетов, +обеспечивающих установку данных языков в систему. + +[options="autowidth,header",cols="4"] +|==== +|Требование +|Пакет +|Версия +|Примечания + +4+|*Pascal (Object Pascal):* + +|FreePascal, версия не ниже 2.6.0 +|fpc-ide +|2.6.2 +| + +|PascalABC, версия не ниже 3.0.1 +|- +|- +| + +|Borland Pascal, версия не ниже7.0 +|- +|- +| + +|Delphi, версия не ниже 7.0 +|- +|- +|В качестве аналога рекомендуется использовать `lazarus-1.0.12` + +4+|*Basic:* + +|QBasic, версия не ниже 3.5 +|- +|- +| + +|FreeBasic, версия не ниже 0.24.0 +|freebasic +|0.90.1 +|http://www.altlinux.org/FreeBASIC#64bit[Особенности запуска на 64-битных системах] + +4+|*C++:* +|Microsoft Visual C++ 2005 +|- +|- +| + +|Code::Blocks, версия не ниже 10.05 +|codeblocks +|12.11 +| + +4+|*Алгоритмический язык:* + +|Кумир, версия не ниже 1.7.3 +|kumir +|1.9.0 +| +|==== From b6b33d584a9c468481e96f9db486ec42ed3ec96b Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Wed, 18 Dec 2013 14:58:01 +0300 Subject: [PATCH 15/53] Add information about FreeBasic --- school-software/programming/basic/index.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/school-software/programming/basic/index.txt b/school-software/programming/basic/index.txt index b2b3883..7e04816 100644 --- a/school-software/programming/basic/index.txt +++ b/school-software/programming/basic/index.txt @@ -8,3 +8,22 @@ BASIC-256 — открытая реализация языка программ программированию школьников. Язык имеет встроенный графический режим, позволяющий в считанные минуты рисовать на экране картинки, и русскоязычную документацию. + +[float] +==== FreeBASIC ==== + +FreeBASIC -- язык программирования высокого уровня по синтаксису наиболее +близкий к QuickBASIC, а также компилятор для него. + +Несмотря на то что компилятор имеет совместимость с QuickBASIC, в язык +FreeBASIC были добавлено множество расширений и возможностей для соответствия +современным требованиям, стандартами и совместимостью с библиотеками и API +написанными на C/C++. + +CAUTION: В (DISTRO) FreeBASIC представлен в виде инструмента командной строки + +// HOW TO RUN: + +// [user@domain folder]$ echo 'Print "Hello World!"' > test.bas +// [user@domain folder]$ fbc test.bas +// [user@domain folder]$ ./test From 67b074304d18181e7c77bb11684bebba04115507 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Wed, 18 Dec 2013 15:01:51 +0300 Subject: [PATCH 16/53] change dash symbol to "--" in couple files --- school-software/programming/basic/index.txt | 2 +- school-software/programming/codeblocks/index.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/school-software/programming/basic/index.txt b/school-software/programming/basic/index.txt index 7e04816..7e7b5d6 100644 --- a/school-software/programming/basic/index.txt +++ b/school-software/programming/basic/index.txt @@ -3,7 +3,7 @@ [float] ==== BASIC-256 ==== -BASIC-256 — открытая реализация языка программирования Бейсик и одновременно — +BASIC-256 -- открытая реализация языка программирования Бейсик и одновременно -- интегрированная среда разработки для него. Ориентирована на обучение программированию школьников. Язык имеет встроенный графический режим, позволяющий в считанные минуты рисовать на экране картинки, и русскоязычную diff --git a/school-software/programming/codeblocks/index.txt b/school-software/programming/codeblocks/index.txt index ae6b32e..40144d6 100644 --- a/school-software/programming/codeblocks/index.txt +++ b/school-software/programming/codeblocks/index.txt @@ -3,7 +3,7 @@ [float] ==== Code::Blocks ==== -Code::Blocks — свободная кроссплатформенная среда разработки. Code::Blocks +Code::Blocks -- свободная кроссплатформенная среда разработки. Code::Blocks написана на С++ и использует библиотеку wxWidgets. Имея открытую архитектуру, может масштабироваться за счёт подключаемых модулей. From 26d3052dfa152d20ee26a288c0a84ece22a860d8 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Wed, 18 Dec 2013 16:12:15 +0300 Subject: [PATCH 17/53] remove 1 unneeded space --- school-software/integration/index_client.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/school-software/integration/index_client.txt b/school-software/integration/index_client.txt index e21a97b..3aae2b0 100644 --- a/school-software/integration/index_client.txt +++ b/school-software/integration/index_client.txt @@ -10,7 +10,7 @@ |Название службы |https://<сервер>/ -|HTTP-сервер Apache +|HTTP-сервер Apache |https://<сервер>/wiki/ |Вики на базе MediaWiki From 2359764ac418a874d9bf26003f02fce791afd4ee Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Mon, 30 Dec 2013 11:41:07 +0300 Subject: [PATCH 18/53] add information about logisim --- school-software/trainingsoft/index.txt | 2 ++ school-software/trainingsoft/logisim/index.txt | 14 ++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 school-software/trainingsoft/logisim/index.txt diff --git a/school-software/trainingsoft/index.txt b/school-software/trainingsoft/index.txt index e621ba3..a5d80d8 100644 --- a/school-software/trainingsoft/index.txt +++ b/school-software/trainingsoft/index.txt @@ -29,4 +29,6 @@ include::maxima/index.txt[] include::scilab/index.txt[] +include::logisim/index.txt[] + include::teacher/index.txt[] diff --git a/school-software/trainingsoft/logisim/index.txt b/school-software/trainingsoft/logisim/index.txt new file mode 100644 index 0000000..454ea09 --- /dev/null +++ b/school-software/trainingsoft/logisim/index.txt @@ -0,0 +1,14 @@ +=== Logisim === +Logisim -- инструмент, позволяющий разрабатывать и моделировать цифровые +электрические схемы, используя графический интерфейс пользователя. + +Logisim может использоваться учащимися в курсе изучения информатики для +разработки и экспериментов с цифровыми схемами при моделировании. Схемы +разрабатываются в Logisim с помощью графического интерфейса, близкого к +традиционному для программ для рисования, такой интерфейс встречается во многих +других программах для моделирования схем. Относительная простота интерфейса +делает программу удобной для обзорных курсов. + +Для запуска программы через терминал введите в командной строке +интерпретатора shell строку `logisim` и нажмите клавишу Enter. Для старта +`logisim` из меню запуска приложений выберите *Образование* -> *logisim*. From 7cc2076ce792721c4fe447d9045ad00e7aae190e Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Wed, 8 Jan 2014 10:35:46 +0300 Subject: [PATCH 19/53] add information about installing printer via CUPS --- system-management/printer/printer-cups.txt | 57 ++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 system-management/printer/printer-cups.txt diff --git a/system-management/printer/printer-cups.txt b/system-management/printer/printer-cups.txt new file mode 100644 index 0000000..4cac218 --- /dev/null +++ b/system-management/printer/printer-cups.txt @@ -0,0 +1,57 @@ +//application path +== Установка принтера в (DISTRO) == + +Перед началом установки убедитесь в том, что в случае локального +подключения принтер присоединён к соответствующему порту компьютера и включён, +а в случае сетевого подключения принтер корректно сконфигурирован для работы в +сети. + +[float] +=== Последовательность установки === + +. Для настройки принтера вам потребуется запустить браузер и зайти по +адресу `http://localhost:631` + +. В открывшемся странице в верхней панели перейдите в раздел +*Администрирование*. + +. Под заголовком *Принтеры* нажмите кнопку *Добавить принтер*. + +. Введите пароль администратора системы. Если будет предложено, не рекомендуется + сохранять введенные данные в браузере. + +. Выберите свой принтер в одной из категорий. Затем нажмите *Продолжить*. +- *Локальные принтеры* -- к этой категории отнесены принтеры, +подключенные к компьютеру физически. +- *Обнаруженные сетевые принтеры* -- к этой категории отнесены +принтеры в вашей локальной сети. +- *Прочие сетевые принтеры* -- в этой категории перечислены различные возможные +способы подключения сетевых принтеров. + +. В этом диалоге вам стоит проверить данные. Если всё определилось верно +автоматически, то вы можете оставить значения по умолчанию. +Нажмите *Продолжить*, когда закончите. +- В поле *Название* можно указать название принтера (в названии не должно быть +символов /, # и пробелов). +- В поле *Описание* можно указать расширенное описание принтера. +- В поле *Расположение* можно указать расположение принтера. +- Вы можете отметить пункт *Совместный доступ*, если хотите разрешить +совместный доступ к принтеру. + +. Вы увидите информацию из прошлого диалога. Теперь вам следует проверить, + верно ли определены производитель и модель принтера. Оставьте значения по умолчанию, + если всё верно. В противном случае укажите правильные данные. + Нажмите *Добавить принтер*, когда закончите. +- При помощи кнопки *Выбрать другую модель* вы можете выбрать правильного производителя принтера. +- В списке *Модель* можно выбрать модель вашего принтера из известных системе. + +. В последнем диалоге нужно уточнить параметры печати. + Нажмите *Сохранить параметры по умолчанию*, когда закончите. +- Выпадающий список *Page Size* предназначен для выбора размера бумаги, + поддерживаемого принтером, например A4. +- *Media Source* -- если в принтере больше одного лотка для бумаги, + тогда выберите предпочтительный, иначе оставьте значение по умолчанию: _default_. +- *Double-Sided Printing* -- позволяет включить двустороннюю печать. +- *Resolution* -- позволяет указать количество точек на линейный дюйм. + +После этих действий принтер станет доступен для использования в приложениях. From c8d8d3e0e686bbec68718779d0a5b9722ba8d43a Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Wed, 8 Jan 2014 11:00:22 +0300 Subject: [PATCH 20/53] Change lable. Add info about starting CUPS. --- system-management/printer/printer-cups.txt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/system-management/printer/printer-cups.txt b/system-management/printer/printer-cups.txt index 4cac218..2bf7942 100644 --- a/system-management/printer/printer-cups.txt +++ b/system-management/printer/printer-cups.txt @@ -1,5 +1,5 @@ //application path -== Установка принтера в (DISTRO) == +== Установка принтера с помощью CUPS == Перед началом установки убедитесь в том, что в случае локального подключения принтер присоединён к соответствующему порту компьютера и включён, @@ -12,6 +12,15 @@ . Для настройки принтера вам потребуется запустить браузер и зайти по адресу `http://localhost:631` +[WARNING] +Если вы получаете сообщение "Веб-страница недоступна", тогда вам следует +запустить службу CUPS. Это можно сделать с помощью модуля +"Системные службы" в приложении *Центр управления системой*, также вы можете +запустить службу CUPS через терминал, для этого от имени администратора +выполните одну из команд `service cups start`, или +`/etc/rc.d/init.d/cups start`. + +[start=2] . В открывшемся странице в верхней панели перейдите в раздел *Администрирование*. From b67f1bebc75febb713c1dea1d9e65c65302b7b5c Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Wed, 8 Jan 2014 11:08:26 +0300 Subject: [PATCH 21/53] include printer-cups.txt to build --- system-management/index.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/system-management/index.txt b/system-management/index.txt index 0ba1650..eb18e9d 100644 --- a/system-management/index.txt +++ b/system-management/index.txt @@ -1,3 +1,6 @@ include::acc/index.txt[] include::network/index.txt[] + +include::printer/printer-cups.txt[Установка принтера с помощью CUPS] + From a1a1f578270b092e6de6da6df880243b68e82b8c Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Thu, 16 Jan 2014 15:33:23 +0300 Subject: [PATCH 22/53] Add old documentation about cmc communication stand information taken from .rpm file: docs-cmc_communication_stand-0.1-alt2.noarch.rpm --- old-docs/cmc_communication_stand.txt | 831 +++++++++++++++++++++++++++ 1 file changed, 831 insertions(+) create mode 100644 old-docs/cmc_communication_stand.txt diff --git a/old-docs/cmc_communication_stand.txt b/old-docs/cmc_communication_stand.txt new file mode 100644 index 0000000..1ad373c --- /dev/null +++ b/old-docs/cmc_communication_stand.txt @@ -0,0 +1,831 @@ +//// +Пакет: docs-cmc_communication_stand +RPM файл: docs-cmc_communication_stand-0.1-alt2.noarch.rpm +Аннотация: Отчёт о проделанной на ф-те ВМиК МГУ работе: sendmail, ClamAV, + SpamAssassin, SquirrelMail, Jabberd2, Samba и OpenLDAP на одной + стендовой машине либо на нескольких; рекомендации по выбору + клиентского ПО и наращиванию дополнительных возможностей. + Выполнено на FreeBSD5. +Автор: Георгий Курячий +Лицензия: FDL +URL: http://heap.altlinux.org/modules/Compact30_CHIP.george.prev/index.html +//// + +== Разработка публичного коммуникационного центра с единой системой авторизации доступа. == + +[float] +=== Введение === + +Рабочей группе была поставлена задача по созданию коммуникационного центра, с +единой системой авторизации доступа к почтовой и файловой службе, а также к +службе обмена мгновенными сообщениями. При выборе платформы и программных +продуктов, решающих поставленную задачу, учитывались следующие требования: + +Реноме:: + +В качестве платформы должна выступать надёжная ОС серверного класса, +имеющая значительную историю эксплуатации систем подобного профиля и богатый +выбор соответствующего ПО + +Стандарт:: + +Единая служба авторизации должна поддерживаться по возможности большим +числом программных продуктов, для обеспечения свободы выбора + +Обслуживание:: + +Ресурсы, затрачиваемые на администрирование служб комплекса, не должны расти +более, чем линейно, с ростом количества выполняемых им функций (иными словами, +добавление очередной службы должно сводиться только к настройке именно этой +службы) + +Качество ПО:: + +Программные продукты, обеспечивающие ту или иную функциональность комплекса, +должны обладать следующими свойствами: + +* Надёжность и защищённость +* Работа под нагрузкой в масштабе факультета (с запасом прочности) +* Наличие всех востребованных возможностей +* Простота настройки/сопровождения + +Свобода выбора:: + +По каждой из функциональностей, предлагаемых комплексом, должен существовать +выбор из нескольких программных продуктов, для обеспечения возможности перехода +на другое ПО, если использованное в стендовом проекте со временем перестанет +устраивать + +Адаптация:: + +Должна существовать действительная возможность адаптировать используемое ПО к +нуждам факультета и особенностям эксплуатации комплекса + +Масштабируемость:: + +Должна быть возможность организации каждой службы комплекса, включая единую +службу авторизации, на отдельном компьютере. При этом должна быть возможность +как безопасного обмена авторизационными данными, так и обмена с использованием +незащищённой версии протокола, имеющей низкую вычислительную мощность (при +размещении серверов внутри ДМЗ) + +Свобода использования:: + +Все задействованные в комплексе пользовательские службы должны быть доступны с +помощью стандартного клиентского ПО, причём обязательно должен существовать +полнофункциональный (желательно — многоплатформенный) свободно распространяемый +набор клиентского ПО + +=== Пользовательские службы === + +Комплекс предоставляет три вида доступа к пользовательским ресурсам: +обслуживание электронной посты, обмен мгновенными сообщениями и доступ к +персональному файловому пространству. + +[float] +==== Электронная почта ==== + +[float] +===== Приём и пересылка почты ===== + +Комплекс функционирует как сервер приёма и пересылки электронной почты по +протоколу SMTP. Принимается только почта, направленная зарегистрированным +пользователям комплекса. + +В качестве примера почтовый сервер настроен таким образом, чтобы он принимал +почту, адресованную любому пользователю обслуживаемого домена (в том числе и +пользователю другого почтового сервера в домене) с целью её дальнейшей +пересылки. Кроме того, определён диапазон IP-адресов, которым разрешено +пересылать через сервер почту любому внешнему абоненту. Эти и множество других +свойств сервера гибко настраиваемы. См. также раздел «Внедрённые службы». + +Право пересылки почты можно получить также по результатам авторизации (т. н. +SMTP auth, используется защищённый канал передачи личных данных). Таким +образом, почтовый сервер можно использовать, находясь в отъезде или с домашнего +компьютера, с использованием любого подключения к сети Интернет. + +[float] +===== Сервер доступа к почтовым ящикам ===== + +Доступ к почтовым ящикам пользователей производится по протоколам IMAP4/SSL и +POP3/SSL, использующим защищённый канал передачи личных данных, а также по +протоколам IMAP4 и POP3 с обязательным использованием расширения STARTTLS для +защиты передаваемых личных данных. Поддерживаются основные расширения IMAP4, не +требующие значительного увеличения вычислительной мощности (в частности, +несколько вариантов сортировки списка сообщений на сервере, режим ожидания и т. +п.). См. также раздел «Рекомендации по клиентскому ПО». + +[float] +===== Доступ к почтовым ящикам через WWW ===== + +Для пользователей, которые по какой-то причине не имеют возможности +воспользоваться клиентской почтовой программой, организован доступ к почтовым +ящикам через WWW-интерфейс. Используется защищённый канал передачи личных +данных пользователя. Для связи с почтовым сервером может применяться как +защищённый протокол IMAP4/SSL, так и обладающий низкой вычислительной +стоимостью IMAP4 (при размещении WWW-интерфейса и службы доступа к почтовым +ящиком на одном компьютере или внутри ДМЗ). Поддерживаются несколько видов +фильтрации сообщений (в том числе по результатам анализа спам-категоризатора). +Возможно подключение всевозможных расширений интерфейса, включая изменение +пароля, настройку внешнего вида, автоматического перемещения сообщений, доступ +к внешним почтовым ящикам и т. д. + +Аналогичный WWW-интерфейс (предыдущей версии) внедрён и активно используется на +почтовом сервере ВМиК МГУ, в состав стенда он был включён из соображений +проверки совместимости с новыми версиями почтовой службы и службы доступа к +почтовым ящикам. + +[float] +==== Сервер обмена мгновенными сообщениями ==== + +Электронная почта не подходит для обмена сообщениями «в реальном времени», так +как почтовый протокол допускает значительную задержку при пересылке сообщений +(вплоть до нескольких дней). Вместе с тем множество задач, в особенности — +связанных с деловой, административной или производственной перепиской, требуют +быстрого (в пределах скорости передачи данных), «мгновенного» отклика. Раньше +такие задачи решались по телефону, в последнее время стали популярны службы +мгновенного обмена сообщениями (ICQ, AIM, YM, IM, Jabber и т. п.). При этом +обычно упускается из внимания, что все перечисленные службы (кроме Jabber) +имеют не просто закрытую, а нетиражируемую реализацию серверной части. Это +означает, что при использовании для деловой переписки, допустим, ICQ, вся +информация становится достоянием организаций, имеющих доступ к серверу. + +[float] +===== Служба Jabber ===== + +Jabber — открытый стандарт обмена сообщениями, поддерживающий мгновенный, +отложенный; групповой, приватный и другие виды обмена сообщениями, передачу +файлов и т. п. Поскольку серверная часть реализована в составе комплекса, а для +доступа к серверу может использоваться защищённый протокол, переписка остаётся +личной тайной абонентов (при условии административного контроля за +обслуживающим персоналом сервера). Поддерживается также и обмен сообщениями с +абонентами других серверов Jabber. + +[float] +===== Терминалы к другим службам обмена мгновенными сообщениями ===== + +Для доступа к другим службам мгновенных сообщений, например, ICQ, MSN, AIM или +YM, абоненту Jabber-сервера незачем устанавливать дополнительное ПО, так как +для этих служб разработано терминальное серверное ПО, обеспечивающее +преобразование соответствующего протокола в Jabber. Таким образом, используя +только Jabber-клиент, пользователь может иметь доступ к этим и некоторым другим +службам. + +[float] +==== Файловый сервер ==== + +Подключение файлового сервера к единой системе авторизации вместе с почтовой +службой и службой передачи коротких сообщений имеет, на наш взгляд, некоторые +слабые с точки зрения безопасности стороны. Следует понимать, что тем самым +уровень приватности данных в файловом архиве уравнивается с уровнем приватности +почтовых учётных записей. Это означает, что утечка почтового пароля (например, +при неосторожном использовании почтового клиента в незащищённом режиме или +разглашении сохранённого пароля) приведёт к открытию посторонним доступа к +файлам в личном архиве пользователя. Верно также и обратное: при использовании +«слабого» формата .pwl для хранения пароля файлового сервера может привести к +его раскрытию, и под угрозой окажется также почтовый архив. + +При соблюдении правила равной приватности файловым архивом пользоваться можно. +Доступ к архиву осуществляется на основании персональной авторизации по +протоколу SMB. Доступ по другим популярным протоколам «удалённых дисков», +например, NFS, не реализован, так как для него используется другая, основанная +на верификации IP-адреса, схема авторизации. + +=== Системные службы и техническая информация === + +Помимо служб, доступных пользователю непосредственно, в комплексе доступны +системные средства, предоставляемые платформой, а также предусмотрены две +дополнительные системные службы для единой авторизации и административного +доступа к учётным записям. + +[float] +==== Единая служба авторизации ==== + +Одним из самых распространённых способов разделения учётных записей между +несколькими службами-абонентами является хранение этих учётных записей и +сопутствующей им информации в общей службе каталогов LDAP. Большинство +серверного ПО либо изначально имеет возможность обращаться к LDAP за +авторизационной информацией, либо пользуется системной службой авторизации, +которая, в свою очередь, может быть настроена на использование LDAP. Для +доступа к службе авторизации внутри ДМЗ используется незащищённый протокол +LDAP, для доступа внешних абонентов — LDAP/SSL. + +[float] +==== Административный WWW-интерфейс ==== + +Для проведения администраторских действий над учётными записями предусмотрен +WWW-интерфейс с возможностью единичного и пакетного добавления и удаления +пользователей, изменения пользовательских настроек, создания шаблонов профиля и +некоторыми другими наиболее востребованными операциями. Используется только +защищённый протокол передачи данных HTTPS. + +[float] +==== Задействованные внутренние системные службы ==== + +Дополнительно в стендовом проекте задействованы системные службы, +предоставляемые ОС FreeBSD: защищённый терминальный доступ к серверам (для +настройки и адаптации служб, а также проведения профилактики) с помощью Secure +Shell, централизованное ведение системных журналов (при необходимости системные +журналы всех служб можно сосредоточить на одном компьютере), регулярная ротация +журналов, использование пользовательской и групповой квоты на объём почтового и +файлового пространства, запуск действий по расписанию, фильтрация трафика с +помощью межсетевого экрана и т. п. + +=== Рекомендации по клиентскому ПО === + +Для того, чтобы воспользоваться службами комплекса, не требуется применения +какого-либо специализированного или уникального клиентского ПО. Однако можно +сформулировать некоторые рекомендации по выбору ПО, связанные с требованиями +безопасности, удобством использования или спектром возможностей. Кроме того, в +наши рекомендации мы старались включить программные продукты, доступные на +большинстве платформ и распространяемые только под свободной лицензией (что +означает, в числе прочего, право свободного их использования в любых условиях). + +[float] +==== Почта ==== + +Почтовый клиент Thunderbird доступен на всех основных пользовательских +платформах, включая Linux, FreeBSD и большинство других POSIX-совместимых ОС, а +также MacOS X и Windows. Thunderbird — продолжение почтовой составляющей +проекта Seamonkey/Mozilla/Netscape, так что смело можно рекомендовать последние +версии любого их них. + +Для доступа к почтовому серверу достаточно поддержки протокола IMAP/SSL или +POP3/SSL, а для анализа результатов спам-категоризатора — возможности +фильтрации по произвольному SMTP-заголовку письма. Такими возможностями, +например, обладает почтовый клиент Sylpheed Claws, доступный под многие +POSIX-платформы (включая основные ветки Linux, и BSD) и Windows. + +Thunderbird:: + http://www.mozilla.org/products/thunderbird + +Sylpheed Claws:: + http://sylpheed-claws.sourceforge.net/ + +[float] +==== Служба мгновенных сообщений ==== + +Ближе всего отвечающим поставленным задачам нам показался многоплатформенный +Jabber-клиент PSI. В нём наиболее полно реализованы возможности протокола +Jabber (стоит напомнить, что возможности других протоколов подключаются в виде +терминалов Jabber-сервера). Клиент доступен для всех основных пользовательских +платформ. + +Альтернативой PSI для UNIX-подобных платформ является клиент SIM, а для Windows +— Miranda. Эти клиенты имеют встроенную поддержку также и других служб обмена +мгновенными сообщениями (в случае когда возможности серверных терминалов +недостаточны). + +PSI:: + http://psi.affinix.com/ + +SIM:: + http://sim-icq.sourceforge.net/ru/jabber.shtml + +Miranda:: + http://miranda-im.org/ + +[float] +==== Файловый сервер ==== + +Поддержка протокола SMB встроена в ядро всех операционных систем семейства +Windows, а для UNIX-подобных ОС существует реализация как на уровне модулей +ядра (модули smbfs или cifs, позволяющие подключать удалённые носители данных с +помощью команды mount), так и прикладные программы (например, smbclient, +входящий в серверный пакет Samba). + +Текущая версия серверного ПО не поддерживает технологии Active Directory (по +причине закрытости отдельных её составляющих), поэтому для доступа к файловому +пространству необходимо отключать поддержку AD в настройках соединения с +сервером. + +// На дворе 2014 год, и самба уже поддерживает Active Directory + +Samba:: + http://www.samba.org/ + +[float] +==== WWW-интерфейс ==== + +Для доступа к WWW-интерфейсу почтового сервера и администратора рекомендуется +использовать любой стандартный навигатор с поддержкой Java Script (в случае +интерфейса к почтовой службе это требование не является обязательным). Мы +рекомендуем Firefox, завоевавший в 2004 году множество наград (в том числе +«Лучший WWW-навигатор» и «WWW-навигатор года») авторитетных сетевых изданий. +Кроме всего прочего, этот навигатор поддерживает передовую технологию написания +расширений, из которых рекомендуются: Adblock (для фильтрации рекламы), +Tabbrowser Preferences (для настройки многооконности), DictionarySearch (для +поиска в сетевых словарях, в т. ч. толковых), Mouse Gestures или All-in-One +Gestures (для управления навигацией движениями мыши) и Image Zoom (для +изменения размера картинок). + +Firefox:: + http://www.mozilla.org/products/firefox/ + +Adblock:: + http://adblock.mozdev.org/ + +Tabbrowser Preferences:: + http://www.pryan.org/mozilla/site/TheOneKEA/tabprefs/ или http://216.55.161.203/theonekea/tabprefs/ + +DictionarySearch:: + http://dictionarysearch.mozdev.org/ + +Mouse Gestures и All-in-One Gestures:: + http://optimoz.mozdev.org/gestures/ и http://perso.wanadoo.fr/marc.boullet/ext/extensions-en.html + +Image Zoom:: + http://imagezoom.yellowgorilla.net/ + +=== Обоснование выбора, доработка и дополнительная настройка служб === + +В этой части отчёта описываются технические детали реализации стендового +проекта, включающие в себя обоснование выбора платформы, используемого +серверного ПО и особенности их настройки/доработки в соответствии с +поставленной задачей. + +[float] +==== FreeBSD ==== + +В качестве платформы стенда была выбрана ОС FreeBSD ветки STABLE (FreeBSD5). +При этом принимались во внимание следующие факты: + +* FreeBSD — наиболее популярная серверная платформа в российском интернете + +* Серверный парк факультета ВМиК в течение нескольких успешно эксплуатирует ОС + FreeBSD4 на похожих задачах (в частности, почтовый сервис и WWW) + +* Ветка FreeBSD5 включает в себя передовые наработки в области ОС и насчитывает + более двух лет эксплуатации, а сам проект FreeBSD (зарегистрирован как + отдельный проект в 1993 году) восходит к проекту 4BSD, являясь, таким + образом, одним из долгожителей среди ОС. С выпуска FreeBSD 5.3 (ноябрь 2004 + года) FreeBSD5 является стабильной веткой FreeBSD, а разработка по FreeBSD4 + сворачивается + +Альтернативные платформы (Debian GNU Linux, ALT Linux, Solaris 10) были +отвергнуты, главным образом, по двум причинам: во-первых, проект планируется +внедрять на факультете ВМиК, где уже функционирует серверный парк на базе +FreeBSD, поэтому целесообразно не умножать задачи администрирования; во-вторых, +на факультете существует достаточно продуктивное FreeBSD-сообщество (главным +образом, в лаборатории ПО, традиционно занимающейся серверным парком). + +В дополнение к единой службе идентификации LDAP (см. ниже) в системе были +установлены пакеты nss_ldap, для включения каталога LDAP в пространство +идентификационных имён сервера, и pam_ldap — для обеспечения любым службам +единообразного доступа к LDAP посредством системной службы идентификации PAM +(были сделаны также соответствующие изменения в PAM-профилях этих служб). Кроме +того, во всех случаях, когда доступ к службам по незащищённым протоколам стоило +запретить из соображений безопасности, а настройки этих служб этого не +позволяли, использовался встроенный межсетевой экран PF. + + +[float] +==== Sendmail ==== + +В качестве почтового сервера был выбран пакет Sendmail. Альтернативные варианты +почтового сервера того же класса — Exim, QMail и PostFix — обладают во многом +схожими (хота и несколько меньшими) возможностями, поэтому выбор Sendmail +обосновывался тем, что он полностью отвечает поставленным задачам, и при этом в +течение нескольких лет успешно эксплуатируется на факультетском почтовом +сервере. Кроме того, часть задач, связанных с обработкой полученных почтовых +сообщений (антиспам и антивирус) уже реализована на основном почтовом сервере +факультета. Чтобы не делать одну и ту же работу дважды, и при этом облегчить +процесс внедрения, было решено дорабатывать имеющийся почтовый комплекс, а в +стендовом проекте реализовать только нововведения (в частности, SMTP-auth и +STARTTLS). См. также раздел «Внедрённые службы». + +Пакет Sendmail был собран с поддержкой TLS (для STARTTLS) и SASL2 (для +SMTP-auth); для SMTP-auth потребовался также пакет cyrus-sasl-saslauthd. Демон +saslauthd может пользоваться для идентификации системной службой PAM, которая, +в свою очередь, обращается к единой службе авторизации (см. подраздел +«OpenLDAP»). Настройки sendmail были скопированы с факультетского почтового +сервера (с изменением имени обслуживаемого домена). + +[float] +==== Dovecot ==== + +Вместо используемой в настоящее время службы доступа к почтовым ящикам IMAP-UW +было решено задействовать пакет Dovecot. Два более популярных и обладающих +большими возможностями программных продукта — Courier IMAP и Cirrus IMAP — были +отвергнуты. Свою роль сыграли следующие доводы: + +* Функциональность IMAP-UW, в отличие от Dovecot, недостаточна даже для имеющегося WWW-интерфейса + +* Большинство возможностей Courier и Cirrus, отсутствующих в Dovecot, требуют + повышения вычислительной мощности (например, поиск подстроки среди сообщений + на сервере) + +* Courier поддерживает только собственный формат почтовых ящиков, что + затрудняет миграцию + +* Cirrus имеет неоправданно сложную систему настройки, хотя и поддерживает + наиболее полный спектр расширений протокола IMAP4 + +* Среди авторов всех перечисленных продуктов только авторы Dovecot заявляют, + что надёжность и эффективность являются для них приоритетной задачей + +Для настройки Dovecot в соответствии с поставленной задачей потребовалось +только разрешить доступ к серверу по незащищённому протоколу (при этом, +согласно RFC, доступ со всех адресов, кроме самого сервера, допускает только +авторизацию с применением TLS, то есть в защищённой форме) и указать в качестве +идентификационной службы PAM. Кроме того, был использован тот же +SSL-сертификат, что и на сервере (для удобства проверки подлинности с помощью +WWW-навигатора). Следует отметить, что в случае различия доменных имён +необходимо использовать общий для ДМЗ сертификат, выданный группе доменных имён +вида (*.обслуживаемый.домен). + +[float] +==== Apache ==== + +WWW-сервер Apache ветки 1.3 был выбран за универсальность функций: при всей +эффективности и простоте таких пакетов, как Wywern или TinyHTTPD, спектр +возможностей «лёгких» ограничивает свободу моделирования и диапазон пригодного +для совместной эксплуатации дополнительного ПО. Возможности ещё более мощного +HTTP-сервера Apache ветки 2 задействовать не предполагалось. Для обеспечения +полноценной и удобной работы сервера потребовались следующие возможности +Apache: + +* Организация доступа по защищённому протоколу (для введения авторизационных + данных WWW-интерфейсов администратора и службы доступа к почтовым ящикам) + +* Организация т. н. «виртуальных серверов» (для различных WWW-интерфейсов). + +* Использование встроенного модуля PHP + +* Использование CGI и преобразования части URL (alias, rewrite и т. п.) + +Сервер, во избежание утечки паролей, должен быть настроен на использование +только защищённого протокола для обоих WWW-интерфейсов (с помощью виртуальных +серверов или выделенных URL). + +[float] +==== Squirrelmail ==== + +WWW-интерфейс к почтовой службе факультета обеспечивается пакетом Squirrelmail. +Аналогичная реализация WWW-интерфейса в стендовом проекте представляет собой +развитие уже имеющейся технологии: использовалась более новая версия +Squirrelmail с «заплатками», разработанными студентом 5-го курса Карлосом +Оливьера Зара Мамани (устраняющими некоторую путаницу в кодировках). +Воссоздание Squirrelmail в стендовом проекте имело две цели: во-первых, +оттестировать более новую версию ПО (имеется негативный опыт «молчаливого» +обновления на факультетском сервере); во-вторых, проверить совместимость +Squirrelmail со службой доступа к почтовым ящикам Dovecot, отличающейся от +используемой в настоящее время на факультете. + +В дополнение к стандартному пакету squirrelmail и входящим в него расширениям, +было использовано дополнительное расширение change_ldappass, позволяющее +пользователю сменить пароль после идентификации (интерфейс Squirrelmail +доступен в стендовом проекте только по защищённому протоколу). + +[float] +==== Jabberd2 ==== + +В качестве сервера Jabber был выбран пакет Jabberd2. По сравнению с другим ПО +(например, предыдущим вариантом дизайна этого же сервера, Jabberd, или продукта +EJabberd, имеющего принципиально иную архитектуру) этот сервер отличается +простотой настройки и удобным интерфейсом для написания терминалов в другие +службы передачи мгновенных сообщений (что позволяло надеяться на быстрый рост +функциональности). К сожалению, выбор Jabberd2 оказался (на время создания +стенда) не самым удачным: интернет-сервер, предоставляющий сообществу Jabberd2 +ресурсы, был взломан около года назад, причём все файловые архивы были +испорчены. Это оказалось очень серьёзным ударом по сообществу (стопроцентно +сетевому), и работа над Jabberd2 и его терминалами приостановилась в стадии +полностью работоспособной, но не обладающей большим списком функциональностей. + +При внедрении планируется ещё раз внимательнее изучить состояние проекта +Jabberd2 (к моменту написания отчёта сообщество уже освоилось на новой +площадке, восстановило там большинство ресурсов и возобновило разработку по +многим направлениям). Вполне возможен переход на EJabberd, достоинствами +которого являются: большой спектр возможностей, высокоуровневый язык разработки +ERLang (что позволяет оперативно вносить изменения в существующий код), и также +то, что сообщество EJabberd — в основном, российское (автор имеет прямое +отношение к крупнейшему открытому Jabber-серверу jabber.ru). + +В дополнение к пакету jabberd-2 были установлены терминалы к службам AIM, MSN и +два терминала к ICQ, на момент разработки стенда обладающие различными +функциональностями (в одном варианте реализован экспорт ICQ-контактов, в другом +— поиск ICQ-клиентов; это особенность текущих версий терминалов, планы +разработки каждого из них предусматривают существенное расширение +функциональностей; кроме того, этими недостатками не обладает сервер EJabberd). +Сервер настраивался согласно инструкции. + +[float] +==== Samba ==== + +Относительно выбора протокола, предоставляющего доступ к сетевым дискам, было +сказано выше: SMB — один из немногих широко распространённых протоколов, +использующий идентификацию по учётным записям, а не по IP-адресу абонента, что +делает включение этого рода служб формально пригодным для реализации в рамках +стендового проекта. Из ПО, распространяющегося под свободной лицензией, +наиболее популярен сервер Samba. Альтернативой Samba является только +использование в качестве серверной платформы Windows-системы, однако это +создаёт множество неприятностей, в том числе неисправимых: принудительное +разделение аппаратной части для различных ОС, удвоение процесса +администрирования, проблемы утечки информации по ненадёжным каналам, +вычислительная неэффективность, и — главное — невозможность полноценной +интеграции со стандартным сервером идентификации LDAP (не Active Directory). + +Есть очевидная возможность применения того же сервиса для организации общей +службы паролей SMB (т. н. «Domain Contriller»), однако в масштабе факультета +пользоваться этой службой можно только в соответствии с общим низким уровнем +секретности (почтовые учётные записи и или учётные записи службы мгновенных +сообщений являются таковыми по определению). Выше говорилось о том, что даже +приравнивание разделяемых сетевых дисков к этому уровню может спровоцировать +нарушение политики безопасности, когда на удалённом диске сохраняются учётные +записи более высокого уровня. + +Даже настройка Samba для использования LDAP в качестве хранилища учётных +записей имеет несколько сложностей: во-первых, в SMB используются алгоритмы +идентификации и поля учётных записей, несовместимые с PAM, поэтому необходима +поддержка обращения к LDAP напрямую. Несовместимость алгоритмов состоит в том, +что для обеспечения безопасности обмена авторизационной информацией в протоколе +SMB предусмотрена передача от клиента серверу не пароля, а значения хеш-функции +от этого пароля. Это требует, в свою очередь, от сервера хранить не +фиксированное значение хеш-функции, а сам пароль в восстановимом виде. +Поскольку в большинстве случаев хранение восстановимых паролей где бы то ни +было считается нарушением политики безопасности, этот алгоритм не используется, +а зачастую и вообще не предусмотрен стандартами. + +Во-вторых, для хранения учётных записей SMB в LDAP используется специальная +схема (поставляется вместе с пакетом samba, но требует ручного включения в +настройки slapd согласно инструкции). В-третьих, необходимо зарегистрировать +саму службу Samba в качестве отдельного абонента единой службы авторизации, +обладающего повышенными правами (добавление, удаление и редактирование учётных +записей в рамках собственной схемы). Именно введение SMB потребовало +непременной организации административного WWW-интерфейса, так как обновление и +синхронизация различных схем LDAP требует дополнительного, на включённого в +состав базовой системы ПО (работа в рамках одной схемы позволяла бы +использовать системные утилиты pw, adduser и т. п.). + +[float] +==== OpenLDAP ==== + +Существует несколько систем, предоставляющих доступ к единой службе +авторизации. Наиболее старая и органично вписывающаяся в использованную +серверную ОС — Network Information System, NIS. Эта служба успешно +эксплуатируется в классах практикума и общего доступа, однако для применения в +масштабах факультета непригодна из-за некоторых проблем с безопасностью и +несовместимостью со специфическими схемами SMB. Более безопасная замена NIS — +NIS+ не имеет свободной реализации и оттого с клиентской стороны поддерживается +также хуже. Действительной альтернативой LDAP было бы использование NIS внутри +ДМЗ или совместно с IPSec, стандартно входящим в базовую ОС: в этом случае +стандартная (POSIX-подобная) часть процедур авторизации была бы сведена к +системному минимуму, однако возникли бы проблемы синхронизации нестандартных +учётных записей (например, SMB), решать которые пришлось бы вручную. + +Выбор служб, предоставляющих LDAP-сервис, не так уж велик. Мы остановились на +OpenLDAP, как на самом популярном на сегодня свободном продукте, обладающим +широкими возможностями. Альтернативой может быть разработка самой компании +Samba, призванная в будущем стать частью свободной версии службы AD, однако на +сегодня этот проект находится в стадии усиленного развития т. н. «нестабильной» +ветки. Другие реализации LDAP, например, пакет Tiny LDAP, имеют, на наш взгляд, +неубедительную эксплуатационную историю. + +Настройка службы LDAP сводится к аккуратной реализации (или включению готовых) +используемых схем хранения учётных записей и к составлению списков управления +доступом (ACL) для абонентов-администраторов. Кроме того, предусмотрен доступ +LDAP-серверу по защищённому протоколу. + +Как уже было замечено выше, для обеспечения доступа к LDAP со стороны служб, +использующих стандарт PAM, были установлены и настроены два дополнительных +системных модуля, nss_ldap и pam_ldap. + +[float] +==== LAM ==== + +Для организации удобного управления учётными записями в LDAP, поддерживающими +несколько схем представления, недостаточно имеющихся системных средств. Главным +образом это связано с необходимостью синхронизации нескольких схем учётных +записей. Кроме того, хотелось иметь механизм, позволяющий передать повседневные +операции (например, добавление и удаление пользователей) +низкоквалифицированному персоналу (т. н. «оператору»). Операторский интерфейс +не должен быть излишне сложным, но обязан содержать шаблоны основных +операторских действий (добавление и удаление учётных записей, в том числе +пакетное, и редактирование их). + +Из множества интерфейсов нами был выбран пакет LDAP Account Manager (LAM). +Некоторые альтернативные продукты, такие как PHPLdapAdmin или WebMin, оказались +чересчур усложнёнными, а другие (такие, как luma или gq) требуют установки на +стороне клиента, и, следовательно, ограничивают выбор ПО на рабочем месте +администратора (впрочем, luma — платформо-независимый клиент, хотя и не до +конца доработанный). + +«Очком» в пользу LAM стало следующее его удобство: при создании учётной записи +пользователя есть возможность сгенерировать печатный документ (в формате PDF), +содержащий все данные этой учётной записи, включая учётное имя, пароль и прочую +информацию, необходимую пользователю для настройки клиентского ПО. + +Основной трудностью при использовании единой службы авторизации является то, +что принадлежащие пользователю ресурсы некоторых служб не исчерпываются только +учётными записями. Эти ресурсы не появляются сами собой при добавлении учётной +записи в LDAP и не исчезают при её удалении. Например, при заведении почтового +пользователя необходимо создать его почтовый ящик и структуру фильтров +(например, спам-классификатор по умолчанию), а при заведении пользователя +файловой службы — домашний каталог. Задача усложняется ещё и тем, что создание +таких ресурсов должно происходить, в общем случае, на удалённом сервере +(который обеспечивает именно эту службу), а не локально. + +У этой задачи есть два решения. На каждом из серверов можно запускать по +расписанию (например, раз в пять минут) специальный сценарий, который будет +проверять, не произошли ли изменения в каталоге LDAP, и создавать при +необходимости соответствующие ресурсы. Дополнительное достоинство этого способа +— каждый сервер может при этом хранить закешированную достаточно актуальную +версию каталога (максимум пятиминутной давности), что позволит избежать +вычислительных и сетевых перегрузок во время пика запросов (например, при +утреннем включении всех клиентских рабочих мест). Главный недостаток такого +способа — задержка между изменением учётной записи и созданием ресурса, +сокращение которой оплачивается серьёзным повышением паразитной вычислительной +нагрузки. + +Поэтому в стендовой реализации был использован второй способ, предусмотренный +WWW-интерфейсом администратора LAM. Суть его в том, что непосредственно после +добавления учётной записи на LDAP-сервере запускается специальный сценарий, в +задачи которого входит уведомление соответствующих серверов о том, какие +ресурсы необходимо добавить. На сервере предусматривается простейшая служба, +доступ к которой ограничен исключительно IP-адресом LDAP-сервера. Эта служба не +выполняет деструктивных действий (например, не удаляет каталоги и почтовые +ящики) и не требует передачи пароля, кроме того, работает исключительно в +рамках ДМЗ. Так дополнительная служба на SMB-сервере принимает единственный +параметр — имя пользователя — и производит следующие действия: + +* Если такого пользователя нет в LDAP, не происходит ничего, кроме записи в + системный журнал о странном происшествии + +* Если пользователь есть в LDAP, но не имеет домашнего каталога, этот каталог + заводится + +* Если пользователь есть в LDAP, но не имеет прав доступа к собственному + домашнему каталогу, значит налицо конфликт нового и старого учётных имён; + имеющийся каталог перемещается в архив и заводится новый + +* Если пользователь есть в LDAP и имеет права доступа к домашнему каталогу, не + происходит ничего, кроме записи в системный журнал о странном происшествии + +Аналогичным способом организована дополнительная служба на почтовом сервере. + +При внедрении возможно решение, сочетающее в себе достоинства обоих описанных +выше способов: использовать первый алгоритм, но вместо запуска обновляющего +сценария по расписанию, использовать универсальную для всех серверов и ещё +более простую службу-«строб», единственная задача которой — дать команду +LDAP-клиенту обновить кеш и проверить наличие дополнительных ресурсов. Это +решение требует дальнейшего исследования. + +=== Внедрённые службы === + +В этом разделе описаны службы и технологии, не вошедшие в состав стендового +проекта, так как целесообразнее было внедрять их непосредственно на серверах +факультета. Как правило, речь идёт о доработке имеющихся служб или о службах, +уже функционирующих на факультете, включение которых в комплекс остаётся только +технической задачей на этапе внедрения. + +[float] +==== Почтовый антивирус и антиспам ==== + +Большинство нововведений и усовершенствований почтовой службы, за исключением +упомянутых ранее, проводились на факультетском почтовом сервере imap.cs.msu.su. + +[float] +==== Антивирус ClamAV ==== + +На факультетском почтовом сервере внедрена и работает система антивирусной +защиты почтовой пересылки. Используется свободно распространяемый антивирус +ClamAV. До 2000 года использовалась лицензированная серверная версия KAV, а до +2003 года — лицензированная серверная версия DrWEB. Обновление программной +составляющей KAV несколько раз приводило к останову службы (нарекания есть до +сих пор), а компания-производитель DrWEB находится в стадии организационной +перестройки (уже почти два года!) и, как следствие, имеет на сегодня +неопределённую политику в области лицензий и поддержки. + +База данных ClamAV обновляется очень оперативно (за счёт распределённости +сообщества), в прошлом году этот продукт заслужил отметку «Editors Choice» в +Linux Journal. Опыт эксплуатации ClamAV на факультете выявил единственную +неисправность, связанную с отсылкой информационного сообщения непосредственно в +момент приёма зараженного письма (в настоящий момент отключено). ClamAV не +умеет «лечить заражённые файлы», однако статистика показывает, что доля +вредоносных программ, сохраняющих исходный код заражённого фала, неуклонно +понижается (на сегодня отношение числа сообщений с «настоящими вирусами» к +общему количеству отфильтрованной почты, включая «троянское ПО», «spyware» и +пр., составляет доли процента). Существует реализация ClamAV также для Windows, +MacOS X и BeOS. + +Антивирус настроен в качестве почтового фильтра Sendmail (т. н. «milter») таким +образом, что при обнаружении вируса почтовое соединение разрывается и +сервер-отправитель получает уведомление о нарушении политики безопасности. + +[float] +==== Фильтрация непрошеной почты на основе чёрных списков ==== + +Большая часть непрошеной почты (спама) отсекается почтовым сервером ещё во +время SMTP-соединения. Делается это на основании публичных сетевых «чёрных +списков», содержащих IP-адреса компьютеров, хозяева которых уличены в рассылке +спама. В рамках проекта было проведено исследование современных чёрных списков +и реорганизация наборов чёрных списков на сервере. Основным направлением +исследования была попытка организовать эффективное распознавание т. н. +спам-агентов — пользовательских машин, заражённых троянским ПО и рассылающих +спам по команде из сети, а также составить каталог сетей с динамически +выделяемыми адресами (абонент такой сети имеет право пересылать почту только +через почтовый сервер своего провайдера). Более подробно о фильтрации см. +http://imap.cs.msu.su/spam/spam.html. + +[float] +==== Категоризация спама с помощью SpamAssassin ==== + +На сегодня невозможно достигнуть стопроцентной эффективности фильтрации спама +на основании одних только чёрных списков. Связано это с тем, что заражение +клиентских машин троянским ПО поставлено на поток (по причине слабой +защищённости ОС на этих машинах), и обновление чёрных списков происходит с +некоторым запаздыванием. + +Поэтому на факультете применяется классификатор полученных писем, позволяющий +сделать предположение о непрошености письма на основании анализа его +содержимого. Используется пакет SpamAssasin с набором дополнительных правил +SARE. Для удовлетворительной работы SpamAssassin необходимо было отключить все +правила, согласно которым письма в кириллической кодировке более подозрительны, +чем прочие (набор правил и SpamAssassin, и SARE — международный, так что +получение письма на русском языке, например, в Голландии сразу наводило бы +мысль о спаме). К сожалению, на факультете вообще нельзя использовать кодировку +как значимый фактор непрошености, так как почтовый сервер используется +иностранными студентами. Более подробно о работе SpamAssassin см. +http://imap.cs.msu.su/spam/antispam/sa-pres/text0.html. + +[float] +==== Ведение статистики ==== + +Сбор данных, пригодных для извлечения статистики, ведётся UNIX-подобными +системами автоматически посредством заполнения системных журналов. В рамках +проекта были рассмотрены несколько средств визуализации статистики (от простых, +наподобие mrtg, до «высокоинтеллектуальных», вроде nrg). Решено было +остановиться на промежуточном уровне: для универсального отображения любых +видов обновляемой информации используется пакет rrdtool, являющийся развитием +mrtg, а для составления разнообразных профилей отображения статистики — пакет +happystats (использующий rrdtool). Диаграммы, порождаемые rrdtool, включены в +упомянутую выше титульную страницу сервера, посвящённую спаму, а страницу +happystats можно увидеть на http://imap.cs.msu.su/cgi-bin/happystats.cgi. + +По данным статистики, за неделю чёрными списками и антивирусом отвергается +587588 соединений, а принимается — 130857 (18% по отношению к общему числу +SMTP-соединений, включая внутреннюю переписку и технический обмен сообщениями), +при этом доля сообщений, принятых сервером извне, составляет 9% (66767). Среди +них 49477 (74%) помечается классификатором как спам. Итого, общее число +«чистых» сообщений, составляет 17290 в неделю, или 2.4% от общего количества +SMTP-соединений, а если исключить из из числа внутренние и служебные, то — +2.65%. + +=== Домашние WWW-страницы пользователей и сервер совместной разработки === + +Во время разработки стендового проекта стоял вопрос об организации домашних +страниц пользователей на базе предложенной схемы. Никаких дополнительных +настроек это не требует: доступ к файловому пространству пользователя есть +посредством SMB, а в настройках HTTP-сервера достаточно разрешить использовать +UserDir. На этом уровне задача решена и в рамках стендового проекта (см. +http://jail.lvk.cs.msu.su/~tmpuser/), однако в предлагаемой схеме есть +определённые допущения, мешающие развитию проекта в этом направлении. +Во-первых, предполагается, что службы SMB и HTTP совмещены в одном компьютере и +пользуются одним и тем же дисковым пространством. Это противоречит методике +разработки комплекса, требующей возможности переноса любой службы на отдельный +компьютер. Во-вторых, имеет место различие уровней секретности публичных +(WWW-страница) и частных (файловый архив) данных, что требует различных учётных +записей и/или политик доступа к этим данным. В-третьих, предоставление +пользователям возможности использовать популярные технологии, наподобие CGI, +PHP, Zope и т. д., требует индивидуального подхода и существенно более +тщательного контроля доступа к ресурсам. + +Также не составило бы труда реализовать сервер совместной разработки +HTTP-страниц (т. н. «Wiki»), так как для этого требуется только установка и +простейшая настройка любого из нескольких десятков свободно распространяемых +продуктов класса «Wiki» или «CMS». Однако включение такой службы в единую +систему авторизации означало бы серьёзное (по нашему мнению — недопустимое) +изменение общей политики безопасности, так как проекты Wiki предусматривают +регистрацию и продуктивную работу любого заинтересованного субъекта глобальной +сети. + +В рамках проекта было проведено исследование подобного рода ПО на предмет +безопасности, простоты настройки и администрирования, простоты доработки и +спектра поддерживаемых функций. Было решено остановиться на пакете MoinMoin +(язык разработки — Python), дополнительным свойством которого является +встроенная в каждую страницу новостная лента RSS, отражающая изменения этой +страницы. Пример сайта, разработанного с помощью moinMoin — +http://uneex.cs.msu.su (время разработки — сутки, включая установку и настройку +самого MoinMoin, перенос содержимого, разработку нового стиля LeftSideBar, +цветовое оформление и разделение двух интерфейсов — https:, с возможностью +редактирования, и http: — только для чтения). + +Вместе с тем, на факультете в течение нескольких лет функционирует +хостинг-сервер, предоставляющий сотрудникам и учащимся ВМиК возможность +размещать свои WWW-страницы с поддержкой технологии VirtualHosting, +использованием языков программирования PHP, Perl, Python и др,, работает сервер +Wiki, есть возможность хранения данных в PostgreSQL и т д. + +На сервере организована дополнительная защита доступа: каждый пользователь +получает изолированное по технологии chroot окружение, не имея доступа к +файловому пространству системы и других пользователей. Обновление содержимого +производится по защищённому протоколу SSH (SCP/SFTP, рекомендуемый клиент для +Windows — WinSCP). + +О разрешении какого-либо доступа, кроме общего, и притом на чтение, по +протоколу FTP на сегодняшний день думать не приходится, так как в классическом +FTP авторизационная информация передаётся в открытом виде, а клиентские +реализации FTP с поддержкой TLS пока что непопулярны. Тем не менее, серверная +реализация FTP с поддержкой TLS существует в нескольких вариантах, один из +которых успешно эксплуатируется на факультетском +сборочном/информационном/FTP-сервере в течение нескольких лет. From 10e1d19b269a414ce666df55230c4caeac655206 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Thu, 16 Jan 2014 15:38:35 +0300 Subject: [PATCH 23/53] Add old documentation about configuring console information taken from .rpm file: docs-console_setup-0.1-alt2.noarch.rpm --- old-docs/console_setup.txt | 121 +++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 old-docs/console_setup.txt diff --git a/old-docs/console_setup.txt b/old-docs/console_setup.txt new file mode 100644 index 0000000..5e84eca --- /dev/null +++ b/old-docs/console_setup.txt @@ -0,0 +1,121 @@ +//// +Пакет: docs-console_setup +RPM файл: docs-console_setup-0.1-alt2.noarch.rpm +Аннотация: Настройка консоли в Linux: шрифты, раскладки клавиатуры, + русификация. +Автор: Георгий Курячий +Лицензия: FDL +URL: http://heap.altlinux.org/modules/console_setup.kirill/index.html +//// + +== Настройка консоли == + +Виртуальная консоль Linux организована на основе текстовых возможностей +графического контроллера (как правило, совместимого со стандартом VESA или, по +крайней мере. EGA/VGA). VGA поддерживает загрузку однобайтовых шрифтов (256 +изображений размера 8x16, 8x14 или 8x8 пикселей) в специальный раздел +видеопамяти. Это означает, что полноценная поддержка языка, содержащего большее +количество символов (например, маньчжурского) в такой консоли невозможна. К +счастью, в русском языке букв гораздо меньше. + +К сожалению, существует более чем одна договорённость о том, как именно +располагаются русские буквы в шрифте (т. н. кодировка, или codepage). Для +кириллических шрифтов VGA принята кодировка cp866 (т. н. “ДОСовская”). Дело в +том, что в некоторых текстовых режимах VGA одно знакоместо занимает не 8, а 9 +пикселей. Поскольку изображение, тем не менее, используется восьмиточечное, +девятая точка всегда рисуется цветом фона. Исключение делается для символов +шрифта с порядковым номером от 192 до 223 включительно, соответствующих в +стандартной кодировке псевдографике с горизонтальными линиями. При выводе +такого символа на экран девятая точка каждой линии в его изображении рисуется +так же, как восьмая. В результате горизонтальные линии получаются непрерывными. + +Загрузкой шрифта занимается утилита consolechars. Ей можно подать на вход шрифт +в двоичном (raw) формате. Двоичный формат содержит изображения всех символов +шрифта и имеет, например, размер 256 символов * 16 точек в высоту * 8 точек в +ширину = 32768 бит (4096 байт). Можно использовать шрифты, оставшиеся от +русификаторов DOS, вроде RK или VGACYR! Стандартный для consolechars формат PSF +дополнительно содержит информацию о том, каким символам в кодировке Unicode +(двухбайтовой) соответствует каждое изображение в шрифте. Эту информацию (т. н. +таблицу соответствия шрифта, Screen Font Map), можно подгружать и отдельно, с +помощью ключа -u таблица.sfm. Для того, чтобы загрузить только изображения из +формата RAW и получить полноценный PSF-шрифт с внедрённой таблицей SFM, можно +воспользоваться командами + +---- +$ consolechars -f VGACYR.RAW +$ consolechars -F VGACYR_with_SFM.psf +---- + +Система позволяет установить любую из имеющихся кодировок при выводе данных на +виртуальную консоль. Поскольку данные о соответствии шрифта и Unicode +добываются из SFM или PSF-файла, остаётся только сообщить, как в ту же Unicode +преобразуется выбранная кодировка вывода. Для этого используется т. н. рабочая +таблица кодировки (Allpication Charset Map, называемая также screenmap). Вывод +на консоль выглядит так, как если бы данные сначала преобразовывались в Unicode +на основании загруженной ACM-таблицы, а затем превращались в восьмибитное +представление с помощью загруженной таблицы ACM. Загрузкой ACM-таблицы +занимается та же утилита: consolechars -a таблица.acm. + +Наконец, для локализации ввода с консольной клавиатуры необходимо сообщить +системе используемую раскладку (keymap). Клавиатура IBM-совместимого компьютера +— довольно сложное устройство, передающее в различных случаях разное количество +информации. Задача виртуальной консоли — преобразовать эту информацию в поток +символов, как если бы он приходил с настоящего терминала. Консоль может +находиться в нескольких состояниях; от того, в каком состоянии находится +консоль, зависит то, что будет происходить при нажатии на конкретную клавишу. +Раскладка — это карта соответствия клавиш на клавиатуре действиям, выполняемым +в разном состоянии консоли. + +Раскладка обычно использует не менее двух состояния: Shift и Control. Первое +состояние используется для того, чтобы посылать одной и той же клавишей +прописной или строчный вариант буквы, цифру или специальный символ и т. п. +Второе используется, чтобы посылать с клавиатуры символы с ascii-кодом, меньшим +0x20 (32), т. н. непечатные. Если, допустим, клавиша A посылает символ с кодом +0x41 (65), то в состоянии Control эта клавиша посылает символ с кодом 0x1, то +есть от кода символа в двоичном представлении отрезаются все биты, кроме первых +пяти. Ещё одно состояние — AltGr — используется в локализованных раскладках для +того, чтобы возвращать буквы национального алфавита. Таких состояний определено +восемь (см. руководство keymaps(5)). В раскладке им соответствует 256 (!) +вариантов поведения консоли для каждой клавиши — по одному варианту на любое +сочетание состояний. + +Клавиши, переводящие консоль в новое состояние, называются модификаторами +состояний: Shift, Alt и Ctrl. В раскладке им будет соответствовать функция +перевода консоли в соответствующее состояние — на время, пока клавиша нажата. +Если клавиша переводит консоль в определённое состояние до другого нажатия на +эту клавишу, это — залипающий модификатор. Такими модификаторами являются, +например, Caps Lock или выбираемый при установке по умолчанию переключатель на +русский язык — сочетание Ctrl+Shift. + +Загрузкой раскладки в консоль занимается утилита loadkeys. Ей на вход подаётся +файл раскладки, в котором описано поведение каждой клавиши. Формат этого файла +похож на тот, что используется в системе X11 утилитой xmodmap. Если в этом +файле опущены строки, описывающее поведение некоторых клавиш, то при его +загрузке оно не меняется. Поэтому если вам необходимо только изменить уже +загруженную раскладку, достаточно создать kmap-файл, описывающий эти изменения +и загрузить его. Например, такой файл может отменять установленные по умолчанию +функции переключения виртуальных консолей при нажатии на клавиши Menu и Windows +105-клавишной клавиатуры (они находятся между Ctrl и Alt, и по ним часто +попадаешь случайно). Кроме того, может заставить клавишу Backspace в состоянии +Shift возвращать не Delete, а именно BackSpace и присвоить клавише Menu функцию +переключения на локальную раскладку и обратно. + +---- +$ cat mnu_bs.kmap + keycode 14 = Delete BackSpace Delete BackSpace + keycode 125 = CapsShift + keycode 126 = AltGr + keycode 127 = AltGr_Lock +$ loadkeys mnu_bs.kmap +---- + +Систему можно настроить так, чтобы ещё при начальной загрузке устанавливались +определённые шрифты и раскладки. Файл /etc/sysconfig/i18n описывает язык по +умолчанию, шрифт (поле SYSFONT) и ACM-таблицу (поле SYSFONTACM). +Соответствующий шрифт, ACM и, если надо, SFM-таблицу система берёт из каталогов +/etc/sysconfig/console/consolefonts и /etc/sysconfig/console/consoletrans. Все +возможные консольные шрифты хранятся в /usr/lib/kbd/consolefonts, а таблицы — в +каталоге /usr/lib/kbd/consoletrans. Раскладка определяется содержимым файла +/etc/sysconfig/keyboard (поле KEYTABLE), всевозможные консольные раскладки +лежат в подкаталогах /usr/lib/kbd/keymaps (сообразно архитектуре и типу +клавиатуры). From 5e7a4efef74b7adb1eb6ae8a0359c0c514a31dc3 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Thu, 16 Jan 2014 15:43:51 +0300 Subject: [PATCH 24/53] Add old documentation about configuring corporate network information taken from .rpm file: docs-corpnet-0.1-alt1.noarch.rpm --- old-docs/corpnet.txt | 165 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 old-docs/corpnet.txt diff --git a/old-docs/corpnet.txt b/old-docs/corpnet.txt new file mode 100644 index 0000000..b3525ec --- /dev/null +++ b/old-docs/corpnet.txt @@ -0,0 +1,165 @@ +//// +Пакет: docs-corpnet +RPM файл: docs-corpnet-0.1-alt1.noarch.rpm +Аннотация: Рекомендации по организации корпоративной + сети на базе Linux +Автор: Андрей Горев +Лицензия FDL +URL: http://heap.altlinux.org/modules/dhcp.kirill.prev/index.html +//// + +== Организация корпоративной сети == + +При организации корпоративных сетей очень важен этап предварительного +планирования топологии сети, нагрузки по сегментам сети, расчёт протяжённости +кабельной системы, а также затратная часть на сетевую инфраструктуру и серверы, +предоставляющие сервис в этой сети. От правильности начального планирования +зависит производительность и масштабируемость всей сети в целом и её отдельных +компонентов. Ваша сеть скорее всего будет работать по Ethernet, а там, как +известно используется протокол обнаружения коллизий. Чем правильнее вы +спланируете свою сеть, тем меньше будет этих коллизий и тем лучше будет +работать сеть в целом. На стадии планирования вам поможет статья по адресу +http://citforum.ru/nets/articles/lso.shtml. + +После того, как вы набросали план вашей будущей сети и приобрели необходимое +оборудование, нужно распределить адресное пространство. В разделе Настройка +сети приводилось несколько ссылок, помогающих разобраться в тонкостях +организации подсетей, работе с сетевыми масками и пр. Здесь мы рассмотрим, +почему используют подсети при организации корпоративных сетей. + +Очень важным является следование RFC1918, которая регламентирует используемое +для построения внутренних сетей адресное пространство. Напомним, что это блоки +адресов: 10.0.0.0/8 для сетей класса A, 172.16.0.0/16—172.31.0.0/16 для сетей +класса B, 192.168.0.0/16 для сетей класса C. Здесь после знака / указана +битовая маска сети. Если вы не будете следовать этим рекомендациям, то у вас +могут возникнуть сложности при подключении сети к Интернет. + +Далее нужно выбрать из перечисленных выше вариантов сетевой блок, который будет +удовлетворять размерам вашей сети. Как правило, в случае небольшой сети (до 254 +машин), выбирают сеть 192.168.0.0/24. Для сети масштаба предприятия выбирают +сеть класса А. + +Введите организацию подсетей: адрес сети класса A может быть разбит на +несколько (если не много) отдельных сетей. Управлять каждой отдельной сетью +значительно проще. + +Это позволяет устанавливать и управлять небольшими сетями — весьма возможно +использовать различные технологии организации сетей. Помните, вы не можете +смешивать Ethernet, Token Ring, FDDI, ATM и т. п. на одной физической сети, +однако они могут быть связаны мостами (bridges). + +Другие причины для организации подсетей: + +* Физическое размещение сайта может быть ограничено длиной кабеля. Ясно, что + физическая инфраструктура может быть связана, требуя множественные сети. + Организация подсетей позволяет это сделать, используя единственный сетевой + номер. Сейчас это обычно делают интернет-провайдеры, которые желают дать + своим постоянным клиентам с локальными сетями статические IP-адреса. + +* Сеть перегружена. Её разбивают на подсети так, чтобы трафик был сосредоточен + внутри подсетей, разгружая таким образом всю сеть, без необходимости + увеличивать её общую пропускную способность. + +* Разделение на подсети может быть продиктовано соображениями безопасности, т. + к. трафик в общей сети может быть перехвачен. Организация подсетей + обеспечивает способ, позволяющий предохранить отдел маркетинга от “сующих нос + не в свои дела”. + +* Имеется оборудование, которое использует несовместимые технологии организации + сетей, и есть потребность связать их (как упомянуто выше). + +Каждая сеть имеет два адреса, не используемых для сетевых интерфейсов +(компьютеров) — сетевой номер сети и широковещательный адрес. Когда вы +организуете подсеть, каждая из них требует собственного, уникального IP-адреса +и широковещательного адреса, причём они должны быть правильными внутри +диапазона адресов сети, которую вы организуете. + +Таким образом, разделение сети на две подсети приводит к тому, что образуются +два адреса сети и два широковещательных адреса — увеличивается число +“неиспользуемых” адресов интерфейсов; создание 4-х подсетей приведёт к +образованию 8-и неиспользуемых адресов интерфейсов и т. д. + +Фактически, самая маленькая пригодная для использования подсеть состоит из 4 +IP-адресов: + +* Два используются для интерфейсов: один для маршрутизатора в этой сети, другой + для единственной машины в этой сети. + +* Один адрес сети. + +* Один широковещательный адрес. + +Если у вас в подсети один компьютер, то любые сетевые сообщения должны +отправляться в другую подсеть. Этим будет заниматься маршрутизатор, на котором +вы в таблицу маршрутизации прописываете пути в эти подсети. А на этом +единственном компьютере в подсети вы указываете маршрутизатор как маршрут по +умолчанию, или шлюз. Для того, чтобы маршрутизатор перебрасывал пакеты между +интерфейсами, вам обязательно надо включить форвардинг. Делается это в файлах +/etc/sysconfig/network и /etc/sysctl.conf. + +Сетевая маска позволяет разделить сеть на несколько подсетей. Сетевая маска для +сети, не разделённой на подсети — это просто четвёрка чисел, которая имеет все +биты в полях сети, установленные в 1 и все биты машины, установленные в 0. + +Таким образом, для трёх классов сетей стандартные сетевые маски выглядят +следующим образом: + +|============================================= +|Класс A|8 сетевых битов |255.0.0.0 +|Класс B|16 сетевых битов |255.255.0.0 +|Класс C|24 сетевых бита |255.255.255.0 +|============================================= + +Способ организации подсетей заимствует один или более из доступных битов номера +хоста и заставляет интерпретировать эти заимствованные биты как часть сетевых +битов. Таким образом, чтобы получить возможность использовать вместо одного +номера подсети два, мы должны заимствовать один бит машины (крайний левый), +установив его в сетевой маске в 1. + +Для адресов сети класса C это привело бы к маске вида +11111111.11111111.11111111.10000000 или 255.255.255.128 К примеру, для сети +класса C с сетевым номером 192.168.1.0, есть несколько случаев: + +[options="header"] +|======================================================= +|Число подсетей |Число машин на сеть |Сетевая маска +|2 |126 |255.255.255.128 +|4 |62 |255.255.255.192 +|8 |30 |255.255.255.224 +|16 |14 |255.255.255.240 +|32 |6 |255.255.255.248 +|64 |2 |255.255.255.252 +|======================================================= + +В принципе, нет абсолютно никакой причины следовать вышеупомянутым способам +организации подсетей, где сетевые биты добавлены от старшего до младшего бита +хоста. Однако, если вы не выберете этот способ, то в результате IP-адреса будут +идти в очень странной последовательности! Но в результате, решение, к какой +подсети принадлежит IP-адрес, получается чрезвычайно трудным для нас (людей), +поскольку мы не слишком хорошо считаем в двоичной арифметике (с другой стороны, +компьютеры, с равным хладнокровием, будут использовать любую схему, которую вы +им предложите). + +Выбрав подходящую сетевую маску, вы должны определить сетевые, +широковещательные адреса и диапазоны адресов для получившихся сетей. Учтите, +что при увеличении числа подсетей сокращается число доступных адресов для +компьютеров. Располагая этой информацией, вы можете назначить адреса машин, +сетевые адреса и сетевые маски. + +Последним этапом будем считать настройку маршрутизатора. Статические маршруты в +подсети описываются в файле /etc/sysconfig/static-routes. Заметьте, что по +умолчанию этого файла нет! Синтаксис записей в файле примерно такой: + +---- +eth1 host 172.16.50.2 +eth1 net 0/0 gw 10.255.16.1 +---- + +Здесь во второй строке для примера нестандартным образом указан маршрут по +умолчанию. Стандартно он оформляется в файлах-описаниях интерфейсов и +/etc/sysconfig/network. Напоминаем про необходимость включения форвардинга. Это +можно сделать не перезагружая систему, дав команду echo "1" > +/proc/sys/net/ipv4/ip_forward + +Ну и напоследок, не лишней будет настройка на маршрутизаторе межсетевого +экрана, подробнее об этом см. раздел Сетевая безопасность. From b9d7b6c74b39e4fd4506fef25afd84ffcfdef1a2 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Thu, 16 Jan 2014 15:48:27 +0300 Subject: [PATCH 25/53] Add old documentation about dhcp information taken from .rpm file: docs-dhcp-0.1-alt2.noarch.rpm --- old-docs/dhcp.txt | 140 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 old-docs/dhcp.txt diff --git a/old-docs/dhcp.txt b/old-docs/dhcp.txt new file mode 100644 index 0000000..a128777 --- /dev/null +++ b/old-docs/dhcp.txt @@ -0,0 +1,140 @@ +//// +Пакет: docs-dhcp +RPM файл: docs-dhcp-0.1-alt2.noarch.rpm +Аннотация: Описаны технологии автоматической настройки Сети +Автор: Георгий Курячий +Лицензия: FDL +URL: http://heap.altlinux.org/modules/dhcp.kirill/index.html +//// + +== Автоматическая настройка сети (RARP и DHCP) == + +Если система устанавливается на компьютер, включённый в корпоративную сеть, +многие параметры сетевых настроек известны заранее. Более того, нежелательно, +чтобы эти известные заранее настройки хозяин компьютера мог самостоятельно +изменять. Наконец, необходим механизм автоматической передачи +компьютерам-абонентам сети таких заранее определяемых системным администратором +настроек, как сетевой адрес и маска, адрес маршрутизатора (шлюза), адрес +сервера доменных имён (DNS) и некоторых других. + +Следует понимать, что всей мощью сетевых протоколов TCP/IP компьютер, не +имеющий пока своего IP-адреса, воспользоваться не может. Поэтому сервис +удалённой настройки должен опираться на информацию более низкого уровня +(интерфейсного уровня TCP/IP). В частности, при использовании сети Ethernet, в +качестве идентификатора компьютера может выступать уникальный идентификатор его +сетевого интерфейса (т. н. MAC-адрес сетевой карты). MAC-адрес шестибайтное +число, традиционно представляемое в виде шести шестнадцатеричных чисел, +разделённых символом :; он содержится, например, в выдаче команды ifconfig. +Любые пакеты (фреймы), передаваемые в Ethernet, содержат MAC-адрес в полях +идентификатор отправителя и идентификатор получателя. Сетевая карта, получив +пакет, сравнивает MAC-адрес получателя со своим, и только в случае совпадения +передаёт в систему. Исключение — т. н. широковещательный идентификатор +получателя, ff:ff:ff:ff:ff:ff, пакеты с которым передаются системе в любом +случае. + +Компьютер-абонент локальной сети при включении посылает специальный +широковещательный Ethernet-пакет, который трактуется как запрос “настрой меня”. +В сети должен находиться хотя бы один (и лучше, чтобы один) сервер, способный +обрабатывать такой запрос, который, на основании MAC-адреса отправителя и +некоторой собственной информации, формирует ответ, содержащий настроечные +данные для абонента. Система абонента должна такой ответ обработать, выбрать +оттуда интересующую её информацию и настроить сетевые параметры. Таким образом, +автоматическая настройка требует наличия в сети сервера, который раздаёт +параметры и следит за их употреблением, и клиента на абонентской машине, +который эти параметры применяет. + +Самый простой способ автоматической настройки воспользоваться стандартной для +семейства протоколов TCP/IP службой преобразования адресов — RARP (Reverse +Address Resolution Protocol). Служба эта преобразует низкоуровневые адреса (в +случае Ethernet — MAC-адреса, интерфейсный уровень) в высокоуровневые +(IP-адрес, сетевой уровень). (Протокол ARP, преобразующий высокоуровневые +адреса в низкоуровневые, используется в TCP/IP сетях постоянно для определения +MAC-адресов абонентов локальной сети). В Linux формированием RARP-запроса +занимается ядро. Сервер rarpd, отвечая на RARP-запросы, пользуется простейшей +таблицей соответствия IP-адресов MAC-адресам в сети. Никакой другой информации +по RARP передать нельзя, поэтому сегодня он используется главным образом для +сетевой загрузки компьютеров (в этом случае простой RARP-запрос формирует не +система, а сама сетевая карта, она же запоминает ответ, а система считывает +этот ответ при загрузке). + +Более гибкий протокол удалённой настройки — DHCP (Dynamic Host Configuration +Protocol). Он позволяет передавать не только IP-адрес, но и адреса +маршрутизаторов, список DNS-серверов, позволяет управлять удалённой загрузкой, +и передавать вообще любые данные, лишь бы они распознавались с клиентской +стороны. Что не менее важно, сервер dhcpd (из пакета dhcp-server║), может +настраивать компьютеры, MAC-адрес которых заранее неизвестен, выделяя им +IP-адреса из заданного диапазона (не навсегда, а на время) и следя за тем, +чтобы разным компьютерам выдавались разные адреса. Более того, однажды выданный +IP-адрес закрепляется за определённым компьютером и выдаётся ему при повторных +запросах — до тех пор, пока адресов в диапазоне хватает для вновь подключаемых +абонентов DHCP. Если запас адресов всё же исчерпан, очередному новому +компьютеру будет выдан адрес, который дольше всего не использовался. + +Сетевая настройка клиента при этом сводится к запуску клиентского демона +dhcpcd, который регулярно засылает в сеть DHCP-запросы и интерпретирует ответы. +dhcpcd умеет обновлять /etc/resolv.conf и некоторые другие настроечные файлы, +модифицируя поведение соответствующих служб системы. Чтобы активизировать +настройку по DHCP при начальной загрузке системы, достаточно в файле, допустим, +/etc/sysconfig/network-scripts/ifcfg-eth0, указать строку BOOTPROTO=dhcp и +убрать строки настройки IP-адреса и/или маршрутизатора. + +Настройка сервера dhcpd, в общем случае, довольно проста. Прежде всего следует +убедиться в том, что ваш DHCP-сервер — единственный в локальной сети, в +противном случае следует настраивать взаимодействие между серверами. Затем +создать файл настройки /etc/dhcp/dhcpd.conf, в котором при помощи ключевого +слова subnet должны быть описаны все сетевые подключения, имеющиеся на вашем +компьютере. В обязательном порядке надо сообщить, какой стиль динамического +обновления DNS будет использоваться (проще всего его выключить). Наконец, хотя +бы в одной из подсетей необходимо выделить диапазон адресов для раздачи. После +этого можно запускать DHCP-демон. + +Предположим, адрес вашего компьютера в Интернет (подключён посредством +интерфейса eth0) — 207.68.172.234, а интерфейс eth1 подключён к внутренней +локальной сети, адрес вашего компьютера в которой — 10.10.10.2. Тогда файл +настройки примет вид + +---- +ddns-update-style none; + +subnet 207.68.172.0 255.255.255.0; + +subnet 10.10.10.0 netmask 255.255.255.0 { + range 10.10.10.10 10.10.10.254; +} +---- + +В нашем примере машинам из внутренней сети будут выдаваться адреса от +10.10.10.10 до 10.10.10.254 (точнее, от 10.10.10.254 до 10.10.10.10, так как +dhcpd начинает с наибольшего адреса). + +Если необходимо, чтобы ваш компьютер выполнял функции маршрутизатора и сервера +имён для внутренней сети (домен internal.com), то после настройки +соответствующих служб, в этот файл следует добавить — по аналогии с range — +строки + +---- +option routers 10.10.10.2; +option domain-name-servers 10.10.10.2; +option domain-name "internal.com"; +---- + +Чтобы постоянно выдавать определённый IP-адрес определённому компьютеру, +необходимо, как и в случае RARP, привязать IP-адрес к идентификатору сетевого +интерфейса этого компьютера. В случае сети Ethernet в этой роли выступает +MAC-адрес. Соответствующая запись в /etc/dhcp/dhcpd.conf может выглядеть, +например, так: + +---- +host fixed { + hardware ethernet 0:c0:c3:49:2b:57; + fixed-address 10.10.10.11; +} +---- + +Следует помнить, что сервис ║dhcpd║ использует технологию chroot: его рабочий +каталог — /var/lib/dhcp/dhcpd. В этом каталоге, помимо прочего, в файле +/var/lib/dhcp/dhcpd/state/dhcpd.leases хранится информация о когда-либо +выданных адресах и сроках их действия. + +Более подробную информацию о работе с DHCP можно найти в руководствах, входящих +в соответствующие пакеты. From da5d7b9c45eb0cd594de5f1047dae5ce72bfa000 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Thu, 16 Jan 2014 16:22:42 +0300 Subject: [PATCH 26/53] Add and include to build "old-docs/index.txt" --- index.txt | 2 ++ old-docs/index.txt | 9 +++++++++ 2 files changed, 11 insertions(+) create mode 100644 old-docs/index.txt diff --git a/index.txt b/index.txt index 6297926..396db13 100644 --- a/index.txt +++ b/index.txt @@ -55,3 +55,5 @@ include::packages/index.txt[Установка приложений] include::admin-basics/index.txt[Основы администрирования] include::support/index.txt[Технич. поддержка] + +include::old-docs/index.txt[Документациия из старых RPM пакетов] diff --git a/old-docs/index.txt b/old-docs/index.txt new file mode 100644 index 0000000..30b76aa --- /dev/null +++ b/old-docs/index.txt @@ -0,0 +1,9 @@ += Старая документация = + +include::cmc_communication_stand.txt[] + +include::console_setup.txt[] + +include::corpnet.txt[] + +include::dhcp.txt[] From eee2a6144fd4a863ac6736d25d52b95ab584e521 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Fri, 17 Jan 2014 10:41:21 +0300 Subject: [PATCH 27/53] Add old docs from docs-emacs_email-0.1-alt2.noarch.rpm --- old-docs/emacs_email.txt | 364 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 364 insertions(+) create mode 100644 old-docs/emacs_email.txt diff --git a/old-docs/emacs_email.txt b/old-docs/emacs_email.txt new file mode 100644 index 0000000..ced4441 --- /dev/null +++ b/old-docs/emacs_email.txt @@ -0,0 +1,364 @@ +//// +Пакет: emacs_email +RPM файл: docs-emacs_email-0.1-alt2.noarch.rpm +Аннотация: Краткое описание использования Emacs для работы с почтой и + новостями Usenet +Автор: Алексей Отт (http://xtalk.msk.su/~ott/) +Лицензия: http://creativecommons.org/licenses/by-nc-sa/2.0/ +URL: http://heap.altlinux.org/modules/EmacsEmail.kirill/index.html +//// + +== Использование Emacs для работы с электронной почтой и новостями Usenet == + +[float] +=== Введение === + +В этом документе рассказывается о том, как можно использовать Emacs для работы +с электронной почтой и новостями Usenet. В статье упоминается GNU Emacs, но +практически всё сказанное справедливо и для XEmacs. + +Достаточно подробный список пакетов для работы с почтой вы можете +http://www.emacswiki.org/cgi-bin/wiki?GettingMail[найти] на сервере +http://www.emacswiki.org/[EmacsWiki] + +=== Пакет Gnus === + +Gnus — это пакет Emacs, разработанный в первую очередь для чтения и отправки +новостей Usenet. Его также можно использовать для чтения и написания ответов на +сообщения из многих других источников — почты, удалённых каталогов, дайджестов +и других источников данных. Большой набор заметок о Gnus вы сможете найти в +соответствующем разделе EmacsWiki. + +[float] +==== Буфера Gnus ==== + +Для показа информации и получения команд Gnus использует несколько разных +буферов. Большую часть времени пользователи проводят в трех буферах — буфере +групп, буфере резюме и буфере статьи. + +Буфер групп содержит перечень групп. Это первый буфер, который Gnus показывает +после запуска. Обычно в нем показаны только те группы, на которые вы подписаны, +и в которых есть непрочитанные статьи. Используйте этот буфер для выбора +конкретной группы. + +Буфер резюме построчно перечисляет статьи одной группы. По умолчанию для каждой +статьи показываются автор, заголовок и число строк, но это можно настроить по +своему вкусу, как и большую часть того, что отображает Gnus. Буфер резюме +создается, когда вы выбираете группу в буфере групп, и уничтожается, когда вы +покидаете эту группу. Используйте этот буфер для выбора статьи. + +Буфер статьи отображает саму статью. При обычном использовании Gnus вы не +выбираете этот буфер — все полезные команды, предназначенные для работы над +статьей, прекрасно работают и из буфера резюме. Но вы можете выбрать буфер +статьи и выполнять все команды Gnus из него, если вы этого хотите. + +[float] +==== Запуск Gnus ==== + +Для запуска Gnus просто наберите M+x gnus. При запуске Gnus считывает ваш файл +инициализации новостей .newsrc и пытается установить связь с локальным сервером +новостей, который служит хранилищем статей. Сервер новостей не обязан быть тем +же компьютером, на который вы вошли. + +Если вы запустили Gnus и соединились с сервером, но не видите в буфере групп ни +одной группы, наберите L или A k, чтобы получить список всех доступных групп. +Затем нажимайте u на нужной вам группе, чтобы переключать подписку на данную +группу. + +Когда вы запускаете Gnus первый раз, он подписывает вас на несколько избранных +групп. Все остальные группы сначала невидимы для вас; вы можете получить их +список с помощью последовательности клавиш A k. Все новые группы, появляющиеся +в дальнейшем на сервере, становятся для вас «зомбированными»; чтобы получить их +перечень наберите A z. Вы можете подписаться на группы, показанные в этих +списках, используя команду u. + +Когда вы покидаете Gnus при помощи команды q, то он автоматически записывает в +ваших файлах инициализации .newsrc и .newsrc.eld статус подписки всех групп. +Обычно вам не стоит редактировать эти файлы вручную, но вы можете это сделать, +если точно уверены в том, что надо в них писать. + +[float] +==== Работа с Gnus ==== + +Для чтения статей из конкретной группы, надо просто установить курсор на нужную +группу и нажать на клавишу пробела. При этом будет открыт буфер резюме, в +котором будет отображен список непрочитанных статей и отображена первая +непрочитанная вами статья. Если непрочитанных статей слишком много, то Gnus +выдаст запрос о том, сколько статей необходимо отобразить. Переменная +gnus-large-newsgroup определяет пороговое значение, при превышении которого +группа будет считаться большой и будет выдаваться предупреждение. + +Если вам необходимо увидеть и прочитанные статьи, то для их выбора вам нужно +использовать комбинацию C+u space. Кроме того, после префиксной комбинации вы +можете указать число, которое определит количество выбираемых статей. +Положительное число N выбирает N самых последних статей, а отрицательное число +— N самых старых статей. Например, C+u - 5 0 space выберет 50 самых старых +статей. + +[float] +==== Настройка Gnus для работы с электронной почтой ==== + +Gnus обрабатывает почту точно также, как и новости Usenet. Для того чтобы +читать электронную почту в Gnus, надо просто задать метод для обработки почты и +источники её получения. Это определяется с помощью следующего кода в вашем +файле ~/.emacs или ~/.gnus (этот файл используется только для инициализации +Gnus): + +---- + (setq gnus-secondary-select-methods '((nnml ""))) + (setq mail-sources + '((file :path "/var/spool/mail/user-name") + (pop :server "pop3.mail.server" + :user "user-name" + :port "pop3" + :password "secret"))) +---- + +Первая строка задает список вторичных методов получения новостей для Gnus. В +нашем примере этот список состоит только из одного элемента — nnml, который +задает метод для чтения почты. Вторая и последующая строки перечисляют +источники получения почты. Переменная mail-sources содержит список, каждый +элемент которого является списком, в котором первый элемент указывает на тип +источника почты, а затем идет список ключевых слов и значений для них. Список +ключевых слов зависит от типа источника почты и полное их описание вы можете +найти в справке по Gnus. В нашем примере задаётся два источника почты. Первый — +это локальный файл с почтой, который задается путем /var/spool/mail/user-name, +а второй источник — это POP3-сервер, для которого указывается большее +количество ключевых слов, описывающих параметры подключения к данному серверу. +Будьте внимательны, помещая пароль для доступа к почте в ваш файл настройки +Emacs: если вы хотите хранить в нём ваш пароль, то запретите чтение этого файла +для всех остальных пользователей вашей системы. + +Gnus обладает очень богатыми возможностями по разбиению почты на группы. Его +возможности позволяют разбить почту по множеству признаков. Разбиение почты на +группы зависит от содержимого переменной nnmail-split-methods, которая содержит +список списков, состоящих из пар строк — имени группы и регулярного выражения, +при соответствии которому сообщение помещается в соответствующую группу. +Следующий код продемонстрирует простой пример обработки входящей почты: + +---- + (setq nnmail-split-methods '( + ("ALT-sisyphus" "^\\(To\\|From\\|Cc\\):.*sisyphus@altlinux\\.ru.*") + ("ALT-devel" "^\\(To\\|From\\|Cc\\):.*devel@altlinux\\.ru.*") + ("inbox" ""))) +---- + +В этом примере создается три группы. В первые две группы помещаются сообщения +только из списков рассылки ALTLinux Sisyphus и ALTLinux Devel. В группу inbox +помещаются все остальные сообщения, для которых не было совпадения по +регулярным выражениям. + +Чтобы создать новое почтовое сообщение просто нажмите на клавишу m в буфере +групп или буфере резюме. При этом будет отображено новое окно, в котором вы +можете ввести адрес получателя и тему сообщения, а также сам текст сообщения. +Текст сообщения должен идти после строки + +--text follows this line-- + +Все, что находится до этой строки, рассматривается как заголовки. Это позволяет +вам вручную задавать дополнительные заголовки, такие как Bcc. Часть заголовков +может подставляться автоматически. К примеру, чтобы все отправляемые сообщения +складывались в отдельную группу, вам необходимо вписать в ваш файл +инициализации следующий код: + +(setq gnus-outgoing-message-group "nnml:sent") + +После установки этой переменной, все отправляемые сообщения будут помещаться в +группу sent, доступ к которой осуществляется с помощью метода nnml. + +[float] +==== Другие возможности Gnus ==== + +В предыдущем тексте была описана лишь малая часть возможностей Gnus. Кроме +обычных групп для почты и новостей, Gnus позволяет создавать виртуальные +группы, которые состоят из частей других групп. Также можно отображать в виде +групп новостей результаты поиска в Интернете, серверы каталогов и прочее. + +Кроме того, Gnus обладает мощными средствами по фильтрации и удалению ненужных +вам сообщений. Работа этого средства основана на подсчёте весов сообщения +(Scoring). Веса могут добавляться или удаляться в зависимости от текста и +заголовка сообщения, его авторов и многих других параметров. Это позволяет +эффективно работать с новостями, читая только то, что необходимо. + +Gnus также умеет взаимодействовать с разными системами определения +нежелательных почтовых рассылок, позволяя вам не отвлекаться на ненужную вам +почту. + +=== Пакет Rmail === + +Этот пакет поставляется вместе с GNU Emacs и предназначен для чтения и хранения +получаемой вами почты. Для запуска этого пакета достаточно просто набрать M+x +rmail. При этом будет прочитан файл с почтой Rmail (обычно это ~/RMAIL), +забрана почта из ваших почтовых ящиков, и отображено первое непрочитанное вами +сообщение. + +Emacs использует сужение для того, чтобы отображать только одно сообщение в +каждый отдельно взятый момент времени. Внутри файла Rmail сообщения +располагаются в порядке их поступления в ваши почтовые ящики. Вы также можете +указать другие методы сортировки сообщений. + +Кроме основного файла с сообщениями Rmail вы можете создавать и использовать +другие файлы с сообщениями. Почта в эти файлы может поступать из других +почтовых ящиков или из своего основного файла Rmail. + +Rmail предоставляет пользователю возможность назначения меток на конкретные +почтовые сообщения, или группы сообщений. Обычно метки используются для +классификации сообщений. Затем эти метки можно использовать для сортировки +писем, или для перемещения их в другие файлы Rmail. + +Более подробную информацию о пакете Rmail можно получить в документации, +которая поставляется вместе с GNU Emacs. Вы также можете прочитать об этом +пакете в русском переводе руководства по GNU Emacs. + +=== Пакет MH-E === + +Этот пакет предоставляет доступ к почтовой программе MH прямо из Emacs. Этот +пакет поставляется вместе с GNU Emacs, так что нет никакой необходимости +устанавливать его самостоятельно. + +Пакет поддерживает чтение и отправку электронной почты, в том числе и +сообщений, соответствующих стандарту MIME. Умеет работать с каталогами, в +которых вы можете хранить письма, например, относящиеся к одной теме. Также +поддерживается работа с письмами-дайджестами, и письмами, закодированными +программами shar и uuencode. + +=== Дополнительные пакеты === + +[float] +==== Отправка почты без использования дополнительных пакетов ==== + +GNU Emacs умеет отправлять электронную почту без использования каких-либо +дополнительных пакетов. Для создания сообщения используется команда +compose-mail, которая создает буфер *mail*. + +Метод отправки и создания сообщения зависит от того, какое значение имеет +переменная mail-user-agent. В настоящее время можно отправлять почту с помощью +программы Sendmail, пакетов Emacs MH-E, Gnus и Message. + +Для получения более подробной информации смотрите раздел Sending Mail в +руководстве по GNU Emacs. + +[float] +==== Пакет Supercite ==== + +Этот пакет позволяет гибко настроить параметры цитирования чужих писем при +ответе на них почтой или в группы Usenet. Пакет поддерживает все основные +пакеты Emacs для работы с почтой и новостями. + +Когда вы отвечаете на письмо или статью, то производится вызов функции +Supercite sc-cite-original, которая осуществляет анализ заголовков исходного +текста, запоминая их параметры. Затем Supercite проходится по каждой из строк +ответа и изменяет их в соответствии с заданными функциями преобразования. +Оригинальное сообщение может быть отформатировано в соответствии с вашими +предпочтениями во время работы функций Supercite. + +Для того чтобы любой почтовый пакет Emacs стал использовать Supercite для +цитирования писем, вам необходимо вставить в файл инициализации ~/.emacs +следующую строку: + +---- + (add-hook 'mail-citation-hook 'sc-cite-original) +---- + +Но если вы используете пакет Gnus, то вам надо добавить ещё и следующую строку + +---- + (setq news-reply-header-hook nil) +---- + +которая предотвратит вставку одинаковых заголовков обоими пакетами. Более +полную информацию вы сможете найти в справочных страницах Info, которые +поставляются вместе с пакетом. + +[float] +==== Пакет Mailcrypt ==== + +Этот пакет является интерфейсом к популярной системе шифрования PGP. Он +позволяет работать как с оригинальным PGP, так и с его свободным клоном — +GnuPG. Использование этих программ возможно из нескольких пакетов для работы с +почтой — Gnus, VM, Rmail, MH-E, Mew. Среди реализованных операций — шифрование +и расшифровка сообщений, подпись сообщений, проверка электронных подписей. +Данный пакет входит в состав дистрибутивов ALTLinux. Кроме того, его можно +скачать с сайта http://mailcrypt.sourceforge.net. + +Вот как можно заставить Mailcrypt работать вместе с пакетом Gnus: + +---- + (load-library "mailcrypt") + (mc-setversion "gpg") + (autoload 'mc-install-write-mode "mailcrypt" nil t) + (autoload 'mc-install-read-mode "mailcrypt" nil t) + (add-hook 'mail-mode-hook 'mc-install-write-mode) +---- + +Первые пять строк одинаковы для всех пакетов работы с почтой. Первая строка +загружает пакет Mailcrypt. Вторая строка задает тип программы, которая будет +использоваться для обработки почты (в нашем примере это gpg — GNU-версия +программы PGP). Третья и четвертая строки описывают, что при вызове функций +mc-install-write-mode и mc-install-read-mode необходимо подгрузить их из +библиотеки mailcrypt. Пятая строка устанавливает ловушку на запуск режима +работы с почтой (mail-mode). + +---- + (add-hook 'gnus-summary-mode-hook 'mc-install-read-mode) + (add-hook 'message-mode-hook 'mc-install-write-mode) + (add-hook 'news-reply-mode-hook 'mc-install-write-mode) +---- + +Эти команды являются специфическими для пакета Gnus и устанавливают «ловушки» +на создание списка сообщений, создание сообщения и режим ответа на сообщение в +Usenet. + +В составе пакета для GNU Emacs в дистрибутивах ALTLinux поставляется скрипт +инициализации, в котором можно раскомментировать строку, соответствующую +используемому вами пакету для работы с почтой. Полное описание пакета и примеры +настройки можно найти в руководстве, которое поставляется вместе с пакетом. + +[float] +==== Пакет BBDB ==== + +Этот пакет позволяет организовать на основе Emacs базу данных для хранения +адресов, телефонов и прочей информации. Пакет обеспечивает интеграцию со +многими популярными пакетами чтения новостей usenet и почты. Существуют +утилиты, которые позволяют экспортировать эту базу данных в формате, понятном +для программ синхронизации с популярным PDA Palm Pilot. Данный пакет входит в +состав дистрибутивов ALTLinux. Кроме того, пакет можно скачать с его +собственного сайта http://bbdb.sourceforge.net. + +В руководстве, которое поставляется вместе с BBDB, приведены примеры настройки +данного пакета для разных пакетов работы с почтой. Следующий пример +демонстрирует настройку пакета для работы с почтой с помощью пакета Gnus: + +---- + (require 'bbdb) + (bbdb-initialize 'gnus 'message) + (add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus) + (add-hook 'message-setup-hook 'bbdb-define-all-aliases) + (defun my-message-mode-hook () (local-set-key [(tab)] 'bbdb-complete-name)) + (setq bbdb-use-pop-up nil) + (defun my-bbdb-tab-complete () + (interactive) + (if (mail-abbrev-in-expansion-header-p) + (bbdb-complete-name) + (message-tab))) + (define-key message-mode-map [tab] 'my-bbdb-tab-complete) +---- + +Этот пример можно сразу помещать в ваш файл настройки Emacs. Предварительно +стоит убедиться, что у вас установлены пакеты Gnus и BBDB. + +Первая строка данного примера производит загрузку самого пакета. Вторая строка +производит начальную настройку BBDB, указывая, что пакет будет использоваться +вместе с пакетом Gnus (message — это специальный режим из поставки Gnus, +который используется при создании электронных сообщений. Третья и четвертая +строки устанавливают ловушки для правильной инициализации пакета при запуске +соответствующих режимов. Пятая строка устанавливает локальную привязку клавиши +Tab для дополнения имен из базы BBDB. Шестая строка запрещает открытие +отдельного окна для отображения информации о выбранном пользователе (слишком +частое открытие окна может просто раздражать, поэтому и используется такая +настройка). + +Строки с седьмой по одиннадцатую определяют функцию, которая производит +дополнение имени только в том случае, если точка находится в почтовом +заголовке. Двенадцатая строка связывает данную функцию с клавишей Tab при +использовании режима редактирования электронного сообщения. From fea5ded9f90591c5e7297f59e7f27f3c106fd3d1 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Fri, 17 Jan 2014 12:31:16 +0300 Subject: [PATCH 28/53] Add old docs from docs-emacs_im-0.1-alt2.noarch.rpm --- old-docs/emacs_im.txt | 939 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 939 insertions(+) create mode 100644 old-docs/emacs_im.txt diff --git a/old-docs/emacs_im.txt b/old-docs/emacs_im.txt new file mode 100644 index 0000000..4ded356 --- /dev/null +++ b/old-docs/emacs_im.txt @@ -0,0 +1,939 @@ +//// +Пакет: docs-emacs_im +RPM файл: docs-emacs_im-0.1-alt2.noarch.rpm +Аннотация: Руководство по использованию Emacs для интерактивного + общения: ICQ, Yahoo! Chat, AIM, Jabber, IRC. +Автор: Алексей Отт (http://xtalk.msk.su/~ott/) +Лицензия: FDL +URL: http://heap.altlinux.org/modules/emacs-im.kirill/ +//// + +== Использование Emacs для интерактивного общения == + +[float] +=== Введение === + +Кроме поддержки "неинтерактивных" средств обмена сообщениями, таких как почта и +новости Usenet, Emacs имеет поддержку практически всех видов интерактивного +обмена информацией: + +* Instant Messaging. Сюда входит поддержка протоколов ICQ, Yahoo Messenger, AIM + (AOL Instant Messaging), Jabber и MSN; +* Internet Relay Chat (IRC). + +Для каждого из перечисленных сервисов существует как минимум одна реализация, +но часто существует две и более реализации, отличающееся полнотой реализации и +степенью поддержки. Некоторые из реализаций уже не развиваются, но часто просто +работают. В данной статье я не буду описывать реализации которые уже не +поддерживаются, и для которых существуют альтернативы. + +=== Instant Messaging и Emacs === + +[float] +==== ICQ ==== + +ICQ — средство для быстрого обмена сообщениями, особенно популярное среди +пользователей Windows, также может использоваться и из Emacs. В настоящее время +существует одна реализация ICQ — eicq, но она может использоваться только с +XEmacs. Данная реализация поддерживает следующие возможности: + +* Поддержку протокола ICQ версии 8 (версия из CVS); +* Регистрацию новых пользователей и смену пароля; +* Передавать сообщения и URL; +* Авторизовывать пользователей, обновлять мета-информацию и получать список контактов; +* Преобразовывать список контактов micq и licq в собственный формат; +* Изменять привязки клавиш, и писать функции на Emacs Lisp. + +К сожалению данная реализация не поддерживает чаты, передачу файлов. + +В связи с тем, что я не пользуюсь XEmacs, я не смог протестировать данную +реализацию, но судя по документации, она достаточно просто устанавливается и +настраивается. + +[float] +==== Yahoo! Chat Messenger ==== + +Существует две реализации клиента Yahoo! Chat для Emacs. Первая из них +называется ElGyach и доступна с http://www.nongnu.org/elgyach, а вторая +называется yod.el и доступна с http://users.starpower.net/marti1/yod.el.html, +однако ElGyach имеет больше возможностей по сравнению с yod.el, поэтому я +остановлюсь на его описании более подробно. + +[float] +===== Возможности ElGyach ===== + +ElGyach поддерживает следующие возможности: + +* Сохранение буферов с сообщениями в файлах; +* Проверка грамматики; +* Подсветка сообщений; +* Поддержка шифрования с помощью AES; +* Механизм дополнений имен, команд и текста; +* Настройка цветов и атрибутов текста; +* Одновременное использование разных учетных записей; +* История сообщений, по которой можно перемещаться вперед и назад; +* Игнорирование сообщений от пользователей; +* Интеграция с другими модулями Emacs. + +Более подробную информацию вы можете найти на страницах, относящихся к +разработке ElGyach. + +[float] +===== Установка ElGyach ===== + +Для установки ElGyach необходимо скачать его с +http://savannah.nongnu.org/projects/elgyach, развернуть и скомпилировать +(поскольку для общения с сервером Yahoo, ElGyach использует реализацию на языке +С). Вот так будет выглядеть загрузка ElGyach в вашем файле инициализации: + +---- +(add-to-list 'load-path "path_to_elgyach") +(autoload "gyach" "gyach" "Autoload for ElGyach") +---- + +После загрузки вы можете задать необходимые параметры с помощью команд +настройки Emacs — M+x customize-group gyach. Здесь вы можете задать имя и +пароль пользователя Yahoo! Chat, а также имя программы elgyach, если она стоит +в нестандартном месте. + +[float] +===== Использование ElGyach ===== + +Для запуска ElGyach используется команда M+x gyach, которая создаст буфер +процесса. Вы также можете использовать несколько процессов ElGyach +одновременно. Это произойдет, если вы перед выполнением команды зададите +префикс, вот так C+u M+x gyach. Однако вы не можете войти больше чем в один +чат, используя одно и то же имя — это ограничение Yahoo! Chat. + +[float] +===== Команды ElGyach ===== + +ElGyach поддерживает выполнение различных команд, задаваемых в форме /имя. В +настоящее время доступны следующие команды: + +* /ignore User и /unignore User — для игнорирования сообщений от + определенных пользователей, и для отмены этого ограничения; + +* /highlight User и /unhighlight User — для подсветки сообщений от + определенного пользователя, и окончания использования данной настройки; + +* /version — печатает номер версии ElGyach. + +[float] +===== Настройка ElGyach ===== + +Основным параметром настройки являются имя и пароль пользователя, которые +используются для подключения к Yahoo! Chat. Эти значения хранятся в переменных +gyach-yahoo-username и gyach-yahoo-password. + +Для обеспечения настройки параметров буфера ElGyach может использоваться код, +который будет выполняться с помощью хука gyach-mode-hook. + +ElGyach легко расширяется. При каждом вызове команды вида /КОМАНДА, будет +вызываться функция gyach-custom-КОМАНДА. Таким образом, вы можете добавить свою +функциональность с помощью небольшого объема кода. + +[float] +===== AOL Instant Messaging (AIM) ===== + +Поддержка AIM в Emacs осуществляется пакетом TNT. Он позволяет обмениваться +сообщениями, и участвовать в групповых чатах. + +_Установка пакета_ + +Получить данный пакет можно с его домашней страницы, расположенной по адресу +http://tnt.sourceforge.net/. Установка пакета достаточно проста — надо раскрыть +архив, и настроить Emacs для его использования. Это выполняется с помощью +следующих команд: + +---- +(add-to-list 'load-path "path_to_tnt_dir") +(require 'tnt) +---- + +Вот и все. + +_Работа с пакетом_ + +Для работы с AIM вам нужно иметь уже зарегистрированное имя. Если у вас его +нет, то вы можете зарегистрировать новое имя по адресу http://www.aol.com/aim. + +Основная работа с пакетом осуществляется с помощью сочетаний клавиш, что +позволяет удобно работать с пакетом. Все команды можно разделить на несколько +частей, которые представлены в виде соответствующих разделов. + +_Подключение, отключение и статус_ + +Подключение к сервису AIM выполняется с помощью команды tnt-open (C+x t o). При +подключении вам необходимо указать ваше имя и пароль, и если все пройдет +нормально, то пакет сообщит о том, что вы подключились к системе. Чтобы каждый +раз не вводить имя и пароль, вы можете задать их с помощью переменных +tnt-default-username и tnt-default-password. вы также можете использовать +несколько разных имен для входа в систему. Более подробную информацию вы можете +найти в разделе Настройка. + +После подключения, вы можете выполнять стандартные задачи — ведение +переговоров, общение в чатах и т.п. + +Изменение статуса с "доступен" в "занят" производится с помощью команды +tnt-away-toggle (или C+x t A). вы можете задать сообщение, которое будет +отображаться для пользователей, которые будут пытаться соединиться с вами, +когда вы находитесь в данном режиме. + +Прекращение работы с AIM выполняется с помощью команды tnt-kill (C+x t q). + +_Обмен информацией_ + +TNT поддерживает два типа обмена информацией — прямые беседы между двумя +пользователями, и общение к чатах. + +Для прямого общения используется команда tnt-im (или сочетание клавиш C+x t i). +При этом у вас запросят имя пользователя с которым вы хотите пообщаться, и +после установления связи, будет открыт буфер, в котором вы сможете печатать +свои сообщения и видеть ответы. Если пользователь есть в вашем списке +пользователей, то вы можете использовать механизм дополнения для ввода имени. + +Для начала общения в чатах используется команда tnt-join-chat (или сочетание +C+x t j). вы можете ввести имя существующего чата, или ввести новое, и тогда +чат будет создан. Как и в предыдущем случае, создается новый буфер, в котором и +ведутся все переговоры. Для выхода из чата вы можете использовать +tnt-leave-chat (или C+x t l). + +В том случае, если кто-то другой присылает вам приглашение в чат, или +сообщение, то вы можете принять его с помощью tnt-accept (C+x t a) или +отклонить с помощью tnt-reject (C+x t r) — это может быть полезным, если вы +заняты, или не хотите беседовать с данным пользователем. В том случае, если вы +получаете несколько сообщений, или приглашений в чат, то они накапливаются в +очереди, в которой их можно просматривать с помощью команд tnt-next-event (C+x +t n) — для получения следующего сообщения, и tnt-prev-event (C+x t p) — для +получения предыдущего сообщения. + +_Прочие команды_ + +Вы можете формировать списки друзей, для того, чтобы быстро набирать их имена. +Для просмотра существующего списка используется команда tnt-show-buddies (C+x t +b), а для редактирования — команда tnt-edit-buddies (C+x t B). Имена заданные в +этом списке будут использованы для реализации механизма дополнений в строках +ввода, там, где необходим ввод имен пользователей. + +TNT может также работать как мост между AIM и электронной почтой. Это очень +удобно, если вы хотите получать сообщения из AIM на ваш почтовый адрес. Это +выполняется с помощью команды tnt-toggle-email (C+x t M). И для ее работы нужно +задать две переменные tnt-email-to-pipe-to и tnt-email-binary. + +В том случае, если у вас несколько зарегистрированных имен, то вы можете +использовать команду tnt-switch-user (C+x t s) для переключения между разными +именами. + +Команда tnt-mute (C+x t m) может использоваться для включения и отключения +звуковых сигналов, используемых TNT для оповещения пользователя. + +[float] +===== Настройка ===== + +Настройку TNT можно осуществлять как с помощью стандартных механизмов настройки +Emacs, так и с помощью кода на Emacs Lisp. Для вызова настройки можно +использовать команду M+x tnt-customize, или M+x customize-group tnt. + +_Настройка входа в систему_ + +TNT позволяет пользователю использовать несколько учетных записей для +использования. Для задания имени и пароля для входа, сразу после запуска TNT, +используются переменные tnt-default-username и tnt-default-password. А для +задания связей между именами и паролями в учетных записях, используется +ассоциативный список tnt-username-alist. Но будьте осторожны с этими +переменными — помните, что они хранятся в вашем файле настройки как обычный +текст, и в случае установки неправильных прав на файл, могут быть прочитаны +другими пользователями. + +_Настройка звука_ + +TNT позволяет настроить проигрывание разных сигналов в зависимости от разных +событий. Настройка сигналов управляется с помощью переменных tnt-beep-on-..., +например tnt-beep-on-incoming-message. Кроме этого, вы можете настроить то, с +помощью какой программы будут проигрываться звуковые сигналы. Эти настройки +определяются переменными tnt-sound-exec и tnt-sound-exec-args. + +_Прочие настройки_ + +Пользователь имеет возможность настроить множество других параметров, полное +описание которых доступно в файле README из поставки TNT, и которые можно +настроить используя буфер настройки Emacs. + +[float] +==== Jabber ==== + +Поддержку сервиса Jabber в настоящее время осуществляют несколько пакетов для +Emacs — ejab, который уже не развивается (замороженная версия доступна с +http://ejab.sourceforge.net), smyrno, который также почти не развивается, но +обладает достаточным набором возможностей (он доступен с +http://www.nongnu.org/smyrno/) и Jabber.el, который активно развивается и +представляет достаточно полную и расширяемую поддержку протокола Jabber. +Поскольку Jabber.el динамично развивается, то я сосредоточусь исключительно на +данном пакете. + +[float] +===== Получение и установка ===== + +Пакет требует для своей работы GNU Emacs 21 и Gnus 5.10.x (из него нужно только +пара файлов — sha1-el.el и hex-util.el, так что вы можете их установить не +устанавливая весь Gnus), или XEmacs с поддержкой Mule, а также установленными +пакетами gnus, net-utils и mule-ucs. Кроме этого, если установлен пакет FLIM, +то Jabber.el может использовать его для поддержки SASL. + +Установка пакета достаточно проста — надо просто скачать его дистрибутив с +http://emacs-jabber.sourceforge.net, развернуть его и настроить загрузку в +стартовом скрипте Emacs'а, например следующими командами: + +---- +;; если вы установили jabber.el в нестандартное место +(add-to-list 'load-path "path_to_jabber.el_dir") +(require 'jabber) +---- + +После загрузки пакета, необходимо задать имя пользователя и сервера, что +делается с помощью команды M+x jabber-customize. С помощью этой команды можно и +зарегистрировать нового пользователя, если перед выполнением команды задать +префикс. + +[float] +===== Основные действия ===== + +После настройки, Jabber.el готов к работе, необходимо только подключиться к +выбранному серверу Jabber. + +_Подключение, отключение и состояние_ + +Подключение к серверу выполняется одной командой — M+x jabber-connect, после +подключения с помощью команды M+x jabber-send-presence можно отправить на +сервер уведомление о присутствии. Эта команда дает возможность вам указать +статус присутствия, если вы оставили статус пустым, то будет установлено +значение по умолчанию равное Online. + +Для отключения от сервера Jabber, просто выполните команду M+x +jabber-disconnect, и ваше подключение будет закрыто. + +Jabber.el позволяет вам изменять состояние вашей доступности. Это можно сделать +как явно, с помощью команды M+x jabber-send-presence, так и программно, с +помощью этой же функции. Кроме этого, вы можете запрограммировать сервер Jabber +на уведомление вас, об изменении статуса нужного вам человека. Это выполняется +с помощью команды M+x jabber-send-subscription-request. + +_Переговоры (chatting)_ + +После подключения, пользователю становится доступен буфер roster'а, находясь в +котором он может выполняться различные действия. Одно из таких действий — +переговоры (или chatting). Для начала переговоров, нужно лишь выбрать персону с +кем вы будете переговариваться и набрать C+c C+c, и будет создан буфер с именем +*-jabber-chat-:-ИМЯПЕРСОНЫ-*, в котором вы и сможете вести переговоры. + +_Групповые чаты_ + +Для подключения к групповому чату пользователь может использовать команду M+x +jabber-groupchat-join, или использовать сочетание клавиш C+c C+m находясь в +буфере roster'а. После подключения к чату, будет создан буфер с именем +*-jabber-groupchat-:-ИМЯЧАТА-*, что позволяет одновременно участвовать в +нескольких обсуждениях. Работа с буфером осуществляется точно так же, как и при +обычных переговорах. Для выхода из группового чата просто наберите M+x +jabber-groupchat-leave. + +Кроме этого, если вы являетесь владельцем данного чата, пакет позволяет +произвести его настройку, используя команду M+x jabber-groupchat-get-config. + +_Работа с буфером roster_ + +Буфер roster'а называется *-jabber-*, и содержит в себе список контактов вашего +roster'а. С использованием данного буфера проводятся все операции, которые +требуют указания Jabber ID, такие как переговоры, групповые и +многопользовательские чаты, получение информации roster'а и работа с сервисами. + +_Работа с сервисами jabber_ + +Jabber.el позволяет пользователю получить доступ к большинству возможностей +предоставляемых Jabber. Сюда входят — просмотр списка сервисов, поиск в +каталогах, регистрация для использования сервисов, а также поддержка набора +специализированных команд (ad-hoc). + +Для использования каких-либо сервисов, вам сначала нужно их найти. Это может +выполняться двумя способами — поиском (discovering) и просмотром (browsing). +Первый способ является предпочтительным, поскольку использует новые протоколы. +Для поиска сервисов могут использоваться две команды — M+x +jabber-get-disco-items и M+x jabber-get-disco-info, которые выдают информацию +либо о конкретном сервисе, либо о сервисах, относящихся к выбранному сервису. +Эти же команды доступны через меню, которое вызывается сочетанием клавиш C+c +C+i из буфера roster'а. + +Поиск по сервисам выполняется с помощью команды M+x jabber-get-search, или +выбором пункта меню, отображаемого с помощью сочетания клавиш C+c C+s. После +выполнения запроса, вам будет показана форма поиска, которую необходимо +заполнить для его выполнения. + +Регистрация производится аналогично проведению поиска, только используется +команда M+x jabber-get-register. С помощью данного сервиса, вы можете например, +сменить свой пароль, или зарегистрироваться для использования конкретного +сервиса. Как и в случае с поиском, при регистрации, модуль отобразит форму +регистрации, которую вам необходимо будет заполнить. + +Для работы со специализированными командами, пользователь сначала должен +получить их список, поддерживаемых сервером. Это выполняется с помощью команды +M+x jabber-ahc-get-list. Для выполнения специализированной команды, +используется команда M+x jabber-ahc-execute-command. Специализированные команды +могут использоваться, например, для того, чтобы удаленно изменить состояние +вашего клиента, или другие вещи. + +[float] +===== Настройка и расширение возможностей ===== +_Настройка клиента_ + +Настройка клиента выполняется с помощью команды M+x jabber-customize или, что +тоже самое, с помощью команды M+x customize-group jabber. Переходя по разделам +группы, вы можете настроить как основные параметры, такие как имя, сервер, так +и другие, например уведомления о событиях, параметры начертаний (faces) и +различные хуки. + +Этот процесс является интуитивно-понятным, и поэтому я не буду заострять на нем +внимание. Список переменных, которые используются для настройки с помощью этих +команд, приведен в руководстве для Jabber.el. + +_Расширение возможностей пакета_ + +Jabber.el позволяет пользователю расширять возможности пакета, предоставляя +возможности по приему и отправке новых типов запросов и ответов, осуществлять +доступ к данным соединения и многое другое. + +XML, который используется для общения с сервером jabber, представляется в виде +списков, которые создаются модулем xml.el — каждый тег представляется в виде +списка, первым элементом которого является символ представляющий тег, за тем +следует список из списков атрибутов, и затем идут вложенные тэги и содержимое. + +Текущее состояние roster'а представляется списком с именем *jabber-roster*. В +данном списке можно найти подробную информацию о группах, состоянии соединения +и прочих параметрах. + +Подробное описание процесса расширения возможностей пакета приведено в разделе +"Hacking and extending" справочной страницы Jabber.el + +[float] +==== MSN ==== + +Судя по информации в Internet, кроме вышеперечисленных модулей, также +существует и рудиментарная поддержка служб мгновенного обмена сообщениями MSN. +Реализация этого сервиса доступна с +http://www.geocities.co.jp/SiliconValley-SanJose/7474/EmacsLisp.html, но +страницы написаны на японском языке, и поэтому информации не так уж и много, +хотя по скриншоту видно, что клиент работает. + +=== IRC === + +IRC является достаточно популярным сервисом в среде пользователей Unix, которых +много среди пользователей Emacs, и это привело к появлению нескольких пакетов, +поддерживающих данный сервис. В настоящее время наиболее активно развивающимся +является пакет Erc, но существует и альтернативная реализация, Zenirc, которая +также имеет много возможностей, но уже практически не поддерживается (если вы +хотите посмотреть на него, то вы можете найти исходные тексты по адресу +ftp://ftp.splode.com/pub/zenirc). + +Дальнейший рассказ будет в основном про пакет Erc, хотя может быть я буду +упоминать и его конкурента. + +[float] +==== Основные возможности пакета Erc ==== + +Пакет Erc предоставляет для пользователя множество возможностей, вот основные: + +* Поддержку работы с несколькими каналами и серверами. Каждый канал работает + в своем буфере; +* Уведомления; +* Дополнения имен пользователей; +* Поддержку разных языков; +* Отслеживание активности на каналах; +* Расширение возможностей, за счет написания скриптов; +* Подсветку ключевых слов и различных действий; +* Взаимодействовать с другими средствами обмена сообщениями, используя + BitlBee (более подробно о настройке Erc для использования вместе с BitlBee + смотрите страницу http://www.emacswiki.org/cgi-bin/wiki?BitlBee; +* и многое, многое другое. + +Пакет работает как с GNU Emacs, так и с XEmacs. + +[float] +==== Установка пакета ==== + +Исходные тексты Erc доступны по адресу http://sourceforge.net/projects/erc/. +Необходимо только раскрыть полученный архив, и поместить несколько команд в ваш +файл инициализации, например вот так: + +---- +(add-to-list 'load-path "path_to_erc_dir") +(require 'erc) +---- + +Это минимальный набор команд, необходимых для загрузки данного пакета. Но Erc +предоставляет намного больше возможностей, поэтому у человека, который часто +пользуется данным пакетом, файл инициализации выглядит намного сложнее. вы +можете найти такие примеры на Emacs WiKi, или в разделе Пример файла +инициализации Erc. А более подробно про настройку я расскажу в разделе +Настройка клиента. + +[float] +==== Основные операции ==== + +Начала работы вам необходимо набрать команды M+x erc-select, которая запросит у +вас имя сервера, порт и другие параметры. Вы можете задать эти параметры один +раз произведя настройку клиента (см. раздел Настройка клиента). В зависимости +от настройки, клиент может сразу подключиться к нужным вам каналам — это +выполняется пакетом erc-autojoin, который поставляется с Erc. + +После того, как вы подключились к IRC-серверу, вы можете выполняться обычные +команды IRC — подключение к новым каналам, получение информации и много других +вещей. Команды вводятся в строке, которая начинается с ERC>. +//Окно канала может +//выглядеть как изображено на рисунке Окно сеанса Erc, +Кроме того, вы можете использовать стандартные команды Emacs для разделения +фрейма на несколько окон и отображать в них разные каналы. + +//Рисунок 1. Окно сеанса Erc +//Окно сеанса Erc + +Во время работы, erc изменяет строку состояния, в которой отображает имя канала +и сервера, а также изменение статуса других каналов, в виде сокращения # и +первой буквы имени канала, и разным цветом, синим — когда кто-то заходит на +канал или покидает в него, и красным когда кто-то беседует на канале. В верхней +строке окна отображается название канала, текущий лаг, и тема канала. Кроме +этого, erc позволяет использовать стандартные механизмы дополнения имен +пользователей и каналов, при их наборе. + +Для того, чтобы закончить работу с IRC, наберите команды erc-quit-server. + +[float] +==== Модули Erc ==== + +В составе Erc идет некоторое количество модулей, которые расширяют основную +функциональность пакета. Для каждого из этих модулей пользователь может +выполнить дополнительную настройку, управляющую его поведением. Часть модулей +загружается автоматически, а некоторые требуют индивидуальной загрузки. Список +автоматически загружаемых модулей хранится в переменной erc-modules. + +Ниже приведен список наиболее часто используемых модулей, и того какие +настройки для них могут выполняться. + +[float] +===== erc-autojoin ===== + +Данный пакет позволяет запоминать на какие каналы заходил пользователь +используя команды /JOIN и /PART, и при следующем сеансе использования erc +восстановить сохраненную конфигурацию. Список автоматически подключаемых +каналов сохраняется в переменной erc-autojoin-channels-alist. Данная переменная +состоит из списков вида "имя сервера" "канал1" "канал2"..., например: + +---- +(setq erc-autojoin-channels-alist + '(("freenode.net" "#emacs" "#arch" "#squiddev"))) +---- + +По умолчанию, данный режим включен, и используется. + +[float] +===== erc-button ===== + +Данный модуль позволяет создать нажимаемые кнопки на основе текста буфера. По +умолчанию данный режим включен, и используется для организации нажимаемых +кнопок для самых разных объектов, таких как: + +* адресов сайтов (URL's); +* запросов к Google; +* имен пользователей IRC; +* RFC (что позволяет сразу перейти к нужному документу); +* разделов документации в формате Info; +* интернет-времени. + +Пользователи могут определять и свои типы, используя механизм сокращений +(abbrevs). Кроме этого, пользователь имеет возможность перехода между кнопками, +используя сочетание C+c C+w C+b для перехода на предыдущую кнопку, и C+c C+w +C+f для перехода на следующую. + +[float] +===== erc-track ===== + +Данный модуль позволяет отслеживать изменения в буферах erc — данный режим +включен по умолчанию. При использовании данного модуля, в строке статуса +отображается список каналов, в которых произошли изменения. По умолчанию, +отслеживается вся активность — вход новых посетителей, выход с канала, и +изменение имени, что не всегда нужно знать. С помощью переменной +erc-track-exclude-types вы можете исключить некоторые команды из списка +отслеживаемой активности. Например, вот так: + +---- +(setq erc-track-exclude-types '("JOIN" "NICK" "PART" "QUIT")) +---- + +Для перехода в буфер, в котором, в последнем была какая-либо активность, вы +можете использовать сочетание клавиш C+c C+space или C+c C+@. В том случае, +если нет больше активных каналов, данное сочетание переключает вас в тот буфер, +в котором вы работали перед этим. + +[float] +===== emacs-completion ===== + +Данный модуль позволяет использовать дополнение имен каналов и посетителей, а +также команд Erc, используя клавишу TAB. Этот модуль разрешен по умолчанию, и +для своей работы использует программируемый механизм дополнений, который +реализуется библиотекой pcomplete, которая обычно поставляется с Emacs. В том +случае, если у вас нет этой библиотеки, вы все равно можете воспользоваться +возможностями дополнения, переключившись на использование старого механизма, +правда это не рекомендуется делать — лучше установите библиотеку pcomplete. + +[float] +===== rc-fill ===== + +По умолчанию Erc позволяет красиво заполнять и выравнивать отображаемый текст. +По умолчанию используется режим заполнения, с переменным префиксом, зависящим +от длины имени посетителя, который написал данное сообщение. Однако вы можете +изменить эту настройку с помощью установки переменной erc-fill-prefix, в +которой вы можете задать данные для заполнения — например, несколько пробелов +подряд. Кроме этого, существуют и другие варианты заполнения, про которые вы +можете прочитать на Emacs WiKi. + +[float] +===== erc-stamp ===== + +Кроме всего прочего, Erc позволяет вам вставлять в текст буферов временные +пометки, для того, чтобы вам было удобней просматривать журналы бесед, или +точно находить нужную беседу. По умолчанию данный модуль не подгружается +автоматически, так что вам необходимо добавить его к списку загружаемых +модулей. Для настройки отображения можно задать несколько переменных, которые +будут описывать вид отображаемых временных пометок, и другие параметры. + +[float] +===== erc-netsplit ===== + +Данный модуль обеспечивает определение отключение от сети целых IRC-серверов +(так называемый netsplit), и подключение ранее отключенных серверов. Вы можете +выполнять свой код в данных случаях, воспользовавшись хуками erc-netsplit-hook +и erc-netjoin-hook. + +[float] +===== erc-autoaway ===== + +Иногда вы отходите от клавиатуры на длительный срок, и можете забыть сообщить +серверу, что вы отсутствуете. Чтобы это делалось автоматически, с Erc +поставляется модуль erc-autoaway, который сам изменит режим после заданного +отрезка времени. Данный модуль не загружается автоматически, так что вам нужно +самим подключить его, с помощью команд, подобных этим: + +---- +(require 'erc-autoaway) +(setq erc-autoaway-idle-seconds 600) +(setq erc-auto-discard-away t) +---- + +первая команда подгружает сам модуль, вторая задает через сколько времени вы +будете считаться отсутствующим, а последняя задает режим автоматического выхода +из режима отсутствия, если вы что-то напишете в каком-либо из буферов. + +[float] +===== erc-log ===== + +Erc позволяет вам сохранять журналы бесед на IRC. Для этого существует модуль +erc-log. Однако, данная возможность не подключается автоматически, а требует +ручной загрузки, например вот так: + +----- +(require 'erc-log) +(setq erc-log-channels-directory "~/.irc/logs/") +----- + +первая команда загружает нужный модуль, а вторая задает расположение для +журнальных файлов. + +Сохранение журналов может производиться несколькими способами. Для обычных +пользователей, наиболее приемлемым будет использование команды + +----- +(setq erc-save-buffer-on-part t) +----- + +что приведет к сохранению журналов при выходе из канала. Однако пользователи +могут явно сохранить журналы с помощью сочетания клавиш C+c C+l или явно +выполнив команду M+x erc-save-buffer-in-logs. Вы можете также поместить +временные метки в сохраняемые журналы — это контролируется с помощью переменной +erc-hide-timestamps. + +Erc умеет восстанавливать часть содержимого предыдущих сессий используя +журнальные файлы. Если вы хотите, чтобы в буфере отображались старые разговоры, +то установите переменную erc-log-insert-log-on-open в истинное значение. По +умолчанию, данная переменная равна nil. + +Более подробную информацию о настройке журналирования, а также о возможных +проблемах, и способах их решения читайте на Emacs WiKi. + +[float] +===== erc-nickserv ===== + +В некоторых IRC-сетях вы можете зарегистрировать свое имя, и таким образом +избежать возможных конфликтов между пользователями. Эта возможность реализуется +с помощью сервиса под названием NickServ. По умолчанию, когда вы входите в +такую сеть, в ответ на приглашение сервера, erc в мини-буфере запрашивает у вас +пароль для регистрации. Чтобы избежать повторяющихся действий, был разработан +модуль erc-nickserv, который идет в поставке erc, но не загружается +автоматически. Настройку этого модуля можно выполнить с помощью следующих +команд: + +---- +(require 'erc-nickserv) +(erc-nickserv-mode t) +(setq erc-prompt-for-nickserv-password nil) +(setq erc-nickserv-passwords + '((freenode (("nick" . "password"))))) +---- + +Первые две команды загружают модуль и включают соответствующий режим. Третья +команда отключает запрос пароля у пользователя при запросе от сервера. Ну а +четвертая команда задает параметры ассоциативного списка, описывающего сервера, +имена и пароли для них. Для каждого из серверов, вы можете задать одно или +несколько имен, и соответствующие пароли для них. Заметьте, что в качестве +ключа списка задается символ, соответствующий IRC-сети. Отображение между +именами сетей и доменными именами серверов хранится в переменной erc-networks, +которую вы при необходимости можете изменять. + +[float] +===== erc-truncate ===== + +В том случае, если вы постоянно пользуетесь IRC, размеры буферов с разговорами, +могут расти очень быстро, и поэтому может быть желательно держать их в рамках +определенных размеров. Для этого используется модуль erc-truncate, которые +следит за размерами буферов каналов, и при необходимости выбрасывает лишние +данные. Данный модуль поставляется с erc, но не загружается автоматически. + +Параметры модуль контролируются несколькими переменными. Переменная +erc-max-buffer-size задает максимальный размер буфера, в байтах. А если +установлена переменная erc-truncate-buffer-on-save, то обрезание буферов будет +происходить при сохранении журналов. вы также можете явно выполнить обрезание +буферов, используя команду M+x erc-truncate-buffer. + +[float] +===== erc-dcc и erc-xdcc ===== + +Для Erc реализована поддержка прямой передачи данных между клиентами (DCC), +которая реализуется с помощью модуля erc-dcc. Данный модуль не загружается +автоматически, так что вы должны сделать это сами. После загрузки этого модуля, +вам будут доступны команды /dcc, которые вы можете использовать для разговоров, +и для передачи файлов между клиентами. + +Кроме этого, в Erc реализована возможность организации файловых сервисов, на +основе IRC. Эта возможность реализуется с помощью модуля erc-xdcc. + +[float] +===== Прочие модули ===== + +Кроме описанных выше модулей существуют еще и другие: + +* erc-bbdb — для интеграции erc и BBDB; +* erc-notify — для организации оповещения, когда определенный пользователь + входит или выходит из сети; +* erc-smileys — для преобразования smileys в изображения с соответствующими + эмоциями; +* erc-sound — для проигрывания звуков при некоторых событиях; +* erc-nicklist — отображает список имен для данного канала в отдельном + буфере; +* erc-speedbar — обеспечивает интеграцию erc и speedbar; +* erc-chess — позволяет играть в шахматы с другими пользователями на IRC; +* erc-lang — реализует новую команду /lang для выбора языка на канале; +* erc-list — обеспечивает быстрый механизм получения списка каналов; +* erc-menu — добавляет меню к буферам Erc, что может быть очень удобно, + особенно для начинающих пользователей; +* erc-speak — позволяет проговаривать содержимое разговоров с помощью + Emacspeak; +* erc-page — обеспечивает обработку /ctcp page команд; +* erc-replace — выполняет замены в тексте сообщений. + +[float] +==== Настройка клиента ==== + +Настройку Erc можно выполнить используя команду M+x customize-group erc. +Появившееся окно настройки позволяет вам задать основные параметры клиента, а +также перейти к настройку разных подсистем клиента. Но кроме визуальной +настройки, вы можете и сами определять порядок инициализации, используя Emacs +Lisp. + +[float] +===== Настройка auto-query ===== + +Erc позволяет настроить свое поведение в отношении личных сообщений. По +умолчанию, они отображаются в буфере сервера, что не всегда удобно, когда ты +разговариваешь с несколькими людьми. Однако, с помощью переменной +erc-auto-query вы можете изменить поведение Erc. Среди разрешенных значений: + +* 'buffer — показывать личные сообщения в отдельном буфере; +* 'window — показывать новые сообщения в новом, выбранном окне; +* 'window-noselect — то же, что и предыдущее, но без перехода в новое окно; +* 'bury — создает новый буфер, но не переходит в него; +* 'frame — открывает новый фрейм. + +вы можете создавать такие буфера не только для личных сообщений, но и для +уведомлений сервера. Это делается добавлением соответствующего хука. + +[float] +===== Игнорирование и скрытие лишней информации ===== + +С помощью Erc вы можете делать часть информации невидимой. Это относится как к +посетителям серверов, так и к различным уведомлениям, поступающим от самих +серверов. + +Например, чтобы не отображать данные о входе и выходе с каналов, вы можете +использовать переменную erc-hide-list, в качестве значения которой задается +список игнорируемых команд. Например, вот так: + +---- +(setq erc-hide-list '("JOIN" "PART")) +---- + +Для временного игнорирования сообщений от какого-либо посетителя, вы можете +использовать команду /IGNORE, но она будет действовать только до окончания +сессии. Для установки постоянного игнорирования, вам необходимо в переменной +erc-ignore-list задать список имен пользователей, или регулярных выражений, +которые будут приводить к игнорированию сообщений от посетителей, чьи имена и +сетевые адреса подпадают под заданное выражение. + +Кроме этого, вы можете скрывать часть содержимого, основываясь на более сложных +вещах, например, если кто-то произносит определенные фразы, или разговаривает с +роботами, засоряя канал ненужным текстом. Как это сделать описано на странице +Emacs WiKi. + +[float] +===== Настройка подсветки ===== + +Erc позволяет вам подсвечивать различные части сообщений на канале. Вы можете +подсвечивать текст, имена пользователей, при этом по умолчанию есть разделение +на "друзей" и "дураков" :-) вы можете задать список имен, и они будут +отображаться с заданным оформлением. По умолчанию этот режим отключен, но вы +можете его легко включить с помощью команды M+x customize-group erc-match. В +этой группе вы также обнаружите опции для настройки списков друзей, подсветки +вашего собственного имени, а также можете задать подсветку произвольного +текста. Для настройки параметров отображения, воспользуйтесь группой настройки +erc-faces. + +[float] +===== Настройка кодировок каналов ===== + +Erc позволяет своим пользователям использовать разные кодовые страницы для +разных каналов (конечно, это только для тех пользователей, которые используют +Emacs с поддержкой mule). Используя переменную erc-encoding-coding-alist вы +можете задать соответствие между именами каналов, и кодировками, которые +используются на этих каналах. Например, я могу нормально общаться на +немецко-говорящих каналах, хотя на остальных каналах будет использоваться +кодировка koi8-r. + +[float] +===== Хуки ===== + +По реализации Erc, по большей части управляется событиями, которые +обрабатываются соответствующими хуками. Существующие хуки можно разделить на +несколько больших групп: + +* Хуки для сообщений сервера; +* Хуки для /ctcp команд; +* Хуки для отображения и ввода; +* Прочие хуки. + +_Хуки для сообщений сервера_ + +Стандарт для IRC определяет, что сервер должен посылать команды клиентам в +специальном формате. Сама команда может быть либо трехзначным числом, либо +именем команды. При получении данных команд Erc запускает соответствующий +обработчик, и при его выполнении также запускает соответствующий хук, который +именуется erc-server-команда-hook. + +_Хуки для команд /ctcp_ + +Для команд /ctcp существует два вида хуков — когда вы получаете запрос на +выполнение команды, и когда вы получаете ответ о выполнении команды. +Соответственно запускаются хуки erc-ctcp-query-команда-hook и +erc-ctcp-reply-команда-hook. + +_Хуки для отображения и ввода_ + +Эти хуки также делятся на две группы — для отображения, и для обработки ввода. + +К хукам отображения относятся: + +* erc-insert-pre-hook — вызывается перед вставкой сообщения в буфер; +* erc-insert-modify-hook — вызывается когда текст уже вставлен, но при этом, + буфер в которые вставлен текст, сужается до самого текста; +* erc-insert-post-hook — вызывается после вставки текста, но может + обрабатывать весь буфер. + +К хукам ввода относятся: + +* erc-send-pre-hook — вызывается перед отправкой введенного пользователем + сообщения; +* erc-send-modify-hook — вызывается после вставки текста в буфер, но при + этом, буфер в которые вставлен текст, сужается до самого текста; +* erc-send-post-hook — вызывается после вставки текста, но может + обрабатывать весь буфер. + +erc-send-modify-hook и erc-send-post-hook никаким образом не влияют на +отправляемый на сервер текст, и в основном могут использоваться для изменения +параметров отображения текста в буфере. + +_Прочие хуки_ + +* erc-mode-hook — вызывается для каждого буфера erc — буферов каналов, + буферов серверов и т.п.; +* erc-timer-hook — вызывается при получении любого события от сервера; +* erc-before-connect и erc-after-connect — вызываются перед подключением к + конкретному серверу, а также после выдачи сервером сообщения дня (MOTD). + +[float] +===== Пример файла инициализации Erc ===== + +Ниже приведен пример настройки Erc, который используется у меня. Я буду писать +комментарии сразу в коде, чтобы сделать его понятным: + +---- +;; здесь мы просто загружаем erc +(add-to-list 'load-path "~/emacs/erc") +(require 'erc) + +;; загружаем авто-подключение к каналам, и задаем список каналов для +;; подключения +(require 'erc-autojoin) +(erc-autojoin-mode t) +(setq erc-autojoin-channels-alist + '(("relay2" "#dansguardian" "#emacs" "#arch" "#linux.de" + "#c.de" "#squiddev"))) + +;; +(require 'erc-fill) +(erc-fill-mode t) + +;; задаем персональные данные, хотя их можно задать и через +;; M-x customize-group erc +(setq erc-user-full-name "Alex Ott") +(setq erc-email-userid "alexott@gmail.com") + +;; часть относящаяся к логированию переговоров на каналах +;; нужно ли вставлять старый лог в окно канала? +(setq erc-log-insert-log-on-open nil) +;; логировать переговоры на каналах? +(setq erc-log-channels t) +;; где будут храниться логи +(setq erc-log-channels-directory "~/.irclogs/") +;; сохранять ли логи при возникновении PART +(setq erc-save-buffer-on-part t) +;; убирать или нет временные отметки? +(setq erc-hide-timestamps nil) +;; максимальный размер буфера канала +(setq erc-max-buffer-size 500000) +---- + +большую часть использованных переменных можно установить воспользовавшись +командами настройки Emacs, я показал этот пример только для наглядности. вы +можете найти большое количество примеров настройки на страницах Emacs WiKi. + +=== Дополнительная информация === + +Вы можете найти огромное количество информации о Erc на страницах Emacs WiKi по +адресу http://www.emacswiki.org/cgi-bin/emacs-en/EmacsIRCClient. Там вы сможете +найти множество советов по настройке клиента, а также по интеграции его с +различными приложениями, например, клиентом для игры в шахматы. From b697f1538168c11a211f66667c787ca30cbc0ac0 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Fri, 17 Jan 2014 12:51:30 +0300 Subject: [PATCH 29/53] Add old docs from docs-filesystems_use-0.1-alt1.noarch.rpm --- old-docs/filesystems_use.txt | 116 +++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 old-docs/filesystems_use.txt diff --git a/old-docs/filesystems_use.txt b/old-docs/filesystems_use.txt new file mode 100644 index 0000000..e03a775 --- /dev/null +++ b/old-docs/filesystems_use.txt @@ -0,0 +1,116 @@ +//// +Пакет: docs-filesystems_use +RPM файл: docs-filesystems_use-0.1-alt1.noarch.rpm +Аннотация: В документе описаны базовые операции с файловыми системами в + Linux: монтирование и проверка целостности (fsck). Дан + пример fstab. Документ представляет собой фрагмент из книги + ``Руководство по установке и использованию системы Linux'' + с некоторыми дополнениями из документации ALT Docs. +Автор: Мэтт Уэлш (Matt Welsh), М. Гильман (перевод) +Лицензия: GPL +URL: http://docs.altlinux.org/archive/2.4/master/alt-docs-master/ch06s08.html +//// + +== Работа с файловыми системами == + +=== Монтирование файловых систем === + +Прежде, чем файловая система станет доступной операционной системе, она должна +быть смонтирована (mounted) в некоторый каталог. Например, если имеется +файловая система на дискете, то для того, чтобы обеспечить доступ к её файлам, +её нужно смонтировать, например, в каталог /mnt/floppy — этот каталог +называется точкой монтирования. После монтирования этой файловой системы все её +файлы оказываются в соответствующем каталоге. После размонтирования +(unmounting) файловой системы этот каталог окажется пустым. + +То же самое относится и к файловым системам на жёстком диске. Так называемая +корневая файловая система (root file system) монтируется в каталог /. Если +имеется отдельная файловая система /home, то она монтируется в каталог /home. +Если имеется лишь корневая файловая система, то все файлы (включая и те, +которые находятся в каталоге /home) находятся только в ней. Операционная +система автоматически монтирует файловые системы, расположенные на жёстких +дисках, во время загрузки. Файловые системы на съёмных носителях (такие как +дискеты, CD-ROM и проч.) также в большинстве случаев монтируются автоматически +при помощи программы automount. + +Для монтирования и размонтирования файловых систем используются программы mount +и umount (не unmount). Команда mount -av выполняется автоматически во время +загрузки системы. Информация о файловых системах и точках монтирования +находится в файле /etc/fstab. Пример файла /etc/fstab приведён ниже. + +---- +# device directory type options +# (устройство) (каталог) (тип) (опции) +# +/dev/hda1 / ext3 defaults +/dev/hda2 /home ext3 defaults +/dev/cdrom /mnt/cdrom auto user,noauto,ro +/dev/hda4 none swap swap +/proc /proc proc none +---- + +На первом поле (device) находится имя раздела, который нужно монтировать. +Второе поле — точка монтирования. Третье поле — тип файловой системы, auto +здесь обозначает, что тип файловой системы должен определяться автоматически. +Последнее поле содержит опции монтирования. Часто они бывают установленными по +умолчанию (defaults). В приведённом примере опция user обозначает, что файловая +система может быть смонтирована обычным пользователем (обычно это — привилегия +суперпользователя), noauto — что файловая система не будет смонтирована +автоматически при загрузке. Подробнее об опциях монтирования можно узнать из +экранной документации по mount. Ниже перечислены поддерживаемые в ALT Linux 2.3 +Junior типы файловых систем. + +Ext2:: + Является наиболее традиционной для Linux и самой стабильной из всех +доступных файловых систем, однако она не является журналируемой, т. е. в случае +перебоя питания и т. п. сбоев вся информация, которая не была записана на диск, +будет утрачена и возможно появление ошибок в файловой системе. Поэтому после +сбоя требуется произвести проверку файловой системы при помощи fsck. + +Ext3:: + Развитие Ext2 с поддержкой журналируемости; хорошо совместима с Ext2. Ext2 +может быть легко преобразована в Ext3 командной tune2fs -j /dev/hdXN. Для +обратного преобразования достаточно смонтировать этот раздел как Ext2. + +ReiserFS:: + Журналируемая система, оптимизированная под каталоги, содержащие большое +количество файлов, а также под небольшие файлы. Для использования в данный +момент рекомендуется версия 3.6 для ядер 2.4.x. + +ISOFS:: + Используется на носителях CD-ROM. + +UDF:: + Используется на носителях DVD-ROM. + +VFAT:: + Используется в операционных системах Microsoft Windows 9x, Microsoft +Windows 2000. + +NTFS:: + Используется в операционных системах Microsoft Windows NT, Microsoft +Windows XP. В настоящее время поддерживается только чтение файловых систем +этого типа. + +Файловые системы ISOFS и UDF используются в носителях CD/DVD-ROM; VFAT и NTFS +используются семейством ОС Microsoft. + +В файл /etc/fstab также включена информация о swap-разделах. Они имеют точку +монтирования none (т. е. не монтируются) и тип swap. + +Файл /etc/fstab содержит одну специальную запись для файловой системы /proc. +Эта файловая система содержит информацию о протекающих в системе процессах, +доступной памяти и т. д.. Если раздел /proc не смонтирован, то команды типа ps +не будут работать. + +=== Проверка файловой системы === + +В Junior проверка файловых систем на наличие повреждённых файлов выполняется +автоматически во время загрузки в случае необходимости, а также регулярно — в +профилактических целях. Однако иногда требуется вручную запустить проверку: для +этого достаточно отдать команду fsck /dev/hdXN, и она сама автоматически +определит тип проверяемой файловой системы и запустит нужную команду. + +Перед проверкой файловую систему полезно размонтировать, а если программа fsck +будет производить какие-либо восстановления в файловой системе, то это сделать +необходимо. From a604a7cdb694a9fba1571c88c9fac1808c44fb7c Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Fri, 17 Jan 2014 13:20:22 +0300 Subject: [PATCH 30/53] Add old docs from docs-finding-0.1-alt1.noarch.rpm --- old-docs/finding.txt | 111 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 old-docs/finding.txt diff --git a/old-docs/finding.txt b/old-docs/finding.txt new file mode 100644 index 0000000..9185062 --- /dev/null +++ b/old-docs/finding.txt @@ -0,0 +1,111 @@ +//// +Пакет: docs-finding +RPM файл: docs-finding-0.1-alt1.noarch.rpm +Аннотация: Кратко о поиске в файловой системе как таковом и более + подробно про использование find +Автор: Антон Бояршинов +Лицензия: FDL +URL: http://heap.altlinux.org/modules/finding.boyarsh/index.html +//// + +== Поиск == + +Поиск информации в файловой системе можно условно разделить на поиск по +атрибутам файла (понимая их расширительно, то есть включая имя, путь и т. п.) и +поиск по содержимому. Для этих видов поиска как правило используются программы +find и grep соответственно. Благодаря удобным средствам межпроцессного +взаимодействия, эти два вида поиска легко объединить, то есть искать нужную +информацию только в файлах с нужными атрибутами[1]. + +[note] +Необходимость искать файлы с нужными атрибутами среди файлов с нужным +содержимым возникает реже, так как поиск по атрибутам в общем случае работает +намного быстрее. + + +=== Поиск по атрибутам === + +Основным средством поиcка по атрибутам файла является программа find. +Обобщенный вызов find выглядит так: find путь выражение, где путь — это список +каталогов, в которых надо искать, а выражение — набор выражений, описывающих +критерии отбора файлов и действия, которые надо произвести над найденными +файлами. По умолчанию имена найденных файлов просто выводятся на стандартный +вывод, но это можно переопределить и передавать список имён найденных файлов +любой команде для обработки. По умолчанию find ищет во всех подкаталогах +каталогов, заданных в списке путей. Выражения + +Выражения, определяющие критерии поиска файлов, состоят из пар ключ — значение. +Ниже перечислены некоторые из возможных параметров поиска: + +-amin, -anewer, -atime:: + Время последнего доступа к файлу. Позволяет искать файлы, которые были +открыты в некоторый период времени, или наоброт, файлы, к которым никто не +обращался в течение некоторого периода. + +-cmin, -cnewer, -ctime:: + Время последнего изменения статуса файла. + +-fstype:: + Тип файловой системы, на которой расположен файл. + +-gid, -group:: + Пользователь и группа, которым принадлежит файл. + +-name, -iname:: + Соответствие имени файла заданному шаблону. + +-regex, -iregex:: + Соответствие имени файла регулярному выражению. + +-path, -ipath:: + Соответствие полного имени файла (с путём) заданному шаблону. + +-perm:: + Права доступа. + +-size:: + Размер файла. + +-type:: + Тип файла. + +[float] +==== Действия ==== + +Программа find может выполнять различные действия над найденными файлами. +Наиболее важные из них: + +-print:: + Вывести имя файла на стандартный выход (действие по умолчанию); + +-delete:: + удалить файл; + +-exec:: + выполнить команду, передав ей в качестве параметра имя файла. + +Об остальных можно прочитать в экранной документации по команде find, отдав +команду man find. + +[float] +==== Параметры ==== + +Параметры влияют на общее поведение find. Наиболее важные из них: + +-maxdepth:: + максимальная глубина поиска в подкаталогах; + +-mindepth:: + минимальная глубина поиска в подкаталогах; + +-xdef:: + поиск только в пределах одной файловой системы. + +Об остальных можно прочитать в экранной документации по команде find. + +Пример 1. Перекодировка имён файлов и каталогов из koi8-r в cp1251 + +---- +find ./ -print | tac | sed -e 's/"/\\"/' | while read name; do mv "$name" + "`dirname "$name"`/`basename "$name" | iconv -f koi8-r -t cp1251`"; done +---- From 820592cb7ab27a8107111c5dcb6649227a6f7b05 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Fri, 17 Jan 2014 13:47:04 +0300 Subject: [PATCH 31/53] Add old docs from docs-firewall-0.1-alt2.noarch.rpm --- old-docs/firewall.txt | 122 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 old-docs/firewall.txt diff --git a/old-docs/firewall.txt b/old-docs/firewall.txt new file mode 100644 index 0000000..036d7e9 --- /dev/null +++ b/old-docs/firewall.txt @@ -0,0 +1,122 @@ +//// +Пакет: docs-firewall +RPM файл: docs-firewall-0.1-alt2.noarch.rpm +Аннотация: Краткое описание принципов работы iptables +Автор: Андрей Горев +Лицензия: FDL +URL: http://docs.altlinux.org/archive/2.4/master/alt-docs-master/ch06s05.html +//// + +== Сетевая безопасность == + +Безопасность бывает различная, в данном разделе мы рассмотрим внешнюю сетевую +безопасность. Главным правилом для обеспечения безопасности при доступе по +сети, является следующее условие: выключайте на сервере весь неиспользуемый +сервис! Команды netstat -anp | grep udp и netstat -anp | grep LISTEN помогут +определить, какой сервис в данный момент предоставляет ваш сервер. Отключить +ненужный сервис вы можете с помощью команд chkconfig или ntsysv. + +Вторым правилом будет следующее: по возможности обновляйте серверные компоненты +из updates дистрибутива, особенно в том случае, если в обновлениях исправлены +ошибки в безопасности. Подпишитесь на список рассылки security-announce По +этому списку приходит очень немного сообщений, но содержащаяся в них информация +и объявления могут иметь очень большое значение для безопасности вашей системы. + +Третьим правилом можно считать следующее: не подключайте критически важные +ресурсы к глобальной сети Интернет, если это возможно. + +Четвёртое правило: используйте где возможно криптование, ssh-туннелирование, +SSL-подписи. Это предохранит ваш трафик от подслушивания. + +Последнее правило — фильтруйте весь нежелательный трафик. Об этом поговорим +подробнее. + +=== Настройка межсетевого экрана === + +Для построения фильтра пакетов на уровне ядра в Linux применяются следующие +пакеты: для ядер 2.2 — ipchains; для ядер 2.4 — iptables; для ядер 2.6 — +iptables и ebtables. Далее будем рассматривать iptables как наиболее популярный +для настройки межсетевого экрана. + +Фундаментальную информацию по настройке iptables и пакетного фильтра на его +основе, включая настройку маскарадинга и NAT, с примерами и готовыми скриптами, +можно найти в статье +http://gazette.linux.ru.net/rus/articles/index-iptables-tutorial.html. + +Фильтр пакетов — это программа (iptables) которая просматривает заголовки +пакетов по мере их прохождения, и решает дальнейшую судьбу всего пакета. Фильтр +может сбросить DROP-пакет (т. е. как будто пакет и не приходил вовсе), принять +ACCEPT-пакет (т. е. пакет может пройти дальше), или сделать с ним что-то ещё +более сложное. + +Под Linux, фильтр пакетов встроен в ядро (как модули), и мы можем делать с +пакетами несколько хитроумных вещей, но основной принцип в просмотре заголовков +пакетов и решении их дальнейшей судьбы сохраняется. + +Ваша текущая настройка межсетевого экрана хранится в ядре, и соответственно +будет потеряна при перезагрузке системы. Для сохранения текущих настроек +существует команда iptables-save. Она помогает сохранить настройки в файле +/etc/sysconfig/iptables. Не исправляйте этот файл вручную! Конфигурация из него +зачитывается и восстанавливается при запуске сервиса iptables. Альтернативным +вариантом будет размещение в каталоге /etc/rc.d сценария rc.firewall, +производящего настройку межсетевого экрана. Файл сценария, естественно, должен +быть исполняемым. + +Для того, чтобы разобраться в работе iptables, необходимо понять, как пакеты +проходят цепочки. На рисунке представлен этот механизм. Как видите, по левой +цепочке пакет проходит в случае когда ваш маршрутизатор переправляет пакет +дальше, а по правой — когда это локальный трафик, или предназначенный самому +маршрутизатору. + +//http://docs.altlinux.org/archive/2.4/master/alt-docs-master/images/tables_traverse.jpg + +Более наглядно можно себе представить картину маршрутизации на примере +межсетевого экрана, установленного между домашней сетью и Интернет (см. +следующий рисунок). + +//iptables3.jpg + +О назначении самих цепочек и расширенных возможностях iptables читайте +документацию по представленной выше ссылке или man iptables. + +Для примера приведём несколько правил. + +---- +# Политики цепочек по умолчанию. Если межсетевой экран не находит описания для +# данного пакета, он поступает с ним согласно этих правил. + +iptables -P INPUT DROP +iptables -P OUTPUT ACCEPT +iptables -P FORWARD DROP + +# Обнуление существующих цепочек + +iptables -F INPUT +iptables -F OUTPUT +iptables -F FORWARD + +# Защита от Syn-flood. +iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT + +# Защита от скрытого сканирования портов. +iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit +--limit 1/s -j ACCEPT + +# Защита от Ping of death. +iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s +-j ACCEPT + +# Запрещаем NEW и INVALID входящие пакеты с ppp. +iptables -A INPUT -i ppp+ -m state --state NEW,INVALID -j DROP + +# Разрешаем пакеты, принадлежащие и относящиеся к уже установленному +# соединению. +iptables -N block +iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT +iptables -A block -m state --state NEW -i ! ppp+ -j ACCEPT +iptables -A block -j DROP + +iptables -A INPUT -j block +---- + +В этих правилах описывается примерная защита для одиноко стоящего хоста с коммутируемым (или ADSL) подключением к Интернет. В самом конце цепочки INPUT осуществляется переход в самодельную цепочку block. From 0d79862f2167dc04a717e36972cf36495a9bf7f1 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Fri, 17 Jan 2014 13:57:23 +0300 Subject: [PATCH 32/53] old-docs/finding.txt: fix AsciiDoc tag --- old-docs/finding.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/old-docs/finding.txt b/old-docs/finding.txt index 9185062..56987b1 100644 --- a/old-docs/finding.txt +++ b/old-docs/finding.txt @@ -17,7 +17,7 @@ find и grep соответственно. Благодаря удобным с взаимодействия, эти два вида поиска легко объединить, то есть искать нужную информацию только в файлах с нужными атрибутами[1]. -[note] +[NOTE] Необходимость искать файлы с нужными атрибутами среди файлов с нужным содержимым возникает реже, так как поиск по атрибутам в общем случае работает намного быстрее. From 1ac47fe416d3e3f53d59399fd3da362b4027c57d Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Fri, 17 Jan 2014 14:23:26 +0300 Subject: [PATCH 33/53] Add old docs from docs-freesoft_history-0.1-alt2.noarch.rpm --- old-docs/freesoft_history.txt | 847 ++++++++++++++++++++++++++++++++++ 1 file changed, 847 insertions(+) create mode 100644 old-docs/freesoft_history.txt diff --git a/old-docs/freesoft_history.txt b/old-docs/freesoft_history.txt new file mode 100644 index 0000000..8e38a10 --- /dev/null +++ b/old-docs/freesoft_history.txt @@ -0,0 +1,847 @@ +//// +Пакет: docs-freesoft_history +RPM файл: docs-freesoft_history-0.1-alt2.noarch.rpm +Аннотация: Изложена история появления понятия ``свободное программное + обеспечение'' и свободных лицензий. +Автор: Кирилл Маслинский, Пётр Новодворский, Георгий Курячий +Лицензия: FDL +URL: http://heap.altlinux.org/kirill/LinuxIntro/Linux.html +Comment: На http://heap.altlinux.org было больше информации, чем + в пакете. Текст ниже содержит информацию из ссылки в том + числе. +//// + +== История возникновения свободного ПО == + +=== Разработка ПО как научное исследование === + +Особенность программного обеспечения состоит в том, что оно производится в +одной форме — в виде исходного текста (source code), а распространяется и +используется в другой — в виде двоичной программы, машинных кодов, по которым +невозможно однозначно восстановить исходный текст. Чтобы изменять программу, +исправлять ошибки или даже просто точно установить, что и как делает программа, +необходимо располагать её исходным текстом. + +Первоначально создание программного обеспечения для компьютеров было в первую +очередь академическим занятием. Для специалистов в области компьютерной науки +(computer science) каждая программа представляла собой результат научного +исследования, в некотором смысле аналогичный публикации статьи. Это означает, +что исходный текст программы был обязательно доступен всему научному +сообществу, поскольку любой научный результат должен быть верифицируем, т. е. +подтверждаться другими исследователями и быть открытым для критики. Таким +образом, процесс разработки программного обеспечения более принципиально схож с +научным процессом: учёный брал существующие программы, исправлял их в +соответствии со своими идеями и публиковал исправленные программы — новый +результат. + +Однако технология производства компьютеров развивалась не менее активно, чем +программное обеспечение для них. В 1970-е годы существует огромное разнообразие +различных архитектур вычислительных машин, различавшихся также и +производительностью, и ценой. Естественно, для каждой архитектуры приходилось +разрабатывать отдельный набор программного обеспечения. С середины 1970-х в +большинстве американских университетов (где преимущественно и развивалась +компьютерная наука) для академических разработок использовались компьютеры +архитектуры PDP-10, что позволило сотрудникам разных университетов использовать +разработки друг друга на своих машинах. Сотрудники лаборатории искусственного +интеллекта массачуссетского технологического института в конце 1970-х +разработали для PDP-10 собственную операционную систему ITS (Incompatible +Timesharing System, несовместимая система с разделением времени) и очень +большой набор программ для неё. Исходные тексты написанных в МТИ программ были +общедоступны, сотрудники других университетов пользовались их исходными +текстами и присылали им исправления, всё программное обеспечение в этих +лабораториях было полностью академическим, а среди учёных-разработчиков был +настоящий дух сотрудничества. + +=== ПО как «патентованный» продукт === + +В условиях огромного многообразия архитектур компьютеров программное +обеспечение составляло неотъемлемую часть самой машины, причём далеко не самую +дорогостоящую часть. Производители компьютеров поставляли их вместе с основным +программным обеспечением, по крайней мере, с операционной системой. +Производство компьютеров было наукоёмким, в основе своей коммерческим +предприятием. + +В ситуации, когда программное обеспечение является объектом продажи наравне с +предметами обихода, на него автоматически распространяются уже не только законы +научной разработки, но и свойства материальных предметов, которыми можно +торговать, обмениваться, право владения и пользования которыми стоит охранять +законодательно. Так, программное обеспечение попало в разряд интеллектуальной +собственности: т. е. исходный текст программы стал рассматриваться как +произведение, объект применения авторского права. Чтобы защитить свои интересы, +производители компьютеров и программного обеспечения используют лицензии — вид +договора между обладателем авторских прав и пользователем (покупателем) +программного обеспечения. Подобные договоры заключались и с университетами, +например, университету передавались исходные тексты программ и право их +изменять, но запрещалось распространять их за пределами университета. Подобные +ограничения означали, что тексты соответствующих программ не могли открыто +обсуждаться в сообществе, т. е. не существовали для научной разработки. Были у +компьютеров и программного обеспечения покупатели и вне академической среды, +например, банки. Таким пользователям не столь важно получить исходные тексты +программ, они заинтересованы в программном обеспечении как в законченном +продукте и готовы платить деньги за надёжные и удобные программы. + +В европейской культуре столь долго вырабатывались правила собственности по +отношению к материальным предметам, что распространение этих прав на предметы +нематериальные — программные продукты — выглядит делом естественным и не +вызывает сомнений. А поводов для сомнений немало. Главное отличие программного +продукта от, допустим, табурета — т. н. безущербное копирование. Если грабитель +отбирает у крестьянина табурет, совершается злодеяние: крестьянин табурета +лишается, терпит ущерб. Если крестьянин отдаёт кому-то табурет добровольно, он +его также лишается, поэтому вправе требовать возмещения ущерба — например, +деньгами. Для того, чтобы ущерба у крестьянина не происходило, табурет нужно +воспроизвести: добыть досок, позвать столяра, краснодеревщика и оплатить их +работу, и один из двух получившихся предметов обихода отдать грабителю. В этом +случае ущерб — денежный — терпит тот, кто оплачивает копирование табурета. +Совершенно естественно при этом законодательно запрещать нанесение ущерба, то +есть признавать право распоряжаться вещью только за одним человеком — за её +хозяином. Никаких дополнительных механических или юридических приспособлений, +запрещающих воспроизводить табуреты, при этом не требуется. + +Иное дело — программный продукт. Сколько бы средств ни было вложено в его +разработку, процедура его копирования (переписывания с одного носителя данных +на другой) резко отличается от процедуры воспроизведения табурета. Она не +требует участия ни одного из авторов программы, ни, по большому счёту, вообще +человека. Единственная расходная статья при этом — цена носителя данных и +амортизация копировального устройства. В результате такого копирования +получается два экземпляра программы, создающие удобства уже для двух человек. +Таким образом, если человек оценивает приносимые программой удобства выше +стоимости носителя данных, копирование — благо. Если же относиться к +программному продукту, как материальной вещи, и закреплять право её +использования за одним каким-то человеком, возникает множество неурядиц, каждую +из которых приходится решать искусственными, а зачастую и противоестественными +методами. + +Например, придётся изыскивать, какой ущерб всё-таки наносится «хозяину» +программы при её безущербном копировании. Обычно при этом фигурирует понятие +«упущенная выгода», то есть та прибыль, которую хозяин мог бы получить, но не +получил из-за того, что продукт скопировали. Вспоминается история 30-х годов, +когда советский колхозник украл мешок колхозной пшеницы, и был осуждён за +хищение в крупных размерах: если, мол, эту пшеницу всю посадить, да вырастить, +да собрать, вышло бы несколько центнеров. Приходится изобретать хитроумную +аппаратуру, мешающую копированию, или причиняющую при этом ущерб. Приходится +вводить в законодательство особую категорию прав, `условно` назовём её «патент», +ограничивающую злоупотребления — и свободу — всего человечества в пользу +хозяина патента. Причём далеко не всегда хозяин патента и автор изобретения — +один и тот же человек! + +[NOTE] +Условно — потому, что далеко не во всех странах разрешено выдывать +патенты на программное обеспечение, однако везде отношения собственности на +исходные тексты программ регулируются общими или специальными разделами законов +об авторском праве (разных в разных государствах). + +Далее в лекции патентованные программные продукты и способ их разработки будут +в чём-то противопоставлены свободно распространяемым программам. Термин +«патентованный программный продукт» будет означать не наличие действительного +патента на программу, а наличие у программы собственника, который относится к +ней как к материальному объекту (в случае патентованных программ). +Патентованные программы часто называют иногда «проприетарными» (от английского +термина «proprietary») или просто «коммерческими» (что, строго говоря, неверно, +так как «делать коммерцию» — то есть получать выгоду — можно различными +способами, и многие успешные свободные проекты это подтверждают). + +=== Появление свободного ПО === + +Однако компьютеры развивались очень быстро, и бывшие вполне современными в +1970-е PDP-10 к началу 1980-х уже устарели, и значительно отставали по +производительности от более современных машин. Однако ни для одной из новых +архитектур уже не было операционной системы и прочего программного обеспечения, +разработанного исключительно в академической среде. Университеты должны были +покупать новые компьютеры с новым программным обеспечением и выполнять условия +лицензии, ограничивающей их права на разработку и распространение ПО, иначе +говоря, ограничивающей возможность научной модели разработки программного +обеспечения. + +В это время в лаборатории искусственного интеллекта МТИ разрабатывались так +называемые LISP-машины, умевшие на аппаратном уровне интерпретировать язык +программирования, похожий на LISP — развитый и перспективный язык +программирования. На LISP же была написана операционная система для таких машин +и всё программное обеспечение для них. В начале 1980-х некоторые сотрудники +лаборатории искусственного интеллекта выкупили у МТИ права на LISP-машины и +математическую систему MACSIMA и основали собственные коммерческие компании для +дальнейшей разработки в этой области. Очень многие сотрудники лаборатории +перешли работать в эти компании, после чего все их дальнейшие разработки уже +становились закрытыми для научного сообщества. Новые LISP-машины +распространяются с лицензиями, запрещающими пользователям модифицировать и +распространять исходные тексты программ. Программы, которые раньше для +сотрудников МТИ были аналогом научных публикаций, стали принадлежащим кому-то +патентованным продуктом. + +Одному из сотрудников, оставшемуся в лаборатории искусственного интеллекта МТИ, +Ричарду Столлману, такое положение дел казалось недопустимым нарушением +открытого научного процесса разработки программного обеспечения. Он в одиночку +пытался в рамках прежней академической модели развивать LISP-машины и открыто +реализовывать изменения, аналогичные сделанным в рамках закрытой коммерческой +разработки, чтобы LISP-машины МТИ могли конкурировать с патентованными +аналогами. Конечно, эта попытка угнаться за активной разработкой целой компании +была обречена на неудачу. + +Тогда в поисках единомышленников Ричард Столлман создаёт некоммерческую +организацию Фонд свободного программного обеспечения (Free Software Foundation, +FSF). Своей основной целью Фонд ставит сохранение программного обеспечения, +процесс разработки которого всегда будет гарантированно открытым, а исходные +тексты всегда доступны. Более масштабная цель Фонда — разработка операционной +системы, целиком состоящей из открыто разрабатываемого программного +обеспечения. Декларируя такую цель Столлман, фактически хотел вернуть +представлявшееся ему идеальным состояние, когда в МТИ работали в собственной +операционной системе для PDP-10. + +Операционная система, разрабатываемая в рамках Фонда, должна была стать +совместимой с операционной системой UNIX. Изначально UNIX был разработан в +1970-е годы Кеном Томпсоном и Деннисом Ричи в лаборатории компании AT&T и +распространялся этой компанией (а впоследствии — и другими) как патентованная +операционная система. К началу 1980-х UNIX очень широко использовался, в том +числе и в академической среде, для этой операционной системы существовало много +программ, свободно распространявшихся в научном сообществе, поэтому хотелось, +чтобы эти программы работали и в новой — свободной — операционной системе. Эта +будущая операционная систему получила название GNU. + +[NOTE] +Это псевдоаббревиатура, для которой сам Столлман предлагал рекурсивную +расшифровку: GNUs Not Unix («Гну — Не UNIX»). + +=== Определение свободного ПО === + +Для того, чтобы сохранить модель научного сотрудничества между разработчиками, +необходимо было обеспечить, чтобы исходные тексты программ, написанных +разработчиками, оставались доступными для чтения и критики всему научному +сообществу. Для этого Ричард Столлман сформулировал понятие свободное +программное обеспечение, в котором отразились принципы открытой разработки +программ в научном сообществе, сложившемся в американских университетах в +1970-е годы. Столлман явно сформулировал эти принципы, они же — критерии +свободного программного обеспечения. Эти критерии оговаривают те права, которые +автор свободной программы передаёт любому пользователю. + +* Программу можно использовать с любой целью («нулевая свобода»). + +[NOTE] +Для российских пользователей эта свобода действительно «нулевая», в том смысле, +что она присутствует всегда, в том числе и у пользователей патентованного ПО. +По российскому законодательству обладатель прав на интеллектуальную +собственность может передавать или не передавать пользователю право на +распространение копий своего произведения (в данном случае — программного +обеспечения), однако у него нет никаких прав каким бы то ни было образом +ограничивать владельца копии в использовании программы. + +* Можно изучать, как программа работает и адаптировать её для своих целей + («первая свобода»). Условием этого является доступность исходного текста + программы. + +* Можно распространять копии программы — в помощь товарищу («вторая свобода»). + +* Программу можно улучшать и публиковать свою улучшенную версию, с тем чтобы + принести пользу всему сообществу («третья свобода»). Условием этого является + доступность исходного текста программы. + +Только удовлетворяющая всем принципам программа может считаться свободной, т. +е. гарантированно открытой и доступной для научного сообщества. Нужно +подчеркнуть, что эти принципы оговаривают только доступность программ для +всеобщего использования, критики и улучшения, но никак не оговаривают связанные +с распространением программ денежные отношения, в том числе не предполагают и +бесплатности. В англоязычных текстах здесь часто возникает путаница, поскольку +слово «free» обозначает не только «свободное», но и «бесплатное» и нередко +употребляется по отношению к программному обеспечению, которое распространяется +без взимания платы за использование, но которое при этом совершенно недоступно +для изменения сообществом, просто потому, что его исходные тексты не +опубликованы. Такое бесплатное ПО вовсе не является свободным. Наоборот, +свободное ПО вполне можно распространять, взимая при этом плату, однако +соблюдая при этом критерии свободы: каждому пользователю предоставляется право +получить исходные тексты программ, изменять их и распространять далее. Всякое +программное обеспечение, пользователям которого не предоставляется такого +права, является несвободным. + +Открытый доступ к исходным текстом программ, в действительности, является +ключевым признаком свободного ПО, поэтому предложенный несколько позднее термин +«open source software» (ПО с открытым исходным текстом) представляется даже +более удачным для обозначения феномена свободного программного обеспечения, чем +предложенный Столлманом «free software». + +=== Общественная лицензия GNU === + +Декларировав критерии свободного ПО, члены Фонда свободного ПО стали +распространять свои программы в соответствии с этими принципами, никак не +оформляя это документально, иначе говоря, первоначально свободные программы +распространялись вообще без лицензии. Однако произошедший с самим Ричардом +Столлманом прецедент убедил его в том, что документальное оформление необходимо +для свободного ПО. + +Ричард Столлман занимался разработкой текстового редактора Emacs (о котором шла +речь в лекции Текстовые редакторы) на основе исходных текстов Джеймса Гослинга +(который впоследствии стал автором известного сегодня продукта Java). Тогда +Гослинг свободно раздавал свои исходные тексты всем заинтересованным. Однако в +некоторый момент Гослинг продал права на распространение Emacs компании +UniPress (http://www.unipress.com) и компания попросила Столлмана прекратить +распространение его версии Emacs, так как права принадлежат им. Этот инцидент +заставил Столлмана переписать заново те части исходного текста Emacs, которые +теперь принадлежали UniPress, после чего он разработал собственную лицензию на +программное обеспечение. + +Лицензия, сформулированная Столлманом, должна была работать так же, как и +лицензии на патентованное программное обеспечение: это типовой договор автора +программы (обладателя авторских прав) с пользователем, в котором автор +оговаривает права пользователя по отношению к программе. В отличие от +коммерческой лицензии, в лицензии Столлмана оговариваются те права, которые +пользователь получает по отношению к свободной программе: получать исходные +тексты программ, изменять их, распространять изменённые и неизменённые версии +(см. перечисленные выше критерии свободного ПО). Кроме того, в этой лицензии +оговаривается принципиальное для Столлмана условие распространения свободного +ПО: ни один пользователь не имеет права, сделав модифицированную версию +свободной программы, распространять её, не соблюдая всех принципов свободного +ПО, ограничивая тем самым права других пользователей по отношению к программе. +Иначе говоря, нельзя модификацию свободной программы сделать несвободной. + +Лицензия, содержащая такое условие, получила название «copyleft». Здесь игра +слов: по-английски авторское право называется «copyright», буквально +«копироватьправо», а «copyleft», соответственно, «копироватьлево». +Действительно, условие «copyleft» прямо противоположно по смыслу авторскому +праву: авторское право призвано ограничить пользователя в копировании и +распространении копий продукта, а «авторское лево», наоборот, строго запрещает +его ограничивать. Впоследствии лицензия Столлмана получила название +«Общественная лицензия GNU» (GPL, GNU Public License). + +В настоящее время помимо GPL известны и другие лицензии, под которыми может +распространяться свободное ПО. Самая распространённая из таких лицензий — BSD +License. Лицензия BSD отличается от GPL главным образом тем, что в ней +отсутствует условие «copyleft», т. е. на основании свободного ПО, +распространяемого под этой лицензией, можно производить несвободные +модификации. Однако лицензия BSD и другие лицензии до тех пор будут оставаться +лицензиями на свободное программное обеспечение, пока они соответствуют +условиям, оговорённым принципами свободного ПО, объявленными Фондом. + +[NOTE] +BSD — Berkeley Software Distribution, пакет совместимого с UNIX программного +обеспечения, разработанный в университете Беркли и распространявшийся свободно. + +=== Сообщество разработчиков и пользователей === + +Однако главное условие существования свободного ПО — не лицензия, а люди, +которые готовы делиться текстами своих программ и совершенствовать тексты +чужих. Свободное ПО унаследовало модель открытой научной разработки, а вместе с +ней — и специфическую организацию сообщества разработчиков и пользователей, в +некоторых отношениях напоминающую академическое сообщество. Чтобы лучше +продемонстрировать специфику этого сообщества, сравним социальные отношения, +сопровождающие использование свободного и патентованного ПО. + +У любого пользователя программного обеспечения непременно возникают вопросы, +когда он пытается применить его для решения своих задач. Традиционная +коммерческая модель разработки и использования программного обеспечения +основана на том, что исходные тексты программ являются коммерческой тайной +производителя, а пользователь получает готовый продукт — скомпилированную +программу. Такая программа является несвободной. Пользователь несвободной +(патентованной) программы платит за неё производителю, который взамен +предоставляет ему некоторые гарантии, одна из которых — отвечать на вопросы о +работе программы. Специально для этого производитель организует службу +поддержки, которая по телефону и по электронной почте отвечает на вопросы +пользователей. + +Пользователь свободно распространяемой программы не получает вместе с ней +никаких гарантий: автор сделал её исходный текст открытым для общества, но при +этом не брал на себя обязательств объяснять всем, как работает программа. +Поэтому получить ответ на свой вопрос пользователь может из двух источников: из +документации, а если её недостаточно — от более опытных пользователей. Хорошо, +если такие пользователи есть среди знакомых, а если нет? В этом случае их +всегда можно найти в списке рассылки в Internet, посвящённом данной программе. + +[NOTE] +В общественной лицензии GNU есть даже стандартная формулировка, закрепляющая +отсутствие гарантий: «Настоящая программа поставляется на условиях «как есть». +Если иное не указано в письменной форме, автор и/или иной правообладатель не +принимает на себя никаких гарантийных обязательств, как явно выраженных, так и +подразумеваемых, в отношении программы, в том числе подразумеваемую гарантию +товарного состояния при продаже и пригодности для использования в конкретных +целях, а также любые иные гарантии». Текст лицензии приводится в переводе Елены +Тяпкиной. + +Письмо, пришедшее на электронный адрес списка рассылки, будет отправлено всем +подписчикам списка, любой из них может ответить на него в списке, и ответ также +получат все подписчики и т. д. Так организуется нечто вроде виртуальной общей +`комнаты для разговоров`. В настоящее время сложилось неписанное правило, что +для каждой свободно распространяемой программы существует отдельный список +рассылки. Найти адрес этого списка и подписаться на него можно в Internet +(обычно на сайте, посвящённом данной программе). Любой пользователь свободной +программы может направить свой вопрос в список рассылки. Списки рассылки читают +разработчики программы и её активные пользователи, и обычно среди них находится +тот, кто `ответит на вопрос`. Так получается, что пользователи свободных +программ, в отсутствие централизованной службы поддержки, организуются в +сообщество для взаимопомощи. + +[NOTE] +Списки рассылки в Internet — наследники телеконференций сети Usenet, возникшей +до появления Internet. В Usenet существовали телеконференции буквально на любую +тему, и, конечно же, многие были посвящены программному обеспечению. + +[NOTE] +Задавший вопрос пользователь должен принимать в расчёт, что все подписчики +списка рассылки участвуют в нём добровольно, и никто их них не обязан отвечать +на какие-либо вопросы, поэтому предъявлять претензии на этот счёт бессмысленно +и невежливо. + +У пользователей программ вновь и вновь возникают одни и те же вопросы и +сложности. Постоянным читателям списков рассылки это особенно очевидно, +поскольку им приходится на эти вопросы отвечать не по одному разу. В таких +ситуациях у них нередко возникает инициатива записать ответы на самые +распространённые вопросы и открыть их для всеобщего обозрения. Так к свободной +программе появляется новая документация в жанре FAQ (Frequently Asked +Questions, ЧАсто задаваемые ВОпросы), представляющая собой список вопросов с +ответами. Пользователи патентованных программ тоже задают одни и те же вопросы, +только не в списке рассылки, а службе поддержки, в результате так же появляется +документация типа FAQ, которая, почему-то, редко выходит за пределы внутреннего +пользования производителя программы. + +В любой программе непременно имеются ошибки (bugs). Производитель патентованной +программы оплачивает работу отдела контроля качества, который занимается +поиском ошибок. Тем не менее, некоторые ошибки этот отдел пропускает, и они +достигают пользователя. Пользователь несвободной программы, столкнувшись с +ошибкой, не может выявить её причину (поскольку ему недоступны исходные тексты +программы), но, скорее всего, способен описать ошибку и условия, в которых она +происходит. Он может сообщить об ошибке производителю программы (обычно +посредством обращения всё в ту же службы поддержки), и если там решат, что +ошибка действительно в программе, а не в работе пользователя, о ней будет +сообщено разработчикам. В итоге пользователь может ожидать, что в следующей +версии программы ошибка будет исправлена. + +У свободно распространяемой программы обычно нет оплачиваемого отдела контроля +качества. Значит, пользователь может столкнуться с ещё большим количеством +ошибок, чем в патентованной программе. Тем актуальнее для него возможность +сообщить об ошибке разработчикам программы. Раньше в сопровождающей программу +документации было принято указывать электронный адрес, по которому разработчики +принимали сообщения об ошибках, bug report. Некоторые вводили стереотипную +форму для таких сообщений, чтобы облегчить и автоматизировать их обработку. Уже +это требует существенно более высокой связности сообщества во всём мире, +существенно большей, чем достаточно для закрытой разработки. + +Разработчики и контролёры-испытатели патентованного продукта могут ходить на +службу в один и тот же офис, и там обмениваться информацией или тратить +определённую долю рабочего времени на составление и анализ строгих отчётностей, +содержащих сообщения о ошибках и рапорты об устранении неисправностей. Такая +организация труда эффективна, если круг разработчиков невелик, а ввести общую +дисциплину относительно легко (например, угрожая рублём). Для открытого проекта +круг потенциальных разработчиков не ограничен ничем, поэтому эффективность +разработки в гораздо большей степени зависит от того, насколько просто всем +членам сообщества договариваться между собой, а также от «сознательности» +пользователей. Заметив ошибку в программе, сознательный пользователь не просто +исправит её самостоятельно (что не всегда ему по силам), а оформит внятное +сообщение об ошибке, а если исправление готово, приложит к сообщению и его. + +Простому и упорядоченному приёму и перенаправлению сообщений об ошибках служат +системы отслеживания ошибок (Bug Tracking System), самые известные из которых +разработаны участниками больших проектов для себя, а благодаря свободным +лицензиям используются повсеместно. Таковы GNUTS (разработанная в GNU), +Bugzilla (mozilla.org), JitterBug (проект Samba) или Debian BTS. Более ранние +версии ориентируются на электронную почту, более поздние включают в себя +WWW-интерфейс. Например, при помощи Bugzilla организуется сайт в Internet, на +котором пользователь может заполнить форму сообщения об ошибке. Каждое +сообщение имеет свой номер, по которому можно попасть на «персональную» +страницу данной ошибки, где отражаются все происходящие по её поводу события, +от первоначального сообщения (открытия) до исправления (закрытия). При каждом +изменении в состоянии ошибки Bugzilla рассылает всем заинтересованным лицам +(включая, естественно, сообщившего об ошибке и занимающихся данной программой +разработчиков) письма по электронной почте. Поскольку Bugzilla позволяет +оставлять комментарии и прикладывать файлы, она является полноценным средством +для общения пользователя с разработчиком по поводу ошибки в программе. + +Принципиальное преимущество пользователя свободной программы заключается в том, +что у него, в отличие от пользователей несвободных программ, всегда есть +возможность заглянуть в исходные тексты. Конечно, для многих пользователей +исходные тексты не более понятны, чем двоичные исполняемые файлы. Однако при +достаточном уровне познаний в программировании пользователь может установить +причину ошибки в программе и устранить её, исправив соответствующим образом +исходный текст. А если пользователь заинтересован в развитии программы, то с +его стороны будет разумно не только сообщить автору об ошибке, но и прислать +ему свои исправления к исходному тексту программы: автору останется только +применить эти исправления к тексту программы, если он найдёт их корректными и +уместными. Пересылать автору исправленный текст программы целиком непрактично: +он может быть очень большим (десятки тысяч строк), и автору будет нелегко +разобраться, что же изменено (а вдруг изменения сделаны неграмотно?). + +Чтобы облегчить и автоматизировать процесс внесения исправлений, Ларри Уолл +(Larry Wall) в 1984 году разработал утилиту patch («заплатка»), которая в +формализованном (но хорошо понятном человеку) виде описывает операции +редактирования, которые нужно произвести, чтобы получить новую версию текста. С +появлением этой утилиты пользователь, обнаруживший и исправивший ошибку в +программе, мог прислать автору небольшую заплатку, по которой автор мог понять, +какие изменения предлагаются, и автоматически «приложить» их к своему исходному +тексту. С появлением patch гораздо больше пользователей стало включаться в +разработку программ с доступным исходным текстом, немалую роль и здесь сыграла +сеть Usenet (см. об этом статью Тима ОРейли +http://tim.oreilly.com/articles/paradigmshift_0504.html). Файлы-заплатки с +исправлениями — обязательный атрибут сегодняшней разработки свободных программ. + +Однако почему ограничивать сферу применения patch исправлением ошибок? Если +пользователю программы не хватает в ней какой-то функции, то при должной +квалификации он вполне может запрограммировать её сам и включить в исходный +текст программы. Естественно, ему выгодно, чтобы его дополнение попало в +«главный», авторский вариант программы (его называют «upstream») и появлялось +во всех последующих версиях: можно точно так же оформить его в виде patch и +выслать автору. Этой возможности лишён пользователь несвободной программы, даже +если он достаточно квалифицирован. Единственный способ включить в программу +нужную ему функцию — обратиться к производителю (если программа патентованная) +с соответствующей просьбой, и надеяться, что производитель сочтёт предложенную +функцию действительно необходимой. + +Чем больше у свободной программы активных пользователей, готовых вносить +исправления и дополнения и делиться ими, тем надёжнее работает и быстрее +развивается программа. Причём такая свободная модель отслеживания и исправления +ошибок для программы, у которой тысячи активных пользователей, может оказаться +гораздо более эффективной, чем у любой патентованной программы: ни одна +компания не может себе позволить такой огромный штат сотрудников в отделе +контроля качества. Поэтому действительно популярная свободная программа может +оказаться гораздо надёжнее патентованных аналогов. + +Написать большую программу в одиночку довольно сложно и даже не всегда +возможно, особенно если автор занимается этим в свободное от работы время. +Большинство современных свободных программ пишется группой разработчиков. Даже +если начинал писать программу один человек, и она оказалась интересной, к +разработке могут присоединиться активные пользователи. Чтобы они могли не +только вносить отдельные исправления, но и вообще всю разработку вести +совместно, нужны специальные инструменты. Помимо patch, для организации +совместной разработки ПО применяются системы контроля версий. Функции системы +контроля версий состоят в том, чтобы организовать доступ к исходным текстам +программы для нескольких разработчиков и хранить историю всех изменений в +исходных текстах, позволяя объединять и отменять изменения и пр. Самая ранняя +свободная система контроля версий, RCS использовалась ещё на заре свободного ПО +абонентами сети Usenet, затем на смену ей пришла более развитая CVS, но сегодня +и она считается во многом устаревшей, и всё чаще заменяется Subversion, Arch и +другими. К слову, названные системы контроля версий сегодня активно +используются и разработчиками патентованного ПО для организации совместной +разработки. + +Нужно заметить, что преимущества свободной разработки для пользователя не +следует преувеличивать. Не все свободные программы в равной степени доступны +для изменения пользователям, и это совершенно не связано с лицензией на их +распространение. Важный фактор здесь — объём программы: если в ней десятки +тысяч строк (как, например, в OpenOffice.org), то даже квалифицированному +пользователю потребуется слишком много времени, чтобы разобраться, что к чему. +А если при этом ещё нет толковой документации... Рассчитывать же на то, что +разработчики ответят на все замечания и предложения пользователя немедленным +исправлением программы тоже нельзя, поскольку они не несут перед пользователем +никаких обязательств по качеству программы. В этом отношении пользователь +патентованной программы может быть даже в лучшем положении. + +Очень многие свойства сообщества разработчиков и пользователей свободных +программ проистекают из того, что все его участники обычно занимаются этой +программой из интереса или потому, что эта программа — необходимый для них +инструмент (например, зарабатывания денег). Время, потраченное ими на +программу, не оплачивается, поэтому нет никакой надежды, что обстоятельства не +переменятся и разработка не прекратится вовсе. Нередки случаи, когда разработка +программы начинается благодаря одному автору-энтузиасту, который привлекает +многих к участию в разработке, а потом энтузиазм лидера гаснет, а вместе с ним +затухает и разработка. К сожалению, сегодня существуют тысячи свободных +программ, так никогда и не достигших версии 1.0, хотя «выгорание» лидеров и не +единственная этому причина. Кроме того, программа может быть необходимой, но +«неинтересной», а потому не найдётся и свободных разработчиков. + +Место свободных программ на сегодняшнем рынке ПО очень значительно, и многие +коммерческие и государственные предприятия используют свободное ПО прямо или +опосредованно. Собственно, опосредованно все пользователи Internet задействуют, +например, свободную программу Bind, предоставляющую службу DNS. Многие +организации, особенно предоставляющие услуги через Internet, используют +свободный web-сервер Apache, от работы которого непосредственно зависит их +прибыль, не говоря уже о серверах на платформе Linux. Выгода использования +свободного ПО очевидна: за него не приходится платить, а если приходится — оно +стоит гораздо дешевле патентованных аналогов. Главный недостаток с точки зрения +коммерческого пользователя: разработчики свободных программ не несут никаких +обязательств по качеству программы, кроме моральных. Поэтому сегодня большие +корпорации, например, Intel или IBM, находят необходимым поддерживать проекты +по разработке свободного ПО, оплачивая сотрудников, которые работают в рамках +этих проектов. + +=== История Linux === + +[float] +==== GNU без Linux ==== + +К 1990 году в рамках проекта GNU были разработаны и постоянно развивались +свободные программы, составляющие основной инструментарий для разработки +программ на языке Си: текстовый редактор Emacs, компилятор языка Си gcc, +отладчик программ gdb, командная оболочка bash, библиотека важнейших функций +для программ на Си libc. Все эти программы были написаны для операционных +систем, похожих на UNIX. Это означает, что в них использовался стандартный для +UNIX механизм запроса ресурсов компьютера, необходимых программе — системные +вызовы, которые исполняются ядром операционной системы. При помощи системных +вызовов программы получают доступ к оперативной памяти, файловой системе, +устройствам ввода и вывода. Благодаря тому, что системные вызовы выглядели +более-менее стандартно во всех реализациях UNIX, программы GNU могли работать +(с минимальными изменениями или вообще без изменений) в любой UNIX-подобной +операционной системе. + +С помощью имевшихся инструментов GNU можно было бы писать программы на Си, +пользуясь только свободными программными продуктами, однако свободного +UNIX-совместимого ядра, на основе которого могли бы работать все эти +инструменты, не существовало. В такой ситуации разработчики GNU вынуждены были +использовать одну из патентованных реализаций UNIX, т. е. вынуждены были +следовать принятым в этих операционных системах архитектурным решениям и +технологиям и основывать на них свои собственные разработки. Идеал Столлмана о +научной разработке ПО, свободной от решений, движимых коммерческими целями, был +недоступен, пока в основе свободной разработки лежало патентованное +UNIX-совместимое ядро, исходные тексты которого оставались тайной для +разработчиков. + +[float] +==== Linux — ядро ==== + +В 1991 году Линус Торвальдс, финский студент, чрезвычайно увлёкся идеей +написать совместимое с UNIX ядро операционной системы для своего персонального +компьютера с процессором ставшей очень широко распространённой архитектуры +Intel 80386. Прототипом для будущего ядра стала операционная система MINIX: +совместимая с UNIX операционная система для персональных компьютеров, которая +загружалась с дискет и умещалась в очень ограниченной в те времена памяти +персонального компьютера. MINIX был создан Энди Танненбаумом в качестве учебной +операционной системы, демонстрирующей архитектуру и возможности UNIX, но +непригодной для полноценной работы с точки зрения программиста. Так же, MINIX +можно было использовать только в некоммерческих целях. Именно полноценное ядро +для своего ПК и хотел сделать Линус Торвальдс. Название для своего ядра он +соорудил из собственного имени, заменив последнюю букву и сделав его похожим на +анаграмму слова UNIX. + +Совместимость с UNIX в этот момент означала, что операционная система должна +поддерживать стандарт POSIX. POSIX — это функциональная модель совместимой с +UNIX операционной системы, в которой описано, как должна вести себя система в +той или иной ситуации, но не приводится никаких указаний, как это следует +реализовать программными средствами. POSIX описывал те свойства +UNIX-совместимых систем, которые были общими для разных реализаций UNIX на +момент создания этого стандарта. В частности, в POSIX описаны системные вызовы, +которые должна обрабатывать операционная система, совместимая с этим +стандартом. + +Важнейшую роль в развитии Linux сыграли глобальные компьютерные сети Usenet и +Internet. На самых ранних стадиях он обсуждал свою работу и возникающие +трудности с другими разработчиками в телеконференции comp.os.minix в сети +Usenet, посвящённой операционной системе MINIX. Ключевым решением Линуса стала +публикация исходных текстов ещё малоработоспособной первой версии ядра под +свободной лицензией GPL. Благодаря этому и получавшей всё большее +распространение сети Internet очень многие получили возможность самостоятельно +компилировать и тестировать это ядро, участвовать в обсуждении и исправлении +ошибок, и присылать исправления и дополнения к исходным текстам Линуса. Теперь +над ядром работал уже не один человек, разработка пошла быстрее и эффективнее. + +В 1992 году версия ядра Linux достигла 0.95, а в 1994 году вышла версия 1.0, +что свидетельствует о том, что разработчики наконец сочли, что ядро в целом +закончено и все ошибки (теоретически) исправлены. В настоящее время разработка +ядра Linux — дело уже гораздо большего сообщества, чем во времена до версии +0.1, изменилась и роль самого Линуса Торвальдса, который теперь не главный +разработчик, но главный авторитет, который традиционно оценивает исходные +тексты, которые должны быть включены в ядро и даёт своё добро на их включение. +Тем не менее, общая модель свободной разработки сообществом сохраняется. В +настоящее время параллельно всегда разрабатывается два варианта ядра. +Стабильная версия, считающаяся достаточно надёжной и пригодной для +пользователей, её номер заканчивается на чётное число, например, “2.4”. Номер +соответствующей экспериментальной версии ядра оканчивается на нечётное число — +“2.5”. Экспериментальная версия адресована в первую очередь разработчикам ядра, +тестирующим новые возможности. + +[float] +==== GNU и Linux ==== + +Однако как нельзя сделать операционную систему без ядра, так и ядро будет +бесполезно без утилит, которые использовали бы его возможности. Благодаря +проекту GNU Линус Торвальдс сразу имел возможность использовать в Linux +свободные утилиты: bash, компилятор gcc, tar, gzip и многие другие уже +известные и широко используемые приложения, которые могли работать с его +UNIX-совместимым ядром. Так Linux сразу попал в хорошее окружение и в сочетании +с утилитами GNU представлял собой очень интересную среду для разработчиков +программного обеспечения даже на самой ранней стадии своего развития. + +Принципиальным шагом вперёд было именно то, что из ядра Linux и утилит и +приложений GNU впервые стало возможно сделать полностью свободную операционную +систему, т. е. работать с компьютером и, более того, разрабатывать новое +программное обеспечение, пользуясь только свободным программным обеспечением. +Идеал полностью некоммерческой разработки Столлмана теперь мог быть реализован +в жизни. + +Однако появление теоретической возможности воплощения идеала не означало его +немедленной практической реализации. Совместимость Linux и утилит GNU была +обусловлена тем, что и то, и другое писалось с ориентацией на одни и те же +стандарты и практику. Однако, в рамках этой практики (множество различных +UNIX-систем) оставался большой простор для несовместимости и различных решений. +Поэтому на начальном этапе разработки ядра каждое заработавшее под Linux +приложение GNU было для Линуса очередным достижением: первыми стали bash и gcc. +Таким образом, сочетание GNU и Linux было возможностью создать свободную +операционную систему, но само по себе ещё не составляло такой системы, потому +что Linux и различные утилиты GNU оставались разрозненными программными +продуктами, которые писали разные люди, не всегда принимая в расчёт то, что +делают другие. Основное же качество системы — согласованность её компонентов. + +[float] +==== Возникновение дистрибутивов ==== + +После определённого периода разработки под Linux уже стабильно работал ряд +важнейших утилит GNU. Скомпилированное ядро Linux с небольшим комплектом +скомпилированных уже в Linux утилит GNU составляло набор инструментов для +разработчика программного обеспечения, желающего использовать свободную +операционную систему на своём персональном компьютере. В таком виде Linux уже +не только годился для разработки Linux, но и представлял собой операционную +систему, в которой можно было уже выполнять какие-то прикладные задачи. +Конечно, первое, чем можно было заниматься в Linux — писать программы на Си. + +Первоначально, чтобы получить компьютер с работающей системой Linux, +разработчики пользовались специальными комплектами дискет со скомпилированным +ядром Linux и утилитами: с этих дискет можно было загрузить Linux и работать в +нём. Однако это не слишком удобно, когда нужно работать в Linux постоянно, да и +объём дискет накладывал очень сильные ограничения на дальнейшее расширение +системы и включение новых утилит. + +Когда задача получить компьютер с постоянно работающей на нём системой Linux +стала востребованной и довольно распространённой, разработчики в хельсинкском и +техасском университетах создают собственные наборы дискет, с которых +скомпилированное ядро и основные утилиты можно записать на жёсткий диск, после +чего загружать операционную систему прямо с него. Эти наборы дискет — первые +прототипы современных дистрибутивов Linux — комплекты программного обеспечения, +на основе которых можно получить работающую операционную систему на своём +компьютере. Нужно отметить, что в дистрибутив Linux с самого начала входили +программные продукты GNU. На самом деле, всякий раз, когда говорится +«операционная система Linux», подразумевается «ядро Linux и утилиты GNU». Фонд +свободного ПО даже рекомендует называть это операционной системой GNU/Linux. + +Однако скопировать все нужные программы на жёсткий диск ещё недостаточно, чтобы +получить подходящую для нужд пользователя операционную среду (пусть даже это +очень профессиональный пользователь). Поэтому первые наборы дискет можно только +условно назвать дистрибутивами. Чтобы получить работающую операционную систему, +требуются какие-то специальные средства установки и настройки программного +обеспечения. Именно наличие таких средств и отличает современные дистрибутивы +Linux. Другое важнейшая задача дистрибутива — регулярное обновление. +Программное обеспечение, особенно свободное, — одна из самых быстро +развивающихся областей, поэтому мало один раз установить Linux, нужно ещё +регулярно его обновлять. Первым дистрибутивом в современном понимании, +получившим широкое распространение, стал Slackware, созданный Патриком +Фолькердингом (кстати, этот дистрибутив сохранился и до наших дней). Он был +широко известен пользователям Linux уже к 1994 году. + +Несмотря на то, что с появлением первых дистрибутивов установка Linux уже не +требует самостоятельной компиляции всех программ из исходных текстов, +использование Linux оставалось уделом разработчиков: пользователь этой +операционной системы в тот период её развития мог заниматься почти +исключительно программированием. По крайней мере, чтобы решать в ней другие +повседневные прикладные задачи (например, чтение электронной почты, написание +статей и т. п.), он должен был сначала некоторое время позаниматься +программированием и даже разработкой самой системы Linux, чтобы создать для +себя соответствующие прикладные программы или заставить их работать в Linux. + +Однако разработчики — тоже люди, которые пишут и электронные письма, и статьи, +и даже рисуют картинки. Всё программное обеспечение для Linux было открытым, +поэтому вскоре стало появляться всё больше прикладных программ для Linux, +которые использовались всё большим сообществом, отчего становились надёжнее и +получали всё новую функциональность. В конце концов возникает идея, что из +Linux и GNU-приложений для Linux целенаправленными усилиями небольшой группы +разработчиков можно делать целостные операционные системы, подходящие для очень +широкого круга пользователей и продавать эти системы пользователям за деньги +как аналог и альтернативу существующим патентованным операционным системам. + +Выгода операционной системы, целиком состоящей из свободного программного +обеспечения, очевидна — собирающие эту систему не должны никому платить за +входящие в неё программы. Более того, дальнейшая разработка и обновление +имеющихся программ ведётся сообществом разработчиков также совершенно +бесплатно, не нужно платить сотрудникам, которые занимались бы этим. В итоге +затраты фирмы, собирающей дистрибутив Linux для пользователя, ограничиваются +оплатой программистов, интегрирующих разрозненные приложения в систему и +пишущих программы для стандартизации процедур установки и настройки системы, +чтобы облегчить эти задачи неподготовленному пользователю, а также затратами на +само издание получившегося дистрибутива. Для конечного покупателя это означает +принципиальное снижение цены на операционную систему. + +Первой успешной компанией, работающей по такой схеме, стала RedHat, появившаяся +в 1995 году. RedHat адресовала свои разработки не только программистам +профессионалам, но и обыкновенным пользователям и системным администраторам, +для которых компьютер — в первую очередь офисное рабочее место или рабочий +сервер. Ориентируясь на уже существующие на рынке предложения для такого класса +пользователей, RedHat всегда уделял большое внимание разработке приложений с +графическим интерфейсом для выполнения типичных задач по настройке и +администрированию системы. Бизнес RedHat развивался довольно успешно, в 1999 +году эта компания акционировалась — сразу после выпуска акции росли в цене +очень энергично, однако потом ажиотаж улёгся. В настоящее время доля RedHat на +рынке серверов и рабочих станций Linux очень велика. Благодаря RedHat в +сообществе пользователей Linux очень широкое распространение получил формат +пакетов RPM. + +Практически одновременно с RedHat появился проект Debian. Его задача была +примерно той же — сделать целостный дистрибутив Linux и свободного программного +обеспечения GNU, однако этот проект был задуман как принципиально +некоммерческий, проводимый в жизнь сообществом разработчиков, нормы +взаимодействия в котором полностью соответствовали бы идеалам свободного ПО. +Сообщество разработчиков Debian — международное, участники которого +взаимодействуют через Internet, а нормы взаимодействия между ними определяются +специальными документами — полиси (policy). + +[NOTE] +Официальное название дистрибутива — Debian GNU/Linux. + +Сообщество разработчиков не извлекает никакой прибыли от продажи Debian, его +версии распространяются свободно, доступны в Интернет, могут распространяться и +на твёрдых носителях (CD, DVD), но и в этом случае их цена редко сильно +превышает стоимость носителя и наценку, окупающую затраты на издание. +Первоначально разработка Debian спонсировалась Фондом свободного программного +обеспечения. Адресатами дистрибутивов Debian всегда в первую очередь были +профессиональные пользователи, так или иначе связанные с академической +разработкой программного обеспечения, которые готовы читать документацию и +собственными руками организовать нужный профиль системы, соответствующий именно +их задачам. Ориентация на такую аудиторию предопределила некоторые тенденции +развития Debian: в нём никогда не было обилия «простых» графических средств +настройки среды, всевозможных мастеров, однако всегда уделялось много внимания +средствам последовательной и единообразной интеграции программного обеспечения +в единую систему. Именно в Debian появился менеджер пакетов (APT). В настоящее +время Debian — самый популярный дистрибутив Linux среди пользователей, +являющихся профессионалами в области информационных технологий. + +Всякий раз, когда свободное программное обеспечение оказывается востребованным, +немедленно возникает множество альтернативных решений — так произошло и с +дистрибутивами Linux. После 1995 года возникло (и продолжает возникать) +огромное количество коммерческих компаний и свободных сообществ, которые ставят +своей задачей подготовку и выпуск дистрибутивов Linux. У каждого из них — свои +особенности, своя целевая аудитория, свои приоритеты. К настоящему времени на +рынке дистрибутивов выделилось несколько лидеров, которые предлагают более или +менее универсальные решения и наиболее широко известны и используются. Помимо +уже названных RedHat и Debian следует назвать в ряду дистрибутивов, +ориентированных на рядового пользователя, немецкий SuSE и французский Mandrake, +среди адресованных специалистам — Gentoo. Но помимо «крупных» игроков на рынке +дистрибутивов есть гораздо большее количество менее распространённых +дистрибутивов. Теперь перед пользователем, желающим установить Linux, встаёт +вопрос выбора дистрибутива. Критерии выбора — и задачи, которые предполагается +решать с помощью Linux, и уровень подготовки пользователя, и технологии, и +предстоящие контакты с тем сообществом, которое занимается разработкой +дистрибутива. + +[float] +==== История Linux в России ==== + +Получилось так, что в международном сообществе разработчиков, начинавших и +продолжавших развивать Linux, все в той или иной степени могли объясниться +по-английски. Это и неудивительно, поскольку исторически английский оказался +языком компьютерной науки и операционной системы UNIX, глобальной сети +Internet, программирования. В международном сообществе разработчиков +программного обеспечения английский выполнял и выполняет роль, подобную латыни +в научном сообществе средневековой Европы. Но если Linux предполагается +использовать не только для программирования и общения с программистами, но и +для повседневных задач, необходима локализация — т. е. возможность общаться с +компьютером и при помощи компьютера и на других языках. + +Локализация — комплексный процесс, затрагивающий самые разные стороны системы. +Для полноценной поддержки того или иного языка в системе необходимо обеспечить +возможность ввода на этом языке (поддержка раскладок клавиатуры и кодировок), +вывода (экранных шрифтов), печати, а затем уже необходимо переводить интерфейс +различных приложений на данный язык, разрабатывать средства подготовки +электронных и бумажных публикаций на этом языке и т. д. В этой лекции мы кратко +рассмотрим только историю локализации Linux в России для русского языка, т. е. +русификации Linux. + +Первой компанией, поставившей своей целью выпуск дистрибутивов Linux для +русскоговорящих пользователей, была УрбанСофт, открытая в Петербурге в 1992 +году. Весь её бизнес состоял в выпуске и продаже CD-дисков с дистрибутивами +свободного программного обеспечения. В первую очередь это были дистрибутивы +RedHat, а также Debian, в которые включались разработанные силами УрбанСофт +пакеты для русификации. + +Несколько позже в Москве IPLabs Linux Team выпускает Linux Mandrake Russian +Edition — модифицированный (чтобы соответствовать нуждам русского пользователя) +вариант дистрибутива Mandrake Linux. Впоследствии эта команда начинает +выпускать дистрибутивы, которые отличаются от Mandrake уже не только наличием +пакетов для русификации, но и другими принципиальными возможностями. В конце +концов команда разработчиков создаёт фирму ALT Linux и начинает выпускать +дистрибутивы под маркой ALT Linux. + +Также появляется компания ASPLinux, целью которой является выпуск RedHat с +модификациями для поддержки русского языка, название продукта совпадает с +именем компании. + +Все перечисленные Российские производители дистрибутивов Linux существуют и по +сей день, и продолжают с большей или меньшей активностью выпускать +дистрибутивы. From 5f85c4da40cbf07d47ae115e17dfa2dec9a49685 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Fri, 17 Jan 2014 15:43:18 +0300 Subject: [PATCH 34/53] Add old docs from docs-howto_use_nut-0.1-alt2.noarch.rpm --- old-docs/howto_use_nut.txt | 279 +++++++++++++++++++++++++++++++++++++ 1 file changed, 279 insertions(+) create mode 100644 old-docs/howto_use_nut.txt diff --git a/old-docs/howto_use_nut.txt b/old-docs/howto_use_nut.txt new file mode 100644 index 0000000..3849fb9 --- /dev/null +++ b/old-docs/howto_use_nut.txt @@ -0,0 +1,279 @@ +//// +Пакет: docs-howto_use_nut +RPM файл: docs-howto_use_nut-0.1-alt2.noarch.rpm +Аннотация: Использование nut в AltLinux Мастер 2.4 +Автор: Анатолий Базюкин +Лицензия: FDL +URL: http://heap.altlinux.org/kirill/howto_use_nut/html/Howto_use_UPS_nut.html +//// + +== Как использовать UPS с nut == + +Инструменты nut (Network UPS tools) - это демоны управления и мониторинга UPS, +которые могут быть использованы для различных UPS. Этот документ описывает, как +использовать nut пакет из AltLinux Мастер 2.4 на примере подключения Powerman +BackPro Plus по RS-232 для отдельной машины. + +=== Инсталляция пакета nut === + +В AltLinux M2.4 nut входит как три пакета "nut","nut-server" и "nut-driver". +Необходимо установить все. Их можно инсталлировать с помощью apt-get: + +---- +# apt-get install nut-server +---- + +=== Конфигурирование nut === + +Конфигурационные файлы Nut'а должны находятся в каталоге /etc/nut. При +установке nut этот каталог создается RPM пакетом и там должны находится +следующие файлы:. + +* ups.conf – настройки UPS-специфического драйвера +* upsd.conf - настройки для главного UPS демона +* upsd.users – файл контроля доступа для UPS демона +* upsmon.conf - настройки для UPS демона монитора +* upssched.conf - настройки для upssched демона + +Для запуска сервиса необходимо изменить некоторые установки в этих +конфигурационных файлах. Демон upssched не будет использоваться и upssched.conf +не редактируется. Переходим в каталог /etc/nut и смотрим, что мы имеем: + +---- +# ls -l +drwx--x--- 2 root upsmon certs +lrwxrwxrwx 1 root root cmdvartab -> ../../var/lib/nut/etc/nut/cmdvartab +-rw-r--r-- 1 root root driver.list +-rw-r----- 1 root upsdrv ups.conf +lrwxrwxrwx 1 root root upsd.conf -> ../../var/lib/nut/etc/nut/upsd.conf +lrwxrwxrwx 1 root root upsd.pem -> ../../var/lib/nut/etc/nut/upsd.pem +lrwxrwxrwx 1 root root upsd.users -> ../../var/lib/nut/etc/nut/upsd.users +-rw-r----- 1 root upsmon upsmon.conf +-rw-r----- 1 root upsmon upssched.conf +---- + + - обозначает удаленную незначимую информацию. + +Как видно из вывода часть файлов перенесена в chroot, поэтому смотрим, что +находится в /var/lib/nut/etc/nut/: + +---- +-rw-r----- 1 root upsd cmdvartab +-rw-r----- 1 root upsdrv ups.conf +-rw-r----- 1 root upsd upsd.conf +-rw-r----- 1 root upsd upsd.pem +-rw-r----- 1 root upsd upsd.users +-rw-r----- 1 root upsmon upsmon.conf +---- + +Выявлена проблема наличия двух файлов (upsmon.conf, ups.conf) в двух местах. +Править конфигурационные файлы необходимо в /etc/nut. + +[float] +==== Конфигурирование ups.conf ==== + +Настройки UPS-специфического драйвера должны определятся в ups.conf. Какие +драйверы поддерживают определенные типы UPS описано в файле +/etc/ups/driver-list. Powerman BackPro Plus не имеет собственного драйвера и +поэтому необходимо использовать драйвер genericups с указанием upstype. +Процедура подбора драйвера описана в man genericups. Там же смотрим и параметры +необходимые для настройки драйвера. + +Установки в нашем случае приведены ниже: + +---- +# +# To find out if your driver supports any extra settings, start it with +# with the -h option and/or read the driver's documentation. +[myups] + driver = genericups + port = /dev/ttyS0 + upstype = 4 +---- + +* myups – это произвольное имя UPS. Строка [myups] должна начинаться с + первой колонки! В противном случае драйвер не будет стартовать. +* Port – это com–порт к которому присоединен UPS. +* upstype - тип UPS в данном драйвере. +* Для некоторых UPS необходим параметр cable=. + +Запускаем драйвер для нашего оборудования: + +---- +#/etc/init.d/upsdrv start +---- + +Успешный старт будет выглядеть так: + +---- +Starting UPS drivers: [DONE] +---- + +Отсутствие сообщения говорит об ошибке и необходимо проверить установки в +ups.conf, возможно, нужны дополнительные установки для обнаружения UPS. + +[float] +==== Конфигурирование upsd.conf ==== + +Поскольку мы не будем использовать сетевые возможности, то нет необходимости +изменять upsd.conf. Параметры по умолчанию следующие: + +---- +ACL all 0.0.0.0/0 +ACL localhost 127.0.0.1/32 +ACCEPT localhost +REJECT all +---- + +Запускаем сетевой сервер: + +---- +#/etc/init.d/upsd start +---- + +Успешный старт будет выглядеть так: + +---- +Starting UPS information service: [DONE] +---- + +Если upsd сообщит, что не может связаться с UPS, это означает, что ups.conf +сконфигурирован неверно или выбран неверный драйвер устройства. + +Проверим, что UPS сообщает правильные данные о своем состоянии. + +---- +#upsc myups@localhost ups.status +---- + +Ответ должен быть: + +---- +OL +---- + +OL означает, что UPS работает от сети. Другие сообщения (OB – от батареи или LB +разряженная батарея) говорят о том, что конфигурирование ups.conf неверно. Если +выводится сообщение "access denied" это означает, что неверно сконфигурирован +upsd.conf. Правим файлы и выполняем reload соответствующих демонов. + +Посмотрим, какие данные отслеживаются для UPS выбранным драйвером: + +---- +#upsc myups@localhost +Вывод для genericups будет таким: +driver.name: genericups +driver.parameter.port: /dev/ttyS0 +driver.parameter.upstype: 4 +driver.version: 2.0.0 +driver.version.internal: 1.30 +ups.mfr: Generic +ups.model: Generic RUPS model +ups.status: OL +---- + +[float] +==== Конфигурирование upsd.users ==== + +upsd.users разрешает или запрещает доступ к upsd демону клиентам (upsmon +демону, upsc команде, ...). Необходимо позволить upsmon демону связываться с +upsd. Для этого добавляются 4 строчки: + +---- +# The matching MONITOR line in your upsmon.conf would look like this: +# +# MONITOR myups@myhost 1 monuser pass master (or slave) +[monuser] + password = KJSsaia1 + allowfrom = localhost + upsmon master +---- + +* [monuser] – произвольное название для доступа upsmon демона. + +* password = строка определяющая пароль. Этот пароль не используется + пользователями. Определяется только в конфигурационном файле. + +* allowfrom = строка определяющая ACL имя для разрешения доступа. Здесь + "localhost" не localhost как имя хоста, а ACL имя, определенное в + upsd.conf: ACL localhost 127.0.0.1/32 + +* upsmon master – это upsmon специфическая настройка. Если upsd будет + работать в master-mode (обычно это так) необходимо поставить "master" как + аргумент в этой строчке. + +Перезагрузим upsd: + +---- +#/etc/init.d/upsd reload +---- + +Если нет сообщения [DONE] для старта проверяем конфигурационные файлы. + +[float] +==== Конфигурирование upsmon.conf ==== + +upsmon.conf это установки для upsmon, UPS демона монитора. + +---- +# +# MONITOR myups@bigserver 1 monmaster blah master +# MONITOR su700@server.example.com 1 upsmon secretpass slave +MONITOR myups@localhost 1 monuser KJSsaia1 master +# -------------------------------------------------------------------------- +# MINSUPPLIES +---- + +Необходима только одна MONITOR строчка. Здесь определяется имя UPS ("myups"), +имя хоста на котором upsd выполнятся ("localhost"), название доступа +("monuser"), пароль ("KJSsaia1") и "master" или "slave" (обычно "master"). Эти +установки соответствуют установкам в upsd.users. Число "1" - значение мощности +и устанавливается равной 1. Запускаем монитор: + +---- +#/etc/init.d/upmon start +Starting UPS monotor service: [DONE] +---- + +Отсутствие сообщения говорит об ошибке и необходимо проверить установки в +upsmon.conf. + +[float] +==== Заключительная проверка ==== + +Просматриваем сообщения в syslog : + +---- +# grep ups /var/log/messages +---- + +Сообщения, связанные с UPS должны выглядеть примерно так: + +---- +server genericups[14471]: Startup successful +server upsdrvctl: Network UPS Tools - UPS driver controller 2.0.0 +server upsdrv: Starting UPS drivers: succeeded +server upsd[14504]: Connected to UPS [myups]: genericups-ttyS0 +server upsd: Network UPS Tools upsd 2.0.0 +server upsd: Synchronizing...done +server upsd: Connected to UPS [myups]: genericups-ttyS0 +server upsd: upsd startup succeeded +server upsd[14505]: Startup successful +server upsmon: UPS: myups@localhost (master) (power value 1) +server upsmon: Using power down flag file /etc/killpower +server upsmon: upsmon startup succeeded +server upsmon[14523]: Startup successful +server upsd[14505]: Connection from 127.0.0.1 +server upsd[14505]: Client monuser@127.0.0.1 logged into UPS [myups] +---- + +Любые сообщения об ошибках здесь связаны с ошибками конфигурационных файлов, +которые должны быть исправлены. + +=== Что необходимо дописать === + +* Конфигурирование ups.conf для случая более сложного, чем genericups. + Например, APC. +* Конфигурирование upsd.conf Управление по сети. +* Конфигурирование upssched.conf. +* Сообщения об проблемах с питанием по e-mail и т.д. From 11a35321a1bb714ef67ab88545acf00b9a0928c3 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Fri, 17 Jan 2014 16:44:08 +0300 Subject: [PATCH 35/53] Add old docs from docs-install_ltsp-0.1.4-alt1.noarch.rpm --- old-docs/install_ltsp.txt | 109 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 old-docs/install_ltsp.txt diff --git a/old-docs/install_ltsp.txt b/old-docs/install_ltsp.txt new file mode 100644 index 0000000..16315a6 --- /dev/null +++ b/old-docs/install_ltsp.txt @@ -0,0 +1,109 @@ +//// +Пакет: docs-install_ltsp +RPM файл: docs-install_ltsp-0.1.4-alt1.noarch.rpm +Аннотация: Руководство по установке Linux Terminal Server +Автор: Артём Золочевский +Лицензия: FDL +URL: http://heap.altlinux.org/alt-docs/modules/install_ltsp/ +//// + +== Линукс Терминал == + +[float] +=== Введение === + +Линукс Терминал — это технология организации терминального сервера, +позволяющая: + +* сэкономить средства на обновлении аппаратного обеспечения: теперь + быстродействие зависит от одной несколько более мощной системы, а + «морально устаревшие» компьютеры могут потребовать разве что более + современного монитора и новых клавиатуры с мышью; +* сохранить время и спокойствие при резервном копировании: теперь данные + пользователей собраны на одной системе (обычно с «зеркалом» из двух + дисков) и производить резервное копирование совсем не трудно; +* гибко распределять рабочие места: теперь можно работать, войдя в систему с + любого терминала; +* не терять время на администрирование нескольких клиентских ПК, а только + одного или нескольких терминальных серверов; +* удобно перейти к использованию Линукс, а следовательно — избавиться от + опасности вирусов. + +=== Установка Линукс Терминал === + +[WARNING] +Заранее ознакомьтесь с указанными ниже особенностями конфигурации сети и +продумайте, как именно будут подключены терминалы. Также рекомендуется +устанавливать терминальный сервер на программный или аппаратный RAID1 для +увеличения производительности работы и надёжности хранения данных всех его +пользователей. + +Процесс установки Линукс Терминал практически не отличается от установки +обычного дистрибутива, например Линукс Юниор. В качестве пользовательского +интерфейса в установленной системе используется графическая среда KDE. + +Не стоит удивляться тому, что в основу терминального сервера положен +дистрибутив, предназначенный для рабочих станций, так как получаемый сервер — +это сервер приложений, большинство из которых предназначено для использования +именно на рабочих станциях. + +Терминальный сервер готов обслуживать «тонкие клиенты» на коммутаторе или +кросс-кабеле, подключённом к сетевому интерфейсу с адресом 192.168.0.1/24, +сразу после установки и загрузки. + +=== Конфигурация сети === + +[float] +==== Физическая ==== + +Для протокола X11 и современых приложений рекомендуется 100Mbps (Fast Ethernet) +сеть на коммутаторах (switch): 10Mbps работает, но с уловимой на глаз +латентностью. При наличии существенного количества клиентов (примерно более +десятка) имеет смысл применение коммутатора с гигабитным портом для сервера +(соответственно с гигабитным вторым интерфейсом); на сегодня это широко +распространённое и недорогое оборудование, минимум один Gigabit Ethernet вы +найдёте встроенным в любую новую материнскую плату, пригодную для создания +терминал-сервера. + +[float] +==== Логическая ==== + +Внимание: предполагается размещение терминалов в сети 192.168.0.0/24. Если на +терминальном сервере имеется два сетевых интерфейса, один из которых подключён +к локальной сети, проще всего подключить терминальную сеть к другому +интерфейсу, назначив ему адрес 192.168.0.1. В программе установки именно этот +адрес по умолчанию и назначается второму интерфейсу (eth1), всё остальное из +необходимого также конфигурируется для использования соответствующей сети +класса C (адрес: 192.168.0.0; маска: 255.255.255.0; бродкаст: 192.168.0.255). + +=== Проблемы и их решения === + +[float] +==== PXE NIC ==== + +Если сетевая карта имеет PXE-стек, который определяется как Intel Boot Agent +4.0.19, его придётся заменить на более старый или более новый. Для набортных +сетевых интерфейсов это, как правило, означает обновление BIOS материнской +платы. + +[float] +==== AMD Geode ==== + +В силу наличия известной проблемы с видеодрайвером xorg-x11-drv-amd в версии +Xorg, входящей в состав данного дистрибутива Линукс, использование таких +терминалов сейчас затруднено. Дополнительная документация + +=== Дополнительная документация === + +Дополнительная документация доступна на сайте freesource.info Здесь можно +узнать подробности об устройстве терминал-сервера, настройке сети, установке +Линукс-Терминал и его тонкой настройке. + +Для ознакомления с различными способами применения терминального сервера, а +также для получения информации о решении типичных проблем (на английском +языке), можно воспользоваться следующими ссылками: + +* http://www.freesource.info/wiki/Dokumentacija/LTSP5 +* http://www.ltsp.org/twiki/bin/view/Ltsp/SuccessStories +* http://www.ltsp.org/twiki/bin/view/Ltsp/TroubleShooting + From 90c1673770f6c38eeea08ebed1c2290f3b69bbb2 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Fri, 17 Jan 2014 16:46:54 +0300 Subject: [PATCH 36/53] Update "old-docs/index.txt": add to build new files. --- old-docs/index.txt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/old-docs/index.txt b/old-docs/index.txt index 30b76aa..bf89513 100644 --- a/old-docs/index.txt +++ b/old-docs/index.txt @@ -7,3 +7,21 @@ include::console_setup.txt[] include::corpnet.txt[] include::dhcp.txt[] + +include::emacs_email.txt[] + +include::emacs_im.txt[] + +include::filesystems_use.txt[] + +include::finding.txt[] + +include::firewall.txt[] + +include::freesoft_history.txt[] + +include::howto_use_nut.txt[] + +include::install_ltsp.txt[] + +//12 From 926d7fc599fa51527142b4bb8694b90f23e7e857 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Mon, 20 Jan 2014 12:38:04 +0300 Subject: [PATCH 37/53] Add old docs from docs-issue-junior_user-0.3-alt1.noarch.rpm --- old-docs/junior_user.txt | 679 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 679 insertions(+) create mode 100644 old-docs/junior_user.txt diff --git a/old-docs/junior_user.txt b/old-docs/junior_user.txt new file mode 100644 index 0000000..78ffda7 --- /dev/null +++ b/old-docs/junior_user.txt @@ -0,0 +1,679 @@ +//// +Пакет: docs-issue-junior_user +RPM файл: docs-issue-junior_user-0.3-alt1.noarch.rpm +Аннотация: Руководство пользователя ALT Linux 4.0 Junior +Автор: Артём Золочевский +Лицензия: FDL +URL: http://heap.altlinux.org/issues/junior_user/index.html +//// + +== Описание некоторых приложений из Школьного Юниора 4.0 == + +=== Cоздания и редактирования Интернет-приложений === + +[float] +==== Редактор Интернет-приложений Bluefish ==== + +Bluefish:: + редактор Интернет-приложений, пригодный для веб-дизайнеров и +программистов. Он поддерживает множество языков программирования и разметки; но +наиболее удобен, в первую очередь, для динамических и интерактивных веб-сайтов. +Bluefish является проектом разработчиков-приверженцев движения Open Source и +распространяется по лицензии GPL. + +Bluefish — настольное, однопользовательское приложение, занимающее на +жестком диске менее 200 мегабайт, базируется на 32-х разрядной вычислительной +архитектуре и поддерживает работу в режиме реальной многозадачности. + +Bluefish обеспечивает средства разработки, необходимые для создания портальных +Интернет-страниц, совместимых с большинством обозревателей, а также +предоставляет возможность для интуитивно понятной разработки веб-узлов. +Предоставляет возможность быстрого форматирования веб-страниц с помощью +инструментов таблиц стилей (CSS), возможность изменять макет и формат +веб-узлов. + +Bluefish обладает полным комплектом средств для создания веб-страниц и +интеграции данных на порталах и набором инструментов для работы с веб-частями +представленных списков, подключаемых веб-частей. + +Bluefish поддерживает режим интерактивного просмотра, при котором результаты +выполнения редактирования или изменений в форматировании документа доступны в +предварительном просмотре. + +Bluefish имеет дружественную пользователю систему представления полной +документации по работе с ней в режиме так называемой «помощи» (Help). + +Редактор Bluefish позволяет редактировать множество файлов одновременно, +использовать большое количество панелей инструментов и функций тонкой настройки +меню. В программу интегрированы инструменты для работы с изображениями и их +миниатюрами, можно открывать документы прямо из Интернета, а также создавать +файлы CSS, сценарии на языках PHP, HTML, Java, С, редактировать XML. +Предусматривается множество электронных помощников и возможность интеграции с +внешними программами для разработки веб-страниц (tidy, weblint, make, javac). + +Установка и обновление Bluefish осуществляется штатными средствами операционной +системы различными способами: с компактного диска формата CD, жесткого диска, в +том числе доступного в качестве разделяемого ресурса, через Интернет и рядом +других способов. + +[float] +==== Редактор Интернет-приложений Quanta Plus ==== + +Quanta Plus:: + настольное, однопользовательское приложение, занимающее на жестком +диске менее 200 мегабайт, базируется на 32-х разрядной вычислительной +архитектуре и поддерживает работу в режиме реальной многозадачности. + +Quanta Plus обеспечивает средства разработки, необходимые для создания +портальных Интернет-страниц, совместимых с большинством обозревателей, а также +предоставляет возможность для интуитивно понятной разработки веб-узлов. +Предоставляет возможность быстрого форматирования веб-страниц с помощью +инструментов таблиц стилей (CSS), возможность изменять макет и формат +веб-узлов. + +Quanta Plus обладает полным комплектом средств для создания веб-страниц и +интеграции данных на порталах и набором инструментов для работы с веб-частями +представленных списков, подключаемых веб-частей. + +Quanta Plus поддерживает режим интерактивного просмотра, при котором результаты +выполнения редактирования или изменений в форматировании документа доступны в +предварительном просмотре. + +Quanta Plus имеет дружественную пользователю систему представления полной +документации по работе с ней в режиме так называемой «помощи» (Help). + +Quanta Plus — главная составляющая пакета KDE kdewebdev (в него входит еще +несколько утилит для веб-мастера). Этот HTML-редактор обеспечивает стандартные +для программ этого класса возможности набора и редактирования HTML, такие, как +автоматический ввод основных тегов и их атрибутов, подсветка синтаксиса, +предварительный просмотр веб-страниц и пр. Достоинство Quanta Plus — развитые +средства обработки текста, в том числе поиск и замена (в том числе с +использованием регулярных выражений), а также проверка орфографии. Есть в этом +редакторе и специфические функции. Это развитые средства управления проектами и +(что самое главное) визуальный редактор, позволяющий выполнять разметку HTML +методами, привычными по работе с текстовыми процессорами. Кроме того, в +программу интегрирован файловый менеджер, который представляет собой +облегченный вариант файлового менеджера для KDE Konqueror. Для профессиональных +веб-мастеров функции Quanta Plus будут вполне достаточными: программа умеет +работать с языком разметки XML, стилевыми таблицами (CSS), сценариями PHP и +др., без чего представить хорошо сделанный сайт сложно. + +Установка и обновление Quanta Plus, как и Bluefish, осуществляется штатными +средствами операционной системы различными способами: с компактного диска +формата CD, жесткого диска, в том числе доступного в качестве разделяемого +ресурса, через Интернет и рядом других способов. + +=== Работа с электронной почтой === + +[float] +==== Почтовый клиент Claws-Mail ==== + +Claws Mail:: + легкая, быстрая программа для управления электронной почтой и чтения +новостных лент, написанная с использованием свободно распространяемой +графической библиотеки GTK+. Поддерживает протоколы POP3, APOP, IMAP, SMTP, +SMTP AUTH, NNTP, LDAP, использование нескольких учётных записей, проверку +языка, адресную книгу, SSL, GPG, фильтры, i18n и многое другое. Функционал +может расширяться с помощью внешних модулей. + +Claws Mail — настольное, однопользовательское приложение, занимающее на жестком +диске менее 3000 Мб (включая стандартный набор модулей расширения), основано на +32-х разрядной вычислительной архитектуре, поддерживает работу в режиме +реальной многозадачности. + +Claws Mail позволяет расставлять сообщения по приоритетам, создавать отдельные +папки для разных видов сообщений и осуществлять поиск по всем документам. + +Claws Mail предоставляет удобные средства редактирования текста, средства +проверки правописания, обеспечивает защиту от нежелательной почты. Программа +позволяет сохранять созданные документы в текстовых форматах, поддерживаемых +другими настольными приложениями. + +Claws Mail обеспечивает добавление цифровой подписи в документ и гарантирует +его подлинность, целостность и определенность происхождения. + +Claws Mail позволяет организовывать показ сообщений по обсуждениям и +предоставляет возможности дальнейшего расширения программы при помощи +подключаемых модулей. + +[float] +==== Почтовый клиент Mozilla Thunderbird ==== + +Mozilla Thunderbird:: +программа для работы с электронной почтой и группами новостей. Является +составной частью проекта Mozilla. Поддерживает протоколы: SMTP, POP3, IMAP, +NNTP, RSS. Thunderbird работает в Microsoft Windows, Mac OS X и GNU/Linux, +причём набор возможностей на всех платформах одинаков. + +Mozilla Thunderbird — настольное, однопользовательское приложение занимающее на +жестком диске менее 3000 Мб, основан на 32-х разрядной вычислительной +архитектуре, поддерживает работу в режиме реальной многозадачности. + +Mozilla Thunderbird позволяет расставлять сообщения по приоритетам, создавать +отдельные папки для разных видов сообщений и осуществлять поиск по всем +документам. + +Mozilla Thunderbird предоставляет удобные средства редактирования текста, +средства проверки правописания, обеспечивает защиту от нежелательной почты. +Программа позволяет сохранять созданные документы в текстовых форматах, +поддерживаемых другими настольными приложениями. + +Mozilla Thunderbird обеспечивает добавление цифровой подписи в документ и +гарантирует его подлинность, целостность и определенность происхождения. + +Mozilla Thunderbird позволяет организовывать показ сообщений по обсуждениям и +предоставляет возможности дальнейшего расширения программы при помощи +подключаемых модулей. + +Как и OpenOffice.org, Mozilla Thunderbird является многоплатформенным проектом, +и успешно запускается на ряде операционных систем, в частности GNU/Linux, +Windows, MacOS X. + +=== Программирование === + +[float] +==== Интегрированная среда разработки KDevelop ==== + +KDevelop:: +это интегрированная среда разработки (Integrated Development Environment – +IDE), инструмент написания приложений широкого круга применения. + +KDevelop представляет собой современную платформу для разработки программного +обеспечения с возможностью использования небольших независимых модулей для +расширения базовой функциональности среды. KDevelop не зависит от языка +программирования и не зависит от платформы, на которой он запускается, +поддерживая создание приложений KDE, GNOME, Qt, GTK+, wxWidgets, баз данных SQL +и консольных приложений). В поставку KDevelop входят десятки типовых проектов +для различных сред и платформ. + +KDevelop поддерживает большое количество языков программирования, включая C, +C\++, Perl, Python, PHP, Java, Fortran, Ruby, Ada, Pascal, SQL и Bash. +Поддерживаются такие системы сборки проектов, как GNU (automake), qmake и make +для собственных средств сборки проектов. + +KDevelop — однопользовательское средство разработки, занимающее на жестком +диске не более 1 Гб. + +KDevelop обеспечивает поддержку структурированного программирования, выделение +описания процедур и функций, строгую типизацию, поддержку +объектно-ориентированного программирования и проектирования. + +KDevelop имеет подсветку синтаксиса, встроенный отладчик, подсвечивает +ошибочный код, показывает сигнатуры функций и процедур, обеспечивает навигацию +по исходному коду с системой гиперссылок, поддержку рефакторинга, проектов и +групп проектов. Среда разработки может использовать любой компилятор командной +строки. Встроенный отладчик позволяет работать графически со всеми предствами +отладки, такими как точки останова и трассировки. Он так же может работать с +динамически подгружаемыми плагинами, в отличии от консольного gdb. + +KDevelop имеет редактор визуальных интерфейсов для создания приложений для +оконной среды Linux с использованием компонентной идеологии и WYSIWIG подхода, +также обеспечивается взаимная динамическая синхронизация визуального +представления приложения и его исходного кода. + +KDevelop имеет в своём составе библиотеку визуальных компонентов, а также +возможность подключать и использовать компоненты сторонних производителей, как +в исходных кодах, так и в скомпилированном виде. Среда позволяет разрабатывать +расширения и компоненты с использованием как собственных, так и сторонних +языковых средств. + +KDevelop обеспечивает возможность соединения и работы с реляционными базами +данных, включает в себя встроенный менеджер баз данных для администрирования и +разработки баз данных, включая выполнение запросов SQL. + +Все основные операции в KDevelop сопровождаются электронными помощниками для +облегчения создания приложений. Функция завершения кода (code completion) + +доступна для языков C и C++. Quick Open позволяет быстро перемещаться по +файлам. Также реализовано сворачивание блоков кода (folding). + +Система помощи KDevelop покрывает все аспекты языка и среды, с выделением +разделов быстрой помощи и подробных справочных материалов. + +[float] +==== Интегрированная среда для разработки на языке Object Pascal -- Lazarus ==== + +Lazarus:: +интегрированная среда для разработки на языке Object Pascal (компилятор Free +Pascal Compiler). + +Lazarus — однопользовательское средство разработки на языках Pascal и Object +Pascal, обеспечивающее поддержку структурированного программирования, выделение +описания процедур и функций, строгую типизацию, поддержку +объектно-ориентированного программирования и проектирования. + +Интегрированная среда Lazarus имеет подсветку синтаксиса, может использовать +встроенный или подключаемый отладчик, подсвечивает ошибочный код, показывает +сигнатуры функций и процедур, обеспечивает навигацию по исходному коду с +системой гиперссылок, имеет поддержку рефакторинга, проектов и групп проектов. +Также имеется компилятор командной строки. + +Интегрированная среда Lazarus имеет редактор визуальных интерфейсов для +создания приложений для графической среды Linux с использованием компонентной +идеологии и WYSIWIG подхода, обеспечивает взаимную динамическую синхронизацию +визуального представления приложения и его исходного кода. + +Интегрированная среда Lazarus имеет в своем составе библиотеку визуальных +компонентов Lazarus Component Library (LCL), а также возможность подключать и +использовать компоненты сторонних производителей, как в исходных кодах, так и в +скомпилированном виде. Среда позволяет разрабатывать расширения и компоненты с +использованием как собственных, так и сторонних языковых средств. + +Интегрированная среда Lazarus обеспечивает возможность соединения и работы с +реляционными базами данных, включает в себя встроенный менеджер баз данных для +администрирования и разработки баз данных, включая выполнение SQL-запросов. + +Интегрированная среда Lazarus имеет возможность включать в исходный код участки +на ассемблере. + +В Lazarus все основные операции сопровождаются электронными помощниками. + +Интегрированная среда Lazarus, имея собственный менеджер и формат проектов, +также поддерживает преобразование проектов Delphi. + +Интегрированная среда Lazarus работает в различных операционных системах +включая: GNU/Linux, Microsoft Windows, MacOS X и FreeBSD. + +Компиляция программ на Pascal в среде Lazarus обеспечивается Free Pascal +Compiler (FPC) Компилятор совместим с Borland Pascal 7 и Object Pascal – +Delphi, но при этом обладает рядом дополнительных возможностей, например, +поддерживает перегрузку операторов. FPC — кроссплатформенный инструмент, +поддерживающий огромное количество платформ. Среди них — AmigaOS, DOS, Linux, +*BSD, OS/2, MacOS(X) и Win32. + +Однако FPC — это не просто компилятор. Он имеет в своем составе великолепный +набор библиотек, одной из которых является FCL, включающая в себя компоненты, +совместимые с невизуальными компонентами VCL из Borland Delphi. Разработка +удобных в повторном использовании визуальных компонент является одной из целей +проекта Lazarus. + +[float] +==== Образовательная среда программирования -- KTurtle ==== + +KTurtle:: +(K от KDE; Turtle, англ. — черепашка) — образовательная среда программирования, +входящая в пакет образовательных программ KDE Edutainment Project. +Распространяется на условиях GNU General Public License. + +KTurtle предлагает простой способ изучения программирования, предназначенный +для детей. Язык программирования, использующийся в KTurtle, базируется на языке +высокого уровня Logo, и может использовать русские ключевые слова при написании +кода. + +KTurtle — однопользовательское средство разработки пригодное для обучению +основным понятиям программирования детей в возрасте от 7 лет, занимающее на +жестком диске менее 500 Мб. + +Графическая среда программы KTurtle позволяет наглядно обучать детей основным +конструкциям программирования, расширять набор команд за счёт создания +процедур, а наглядное воспроизведение работы программы обеспечивает присутствие +игрового момента. + +Наличие большого количества примеров кода на русском и английском языках, +руководства по установке и запуску а также описания встроенного языка +программирования на русском языке в электронном виде, обеспечивает методическую +помощь учителю. Система помощи покрывает все аспекты языка и среды. + +[float] +==== Интегрированная среда разработки -- Eclipse ==== + +Eclipse:: +свободное средство разработки для создания приложений, веб-приложений, программ +для мобильных устройств. + +Eclipse, в первую очередь, полноценная Java IDE, нацеленная на групповую +разработку, снабженная средствами для работы с системами контроля версий +(поддержка CVS входит в поставку Eclipse, активно развиваются несколько +вариантов модулей работы с SVN, существует поддержка VSS и других). Во многих +крупных организациях Eclipse — корпоративный стандарт для разработки +приложений. + +Второе назначение Eclipse — служить платформой для разработки новых расширений +(чем и завоевал популярность этот продукт: любой разработчик может расширить +возможности Eclipse своими модулями). Такими расширениями стали: C/C++ +Development Tools (CDT), разрабатываемые инженерами QNX совместно с IBM, +средства для разработки на COBOL, FORTRAN, PHP . Множество расширений дополняет +Eclipse средствами для работы с базами данных, серверами приложений и другие. + +Eclipse написана на Java, поэтому является платформо-независимым продуктом, за +исключением библиотеки SWT, которая разрабатывается для всех распространенных +платформ. Библиотека SWT используется вместо Swing и полностью зависит от +платформы выполнения (операционной системы), что обеспечивает быстроту и +натуральный внешний вид пользовательского интерфейса. + +Eclipse обеспечивает поддержку структурированного программирования, выделение +описания процедур и функций, строгую типизацию, поддержку +объектно-ориентированного программирования и проектирования. + +Редактор в Eclipse имеет подсветку синтаксиса. Платформа может использовать как +встроенный так и подключаемый отладчик, подсвечивать ошибочный код, показывать +сигнатуры функций и процедур, обеспечивать навигацию по исходному коду с +системой гиперссылок, поддержиевает рефакторинг, проектов и групп проектов. +Eclipse использует компилятор командной строки, устанавливающийся вместе с этой +платформой. + +*Архитектура:* + +Основой Eclipse является платформа расширенного клиента (RCP — от англ. rich +client platform). Ее составляют следующие компоненты: + +* Ядро платформы (загрузка Eclipse, запуск модулей); +* OSGi (стандартная среда поставки комплектов); +* SWT (портируемый инструментарий графических элементов); +* JFace (файловые буферы, работа с текстом, текстовые редакторы); +* Рабочая среда Eclipse (панели, редакторы, проекции, электронные помощники). + +Пользовательский интерфейс Eclipse пользуется промежуточным слоем графического +интерфейса, называемым JFace, который упрощает построение пользовательского +интерфейса, базирующегося на SWT. + +Гибкость Eclipse обеспечивается за счет подключаемых модулей, благодаря чему +возможна разработка не только на Java, но и на других языках, таких как C/C++, +Perl, Ruby, Python, PHP, ErLang и прочих языков. + +*Локализация* + +Существует языковой пакет для русификации Eclipse. Переведены на русский язык +как графический интерфейс, так и документация. + +*Возможности среды разработки (IDE)* + +_Помощник создания кода_ — выдает подсказки по коду (имеющимся переменным и +функциям), синтаксису, возможному завершению введенной строки и т.п. + +_Шаблоны_ — стенографический ввод текста, например после ввода слова for редактор +выдаст возможные варианты (шаблоны) этой конструкции — остается только выбрать +нужный. + +_Автоматический ввод_ — например, автоматический ввод закрывающей скобки, +кавычки при вводе открывающей и т.п. + +_Рефакторинг_ — преобразование исходного кода без изменения его +функциональности. Обычно используется при переименовании переменной, класса или +метода — Еclipse автоматически вносит необходимые изменения во все файлы +проекта. Кроме того, рефакторинг помогает при переносе класса из одного проекта +в другой — достаточно просто его переместить, и среда позаботится о том, чтобы +это было корректно. Eclipse поддерживает более десятка разновидностей +рефакторинга. + +_Гиперссылки_ — просмотр текста программы в режиме веб-сайта для того, чтобы, к +примеру, от переменной или вызова функции перейти к ее определению и т.п. + +_Быстрое исправление_ — синтаксическая ошибка отмечается сразу же в процессе +написания кода, при этом среда предлагает варианты исправления. + +_Поиск_ — множество вариантов поиска как в пределах одного файла, так и по +всему проекту (проектам) или множеству файлов. Как пример, языковый поиск +различает одноименные переменную, метод, или даже методы, отличающиеся набором +полей. + +_Альбомные_ страницы — способ написания и тестирования отрывков кода. + +_Набор экранов_ — создается набор специальным образом расположенных окон и +панелей меню под различные задачи: написание кода, отладка и т.п.. + +_Система помощи_ покрывает все аспекты языка и среды, с выделением разделов +быстрой помощи и подробных справочных материалов как по самой среде, так и по +подключенным к среде расширениям с возможностью поиска. + +=== Аналитические вычисления === + +[float] +==== Компьютерная алгебра -- Maxima ==== + +Maxima:: +свободная система компьютерной алгебры, написана на языке Lisp. + +Maxima имеет широчайший набор средств для проведения аналитических вычислений, +численных вычислений и построения графиков. По набору возможностей система +близка к таким коммерческим системам как Maple и Mathematica. В то же время она +обладает высочайшей степенью переносимости. Это единственная из существующих +систем аналитических вычислений, которая может работать на всех основных +современных операционных системах на компьютерах, начиная от самых мощных +вплоть до наладонных компьютеров. + +Имеет несколько графических интерфейсов пользователя: XMaxima (включен в +поставку во многих ОС), wxMaxima и т. д. Может работать в режиме командной +строки (используя псевдографику для отображения метематических записей и +графиков). + +Maxima предназначена для того, чтобы преобразовывать алгебраические выражения: +упрощать, приводить подобные, раскрывать скобки или, наоборот, группировать +подобные члены, вычислять производные, пределы и интегралы, решать системы +алгебраических и дифференциальных уравнений, производить вычисления с +матрицами, упрощать и преобразовывать тригонометрические выражения, производить +численные вычисления с любой заданной точностью. + +Maxima имеет средства для построения 2D и 3D графиков функций, возможность +пакетной обработки файлов сценариев без наличия графического интерфейса. + +Maxima совместно с графической оболочкой wxMaxima позволяет записывать формулы +в режиме WYSIWYG, подготавливать и исполнять сценарии на языке среды с +автоматической проверкой синтаксиса. + +Справочное руководство Maxima описывает все встроенные функции системы. +Руководство интегрировано в программу в виде справочника, оснащённого +средствами поиска. + +Обновление программы производится штатными средствами ОС. + +[float] +==== Численные и технические вычисления -- Scilab ==== + +Scilab:: +программа для решения задач численных и технических вычислений, являющаяся +аналогом программ, входящих в MatLab, и имеющая схожий с ним язык +программирования (в составе имеется утилита, позволяющая конвертировать +документы из MatLab в Scilab). Программа доступна для различных операционных +систем, включая Microsoft Windows и Linux. Имеется возможность расширения +возможностей программы внешними программами и модулями, написанными на разных +языках программирования. + +Scilab позволяет работать с элементарными и большим числом специальных функций +(Бесслея, Неймана, интегральные функции), имеет мощные средства работы с +матрицами, полиномами (в том числе и символьно), производить численные +вычисления (например численное интегрирование) и решение задач линейной +алгебры, оптимизации и симуляции, мощные статистические функции, а также +средство для построения и работы с графиками. В состав пакета также входит +Scicos — инструмент для редактирования блочных диаграмм и симуляции (аналог +simulink в пакете MatLab). Имеется возможность совместной работы Scilab с +программой LabVIEW. + +В Scilab имеется возможность пакетной обработки файлов сценариев без наличия +графического интерфейса, а наличие встроенного редактора, позволяет +подготавливать и исполнять сценарии на языке среды, с автоматической проверкой +синтаксиса. + +В Scilab система помощи покрывает все аспекты языка и среды, также имеются +справочные материалы по используемым функциям. + +=== Обработки и монтаж аудио-записей === + +[float] +==== Редактор звуковых файлов -- Audacity ==== + +Audacity:: +бесплатный, кросс-платформенный редактор звуковых файлов. Программа выпущена и +распространяется на условиях GNU GPL. Графический интерфейс сделан с помощью +библиотеки wxWidgets. Работает под GNU/Linux, Mac OS X, Microsoft Windows и +другими операционными системами. + +Audacity — однопользовательское, прикладное ПО, занимающее не более 1 GB +свободного пространства на жестком диске. + +Далее описываются возможности Audacity. + +*Запись* + +Audacity может записывать звук извне с микрофона, встроенного в ОС микшера или +канала Line In, к которому можно подключить кассетный магнитофон, проигрыватель +грампластинок или минидисков. При использовании некоторых звуковых карт можно +записывать и потоковый звук. Доступны: + +* Запись с микрофона, линейного входа или других источников; +* Запись с одновременным прослушиванием имеющихся дорожек; +* Запись до 16 каналов одновременно (необходима многоканальная звуковая карта); +* Индикаторы громкости до, во время и после + записи. + +*Импорт и экспорт* + +Вы можете импортировать звуковые файлы в проект Audacity, изменить их, +объединить с другими файлами или новыми записями, экспортировать результат в +файлы нескольких форматов. Поддерживаются: + +* Импорт и экспорт файлов в форматах WAV, AIFF, AU, MP3, FLAC и Ogg Vorbis; +* Импорт звука в MPEG (включая файлы MP2 и MP3) при помощи libmad; +* Создание файлов WAV и AIFF, которые можно записать на звуковой компакт-диск; +* Импорт и экспорт файлов всех форматов, поддерживаемых библиотекой libsndfile; +* Открытие raw-файлов (файлов без заголовков) при помощи команды «Импортировать + raw-файл». + +*Редактирование* + +* Базовые операции вырезания, копирования, вставки и удаления; +* Неограниченная история изменения, по которой можно отменить и повторить + действие; +* Очень быстрое изменение больших файлов; +* Изменение и сведение неограниченного числа дорожек; +* Использование «карандаша» для редактирования отдельных точек сэмплов; +* Плавное изменение громкости при помощи инструмента редактирования огибающей. + +*Эффекты* + +* Изменение темпа с сохранением высоты тона, изменение высоты тона с + сохранением темпа; +* Удаление статического шума, гула, шипения и других постоянных шумовых + дефектовзаписи; +* Воспроизведение множества дорожек одновременно; +* Изменение частотных характеристик при помощи эквалайзера, FFT-фильтра и + эффекта усиления баса; +* Подстройка громкости при помощи компрессора, эффекта усиления и или нормализации; +* Другие встроенные эффекты: +** Эхо +** Фазер +** Wahwah +** Разворот + +*Качество звука* + +* Запись и редактирование 16/24/32-битных (32бит — с плавающей точкой) звуковых + данных в файлы разных форматов. +* Частота дискретизации до 96 кГц; +* Преобразования частот дискретизации и битовой глубины производятся с + использованием качественных алгоритмов ресэмплинга и дитеринга; +* Сведение дорожек с разными качественными характеристиками с автоматическим + преобразованием до характеристик проекта в режиме реального времени. + +*Дополнительные модули (Plug-Ins):* + +* Модули системы обработки звука LADSPA; Audacity включает несколько + LADSPA-модулей; +* Использование VST-модулей под Windows и Mac при помощи скачиваемого отдельно + модуля VST Enabler; +* Создание своих эффектов на простом встроенном языке Nyquist. + +*Анализ* + +* Спектрографический режим отображения дорожек; +* Команда «Нарисовать график спектра» для детального анализа частотных + характеристик. + +=== Cжатие и архивирование файлов === + +[float] +==== Архиватор Xarchiver ==== + +Xarchiver:: +графический пользовательский интерфейс для различных консольных архиваторов в +системах GNU/Linux, работающий под управлением любой графической среды. + +Xarchiver — однопользовательское прикладное ПО, занимающее не более 4 Мбайт +свободного места на жестком диске и базирующаяся на 32-х разрядной +вычислительной архитектуре, поддерживает работу в режиме реальной +многозадачности. + +Xarchiver умеет создавать следующие типы архивов: arj, tar, tar.bz2, tar.gz, +zip, 7z. Для zip и 7z умеет создавать и самораспаковывающиеся архивы. + +Xarchiver умеет распаковывать следующие типы архивов: arj, tar, tar.bz2, +tar.gz, zip, 7z, rar. + +Xarchiver предоставляет удобные средства для добавления/удаления +файлов/каталогов в архив; навигации по содержимому архива; переименования, +извлечения файлов из архива. + +Xarchiver обеспечивает добавление пароля на архивы, поддерживающие данную +функциональную возможность (arj, zip, rar и 7z), и проверку их целостности. + +Xarchiver поддерживает режим просмотра содержимого и свойств файлов, +находящихся в архиве; возможность запуска при помощи других программ файлов +непосредственно из архива без необходимости ручного их разархивирования. + +[float] +==== Архиватор Ark ==== + +Ark:: +графический пользовательский интерфейс для различных консольных архиваторов в +системах GNU/Linux, работающий под управлением любой графической среды. + +Ark— однопользовательское прикладное ПО, занимающее не более 4 Мбайт свободного +места на жестком диске и базирующаяся на 32-х разрядной вычислительной +архитектуре, поддерживает работу в режиме реальной многозадачности. + +Ark умеет создавать следующие типы архивов: arj, tar, tar.bz2, tar.gz, zip, 7z. + +Ark умеет распаковывать следующие типы архивов: arj, tar, tar.bz2, tar.gz, zip, +7z, rar. + +Ark предоставляет удобные средства для добавления/удаления файлов/каталогов в +архив; навигации по содержимому архива; переименования, извлечения файлов из +архива. + +Ark обеспечивает добавление пароля на архивы, поддерживающие данную +функциональную возможность (arj, zip, rar и 7z), и проверку их целостности. + +Ark поддерживает режим просмотра содержимого и свойств файлов, находящихся в +архиве; возможность запуска при помощи других программ файлов непосредственно +из архива без необходимости ручного их разархивирования. + +[float] +=== Защита от вирусов и других видов вредоносных программ === + +[float] +==== Антивирусный пакет -- Clam AntiVirus ==== + +Clam AntiVirus:: +это антивирусный набор с открытым исходным кодом (GPL) для UNIX, +предназначенный, прежде всего, для сканирования электронной почты на почтовых +шлюзах. Он предоставляет некоторое количество утилит, включая гибкий и +масштабируемый многопоточный демон, сканер командной строки и продвинутый +инструмент для автоматических обновлений баз данных. Ядром набора является +антивирусный механизм, доступный в форме разделяемой библиотеки. + +Clam AntiVirus — многопользовательское прикладное ПО, базирующееся на 32-х +разрядной вычислительной архитектуре, поддерживает работу в режиме реальной +многозадачности занимает не более 12 Мбайт на жестком диске + +Основные возможности: + +* сканер командной строки; +* быстрый, многопоточный демон с поддержкой сканирования при доступе; +* milter-интерфейс для sendmail и взаимодействие с Postfix; +* - продвинутая программа обновления баз данных с поддержкой скриптовых обновлений и цифровых подписей; +* C-библиотека вирусного сканера; +* сканирование при доступе (Linux® и FreeBSD®); +* вирусная база данных, обновляемая несколько раз в день; +* встроенная поддержка различных архивных форматов, включая Zip, RAR, Tar, GZip, BZip2, OLE2, Cabinet, CHM, BinHex, SIS и другие; +* встроенная поддержка почти всех форматов почтовых файлов; +* встроенная поддержка выполняемых файлов ELF и Portable Executable, сжатых UPX, FSG, Petite, NsPack, wwpack32, MEW, Upack и замаскированных SUE, Y0da Cryptor и другими; +* встроенная поддержка общераспространённых форматов документов, включая файлы Microsoft Office и MacOffice, HTML, RTF и PDF. + +KlamAV - графический интерфейс для антивируса ClamAV, написанный для KDE. +Включает: сканирование в режиме доступа, сканирование по запросу, обновление +базы через Интернет, управление карантином, скачивание обновлений, сканирование +почты для почтовых программ, автоматическую установку, поддержку различных +языков для элементов интерфейса. Язык интерфейса KlamAV выбирается +автоматически исходя из настроенных предпочтений пользователя ОС. + + From 5ff54644e7c889999c75de4a78bf360c512043a0 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Mon, 10 Feb 2014 15:07:21 +0300 Subject: [PATCH 38/53] Add old docs from docs-network-0.2-alt1.1.noarch.rpm --- old-docs/network.txt | 220 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 old-docs/network.txt diff --git a/old-docs/network.txt b/old-docs/network.txt new file mode 100644 index 0000000..eb6825e --- /dev/null +++ b/old-docs/network.txt @@ -0,0 +1,220 @@ +//// +Пакет: docs-network +RPM файл: docs-network-0.2-alt1.1.noarch.rpm +Аннотация: Описание настройки сетевых подключений. +Автор: Артём Золочевский +Лицензия: FDL +URL: http://docs.altlinux.org/current/modules/network/index.html +//// + +== Настройка сети в ALT Linux == + +[float] +=== Введение === + +В современном мире трудно встретить одиноко стоящий компьютер, не связанный с +другими тем или иным способом. Локальная сеть в пределах одной квартиры — уже +не редкость. И даже если вы просто время от времени выходите в Интернет, то на +время вашего сеанса работы с Интернетом вы становитесь участником огромной сети +компьютеров. + +В системе Linux полностью реализован протокол TCP/IP (Transport Control +Protocol/Internet Protocol), являющийся наиболее успешным средством объединения +компьютеров в единую сеть. Имея компьютер с системой Linux и адаптером Ethernet +(сетевой картой), можно подключить его к локальной сети или (при наличии +соответствующего подключения) к сети Интернет. + +=== Основные понятия === + +Прежде чем настраивать сетевые подключения, необходимо ознакомиться со +значением параметров, используемых при настройке сети: + +IP-адрес:: +Это уникальный адрес компьютера в формате четырёх трёхзначных десятичных +чисел, разделённых точками, например, 192.168.0.22. Как правило, каждый сетевой +интерфейс (сетевая карта вашего компьютера) имеет не менее одного IP-адреса. + +*Пример*: 192.168.0.22 + +[note] +Даже если ваш компьютер не укомплектован отдельной сетевой картой, у него +имеется внутренний виртуальный сетевой интерфейс с IP-адресом 127.0.0.1. + +Сетевая маска (netmask):: +Маска определяет, какая часть IP-адреса соответствует номеру локальной +(под)сети (subnetwork number), а какая — номеру компьютера в сети. Большинство +локальных сетей используют маску 255.255.255.0. + + +*Пример*: 255.255.255.0 + +Таким образом, при IP-адресе сетевого интерфейса 192.168.0.22 и маске +255.255.255.0: + +* 192.168.0.0 — соответствует адресу сети. +* 22 — соответствует номеру компьютера в сети. + +Адрес маршрутизатора (gateway address):: +Это IP-адрес компьютера, который является «шлюзом» во внешний мир (т. е. к +компьютерам вне локальной сети). Другими словами, если вы обращаетесь за +пределы вашей локальной сети (например, к Интернету), то этот компьютер сможет +предоставить вам такую возможность. Конкретный адрес знает тот, что +проектировал сеть. Например, если ваш IP-адрес в локальной сети 192.168.0.22, +то в роли шлюза может выступать компьютер с IP-адресом 192.168.0.1. + +*Пример*: 192.168.0.1 + +Адрес сервера имён (name server address):: +В большинстве компьютерных сетей имеется сервер, который преобразует имя +компьютера в IP-адрес (Domain Name Server, сокращённо DNS). Сервер +устанавливает соответствие доменного имени, отражающего административную +принадлежность компьютера, и IP-адреса, отражающего место компьютера в сети +Интернет. Любое обращение по сети с использованием доменного имени требует +преобразования его в IP-адрес. Адрес DNS-сервера должен сообщить администратор +сети или провайдер, предоставляющий доступ в Интернет. + +[NOTE] +Указанные выше параметры не всегда необходимо указывать вручную. В сети может +использоваться технология их автоматической настройки DHCP (Dynamic Host +Configuration Protocol). В этом случае всё, что нужно — это физически +подсоединить кабель к сетевой карте и указать, что сетевой интерфейс должен +получать настройки автоматически. В любом случае, для правильной настройки сети +проконсультируйтесь со своим системным администратором и получите от него, если +необходимо, конкретные данные. + +Более подробно про организацию адресации в TCP/IP можно прочесть по адресу +http://citforum.ru/nets/tcp/ adres_inter.shtml. + +=== Настройка сети в ALT Linux === + +Для комфортабельной настройки сети предлагается два способа: + +* Центр управления системой +** Этот способ настройки рекомендуется в том случае, если компьютер не входит в +локальную сеть либо входит в одну и ту же локальную сеть (параметры сети не +меняются). + +Типичный случай — обыкновенный настольный компьютер. + +* NetworkManager +** Этот способ настройки рекомендуется, если ваш компьютер постоянно +меняет своё сетевое окружение (параметры сети всё время разные). + +Типичный случай — переносной компьютер (notebook), подключаемый по +необходимости к разным локальным сетям. + +[IMPORTANT] +Не смешивайте два указанных способа настройки. При определённых условиях это +может привести к неработоспособности сетевых подключений. + +[TIP] +Если для настройки сети вы выбрали Центр управления системой, то рекомендуем +выключить через Центр управления системой службу NetworkManager: Система → +Системные службы → Запускать при загрузке системы + +[float] +==== Центр управления системой ==== + +Данный способ рекомендуется пользователям настольных компьютеров. + +Центр управления системой содержит модуль для настройки сетевых подключений. +Здесь вы сможете задать как глобальные параметры сети (адрес сервера DNS, имя +компьютера), так и настройки конкретного сетевого интерфейса. Поддерживается +настройка беспроводных сетей (wifi) и подключение к Интернет (PPTP, PPPoE). + +За инструкцией по настройке обращайтесь непосредственно к справке Центра +управления системой. + +Запустить Центр управления системой можно из системного меню либо командой acc. +При запуске необходимо ввести пароль администратора (root). + +[float] +==== Настройка при помощи NetworkManager ==== + +Данный способ рекомендуется пользователям переносных компьютеров (notebook). + +NetworkManager — ещё один способ настроить сеть, не прибегая к непосредственной +правке конфигурационных файлов. Этот тип настройки особенно удобен для +настройки портативных компьютеров и применяется на них по умолчанию. + +После запуска NetworkManager доступен как апплет, находящийся в системном +лотке. Изменить настройки вы можете, нажав правой кнопкой мыши на значке и +выбрав "Изменить соединения...". + +[float] +==== Ручная настройка (etcnet) ==== + +[IMPORTANT] +Данный раздел рассчитан на квалифицированных пользователей. + +Если настройка сети, выполненная при помощи графических инструментов, вас +почему-либо не устраивает или неработоспособна, вы можете настроить работу с +сетью, вручную проделав необходимые операции. Стоит иметь в виду, что утилиты, +работающие с сетевыми настройками, такие как ifconfig, ip или route, изменяют +их на время, до перезагрузки системы. Для постоянной настройки сетевых +подключений необходимо изменять соответствующие конфигурационные файлы. + +[WARNING] +Для изменения конфигурационных файлов вам потребуются полномочия администратора +(root). Ошибки при правке конфигурационных файлов могут привести к +неработоспособности сети! + +Система, обеспечивающая настройку сетевых подключений, носит название etcnet. +Настройки, относящиеся к каждому сетевому интерфейсу, хранятся в отдельных +подкаталогах каталога /etc/net/. Например, файлы настройки сетевой карты eth0 +можно найти в каталоге /etc/net/eth0/. + +О значении конкретные директив, указываемых в конфигурационных файлах, +необходимо справляться в документации etcnet. + +Полную документацию cо множеством примеров готовых конфигурационных файлов +можно найти в каталоге /usr/share/doc/etcnet-version/ или на домашней +странице проекта http://etcnet.org/. + +[TIP] +version — версия установленного пакета etcnet. Т. е. путь к каталогу с +документацией будет выглядеть примерно так: /usr/share/doc/etcnet-0.9.7/. + +Для того чтобы настройки в файлах интерфейсов вступили в силу, выполните +команду service network restart. + +=== Примеры настроек === + +Ниже приводятся примеры настроек сети. В примерах используется Центр управления +системой. + +*Пример 1. Подключение компьютера к существующей локальной сети* + +По умолчанию ALT Linux пытается получить настройки автоматически, т. е. +действует настройка "Использовать DHCP". + +Если в вашей сети нет DHCP-сервера, то все параметры необходимо ввести +самостоятельно. Как минимум, указываются IP-адрес и сетевая маска. Если в сети +используется DNS-сервер, то введите и его IP-адрес. Указание шлюза может быть +важным для соединения с сетью Интернет (если такая возможность предоставляется +в вашей локальной сети). + +*Пример 2. Подключение компьютера к сети Интернет через PPTP (VPN)* + +В примере используется Центр управления системой. Предполагается, что +соединение с сетью осуществляется через обычную сетевую карту компьютера. + +* Открыть Центр управления системой. Выбрать Сеть → PPTP-соединения; +* Создать новое соединение (кнопка "Создать"); +* Указать имя или адрес сервера, имя и пароль (выдаются провайдером); +* В случае нескольких сетевых интерфейсов выбрать в выпадающем списке тот, +который будет использоваться для соединения с сервером. + +Для запуска и остановки соединения использовать соответствующие кнопки. Можно +выбрать возможность запуска при старте системы (пункт "Запускать при +загрузке"). + +*Пример 3. Подключение компьютера к сети Интернет через PPPoE* + +* Открыть Центр управления системой. Выбрать Сеть → PPPoE-соединения; +* Создать новое соединение (кнопка "Создать соединение"); +* Выбрать в выпадающем списке интерфейс, который будет использоваться для +соединения с сервером; +* Ввести имя и пароль (выдаются провайдером). + +Можно выбрать использование шифрования (MPPE), отметив соответствующий пункт. From 40954f6806e5a5b2dc3aa139cf178bb09f42c6a6 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Tue, 11 Feb 2014 11:43:28 +0300 Subject: [PATCH 39/53] Add old docs from docs-openvz_basics-0.1-alt2.noarch.rpm --- old-docs/openvz.txt | 267 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 267 insertions(+) create mode 100644 old-docs/openvz.txt diff --git a/old-docs/openvz.txt b/old-docs/openvz.txt new file mode 100644 index 0000000..8ee998a --- /dev/null +++ b/old-docs/openvz.txt @@ -0,0 +1,267 @@ +//// +Пакет: docs-openvz_basics +RPM файл: docs-openvz_basics-0.1-alt2.noarch.rpm +Аннотация: Краткое руководство по организации инфраструктуры сервера с + использованием технологии виртуализации (OpenVZ) +Автор: Кирилл Маслинский +Лицензия: FDL +URL: http://heap.altlinux.org/modules/openvz_basics/index.html +//// + +== Краткое введение в OpenVZ == + +[float] +=== Введение === + +[NOTE] +Текст отчасти основан на http://ru.wikipedia.org/wiki/OpenVZ + +Различные технологии виртуализации позволяют запускать на одном сервере +несколько в той или иной степени независимых экземпляров операционной системы +(или даже разных операционных систем). Системы виртуализации различаюются как +степенью изоляции выполняющихся операционных систем, так и другими +особенностями и ограничениями. В дистрибутивах ALT Linux в качестве технологии +виртуализации используется OpenVZ. + +OpenVZ является реализацией виртуализации на уровне операционной системы +(подобно, например, технологии jail, доступной в ОС FreeBSD). Все запущенные с +её помощью экземпляры операционной системы (далее виртуальные контейнеры) +используют один общий экземпляр ядра Linux. Это способствует повышению +производительности по сравнению с технологиями, основанными на полной +виртуализации оборудования, а также даёт администратору основной системы +дополнительные возможности по контролю и управлению виртуальными контейнерами. + +Минусом этой технологии является невозможность использования в разных +виртуальных контейнерах операционных систем, не основанных на ядре Linux, а +также разных версий ядра. + +Система OpenVZ использует модифицированное ядро, обеспечивающее виртуализацию, +изоляцию, управление ресурсами, сохранение состояний виртуальных серверов. + +=== Виртуализация и изоляция === + +Каждый виртуальный сервер выглядит с точки зрения его пользователя или администратора практически неотличимо от обычного физического сервера. Каждый виртуальный сервер имеет свои собственные: + +Файлы:: +Системные библиотеки, приложения, виртуализованные файловые системы /proc и /sys, виртуализованные блокировки и т. п. + +Пользователи и группы:: +Свои собственные пользователи и группы, включая root. + +Дерево процессов:: +Виртуальный контейнер имеет доступ только к своим собственным процессам +(начиная с init). Идентификаторы процессов (PID) также виртуализованы, поэтому +PID программы init равняется 1, как ему и следует быть. + +Сеть:: +Виртуальное сетевое устройство (venet) обеспечивает наличие виртуальной +сети в пределах физического сервера. Каждый виртуальный контейнер может иметь +свой набор правил фильтрации пакетов. + +Устройства:: +При необходимости администратор физичесого сервера может давать виртуальным +контейнерам доступ к реальным устройствам, например, сетевым адаптерам, портам, +разделам диска и т. д. + +Объекты IPC:: +Разделяемая память, семафоры, сообщения. + +=== Управление ресурсами === + +Ядро OpenVZ обеспечивает ограничение ресурсов каждого виртуального контейнера +так, чтобы исключить для него возможность помешать работе других виртуальных +контейнеров. + +Основными компонентами управления ресурсами в OpenVZ являются: двухуровневая +дисковая квота, специальный планировщик процессора, ограничения (user +beancounters) и дополнительные полномочия (capabilities). Все эти ресурсы могут +быть изменены во время работы виртуального сервера без перезагрузки. + +[float] +==== Использование диска ==== + +Администратор физического сервера может установить для виртуальных серверов +дисковые квоты, в терминах дискового пространства и количества индексных узлов +(i-nodes), число которых примерно равно количеству файлов. Это верхний уровень +дисковой квоты. + +В дополнение к этому, администратор виртуального контейнера может использовать +обычные средства управления дисковыми квотами внутри своего контейнера. + +Работая внутри контейнера, можно определить объем доступного ему дискового +пространства, выполнив следующие команды: + +*Пример 1.* Определение объема дискового пространства в контейнере + +---- +# echo "simfs / simfs rw 0 0" >>/etc/mtab +$ df -h +---- + +Одной из не всегда очевидных проблем при планировании ресурсов является +дисковый ввод/вывод. При создании нагруженного сервера с обширным +вводом/выводом в различных контейнерах следует помимо общей практики +использования RAID1+ для повышения надёжности множества сервисов на одной +системе по возможности применять разнесение потоков данных по различным +физическим дискам + +[NOTE] +Подробную информацию на эту тему можно найти в Multi-Disk HOWTO (его можно +найти в Интернет или в пакете howto-html-en). + +Например, практически возможно использование одного физического сервера как +терминального (LTSP) и для сборки программных пакетов (hasher) при условии, что +терминал-сервер и пакетные базы размещены на программном RAID1, а сборка +ведётся на отдельном SCSI-диске; иначе даже существенный объём RAM (например, +4Gb) не поможет избежать заметного взаимного влияния контейнеров при дисковых +операциях. + +[float] +==== Планировщик процессора ==== + + +Планировщик процессора в OpenVZ также двухуровневый. На первом уровне +планировщик на основании значения параметра cpuunits решает, какому +виртуальному серверу дать квант процессорного времени. На втором уровне +стандартный планировщик Linux решает, какому процессу выбранного виртуального +сервера дать квант времени, основываясь на стандартных приоритетах процесса в +Linux и т. п. + +Администратор физического сервера может устанавливать количество процессорного +времени, выделяемого каждому виртуальному серверу, как на основании системы +весов (cpuunits), так и задавая явные пределы (cpulimit). + +=== Ограничения === + +OpenVZ предоставляет для каждого виртуального контейнера набор счётчиков, +ограничений и гарантий. Имеется набор из примерно 20 параметров, которые +выбраны таким образом, чтобы никакой виртуальный контейнер не мог злоупотребить +каким-либо ресурсом, и таким образом помешать работе других виртуальных +контейнеров на этом же физическом сервере. Смысл порогового и максимального +значений может различаться в зависимости от параметра. + +По умолчанию для виртуального контейнера устанавливаются достаточно низкие +значения ограничителей, поэтому в ряде случаев может оказаться, что выделяемых +ресурсов недостаточно для нормального функционирования процесса в контейнере. В +случае, если работа процесса завершается ошибкой выделения памяти, ошибкой +создания процесса или открытия файла, следует снять показания счётчиков +виртуального контейнера: + +*Пример 2.* Снятие показаний user_beancounters + +---- +# cat /proc/user_beancounters >~/user_beancounters.`date "+%Y%m%d-%H%M"` +---- + +Затем повторить операцию, которая привела к ошибке, и снова снять показания +счётчиков. Затем их нужно сравнить и выяснить, какой из счётчиков failcnt +увеличил значение — соответствующий лимит нужно будет увеличить. Краткое +пояснение смысла разных лимитов приведено ниже, более подробную информацию +можно найти в man vzctl. Нужно также принимать во внимание, что некоторые +лимиты установлены в блоках (обычно 512 байт), некоторые — в страницах памяти +(4 Кб на x86 архитектуре), некоторые в байтах и других натуральных величинах. + +[float] +==== Память ==== + +kmemsize:: +Количество памяти, используемое ядром. Этот параметр связан со значением +параметра numproc Каждый процесс потребляет некоторое количество памяти ядра: +30–50 килобайт, как минимум 16. Важно иметь достаточно большой зазор между +пороговым и максимальным значениями, чтобы не вынуждать ядро завершать +процессы, выполняющиеся в виртуальном окружении. + +lockedpages:: +Количество страниц памяти, заблокированной при помощи mlock. + +privvmpages:: +Объем памяти, размещаемой процессами. Память, разделяемая между разными +процессами, не включается в это значение. + +shmsize:: +Объем памяти, доступный для межпроцессного взаимодействия через разделяемую +память. Установка порогового значения, отличающегося от максимального, не имеет +смысла. + +physpages:: +Объём физической памяти, используемое виртуальным контейнером. Используется +только для учёта, пороговое значение должно быть выставленно в 0. + +vmguarpages:: +Гарантированный размер доступной памяти в страницах. Имеет смысл изменять +только пороговое значение. + +oomguarpages:: +Пока использование памяти в страницах не превышает заданного порогового +значения, процессы не будут принудительно завершены из-за недостка памяти даже +при её реальной нехватке. + +[float] +==== Процессы и файлы ==== + +numproc:: +Количество процессов и обеспечиваемых ядром потоков. Установка порогового +значения, отличающегося от максимального, не имеет смысла. + +numflock:: +Максимальное количество файловых блокировок. Рекомендуется оставлять зазор +между пороговым и максимальным значениями. + +numpty:: +Количество псевдотерминалов. Не может превышать 255. Установка порогового +значения, отличающегося от максимального, не имеет смысла. + +numsiginfo:: +Количество структур siginfo. Установка порогового значения, отличающегося от +максимального, не имеет смысла. + +dcachesize:: +Максимальный размер кешей файловой системы (в байтах). Максимальное значение +должно быть больше порогового. + +numfile:: +Максимальное количество открытых файлов. Установка порогового значения, +отличающегося от максимального, не имеет смысла. + +[float] +==== Сеть ==== + +numtcpsock:: +Максимальное количество сокетов протокола TCP. Установка порогового значения, +отличающегося от максимального, не имеет смысла. + +tcpsndbuf:: +Максимальный размер буферов для данных, отправляемых по протоколу TCP. +Пороговое значение не должно быть меньше 64 Кб, а разница между ним и +максимальным значением не должна быть меньше значения numtcpsock, умноженного +на 2,5. + +tcprcvbuf:: +Максимальный размер буферов для данных, получаемых через протокол TCP. +Пороговое значение не должно быть меньше 64 Кб, а разница между ним и +максимальным значением не должна быть меньше значения numtcpsock, умноженного +на 2,5. + +othersockbuf:: +Максимальный размер прочих (не TCP) буферов отправки. Увеличение лимита +ускоряет связь через локальные сокеты. + +dgramrcvbuf:: +Максимальный размер прочих (не TCP) буферов получения. Установка порогового +значения, отличающегося от максимального, не имеет смысла. + +numothersock:: +Максимальное количество не-TCP сокетов (локальных, UDP и других). Установка +порогового значения, отличающегося от максимального, не имеет смысла. + +numiptent:: +Макисмальное количество записей в таблицах фильтрации сетевых пакетов +(iptables). + +=== Дополнительная информация === + +* Официальный сайт проекта http://openvz.org +* Вики разработчиков и пользователей OpenVZ http://wiki.openvz.org +* Форум проекта http://forum.openvz.org +* Рекомендации по настройке OpenVZ в ALT Linux + http://www.freesource.info/wiki/AltLinux/Dokumentacija/OpenVZ From 713fca7db9f5b23a5a738b05d711b43a72a1bca1 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Tue, 11 Feb 2014 12:12:43 +0300 Subject: [PATCH 40/53] Add old docs from docs-quickstart_desktop_sb-0.2-alt1.noarch.rpm --- old-docs/quickstart_desktop.txt | 65 +++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 old-docs/quickstart_desktop.txt diff --git a/old-docs/quickstart_desktop.txt b/old-docs/quickstart_desktop.txt new file mode 100644 index 0000000..9c23a36 --- /dev/null +++ b/old-docs/quickstart_desktop.txt @@ -0,0 +1,65 @@ +//// +Пакет: docs-quickstart_desktop_sb +RPM файл: docs-quickstart_desktop_sb-0.2-alt1.noarch.rpm +Аннотация: Быстрый старт для начинающих. +Автор: Артём Золочевский +Лицензия: FDL +URL: http://heap.altlinux.org/modules/quickstart/index.html +//// + +== Быстрый старт == + +В этом разделе содержится список задач, часто встающих перед пользователем ALT +Linux после успешной установки системы. + +=== Что делать, если... === + +*«Увидеть» другие компьютеры в сети* + +* Меню «Система — Сетевые ресурсы» +* smb:/ в строке «Адрес» программы konqueror. + +*Печатать на принтер* + +Настройка принтера в Linux сводится к настройке служюы печати CUPS. Для этого +есть несколько путей: + +Mеню «Настройка — Настройка печати». Это стандартный web-интерфейс настройки +CUPS + +Меню «Система печати — Добавить принтер». + +Информацию о том, насколько хорошо поддерживается ваш принтер, можно найти по +адресу http://linuxprinting.org. + +*Соединиться с мобильным телефоном или другим устройством по bluetooth* + +Для настройки соединения с bluetooth-устройством воспользуйтесь программой +kbluetooth: меню «Настройка — Bluetooth Server (kbluetooth)». После её запуска +в области уведомлений панели задач появится значок bluetooth. При нажатии на +него открывается список обнаруженных bluetooth-устройств, с которыми можно +связаться. + +*Отправить компьютер в «спящий» режим* + +Воспользуйтесь программой KPowersave. При запущенной программе в области +уведомлений отображается значок (электрическая вилка). Нажатие правой кнопкой +мыши открывает меню, в котором доступны различные функции, в том числе +«Уснуть». + +*У меня есть вопросы по устройству X.* + +Поддерживается ли оно в Linux? Как это узнать? Где взять драйвер? На диске +производителя устройства есть драйвер для Linux. Как его установить? + +Не спешите искать драйверы на прилагаемых дисках или на сайте производителя +конкретного оборудования. Ознакомьтесь с главой Работа с оборудованием в Linux. + +Интересной особенностью работы некоторых беспроводных карт (WLAN) является то, +что для них могут использоваться win-драйвера. Для настройки таких карт нужно +установить ndiswrapper и настроить его в соответвии с документацией. + +*Подходящей программы под Linux нет, а под Windows есть. Что делать?* + +Попробуйте запустить win-приложение, используя WINE. Подробности содержатся в +разделе «WINE: среда для запуска win-приложений на платформе Unix». From 440e7ce81613a4aa8aa30cc4846b09e6a57368e0 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Tue, 11 Feb 2014 14:44:22 +0300 Subject: [PATCH 41/53] Add old docs from docs-scheme_article1-0.1-alt2.noarch.rpm --- old-docs/scheme.txt | 222 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 old-docs/scheme.txt diff --git a/old-docs/scheme.txt b/old-docs/scheme.txt new file mode 100644 index 0000000..2a4f7af --- /dev/null +++ b/old-docs/scheme.txt @@ -0,0 +1,222 @@ +//// +Пакет: docs-scheme_article1 +RPM файл: docs-scheme_article1-0.1-alt2.noarch.rpm +Аннотация: Вводная статья про язык scheme, ориентированная на + школьников (старшеклассников). +Автор: Станислав Иевлев +Лицензия: FDL +URL: http://heap.altlinux.org/kirill/scheme_article_1/doc/ +//// + +== Ваш новый язык -- Scheme == + +=== Знакомство с грамматикой === + +Вы хорошо знаете русский, возможно, неплохо уже говорите по-английски, в школе +вас научили несколько необычному языку математики. + +Предлагаю вам выучить ещё один — LISP. Точнее, один из его самых интересных +диалектов — Scheme (правильно произносится название как «ским», однако можно +говорить и проще — «схема») + + +Начнём с того, что ознакомимся с несколько необычным порядком слов этого языка: +«действие объект объект ...». Хотя почему необычным? Вот несколько фраз на +русском языке, организованных по тому же принципу: + +«Сумма трёх и пяти» + +«Произведение пяти, шести и семи» + +Каждая законченная фраза на этом языке должна быть окружена парой круглых скобок. + +Запишем сказанное выше на Scheme: + +---- +(+ 3 5) +(* 5 6 7) +---- + +Можно записать выражения и посложнее: + +(+ 2 3 (+ 5 6) ) - «Сумма двух, трёх и суммы пяти и шести." + +Просто, не правда ли? + +Давайте двигаться дальше. Фраза "(* 3 5)" — хороша, а "(* width height)" лучше. Выражение "(* 2 3.1415926 5)" — интригующе, а +"(* 2 pi radius)" гораздо более осмысленно. Здесь width, height — переменные, а 3,5 — их текущее значение. + +Переменная задаётся следующей конструкцией языка: +(define имя «первоначальное значение») + +Пример: + +---- +(define width 3) +(define height 7) +(* 2 (+ width height)) +---- + +Прочитаем записанное по русски: «Положим ширина — это три, высота — это 7, +подсчитаем произведение двух и суммы ширины и высоты (например, периметр +прямоугольника)». Результат такого вычисления в нашем случае будет 20. + +Продолжим совершенствовать конструкции. Допустим, нам требуется подсчитать +сумму квадратов двух чисел. Это можно сделать например так: + +---- +(define a 3) +(define b 4) +(+ (* a a) (* b b)) +---- + +Не правда ли, что-то режет глаз? Cлишком громоздко — так мы никогда не говорим. +Если бы у нас был в языке глагол который, означал бы «квадрат числа», то +последнее выражение звучало бы: + +---- +(+ (square a) (square b)) +---- + +Согласитесь, что так гораздо лучше. + +Есть задача — есть её решение. Мы можем объявить новое слово-функцию, назвать +её square. Функция будет принимать в качестве параметра число и возвращать его +квадрат. Делается это следующим образом: + +---- +(define (square x) (* x x)) +---- + +Общий формат: + +(define (название параметр параметр...) тело функции) + +Функция возвращает последнее вычисленное значение. Это означает, что следующая функция square2: + +---- +(define (square2 x) (+ x x) (* x x)) +---- + +вернёт тот же результат, что и square, только попутно сделает ещё одно ненужное дело — удвоение числа. + +Перепишем пример с суммой квадратов чисел заново: + +---- +(define a 3) +(define b 4) +(define (square x) (* x x)) +(+ (square a) (square b)) +---- + +Нам не хватало слов в языке — мы их добавили. Вообще, когда вы пишете программу на LISP, вы описываете не алгоритм, а сначала создаёте язык, а потом на нём формулируете исходную задачу. Несколько точнее — вы «подгоняете» данный вам Scheme язык до тех пор, пока он не станет совпадать с языком, на котором задача формулируется легко. + +Сразу пример. Пусть перед нами стоит задача сделать программу, которая спрашивает имя пользователя, а потом выводит ему приветствие. + +Scheme предоставляет нам несколько готовых «глаголов»: + +* read — для чтения имени +* display — для того чтобы рисовать что-то на экране +* newline — для того чтобы рисовать на экране «перевод строки» + +Мы бы хотели иметь такие «глаголы»: + +* hello — для приветствия с одним параметром — именем пользователя +* username — для получения имени пользователя, без параметров. + +На таком языке наша задача выглядела бы следующим образом: + +---- +(hello (username)) +---- + +Дело за малым — определить hello и username. Нет проблем. Вот полный текст +программы. + +---- +(define (hello name) + (display «Hello ") + (display name) + (display "!") + (newline)) +(define (username) + (write «Enter your name:") + (read)) +(hello (username)) +---- + +LISP — полноценный функциональный язык, а поэтому функции — полноправные члены +этого языка, независимо от того, определили вы их сами, или они уже были в +языке «готовые». В частности, их можно передавать в качестве параметров в +другие функции, а там уже делать с ними всё, что потребуется. + +Например, функцию «модуль числа», можно определить так: + +---- +(define (abs x) + (if (positive? x ) + x + (- x))) +---- + +«Если аргумент положителен — возвращается x, иначе минус x». А можно и так: + +---- +(define (abs x) + ((if (positive? x) + -) x)) +---- + +«Если аргумент положителен, то плюс, иначе минус x». Здесь в результате +исполнения выражения if возвращается функция + или -, которая затем применяется +к аргументу x. Кстати, обратите внимание на новую конструкцию if — полагаю, что +её назначение вам сразу ясно. Сначала проверяется первый аргумент, если он +истинен, то исполняется второй аргумент, иначе третий. Общий формат следующий: +(if условие «действие, если условие выполняется» «действие в противном случае») + +=== Где посмотреть и попробовать === + +В теории всё хорошо, а где немного попрактиковаться? В мире можно найти много +прекрасно разработанных сред для работы со Scheme. К сожалению, большинство +документации по Scheme на английском языке, но можно найти и отличные введения +на русском — язык-то простой. + +Вот названия нескольких самых распространённых реализаций: + +Plt Scheme(http://www.plt-scheme.org/) — одна из самых полных реализаций, +включает в себя удобную обучающую среду Dr.Scheme. Есть версии для платформ +Windows,Linux, Mac OS. + +Bigloo (http://www-sop.inria.fr/mimosa/fp/Bigloo/) — тоже достаточно полная +реализация. Доступна для платформ Windows, Linux. + +LispMe (http://www.lispme.de/index.html) — версия для карманных компьютеров с +операционной системой Palm OS. + +Также ещё посмотрите Gambit-C (http://www.iro.umontreal.ca/~gambit/) — один из +самых быстрых компиляторов Scheme. + +Все перечисленные реализации Scheme — это интерпретаторы. Запускате +интерпретатор — и можно вести с ним диалог на Scheme: в ответ на его +приглашение вводите конструкции на Scheme, а он будет возвращать результаты +вычислений. + +---- +Wecome to MzScheme version 208, Copyright (c) 2004 PLT Scheme, Inc. +>1 +1 +>(+ 1 2) +3 +>(define a 3) +>(+ a a) +6 +> +---- + +Попробуйте «проиграть» все вышеперечисленные примеры. Думаю, вам понравится! + +=== Кот в мешке === + +Простота Scheme обманчива. На самом деле — это один из самых мощных на +сегодняшний день языков программирования. На основе этого языка можно изучить +все известные стили и методы программирования. С частью этих приёмов мы +познакомимся с вами в следующих статьях этой серии. From 98497c295b8a33402622e0710827af5208e484a9 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Tue, 11 Feb 2014 15:15:50 +0300 Subject: [PATCH 42/53] Add old docs from docs-sshd-0.1.1-alt1.noarch.rpm --- old-docs/sshd.txt | 186 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 old-docs/sshd.txt diff --git a/old-docs/sshd.txt b/old-docs/sshd.txt new file mode 100644 index 0000000..dc2a6df --- /dev/null +++ b/old-docs/sshd.txt @@ -0,0 +1,186 @@ +//// +Пакет: docs-sshd +RPM файл: docs-sshd-0.1.1-alt1.noarch.rpm +Аннотация: Описание возможностей и принципов удалённого администрирования + при помощи OpenSSH - реализации технологии SSH +Автор: Артём Золочевский +Лицензия: FDL +URL: http://heap.altlinux.org/modules/sshd/index.html +//// + +== Удалённый доступ и удалённое администрирование (OpenSSH) == + +[float] +=== Введение === + +Одна из самых распространённых задач, возникающих при работе в сети, — +удалённый доступ к другим компьютерам, в том числе их удалённое +администрирование. Технология SSH (Secure Shell) призвана предоставить +возможность безопасного способа управления удалённой системой. Построенная по +клиент-серверной модели, она позволяет при помощи ssh клиента подключаться к +ssh серверу, предоставляя командную оболочку для работы с удалённой системой. + +SSH реализует соединение с удалённым компьютером, защищающее от: + +* прослушивания данных, передаваемых по этому соединению; +* манипулирования данными на пути от клиента к серверу; +* подмены клиента или сервера путём манипулирования IP-адресами, DNS или +маршрутизацией. + +В дополнение к отличным характеристикам в области обеспечения безопасного +клиент-серверного соединения, SSH обладает следующими возможностями: + +* Сжатие передаваемых данных. +* Туннелирование каналов внутри установленного соединения, в том числе +соединений с X-сервером, что позволяет запускать графические приложения на +удалённой машине. +* Широкая распространённость: существуют реализации SSH для самых различных +аппаратных платформ и операционных систем. + +OpenSSH — это включённая в дистрибутивы ALT Linux реализация SSH. Она +представлена следующими пакетами: + +* openssh-clients — клиентская часть (утилита ssh, sftp и др.). +* openssh-server — серверная часть (сервер sshd, sftp-server). +* openssh — утилиты, необходимые для работы как клиентской, так и серверной +части. + +Пакет openssh-server в ALT Linux 4.0 Server устанавливается по умолчанию, +позволяя непосредственно после установки системы воспользоваться возможностью +удалённого администрирования. + +В простейшем виде сеанс работы будет выглядеть следующим образом. Запускается +ssh клиент (ssh) с указанием имени пользователя на удалённой системе (если оно +отличается от локального) и имени машины (либо IP-адреса). На удалённой машине, +естественно, должна быть настроена и работать серверная часть — sshd. + +*Пример 1.* Использование ssh + +---- +$ ssh user@hostname +---- + +После этого sshd предоставляет командную оболочку для работы на удалённой +системе. Ваш компьютер становится удалённым терминалом другого компьютера. + +=== Аутентификация === + +Прежде чем начать удалённый сеанс работы, необходимо пройти процедуру +аутентификации, аналогичную той, что происходит при непосредственной работе с +физическим терминалом Linux-системы. Утилита sshd поддерживает различные +способы аутентификации, наиболее часто используются два из них: аутентификация +по паролю и аутентификация по ключу. + +Параметры, относящиеся к способу аутентификации, а так же все прочие настройки +sshd указываются в конфигурационном файле /etc/openssh/sshd_config. Для +вступления в силу изменений, вносимых с конфигурационный файл, каждый раз после +правки файла необходимо выполнять команду + +*Пример 2.* Перезапуск sshd + +---- +# service sshd reload +---- + +[float] +==== Аутентификация по паролю ==== + +Аутентификации по паролю включается добавлением строки PasswordAuthentication +yes в файл etc/openssh/sshd_config. Хотя пароль в этом случае и не передаётся +по сети в открытом виде, всё же существует опасность подбора пароля. Поэтому не +следует выбирать слишком простые пароли. + +[float] +==== Аутентификация по ключу ==== + +Аутентификация по ключу включается строкой + +*Пример 3.* Настройка аутентификации по ключу + +---- +PubkeyAuthentication yes +---- + +в файле /etc/openssh/sshd_config. При использовании этой схемы аутентификации +будет использоваться асимметричное шифрование, следовательно, необходимо +сгенерировать пару ключей: секретный и публичный. + +[NOTE] +Более подробно о технологии асимметричного шифрования можно узнать на +http://www.intuit.ru/department/security/networksec/7/ и +http://www.mgpu.ru/crypto/2.1.htm. + +Для генерации пары ключей на компьютере пользователя необходимо выполнить $ +ssh-keygen с необходимыми параметрами, например: + +*Пример 4.* Генерация пары ключей + +---- +$ ssh-keygen -t dsa +---- + +На вопрос о файле для сохранения ключа нажать Enter (принять вариант по +умолчанию). Будет задан вопрос, следует ли создать пароль к ключу. Поскольку +ключи рекомендуется создавать с паролем, нужно указать свой пароль. + +После генерации ключей образуются 2 файла: \~/.ssh/id_dsa — секретный ключ, и +~/.ssh/id_dsa.pub — публичный. Его предстоит поместить на удалённый сервер. + +Следующим шагом содержимое файла id_dsa.pub необходимо добавить в файл +~/.ssh/authorized_keys2 на удалённой машине. Если под этой учётной записью +будет входить один пользователь, файл id_dsa.pub можно просто скопировать, +назвав его authorized_keys2. Также можно воспользоваться утилитой ssh-copy-id: + +*Пример 5.* Настройка доступа по ключу + +---- +$ ssh-copy-id username@hostname +---- + +Обратите внимание, что для выполнения этой операции должна работать +аутентификация по паролю. В дальнейшем её можно будет отключить. + +После указанных действий можно использовать аутентификацию по ключу. В процессе +такой аутентификации запрашивается не пароль удалённого пользователя, а пароль +на ваш ключ, что делает ssh сессию ещё более безопасной. Безопасность + +При настройке sshd следует весьма щепетильно отнестись к вопросам безопасности. +SSH — очень важная часть системы. Она является незаменимым помощником любого +администратора Linux, предоставляя ему доступ к командной оболочке удалённой +системы. Но как раз по этой же причине данная служба может стать и источником +бед. + +Далее приводятся лишь некоторые рекомендации, призванные обезопасить вашу +систему от несанкционированного доступа. + +По возможности следует использовать способ аутентификации по ключу как наиболее +безопасный. Если вы все же по каким-либо причинам используется аутентификация +по паролю, то следует тщательнейшим образом отнестись к выбору паролей. В +вопросах выбора паролей надо руководствоваться теми же соображениями что и при +выборе паролей при регистрации пользователей. + +В качестве дополнительных мер, можно явно указать список пользователей, которым +разрешена либо запрещена удалённая работа. За это отвечают параметры AllowUsers +и DenyUsers в /etc/openssh/sshd_config. + +Наконец, можно осложнить жизнь потенциальному злоумышленнику, отключив +возможность удалённой регистрации в системе для суперпользователя (root). Для +этого в /etc/openssh/sshd_config нужно добавить строку PermitRootLogin no. + +Как и в случае с любыми потенциально опасными службами, следует постоянно +следить за обновлениями безопасности, связанными с данными пакетами. +Администратор системы, заботящийся о безопасности, должен непременно +устанавливать обновления штатным способом: + +*Пример 6.* Обновления по безопасности + +---- +# apt-get update +# apt-get upgrade +---- + +За более детальной информацией по настройке sshd следует обращаться к +руководству sshd_config(5). Настройка клиентской части подробно описана в +ssh_config(5). + + From 24d598871abb91a47d828b9416828d2da74a30be Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Tue, 11 Feb 2014 15:59:23 +0300 Subject: [PATCH 43/53] Add old docs from docs-ve_management-0.1-alt2.noarch.rpm --- old-docs/ve_management.txt | 61 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 old-docs/ve_management.txt diff --git a/old-docs/ve_management.txt b/old-docs/ve_management.txt new file mode 100644 index 0000000..71cc294 --- /dev/null +++ b/old-docs/ve_management.txt @@ -0,0 +1,61 @@ +//// +Пакет: docs-ve_management +RPM файл: docs-ve_management-0.1-alt2.noarch.rpm +Аннотация: Описание управления виртуальными серверами при + помогщи веб-интерфейса +Автор: Кирилл Маслинский +Лицензия: FDL +URL: http://heap.altlinux.org/modules/ve_management/index.html +//// + +== Развёртывание виртуальных серверов == + +Web-интерфейс управления виртуальными серверами доступен по адресу +https://server-name:8080/index.scm/ovz-ve. Вы можете просмотреть список +доступных виртуальных серверов, запустить, остановить или перезапустить +выбранные. Для запущенных виртуальных серверов можно изменить настройки +виртуального контейнера (ссылка «Настроить контейнер») или настроить сервисы, +выполняющиеся внутри контейнера (ссылка «Настроить службы»). Также имеется +возможность создания нового виртуального контейнера. + +Виртуальный контейнер создаётся на основе шаблона, который, в свою очередь, +создаётся на основе профиля. + +Профиль представляет собой описание конфигурации и составляющих частей +виртуального сервера. Главной составляющей профиля является список пакетов, +которые будут установлены в шаблон, создаваемый на основе этого профиля. Для +создания работоспособного контейнера в список пакетов обязательно нужно +включать пакеты basesystem и sysklogd. Чтобы в созданном контейнере была +возможность управлять параметрами системы через web-инетрфейс, аналогично +поставляемым ALT стандартным контейнерам, в профиль следует включить пакет +alterator-fbi. + +Интерфейс управления профилями позволяет просмотреть, изменить или удалить +существующие профили, а также создавать новые. + +Шаблон представляет собой образ файловой системы виртуального сервера. Он +создаётся на основе профиля и используется для создания экземпляров виртуальных +серверов. + +Интерфейс управления шаблонами позволяет удалять существующие шаблоны и +создавать новые. Для создания шаблона надо выбрать для него имя и профиль, на +основе которого он будет создан. + +Одновременное создание двух шаблонов невозможно. + +[float] +=== Обновление виртуальных серверов === + +Обновление виртуальных серверов рекомендуется производить только из +официального источника обновлений дистрибутива. + +Обновление виртуальных серверов может производиться при помощи apt. В каждом +виртуальном сервере доступны web-интерфейсы для управления источниками +обновлений («Система->Источники обновлений») и обновления +(«Система->Обновления»). + +В случае, когда на сервере или в сети работает значительное число виртуальных +серверов, рекомендуется создать специальный контейнер, содержащий squid, +настроенный на кэширование обновлений и настроить контейнеры на обновление +через него или же обеспечить зеркалирование обновлений с сайта ALT Linux и +производить обновление из локального зеркала. From 6f58e8494ac72d8a20e438aff65911c367ed3e2f Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Tue, 11 Feb 2014 16:18:21 +0300 Subject: [PATCH 44/53] Add old docs from docs-ve_rationale-0.1-alt2.noarch.rpm --- old-docs/ve_rationale.txt | 336 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 336 insertions(+) create mode 100644 old-docs/ve_rationale.txt diff --git a/old-docs/ve_rationale.txt b/old-docs/ve_rationale.txt new file mode 100644 index 0000000..5b391f4 --- /dev/null +++ b/old-docs/ve_rationale.txt @@ -0,0 +1,336 @@ +//// +Пакет: docs-ve_rationale +RPM файл: docs-ve_rationale-0.1-alt2.noarch.rpm +Аннотация: Информация о возможностях виртуализации применительно + к администрированию сервера +Автор: Кирилл Маслинский +Лицензия: FDL +URL: http://heap.altlinux.org/modules/ve_rationale/index.html +//// + +== Инфраструктура сервера: виртуальные контейнеры == + +[float] +=== Введение === + +[TIP] +Огромное спасибо Петру Савельеву () за терпеливые и подробные консультации по +виртуализации и системному администрированию. + +В дистрибутивах ALT Linux администратору сервера рекомендуется размещать +системные службы (сервисы) в изолированных окружениях, виртуальных контейнерах. +В данном документе рассмотрены задачи, решению которых способствует +виртуализация сервисов, а также некоторые технологические ограничения, которые +следует принимать во внимание, планируя инфраструктуру сервера с использованием +виртуальных контейнеров. + +=== Виртуализация и администрирование === + +[float] +==== Серверы и сервисы ==== + +Под сервером обычно понимается отдельный (обычно мощный) компьютер, +специализированный под выполнение задач по обслуживанию абонентов +(предоставление сервисов). Количество таких сервисов, одновременно выполняемых +в рамках одного сервера, ограничено сверху вычислительными возможностями +оборудования, пропускной способностью канала для запросов клиентов и т. п. На +практике количество сервисов на одном сервере обычно больше одного, как из +экономических соображений (невыгодно позволять простаивать дорогому серверному +оборудованию), так и из технологических (зачастую сервисы бывает удобно +аггрегировать на одном узле, т. к. они могут работать взаимосвязанно, например, +с одними и теми же данными). + +С развитием технологий постоянно нарастающие мощности компьютерного +оборудования намного опережают рост запросов к ресурсам со стороны программ. В +результате всё выше поднимается верхняя граница по числу возможных сервисов на +одном сервере, и все более невыгодно становится держать сервер только для +одного сервиса — ресурсы простаивают. + +[float] +==== Виртуализация в операционных системах ==== + +Виртуализация в операционных системах понимается широко и разнообразно. Если +пробовать выделить общее, то речь всегда идёт о запуске в той или иной степени +полноценной операционной системы (далее ОС), работающей в рамках другой ОС (или +в гипервизоре: специализированной ОС, которая только и умеет, что обеспечивать +работу других ОС внутри себя). Такую виртуализованную ОС называют чаще всего +гостевая ОС (а также виртуальное окружение и др.), а ОС, внутри которой +выполняется гостевая, — хост-системой (также аппаратный узел, Hardware Node). +Виртуальное окружение, внутри которого выполняется программа, обычно неотличимо +для нее от невиртуализованной ОС. Здесь мы не будем подробно рассматривать +разные технологии виртуализации, для этого лучше обращаться к специальным +источникам. + +[NOTE] +См. например хорошую вводную статью (на английском языке) +http://www-128.ibm.com/developerworks/linux/library/l-linuxvirt/?ca=dgr-lnxw01Virtual-Linux. + +В контексте системного администрирования наиболее существенны два свойства +любой технологии виртуализации. Первое состоит в том, что виртуализация вводит +промежуточный уровень между оборудованием (аппаратным обеспечением) и +программным обеспечением. Использование этого уровня даёт администратору +возможность гибко управлять распределением аппаратных ресурсов между +параллельно выполняющимися программами. Второе — помещение программ в +виртуальное окружение довольно надёжно изолирует их от всех прочих программ, +исполняющихся на этом же физическом оборудовании вне данного окружения. Тем +самым радикально снижается вероятность побочного влияния работы одних программ +на работу других, в том числе снижается вероятность атак, построенных на +подобных побочных взаимодействиях. + +[float] +==== Виртуализация сервисов ==== + +Традиционный подход к размещению сервисов состоит в том, что на одном +физическом сервере работает одна операционная система, в рамках которой +выполняются несколько системных служб, предоставляющих те или иные сервисы. + +У нескольких задач, выполняющихся в рамках одной ОС (иначе говоря, в +разделяемой среде), всегда есть возможности для взаимодействия, поскольку ОС +именно для организации такого взаимодействия и предназначена. Кроме того, в +разделяемой среде задачи совместно пользуются общими интерфейсами (файловая +система, структуры ядра...) и в конечном итоге общими аппаратными ресурсами, +что открывает дорогу побочным взаимодействиям. В случае независимых сервисов +подобное взаимодействие равнозначно помехам и нарушению работы. + +В UNIX-системах, при разработке которых многозадачность являлась одним из +важнейших приоритетов, уже присутствует комплекс средств для решения задач +изоляции и контроля. К подобным средствам относятся, например, системный вызов +chroot(), обеспечивающий изоляцию на уровне файловой системы, во FreeBSD +существует также технология jail, дополнительно к этому ограничивающая доступ к +структурам ядра. В последних версиях ядра Linux реализована поддержка +аппаратной паравиртуализации (kvm, применимо в том случае, если ее поддерживает +процессор). Однако стандартные средства UNIX-систем не решают всех проблем +совместного размещения сервисов. + +Проще говоря, в разделяемой среде работает логика: «кто успел, тот и съел». +Поэтому в ситуации, когда критически важна работа нескольких сервисов, в +особенности требовательных к аппаратным ресурсам, работа в рамках одной +разделяемой среды (ОС) может быть нежелательна. + +Путь разрешения обозначенных проблем — использовать средства виртуализации, +чтобы исключить возможности побочного взаимодействия и получить дополнительную +к средствам ОС точку контроля за потреблением аппаратных ресурсов. Так, в +последнее время нормой постепенно становится размещение нескольких сервисов в +рамках одного сервера не в одной и той же ОС, а в отдельных виртуальных +окружениях. Далее мы будем называть такое виртуальное окружение с работающей в +нём системной службой виртуальным контейнером. + +С точки зрения задачи виртуализации сервисов не принципиально, какая конкретно +технология виртуализации выбрана для создания контейнера. При большой +вычислительной нагрузке это вряд ли может быть виртуальная машина, эмулирующая +все оборудование компьютера, но вполне может использоваться одна из систем с +гипервизором. Для UNIX-систем может быть весьма удобно применять одну из +технологий виртуализации на уровне ОС, доводящих средства изоляции и контроля +UNIX до уровня, достаточного для организации полноценных виртуальных окружений. +К таким технологиям относятся OpenVZ (широко применяемый в ALT Linux) и +VServer. + +=== Высокая надёжность и гарантированное обслуживание === + +Во многих областях обслуживания абонентов критически важно обеспечивать +постоянную работу сервиса, минимизировать простои из-за неполадок или +управляться с большим потоком запросов, чтобы они не приводили к нарушению +работы сервиса. Системы, обладающие техническими характеристиками для +выполнения этих условий, называют системами высокой надёжности (high +availability systems). Помещение сервиса в виртуальный контейнер можно +использовать для повышения надёжности его работы. + +[float] +==== Ограничение ресурсов ==== + +Аппаратные ресурсы, доступные виртуальным контейнерам, должны быть всегда +меньше аппаратных ресурсов всей системы. + +Бывают ситуации, особенно при работе под большой нагрузкой, когда затребованные +сервисом ресурсы настолько велики, что могут привести к неработопособности +самой операционной системы. Средствами виртуального окружения можно ограничить +верхний предел ресурсов системы, выделяемых сервису в рамках виртуального +контейнера. + +Т. е. технология виртуализации применяется в данном случае как средство +контроля ресурсов, потребляемых отдельной задачей, и обеспечивает непревышение +этих ресурсов (поскольку задача не имеет прямого доступа к оборудованию). Эту +задачу большинство средств виртуализации решает весьма надёжно. + +Такой подход повышает надёжность системы, поскольку гарантирует операционную +систему от неработоспособности по причине превышения ресурсов со стороны +сервиса. Однако этот метод, естественно, не может гарантировать от сбоев самого +сервиса, вызванных, например, большим потоком запросов. + +Помещение сервиса в виртуальный контейнер позволяет минимизировать время +простоя даже в ситуации сбоя виртуального контейнера из-за превышения ресурсов, +поскольку потребуется только восстановить виртуальный контекст, что в среднем +быстрее, чем перезагрузка всего сервера. + +Таким образом, даже в случае размещения на сервере только одного сервиса, +оправдано его помещение в виртуальный контейнер. + +[float] +==== Гарантированные ресурсы ==== + +Аппаратные ресурсы, доступные виртуальному контейнеру, должны быть +гарантированно больше некоторого минимального значения. + +В ряде случаев необходимо предоставить клиентам сервиса некоторые гарантии +качества обслуживанияш (QoS, quality of service). Примером такой ситуации может +служить телефонный разговор: после соединения клиент получает гарантию, что во +время разговора не закончатся ресурсы канала связи и разговор не прервётся. +Другой пример, уже из области системного администрирования: весьма желательно +гарантировать, что даже при максимальной нагрузке на сервере (в том числе в +ситуации DoS-атак), у сервиса SSH будет достаточно ресурсов, чтобы обеспечить +удалённый вход на сервер системного администратора, который мог бы принять +срочные меры. + +Чтобы обеспечить качество обслуживания для сервиса, администратору необходимо +гарантировать достаточный объем аппаратных ресурсов для этого сервиса, т. е. +исключить ситуации сбоя сервиса из-за физической нехватки ресурсов в системе. + +И здесь можно использовать виртуализацию сервисов. Если сервис работает в +виртуальном контейнере, то гарантия минимального уровня ресурсов сводится к +тому, что процессы, выполняемые вне данного контейнера, в сумме не затребуют +больше ресурсов, чем разность между объемом ресурсов системы и ресурсами +данного контейнера. + +Так, если в системе параллельно выполняется несколько сервисов, каждый из +которых помещён в отдельном виртуальном контейнере, то задача администратора — +ограничить ресурсы каждого контейнера таким образом, чтобы сумма выделенных им +ресурсов не превышала всех ресурсов системы, и при этом выделенные каждому +сервису ресурсы были достаточны для его нормальной работы. + +В случае, если сервисы не помещены в виртуальные контейнеры, добиться +гарантированной нижней границы доступных ресурсов можно только в том случае, +если на одном физическом сервере выполняется только один сервис. В противном +случае работает правило «кто первый встал, того и тапки», т. е. любой из +сервисов может в какой-то момент занять большой объём свободных ресурсов, так +что оставшегося не хватит другому сервису для нормальной работы. + +Иначе говоря, в разделяемой среде невозможно гарантировать отдельному сервису +нижнюю границу доступных ресурсов, и, следовательно, невозможно дать гарантии +клиентам по качеству обслуживания. + +=== Изоляция ergo защищённость === + +default deny:: +Важнейший принцип информационной безопасности: всякое взаимодействие, которое +не является заведомо необходимым, должно быть по умолчанию запрещено. + +Сервис, принимающий запросы от внешних клиентов, является одним из классических +источников для разного рода уязвимостей в безопасности системы. Зачастую +несанкционированный доступ к ОС осуществляется именно через эксплуатацию +уязвимостей некоторого сервиса. Если подвергшийся атаке сервис помещён в +виртуальный контейнер, последствия взлома могут быть значительно менее +разрушительными, чем в случае, когда сервис выполняется непосредственно в +операционной системе сервера. В последнем случае ОС сервера может быть взломана +через один из сервисов, а под удар подставляются все выполняющиеся сервисы. + +В случае виртуализованного сервиса, взломщик может получить доступ только в +рамках виртуального контейнера, так что даже если на сервере параллельно +выполняются другие сервисы (в других виртуальных контейнерах), то их работе +данный инцидент угрожать не будет. Попытки взломщика исчерпать все физические +ресурсы приведут только к исчерпанию ресурсов данного контейнера. Таким +образом, взломщик не сможет затруднить удалённый доступ администратора на +сервер, исчерпав все доступные ресурсы. Кроме того, изнутри контейнера у +взломщика нет возможности перезаписать загрузчик сервера и получить какой-либо +прямой контроль над оборудованием. + +При подобном инциденте администратор может просто целиком уничтожить +скомпрометированный виртуальный контекст и восстановить его и данные из +резервной копии, не перезагружая сервер и не останавливая работу прочих +выполняющихся на нём сервисов. + +[float] +==== Программные и аппаратные средства ограничения ресурсов ==== + +Из предыдущих разделов становится понятно, что при использовании виртуальных +контейнеров на сервере работоспособность как виртуализованных сервисов, так и +основной ОС сервера весьма существенно зависит от надёжности работы механизмов +ограничения и изоляции, заложенных в технологии виртуализации. + +Такие механизмы ограничения могут быть двух родов: аппаратные и программные. +Если используется платформа, поддерживающая виртуализацию на аппаратном уровне, +то алгоритмы изоляции контекстов реализованы непосредственно в оборудовании, +подвести здесь может только ошибка в микросхеме. Во всех остальных технологиях +виртуализации механизмы ограничения реализованы так или иначе программно, и, +как показывает практика, в программных реализациях ошибки встречаются. + +Производители программного обеспечения, выполняющего те или иные серверные +функции (т. е. предоставляющие некоторый сервис), могут встраивать в свои +продукты собственные средства контроля ресурсов, предоставляющие примерно ту же +функциональность, что и ограничение средствами виртуального контейнера. Однако +как в любой программной реализации в этих механизмах возможны ошибки, дающие +возможность при определённых условиях обходить установленные ограничения. + +Однако вероятность ошибок в механизмах ограничения тем выше, чем больше разных +механизмов использовано в системе. Поэтому в случае размещения на сервере +нескольких виртуальных контейнеров с сервисами правильнее использовать один +общий механизм контроля, предоставляемый средством виртуализации. Кроме того, +если используется стандартное для дистрибутива средство виртуализации (OpenVZ в +случае ALT Linux), то возможные ошибки, критичные для безопасности, будут +быстрее обнаружены и исправлены. + +=== Защита интерфейса управления === + +При организации сервера с использованием виртуализованных сервисов критически +важной точкой для безопасности системы становится интерфейс управления самими +виртуальными контейнерами. Доступ к этому интерфейсу должен быть наиболее +обстоятельно защищён. + +Возможные варианты защиты доступа к интерфейсу управления: + +* запретить удалённый доступ по сети, разрешить только доступ с локальной +консоли (виртуальная консоль, последовательный порт); +* физически изолировать сетевое подключение для интерфейса управления +(отдельный сетевой адаптер); +* логически изолировать сетевое подключение для интерфейса управления +(отдельный VLAN-интерфейс); +* использовать защищённые сетевые соединения для удалённого доступа к +интерфейсу управления (защищённый туннель ipsec, openvpn, pptp или +ssh-туннели). + +=== Консолидация серверов === + +Консолидация сервисов на одном сервере ведет к экономии на затратах на +обслуживание оборудования. + +Выше уже говорилось о том, что современное оборудование позволяет одновременно +выполнять значительно больше одного сервиса на одном сервере. При использовании +некоторых технологий виртуализации вычислительных ресурсов сегодня хватает на +организацию множества виртуальных контекстов на сервере, даже с учётом +дополнительных вычислительных расходов на виртуализацию. Технологии +виртуализации на уровне операционной системы (для UNIX-систем) позволяют +одновременно эксплуатировать сотни виртуальных контекстов на одном достаточно +мощном сервере. + +Типичная сфера применения подобных решений — хостинг-провайдеры: при +использовании виртуальных контекстов каждому клиенту можно выдать независимое +окружение с правами суперпользователя, предоставив администрирование внутри +контекста на его полное усмотрение. + +Выгоды от малой и до массовой консолидации сервисов на одном сервере в первую +очередь лежат в сфере снижения затрат на приобретение, размещение и +обслуживание оборудования. Традиционно подобная консолидация сдерживалась +соображениями безопасности и качества обслуживания, которые также +обеспечиваются средствами виртуальных контейнеров. + +=== Динамическое перераспределение ресурсов === + +Виртуализация сервисов даёт возможность простого и безущербного внедрения, +перемещения и выведения из строя любого из сервисов без ущерба общей +инфраструктуре и без простоя. + +Еще одна неочевидная, но немаловажная выгода, представляемая помещением +сервисов в виртуальные контейнеры происходит от того, что виртуальные +контексты, с одной стороны, самодостаточны, а с другой — отчуждаемы от +оборудования. Благодаря этому, администратор имеет возможность манипулировать +виртуальными контейнерами как целостными объектами, в том числе переносить с +одного сервера на другой. Так, для большинства технологий виртуализации есть +средства для «заморозки» контейнера в текущем состоянии, с возможностью +последующей разморозки, в том числе на другом сервере, при том что выполняемые +внутри контейнера процессы даже не заметят происшедшей перемены. + +Такие возможности позволяют даже в процессе работы мигрировать виртуализованные +сервисы, например, по разным узлам сети, гибко перераспределяя вычислительную +нагрузку, в том числе среди узлов кластера. Кроме того, можно уничтожить +ставший ненужным виртуальный контейнер, при этом не возникнет необходимости +продавать высвободившийся сервер: просто остальные контейнеры смогут разделить +высвобившиеся мощности. From 2fc79d9d2dce8cb24e08bfacbfef74cb016c704c Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Tue, 11 Feb 2014 16:23:04 +0300 Subject: [PATCH 45/53] Update "old-docs/index.txt": add to build new files --- old-docs/index.txt | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/old-docs/index.txt b/old-docs/index.txt index bf89513..d6df35e 100644 --- a/old-docs/index.txt +++ b/old-docs/index.txt @@ -24,4 +24,19 @@ include::howto_use_nut.txt[] include::install_ltsp.txt[] -//12 +include::junior_user.txt[] + +include::network.txt[] + +include::openvz.txt[] + +include::quickstart_desktop.txt[] + +include::scheme.txt[] + +include::sshd.txt[] + +include::ve_management.txt[] + +include::ve_rationale.txt[] +//20 From 7b544d16002e53e307a596fce72177a1525f5765 Mon Sep 17 00:00:00 2001 From: Nickolay Rogalskiy Date: Wed, 12 Feb 2014 14:00:49 +0300 Subject: [PATCH 46/53] Add old docs from docs-zsh_intro-0.1.1-alt1.noarch.rpm --- old-docs/zsh_intro.txt | 368 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 368 insertions(+) create mode 100644 old-docs/zsh_intro.txt diff --git a/old-docs/zsh_intro.txt b/old-docs/zsh_intro.txt new file mode 100644 index 0000000..9bbbdb1 --- /dev/null +++ b/old-docs/zsh_intro.txt @@ -0,0 +1,368 @@ +//// +Пакет: docs-zsh_intro +RPM файл: docs-zsh_intro-0.1.1-alt1.noarch.rpm +Аннотация: Небольшой обзор командного процессора Zsh +Автор: Алексей Отт +Лицензия: FDL +URL: http://alexott.net/ru/index.html +//// + +== Командный процессор Zsh == + +[float] +=== Введение === + +В этой статье предполагается, что читатель уже имеет навыки работы с одним из +распространенных командных процессоров UNIX, и поэтому сосредоточимся на +отличительных возможностях Zsh. + +Zsh — командный процессор UNIX, который может использоваться как в качестве +командного процессора для скриптов, так и в качестве интерактивной оболочки. +Zsh обладает множеством возможностей, среди которых — настраиваемый механизм +дополнений (completions), редактирование командной строки, механизм сохранения +историй, встроенное исправление неправильных команд. + +По возможностям Zsh наибольшее сходство имеет с Ksh, но при этом еще обладает +множеством расширений. + +Свежие версии Zsh доступны с сервера www.zsh.org и его зеркал. Кроме этого, Zsh +часто включают в состав популярных дистрибутивов Linux и других вариантов UNIX. + +=== Запуск === + +Обычно Zsh указывают в качестве интерактивной оболочки для входа в систему. Но, кроме этого, Zsh можно запускать и отдельно, с разными ключами, определяющими его поведение. Например, ключ -r заставляет Zsh работать в «ограниченном» (restricted) режиме, ключ -c указывает откуда читать команды для выполнения, а ключ -i заставляет работать в интерактивном режиме. + +При работе в «ограниченном» режиме запрещается выполнять некоторые действия: изменять каталог, запускать программы с помощью команды exec, перенаправлять вывод в файлы, изменять значение переменных среды, используемых при запуске программ, а также запускать программы, используя их абсолютные имена. + +При запуске Zsh старается эмулировать sh или Ksh в зависимости от того, под каким именем его запустили. В режиме эмуляции не исполняются обычные скрипты инициализации и завершения работы Zsh. Для инициализации используются файлы /etc/profile и $HOME/.profile + +[float] +==== Файлы, используемые при запуске ==== + +При запуске Zsh читается некоторое количество файлов, содержащих команды инициализации. В первую очередь читается файл /etc/zshenv, затем читается файл $ZDOTDIR/.zshenv. Затем, если запускаемый процесс используется для входа в систему, то читаются файлы /etc/zprofile и $ZDOTDIR/.zprofile. Затем, если оболочка является интерактивной, читаются файлы /etc/zshrc и $ZDOTDIR/.zshrc. И наконец, если процесс используется для входа в систему, то читаются файлы /etc/zlogin и $ZDOTDIR/.zlogin. + +Когда происходит выход из оболочки, использовавшейся для входа в систему, то читаются файлы $ZDOTDIR/.zlogout и затем /etc/zlogout. + +Если переменная ZDOTDIR не установлена, то вместо нее используется значение переменной HOME. Файл /etc/zshenv читается при запуске любого процесса Zsh, поэтому он должен быть настолько малым, насколько это возможно. + +Все перечисленные файлы могут быть откомпилированы с помощью команд zcompile, что позволяет их загружать быстрее. Откомпилированные файлы имеют расширение .zwc, и загружаются в том случае, если они новее исходного файла. + +=== Грамматика команд === + +Грамматика команд по большей части совпадает с грамматикой других командных процессоров семейства bourne shell, хотя имеются различные расширения, специфические для данного командного процессора. Схожесть грамматики позволяет быстро перейти к работе с использованием Zsh, и осваивать новые возможности уже в процессе его эксплуатации. + +=== Перенаправление вывода === + +Zsh поддерживает такое же перенаправление вывода как и Bash, но кроме этого он поддерживает множество расширений. Некоторые расширения работают только если заданы соответствующие настройки. Например, если не задана опция CLOBBER, то использование команды > для существующего файла приведет к возникновению ошибки и невыполнению команды. На этот случай, для практически всех команд существуют их модификации, которые не зависят от настроек. Например, для команды > существуют ее модификации >! и >|. + +Для одновременного перенаправления стандартного вывода и стандартного потока сообщений об ошибках определены дополнительные команды >&, &>, >>&, &>> и их модификации со знаками | и ! (например, &>|). Эти команды соответственно переписывают и дополняют информацию в указанных файлах, а также позволяют избавиться от неуклюжих конструкций вида 1>FNAME 2>&1. + +Zsh также позволяет перенаправлять информацию в более чем в один файл, аналогично использованию команды tee (это доступно только если определена переменная MULTIOS, что обычно указано по умолчанию). Кроме этого можно одновременно использовать перенаправление и конвейеры. Например, команда date >foo | cat запишет дату в файл foo и выведет ее в стандартный поток вывода. + +Если установлена переменная MULTIOS, то имя файла, указанное в качестве того, куда надо будет перенаправлять информацию, подвергается раскрытию шаблонов (globbing). Таким образом можно использовать команду + + : > * + +для усечения всех файлов в текущем каталоге. + +Множественное перенаправление также работает и при вводе информации, позволяя заменять конструкции вида + + cat foo fubar | sort + +на конструкции + + sort Date: Wed, 12 Feb 2014 16:42:59 +0300 Subject: [PATCH 47/53] add to build: old-docs/zsh_intro.txt --- old-docs/index.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/old-docs/index.txt b/old-docs/index.txt index d6df35e..b726838 100644 --- a/old-docs/index.txt +++ b/old-docs/index.txt @@ -39,4 +39,7 @@ include::sshd.txt[] include::ve_management.txt[] include::ve_rationale.txt[] + //20 + +include::zsh_intro.txt[] From 4d2081954d89129d9698974c33b2549ddd03249c Mon Sep 17 00:00:00 2001 From: Alexandr Boltris Date: Fri, 25 Apr 2014 13:43:08 +0300 Subject: [PATCH 48/53] change format: asciidoc -> docbook --- Makefile | 117 +- admin-basics/command-line.txt | 47 - admin-basics/documentation/index.txt | 133 - admin-basics/driver-saga.txt | 301 - admin-basics/index.txt | 19 - admin-basics/os-principles/index.txt | 520 - admin-basics/sumode/index.txt | 68 - admin-basics/syslog/index.txt | 70 - .../terminal/basic/docs-linux_basics.txt | 319 - .../terminal/basic/docs-linux_firststeps.txt | 343 - .../terminal/basic/docs-linux_intro.txt | 15598 ---------------- .../basic/images/konqueror.ppm.bz2.png | Bin 525 -> 0 bytes .../terminal/basic/images/startx.ppm.bz2.png | Bin 525 -> 0 bytes .../terminal/basic/images/wm-menu.ppm.bz2.png | Bin 525 -> 0 bytes .../basic/images/wmaker-winmenu.ppm.bz2.png | Bin 525 -> 0 bytes .../terminal/basic/images/wmaker.ppm.bz2.png | Bin 525 -> 0 bytes .../terminal/basic/images/xcalc.ppm.bz2.png | Bin 525 -> 0 bytes .../terminal/basic/images/xterm.ppm.bz2.png | Bin 525 -> 0 bytes admin-basics/terminal/index.txt | 168 - admin-basics/user-management/index.txt | 171 - asciidoc.conf | 5 - desktop-gnome/images/desktop-gnome.png | Bin 525 -> 0 bytes desktop-gnome/images/icon-evolution.png | Bin 525 -> 0 bytes desktop-gnome/images/icon-firefox.png | Bin 525 -> 0 bytes desktop-gnome/index.txt | 334 - .../images/kde-desktop-with-widgets.png | Bin 525 -> 0 bytes desktop-kde/images/kde-desktop.png | Bin 525 -> 0 bytes desktop-kde/images/kde-helpcenter.png | Bin 525 -> 0 bytes desktop-kde/images/kde-menu.png | Bin 525 -> 0 bytes desktop-kde/images/kde-panel.png | Bin 525 -> 0 bytes desktop-kde/images/kde-settings.png | Bin 525 -> 0 bytes desktop-kde/images/kde-widgets-rotate.png | Bin 525 -> 0 bytes desktop-kde/images/kde-widgets-select.png | Bin 525 -> 0 bytes desktop-kde/images/kde-widgets-unlock.png | Bin 525 -> 0 bytes desktop-kde/index.txt | 192 - desktop-lxde/images/desktop-lxde.png | Bin 525 -> 0 bytes desktop-lxde/images/lxde-setting-manager.png | Bin 525 -> 0 bytes desktop-lxde/index.txt | 134 - desktop-mate/images/desktop-mate.png | Bin 525 -> 0 bytes desktop-mate/index.txt | 420 - .../dolphin/images/dolphin-address.png | Bin 525 -> 0 bytes .../dolphin/images/dolphin-places.png | Bin 525 -> 0 bytes .../file-manager/dolphin/images/dolphin.png | Bin 525 -> 0 bytes .../file-manager/dolphin/index.txt | 132 - desktop-software/file-manager/index.txt | 16 - .../file-manager/pcmanfm/images/pcmanfm.png | Bin 525 -> 0 bytes .../file-manager/pcmanfm/index.txt | 21 - .../file-manager/thunar/index.txt | 23 - desktop-software/graphics/gimp/index.txt | 64 - .../graphics/gnomepaint/index.txt | 11 - desktop-software/graphics/index.txt | 16 - desktop-software/graphics/inkscape/index.txt | 48 - desktop-software/graphics/kde/index.txt | 32 - desktop-software/graphics/viewnior/index.txt | 25 - desktop-software/index.txt | 26 - desktop-software/internet/im/index.txt | 41 - .../im/kopete/images/kopete-settings.png | Bin 525 -> 0 bytes .../internet/im/kopete/images/kopete.png | Bin 525 -> 0 bytes desktop-software/internet/im/kopete/index.txt | 51 - desktop-software/internet/im/pidgin/index.txt | 73 - .../telepathy/images/telepathy-settings.png | Bin 525 -> 0 bytes .../im/telepathy/images/telepathy.png | Bin 525 -> 0 bytes .../internet/im/telepathy/index.txt | 58 - desktop-software/internet/index.txt | 5 - .../clawsmail/images/clawsmail-message.png | Bin 525 -> 0 bytes .../mail/clawsmail/images/clawsmail.png | Bin 525 -> 0 bytes .../internet/mail/clawsmail/index.txt | 61 - .../evolution/images/evolution-message.png | Bin 525 -> 0 bytes .../mail/evolution/images/evolution.png | Bin 525 -> 0 bytes .../internet/mail/evolution/index.txt | 63 - desktop-software/internet/mail/index.txt | 54 - .../mail/kmail/images/kmail-message.png | Bin 525 -> 0 bytes .../internet/mail/kmail/images/kmail.png | Bin 525 -> 0 bytes .../internet/mail/kmail/index.txt | 62 - .../internet/mail/thunderbird/index.txt | 73 - .../internet/web/chromium/images/chromium.png | Bin 525 -> 0 bytes .../internet/web/chromium/index.txt | 40 - .../internet/web/firefox/index.txt | 45 - desktop-software/internet/web/index.txt | 30 - .../web/konqueror/images/konqueror.png | Bin 525 -> 0 bytes .../internet/web/konqueror/index.txt | 42 - .../internet/web/midori/images/midori.png | Bin 525 -> 0 bytes .../internet/web/midori/index.txt | 45 - desktop-software/multimedia/amarok/index.txt | 9 - .../multimedia/audacious/index.txt | 31 - .../multimedia/audacity/images/audacity.png | Bin 525 -> 0 bytes .../multimedia/audacity/index.txt | 124 - .../multimedia/deadbeef/index.txt | 28 - desktop-software/multimedia/index.txt | 16 - desktop-software/multimedia/kde/index.txt | 10 - desktop-software/multimedia/kino/index.txt | 6 - .../office/abiword/images/abiword.png | Bin 525 -> 0 bytes desktop-software/office/abiword/index.txt | 20 - .../office/gnumeric/images/gnumeric.png | Bin 525 -> 0 bytes desktop-software/office/gnumeric/index.txt | 20 - desktop-software/office/index.txt | 12 - desktop-software/office/libreoffice/index.txt | 52 - desktop-software/office/openoffice/index.txt | 47 - desktop-software/others/brasero/index.txt | 41 - desktop-software/others/index.txt | 9 - desktop-software/others/k3b/images/k3b.png | Bin 525 -> 0 bytes desktop-software/others/k3b/index.txt | 20 - desktop-software/others/leafpad/index.txt | 16 - desktop-software/others/medit/index.txt | 23 - desktop-xfce/index.txt | 210 - docs.spec | 2 +- index.txt | 59 - install-guide/alternative-install.txt | 94 - install-guide/backup-before-install.txt | 31 - install-guide/bacula-select.txt | 11 - install-guide/boot.txt | 73 - install-guide/datetime.txt | 34 - install-guide/grub.txt | 21 - install-guide/hpc-node.txt | 19 - install-guide/images/bacula-select.png | Bin 525 -> 0 bytes install-guide/images/boot.png | Bin 525 -> 0 bytes install-guide/images/hpc-node.png | Bin 525 -> 0 bytes install-guide/images/installer-preinstall.png | Bin 525 -> 0 bytes install-guide/images/junior-cd2-install.png | Bin 525 -> 0 bytes install-guide/images/junior-cd2.png | Bin 525 -> 0 bytes install-guide/images/lilo.png | Bin 525 -> 0 bytes install-guide/images/office-desktop-auth.png | Bin 525 -> 0 bytes install-guide/images/pkg-groups.png | Bin 525 -> 0 bytes install-guide/images/small_cd-writer.png | Bin 20876 -> 0 bytes install-guide/images/sysconfig.png | Bin 525 -> 0 bytes install-guide/images/vm.png | Bin 525 -> 0 bytes install-guide/images/x11.png | Bin 525 -> 0 bytes install-guide/index.txt | 35 - install-guide/install-intro.txt | 35 - install-guide/installer-network.txt | 10 - install-guide/installer-preinstall.txt | 16 - install-guide/junior_cd2.txt | 11 - install-guide/license.txt | 16 - install-guide/lilo.txt | 19 - install-guide/luks-set-password.txt | 16 - install-guide/office-desktop-auth.txt | 7 - install-guide/pkg-groups.txt | 24 - install-guide/pkg.txt | 22 - install-guide/prepare-installation-media.txt | 139 - install-guide/release-notes.txt | 11 - install-guide/sysconfig.txt | 21 - install-guide/users-add.txt | 26 - install-guide/users-root.txt | 38 - install-guide/vm.txt | 184 - install-guide/x11.txt | 60 - old-docs/cmc_communication_stand.txt | 831 - old-docs/console_setup.txt | 121 - old-docs/corpnet.txt | 165 - old-docs/dhcp.txt | 140 - old-docs/emacs_email.txt | 364 - old-docs/emacs_im.txt | 939 - old-docs/filesystems_use.txt | 116 - old-docs/finding.txt | 111 - old-docs/firewall.txt | 122 - old-docs/freesoft_history.txt | 847 - old-docs/howto_use_nut.txt | 279 - old-docs/index.txt | 45 - old-docs/install_ltsp.txt | 109 - old-docs/junior_user.txt | 679 - old-docs/network.txt | 220 - old-docs/openvz.txt | 267 - old-docs/quickstart_desktop.txt | 65 - old-docs/scheme.txt | 222 - old-docs/sshd.txt | 186 - old-docs/ve_management.txt | 61 - old-docs/ve_rationale.txt | 336 - old-docs/zsh_intro.txt | 368 - packages/acc/alterator-packages-install.txt | 17 - packages/acc/alterator-pkg-add-repo.txt | 12 - packages/apt-get.txt | 375 - packages/apt-repo/apt-repo.txt | 9 - packages/index.txt | 58 - packages/manually/manually-add-repo.txt | 25 - packages/synaptic/synaptic-add-repo.txt | 15 - packages/synaptic/synaptic-install.txt | 15 - publican.cfg | 15 + rescue/index.txt | 89 - ru-RU/Author_Group.xml | 17 + ru-RU/Book_Info.xml | 47 + ru-RU/Preface.xml | 13 + ru-RU/Revision_History.xml | 27 + ru-RU/admin-basics/driver-saga--chapter.xml | 363 + ru-RU/admin-basics/index.xml | 11 + ru-RU/admin-basics/os-principles--chapter.xml | 810 + ru-RU/admin-basics/sumode--chapter.xml | 101 + ru-RU/desktop-environment/index.xml | 10 + ru-RU/desktop-environment/xfce/index.xml | 24 + .../xfce/running-applications.xml | 22 + .../xfce/settings-manager.xml | 188 + .../xfce/xfce4-desktop.xml | 128 + .../e-mail-section-thunderbird.xml | 121 + ru-RU/desktop-software/e-mail.xml | 71 + .../file-manager-section-thunar.xml | 46 + ru-RU/desktop-software/file-manager.xml | 22 + .../graphics-section-gimp.xml | 116 + ru-RU/desktop-software/graphics.xml | 18 + ru-RU/desktop-software/index.xml | 32 + .../instant-messaging-section-pidgin.xml | 106 + ru-RU/desktop-software/instant-messaging.xml | 54 + .../multimedia-section-audacious.xml | 52 + ru-RU/desktop-software/multimedia.xml | 16 + ...ffice-applications-section-libreoffice.xml | 90 + .../desktop-software/office-applications.xml | 16 + .../other-applications-section-brasero.xml | 103 + .../other-applications-section-medit.xml | 51 + ...er-applications-section-system-monitor.xml | 76 + ru-RU/desktop-software/other-applications.xml | 23 + .../web-navigation-section-firefox.xml | 73 + ru-RU/desktop-software/web-navigation.xml | 37 + ru-RU/docbook-samples/index.xml | 204 + ru-RU/docs.ent | 2 + ru-RU/docs.xml | 31 + .../images/alterator-not-browser-login.png | Bin .../images/alterator-not-browser.png | Bin .../images/boot-live.png | Bin .../images/datetime-0.png | Bin .../images/datetime-1.png | Bin .../images/desktop-xfce.png | Bin {system-start => ru-RU}/images/dm.png | Bin .../web/firefox => ru-RU}/images/firefox.png | Bin {install-guide => ru-RU}/images/grub.png | Bin .../images/hello.png | Bin ru-RU/images/icon.svg | 19 + .../images/installer-network.png | Bin .../images/libreoffice.png | Bin {install-guide => ru-RU}/images/license.png | Bin .../images/live-system.png | Bin .../images/luks-create-partition.png | Bin .../images/luks-enter-password.png | Bin .../images/luks-set-password.png | Bin .../images/lvm-create-logical-volume.png | Bin .../images/lvm-create-volume-group.png | Bin .../images/nm-applet-LMB.png | Bin .../images/nm-applet-RMB.png | Bin .../images/nm-applet-help.png | Bin .../images/nm-applet-pass.png | Bin .../images/pidgin-settings.png | Bin .../im/pidgin => ru-RU}/images/pidgin.png | Bin .../images/pkg-0.png | Bin {install-guide => ru-RU}/images/pkg.png | Bin .../images/prepare-hdd.png | Bin .../images/raid-create-partition.png | Bin .../images/raid-select-members.png | Bin .../images/release-notes.png | Bin .../images/set-language.png | Bin .../images/small_cd-writer.png | Bin .../images/system-boot.png | Bin .../thunar => ru-RU}/images/thunar.png | Bin .../images/thunderbird-message.png | Bin .../images/thunderbird.png | Bin {install-guide => ru-RU}/images/users-add.png | Bin .../images/users-root.png | Bin .../images/xfce-setting-manager.png | Bin .../install-distro/backup-before-install.xml | 41 + ru-RU/install-distro/boot-disk.xml | 215 + ru-RU/install-distro/index.xml | 30 + ru-RU/install-distro/install-add-root.xml | 55 + ru-RU/install-distro/install-add-user.xml | 41 + ru-RU/install-distro/install-datetime.xml | 59 + ru-RU/install-distro/install-grub.xml | 37 + ru-RU/install-distro/install-license.xml | 39 + .../install-load-from-boot-disk.xml | 45 + .../install-luks-set-password.xml | 34 + ru-RU/install-distro/install-network.xml | 25 + ru-RU/install-distro/install-order.xml | 76 + ru-RU/install-distro/install-prepare-hdd.xml | 283 + .../install-distro/install-release-notes.xml | 25 + ru-RU/install-distro/install-set-language.xml | 35 + ru-RU/install-distro/install-system.xml | 64 + ru-RU/install-distro/starting-os.xml | 121 + ru-RU/install-packages/index.xml | 29 + ru-RU/install-packages/install-from-cd.xml | 82 + .../install-from-external-repo.xml | 66 + ru-RU/support/index.xml | 10 + ru-RU/support/support-free.xml | 81 + ru-RU/support/support-paid.xml | 14 + ru-RU/system-management/acc.xml | 92 + ru-RU/system-management/index.xml | 19 + .../network-configuration.xml | 76 + ru-RU/system-management/printer.xml | 79 + ru-RU/whatis/index.xml | 17 + ru-RU/whatis/whatis-alt.xml | 112 + ru-RU/whatis/whatis-linux.xml | 127 + ru-RU/whatis/whatis-simply.xml | 59 + school-software/index.txt | 30 - school-software/integration/index_client.txt | 29 - school-software/integration/index_server.txt | 47 - school-software/moodle/images/admin.png | Bin 4386 -> 0 bytes school-software/moodle/images/assignment.png | Bin 13713 -> 0 bytes school-software/moodle/images/blocks.png | Bin 102949 -> 0 bytes school-software/moodle/images/card.png | Bin 12344 -> 0 bytes .../moodle/images/category-list.png | Bin 19746 -> 0 bytes .../moodle/images/correspondence.png | Bin 23531 -> 0 bytes school-software/moodle/images/course-add.png | Bin 8353 -> 0 bytes .../moodle/images/course-category.png | Bin 16950 -> 0 bytes .../moodle/images/course-description.png | Bin 13053 -> 0 bytes .../moodle/images/course-elements.png | Bin 11937 -> 0 bytes school-software/moodle/images/course-home.png | Bin 64818 -> 0 bytes school-software/moodle/images/course-name.png | Bin 40478 -> 0 bytes school-software/moodle/images/edit.png | Bin 80876 -> 0 bytes school-software/moodle/images/editor.png | Bin 10889 -> 0 bytes school-software/moodle/images/files.png | Bin 40224 -> 0 bytes school-software/moodle/images/forum.png | Bin 55429 -> 0 bytes school-software/moodle/images/login.png | Bin 43585 -> 0 bytes .../moodle/images/multi-select.png | Bin 14583 -> 0 bytes school-software/moodle/images/path.png | Bin 2031 -> 0 bytes .../moodle/images/question-bank.png | Bin 53783 -> 0 bytes .../moodle/images/question-page.png | Bin 26201 -> 0 bytes .../moodle/images/question-page2.png | Bin 19583 -> 0 bytes .../moodle/images/rename-files.png | Bin 43190 -> 0 bytes .../moodle/images/short-answer.png | Bin 25406 -> 0 bytes school-software/moodle/images/test.png | Bin 29562 -> 0 bytes school-software/moodle/images/theme.png | Bin 220728 -> 0 bytes school-software/moodle/images/unzip.png | Bin 9933 -> 0 bytes school-software/moodle/index.txt | 1215 -- school-software/programming/basic/index.txt | 29 - .../programming/codeblocks/index.txt | 12 - .../programming/geany/images/geany.png | Bin 84850 -> 0 bytes school-software/programming/geany/index.txt | 35 - school-software/programming/index.txt | 30 - school-software/programming/kturtle/index.txt | 22 - school-software/programming/kumir/index.txt | 18 - school-software/programming/pascal/index.txt | 33 - .../programming/unified_state_exam.txt | 71 - .../trainingsoft/gcompis/images/book.png | Bin 6100 -> 0 bytes .../trainingsoft/gcompis/images/computer.png | Bin 6685 -> 0 bytes .../trainingsoft/gcompis/images/discovery.png | Bin 6152 -> 0 bytes .../gcompis/images/experience.png | Bin 5834 -> 0 bytes .../trainingsoft/gcompis/images/fun.png | Bin 5073 -> 0 bytes .../trainingsoft/gcompis/images/math.png | Bin 6591 -> 0 bytes .../trainingsoft/gcompis/images/puzzles.png | Bin 4669 -> 0 bytes .../trainingsoft/gcompis/images/strategy.png | Bin 6256 -> 0 bytes .../trainingsoft/gcompis/index.txt | 47 - school-software/trainingsoft/index.txt | 34 - .../trainingsoft/kde-edu/images/blinken.png | Bin 1683 -> 0 bytes .../trainingsoft/kde-edu/images/kalgebra.png | Bin 1536 -> 0 bytes .../trainingsoft/kde-edu/images/kalzium.png | Bin 1241 -> 0 bytes .../trainingsoft/kde-edu/images/kanagram.png | Bin 1835 -> 0 bytes .../trainingsoft/kde-edu/images/kbruch.png | Bin 1630 -> 0 bytes .../kde-edu/images/kgeography.png | Bin 2247 -> 0 bytes .../trainingsoft/kde-edu/images/khangman.png | Bin 2092 -> 0 bytes .../trainingsoft/kde-edu/images/kig.png | Bin 1813 -> 0 bytes .../trainingsoft/kde-edu/images/kiten.png | Bin 1465 -> 0 bytes .../trainingsoft/kde-edu/images/klettres.png | Bin 1590 -> 0 bytes .../trainingsoft/kde-edu/images/kmplot.png | Bin 1775 -> 0 bytes .../kde-edu/images/kpercentage.png | Bin 1120 -> 0 bytes .../trainingsoft/kde-edu/images/kstars.png | Bin 1472 -> 0 bytes .../trainingsoft/kde-edu/images/ktouch.png | Bin 1409 -> 0 bytes .../trainingsoft/kde-edu/images/kturtle.png | Bin 814 -> 0 bytes .../trainingsoft/kde-edu/images/kwordquiz.png | Bin 1869 -> 0 bytes .../trainingsoft/kde-edu/images/marble.png | Bin 2259 -> 0 bytes .../trainingsoft/kde-edu/images/parley.png | Bin 1579 -> 0 bytes .../trainingsoft/kde-edu/images/step.png | Bin 2343 -> 0 bytes .../trainingsoft/kde-edu/index.txt | 60 - .../trainingsoft/logisim/index.txt | 14 - school-software/trainingsoft/maxima/index.txt | 17 - .../trainingsoft/scilab/images/scilab.png | Bin 21609 -> 0 bytes school-software/trainingsoft/scilab/index.txt | 40 - .../trainingsoft/teacher/images/class32.png | Bin 2913 -> 0 bytes .../trainingsoft/teacher/images/edit1.png | Bin 3554 -> 0 bytes .../trainingsoft/teacher/images/flag.png | Bin 2579 -> 0 bytes .../trainingsoft/teacher/images/itest.png | Bin 68609 -> 0 bytes .../trainingsoft/teacher/images/itest32.png | Bin 3907 -> 0 bytes .../teacher/images/itestserver32.png | Bin 3940 -> 0 bytes .../teacher/images/savedsessions32.png | Bin 4026 -> 0 bytes .../trainingsoft/teacher/index.txt | 95 - support/index.txt | 44 - system-management/acc/browser.txt | 34 - system-management/acc/gui.txt | 18 - system-management/acc/gui/acc-gnome.txt | 2 - system-management/acc/gui/acc-kde.txt | 1 - system-management/acc/gui/acc-lxde.txt | 2 - system-management/acc/gui/acc-mate.txt | 2 - system-management/acc/gui/acc-xfce.txt | 2 - .../acc/images/alterator-datetime.png | Bin 525 -> 0 bytes system-management/acc/images/alterator.png | Bin 525 -> 0 bytes system-management/acc/images/login.png | Bin 525 -> 0 bytes system-management/acc/index.txt | 32 - .../images/alterator-datetime.png | Bin 525 -> 0 bytes system-management/images/alterator.png | Bin 525 -> 0 bytes system-management/images/login.png | Bin 525 -> 0 bytes system-management/index.txt | 6 - .../images/knetworkmanager-settings.png | Bin 525 -> 0 bytes .../network/images/knetworkmanager.png | Bin 46613 -> 0 bytes system-management/network/index.txt | 3 - system-management/network/knetworkmanager.txt | 14 - system-management/network/networkmanager.txt | 36 - system-management/printer/printer-cups.txt | 66 - system-start/index.txt | 5 - system-start/system-boot.txt | 52 - system-start/system-login-dm.txt | 22 - whatis-alt/index.txt | 87 - whatis-distro/index.txt | 3 - whatis-linux/index.txt | 103 - 394 files changed, 5327 insertions(+), 31380 deletions(-) mode change 100644 => 100755 Makefile delete mode 100644 admin-basics/command-line.txt delete mode 100644 admin-basics/documentation/index.txt delete mode 100644 admin-basics/driver-saga.txt delete mode 100644 admin-basics/index.txt delete mode 100644 admin-basics/os-principles/index.txt delete mode 100644 admin-basics/sumode/index.txt delete mode 100644 admin-basics/syslog/index.txt delete mode 100644 admin-basics/terminal/basic/docs-linux_basics.txt delete mode 100644 admin-basics/terminal/basic/docs-linux_firststeps.txt delete mode 100644 admin-basics/terminal/basic/docs-linux_intro.txt delete mode 100644 admin-basics/terminal/basic/images/konqueror.ppm.bz2.png delete mode 100644 admin-basics/terminal/basic/images/startx.ppm.bz2.png delete mode 100644 admin-basics/terminal/basic/images/wm-menu.ppm.bz2.png delete mode 100644 admin-basics/terminal/basic/images/wmaker-winmenu.ppm.bz2.png delete mode 100644 admin-basics/terminal/basic/images/wmaker.ppm.bz2.png delete mode 100644 admin-basics/terminal/basic/images/xcalc.ppm.bz2.png delete mode 100644 admin-basics/terminal/basic/images/xterm.ppm.bz2.png delete mode 100644 admin-basics/terminal/index.txt delete mode 100644 admin-basics/user-management/index.txt delete mode 100644 asciidoc.conf delete mode 100644 desktop-gnome/images/desktop-gnome.png delete mode 100644 desktop-gnome/images/icon-evolution.png delete mode 100644 desktop-gnome/images/icon-firefox.png delete mode 100644 desktop-gnome/index.txt delete mode 100644 desktop-kde/images/kde-desktop-with-widgets.png delete mode 100644 desktop-kde/images/kde-desktop.png delete mode 100644 desktop-kde/images/kde-helpcenter.png delete mode 100644 desktop-kde/images/kde-menu.png delete mode 100644 desktop-kde/images/kde-panel.png delete mode 100644 desktop-kde/images/kde-settings.png delete mode 100644 desktop-kde/images/kde-widgets-rotate.png delete mode 100644 desktop-kde/images/kde-widgets-select.png delete mode 100644 desktop-kde/images/kde-widgets-unlock.png delete mode 100644 desktop-kde/index.txt delete mode 100644 desktop-lxde/images/desktop-lxde.png delete mode 100644 desktop-lxde/images/lxde-setting-manager.png delete mode 100644 desktop-lxde/index.txt delete mode 100644 desktop-mate/images/desktop-mate.png delete mode 100644 desktop-mate/index.txt delete mode 100644 desktop-software/file-manager/dolphin/images/dolphin-address.png delete mode 100644 desktop-software/file-manager/dolphin/images/dolphin-places.png delete mode 100644 desktop-software/file-manager/dolphin/images/dolphin.png delete mode 100644 desktop-software/file-manager/dolphin/index.txt delete mode 100644 desktop-software/file-manager/index.txt delete mode 100644 desktop-software/file-manager/pcmanfm/images/pcmanfm.png delete mode 100644 desktop-software/file-manager/pcmanfm/index.txt delete mode 100644 desktop-software/file-manager/thunar/index.txt delete mode 100644 desktop-software/graphics/gimp/index.txt delete mode 100644 desktop-software/graphics/gnomepaint/index.txt delete mode 100644 desktop-software/graphics/index.txt delete mode 100644 desktop-software/graphics/inkscape/index.txt delete mode 100644 desktop-software/graphics/kde/index.txt delete mode 100644 desktop-software/graphics/viewnior/index.txt delete mode 100644 desktop-software/index.txt delete mode 100644 desktop-software/internet/im/index.txt delete mode 100755 desktop-software/internet/im/kopete/images/kopete-settings.png delete mode 100755 desktop-software/internet/im/kopete/images/kopete.png delete mode 100644 desktop-software/internet/im/kopete/index.txt delete mode 100644 desktop-software/internet/im/pidgin/index.txt delete mode 100644 desktop-software/internet/im/telepathy/images/telepathy-settings.png delete mode 100755 desktop-software/internet/im/telepathy/images/telepathy.png delete mode 100644 desktop-software/internet/im/telepathy/index.txt delete mode 100644 desktop-software/internet/index.txt delete mode 100644 desktop-software/internet/mail/clawsmail/images/clawsmail-message.png delete mode 100644 desktop-software/internet/mail/clawsmail/images/clawsmail.png delete mode 100644 desktop-software/internet/mail/clawsmail/index.txt delete mode 100644 desktop-software/internet/mail/evolution/images/evolution-message.png delete mode 100644 desktop-software/internet/mail/evolution/images/evolution.png delete mode 100644 desktop-software/internet/mail/evolution/index.txt delete mode 100644 desktop-software/internet/mail/index.txt delete mode 100755 desktop-software/internet/mail/kmail/images/kmail-message.png delete mode 100755 desktop-software/internet/mail/kmail/images/kmail.png delete mode 100644 desktop-software/internet/mail/kmail/index.txt delete mode 100644 desktop-software/internet/mail/thunderbird/index.txt delete mode 100644 desktop-software/internet/web/chromium/images/chromium.png delete mode 100644 desktop-software/internet/web/chromium/index.txt delete mode 100644 desktop-software/internet/web/firefox/index.txt delete mode 100644 desktop-software/internet/web/index.txt delete mode 100644 desktop-software/internet/web/konqueror/images/konqueror.png delete mode 100644 desktop-software/internet/web/konqueror/index.txt delete mode 100644 desktop-software/internet/web/midori/images/midori.png delete mode 100644 desktop-software/internet/web/midori/index.txt delete mode 100644 desktop-software/multimedia/amarok/index.txt delete mode 100644 desktop-software/multimedia/audacious/index.txt delete mode 100755 desktop-software/multimedia/audacity/images/audacity.png delete mode 100644 desktop-software/multimedia/audacity/index.txt delete mode 100644 desktop-software/multimedia/deadbeef/index.txt delete mode 100644 desktop-software/multimedia/index.txt delete mode 100644 desktop-software/multimedia/kde/index.txt delete mode 100644 desktop-software/multimedia/kino/index.txt delete mode 100644 desktop-software/office/abiword/images/abiword.png delete mode 100644 desktop-software/office/abiword/index.txt delete mode 100644 desktop-software/office/gnumeric/images/gnumeric.png delete mode 100644 desktop-software/office/gnumeric/index.txt delete mode 100644 desktop-software/office/index.txt delete mode 100644 desktop-software/office/libreoffice/index.txt delete mode 100644 desktop-software/office/openoffice/index.txt delete mode 100644 desktop-software/others/brasero/index.txt delete mode 100644 desktop-software/others/index.txt delete mode 100755 desktop-software/others/k3b/images/k3b.png delete mode 100644 desktop-software/others/k3b/index.txt delete mode 100644 desktop-software/others/leafpad/index.txt delete mode 100644 desktop-software/others/medit/index.txt delete mode 100644 desktop-xfce/index.txt delete mode 100644 index.txt delete mode 100644 install-guide/alternative-install.txt delete mode 100644 install-guide/backup-before-install.txt delete mode 100644 install-guide/bacula-select.txt delete mode 100644 install-guide/boot.txt delete mode 100644 install-guide/datetime.txt delete mode 100644 install-guide/grub.txt delete mode 100644 install-guide/hpc-node.txt delete mode 100644 install-guide/images/bacula-select.png delete mode 100644 install-guide/images/boot.png delete mode 100644 install-guide/images/hpc-node.png delete mode 100644 install-guide/images/installer-preinstall.png delete mode 100644 install-guide/images/junior-cd2-install.png delete mode 100644 install-guide/images/junior-cd2.png delete mode 100644 install-guide/images/lilo.png delete mode 100644 install-guide/images/office-desktop-auth.png delete mode 100644 install-guide/images/pkg-groups.png delete mode 100644 install-guide/images/small_cd-writer.png delete mode 100644 install-guide/images/sysconfig.png delete mode 100644 install-guide/images/vm.png delete mode 100644 install-guide/images/x11.png delete mode 100644 install-guide/index.txt delete mode 100644 install-guide/install-intro.txt delete mode 100644 install-guide/installer-network.txt delete mode 100644 install-guide/installer-preinstall.txt delete mode 100644 install-guide/junior_cd2.txt delete mode 100644 install-guide/license.txt delete mode 100644 install-guide/lilo.txt delete mode 100644 install-guide/luks-set-password.txt delete mode 100644 install-guide/office-desktop-auth.txt delete mode 100644 install-guide/pkg-groups.txt delete mode 100644 install-guide/pkg.txt delete mode 100644 install-guide/prepare-installation-media.txt delete mode 100644 install-guide/release-notes.txt delete mode 100644 install-guide/sysconfig.txt delete mode 100644 install-guide/users-add.txt delete mode 100644 install-guide/users-root.txt delete mode 100644 install-guide/vm.txt delete mode 100644 install-guide/x11.txt delete mode 100644 old-docs/cmc_communication_stand.txt delete mode 100644 old-docs/console_setup.txt delete mode 100644 old-docs/corpnet.txt delete mode 100644 old-docs/dhcp.txt delete mode 100644 old-docs/emacs_email.txt delete mode 100644 old-docs/emacs_im.txt delete mode 100644 old-docs/filesystems_use.txt delete mode 100644 old-docs/finding.txt delete mode 100644 old-docs/firewall.txt delete mode 100644 old-docs/freesoft_history.txt delete mode 100644 old-docs/howto_use_nut.txt delete mode 100644 old-docs/index.txt delete mode 100644 old-docs/install_ltsp.txt delete mode 100644 old-docs/junior_user.txt delete mode 100644 old-docs/network.txt delete mode 100644 old-docs/openvz.txt delete mode 100644 old-docs/quickstart_desktop.txt delete mode 100644 old-docs/scheme.txt delete mode 100644 old-docs/sshd.txt delete mode 100644 old-docs/ve_management.txt delete mode 100644 old-docs/ve_rationale.txt delete mode 100644 old-docs/zsh_intro.txt delete mode 100644 packages/acc/alterator-packages-install.txt delete mode 100644 packages/acc/alterator-pkg-add-repo.txt delete mode 100644 packages/apt-get.txt delete mode 100644 packages/apt-repo/apt-repo.txt delete mode 100644 packages/index.txt delete mode 100644 packages/manually/manually-add-repo.txt delete mode 100644 packages/synaptic/synaptic-add-repo.txt delete mode 100644 packages/synaptic/synaptic-install.txt create mode 100644 publican.cfg delete mode 100644 rescue/index.txt create mode 100644 ru-RU/Author_Group.xml create mode 100644 ru-RU/Book_Info.xml create mode 100644 ru-RU/Preface.xml create mode 100644 ru-RU/Revision_History.xml create mode 100644 ru-RU/admin-basics/driver-saga--chapter.xml create mode 100644 ru-RU/admin-basics/index.xml create mode 100644 ru-RU/admin-basics/os-principles--chapter.xml create mode 100644 ru-RU/admin-basics/sumode--chapter.xml create mode 100644 ru-RU/desktop-environment/index.xml create mode 100644 ru-RU/desktop-environment/xfce/index.xml create mode 100644 ru-RU/desktop-environment/xfce/running-applications.xml create mode 100644 ru-RU/desktop-environment/xfce/settings-manager.xml create mode 100644 ru-RU/desktop-environment/xfce/xfce4-desktop.xml create mode 100644 ru-RU/desktop-software/e-mail-section-thunderbird.xml create mode 100644 ru-RU/desktop-software/e-mail.xml create mode 100644 ru-RU/desktop-software/file-manager-section-thunar.xml create mode 100644 ru-RU/desktop-software/file-manager.xml create mode 100644 ru-RU/desktop-software/graphics-section-gimp.xml create mode 100644 ru-RU/desktop-software/graphics.xml create mode 100644 ru-RU/desktop-software/index.xml create mode 100644 ru-RU/desktop-software/instant-messaging-section-pidgin.xml create mode 100644 ru-RU/desktop-software/instant-messaging.xml create mode 100644 ru-RU/desktop-software/multimedia-section-audacious.xml create mode 100644 ru-RU/desktop-software/multimedia.xml create mode 100644 ru-RU/desktop-software/office-applications-section-libreoffice.xml create mode 100644 ru-RU/desktop-software/office-applications.xml create mode 100644 ru-RU/desktop-software/other-applications-section-brasero.xml create mode 100644 ru-RU/desktop-software/other-applications-section-medit.xml create mode 100644 ru-RU/desktop-software/other-applications-section-system-monitor.xml create mode 100644 ru-RU/desktop-software/other-applications.xml create mode 100644 ru-RU/desktop-software/web-navigation-section-firefox.xml create mode 100644 ru-RU/desktop-software/web-navigation.xml create mode 100644 ru-RU/docbook-samples/index.xml create mode 100644 ru-RU/docs.ent create mode 100644 ru-RU/docs.xml rename {system-management/acc => ru-RU}/images/alterator-not-browser-login.png (100%) rename {system-management/acc => ru-RU}/images/alterator-not-browser.png (100%) rename admin-basics/terminal/basic/images/FreeDOS-Linux.dia.png => ru-RU/images/boot-live.png (100%) rename {install-guide => ru-RU}/images/datetime-0.png (100%) rename {install-guide => ru-RU}/images/datetime-1.png (100%) rename {desktop-xfce => ru-RU}/images/desktop-xfce.png (100%) rename {system-start => ru-RU}/images/dm.png (100%) rename {desktop-software/internet/web/firefox => ru-RU}/images/firefox.png (100%) rename {install-guide => ru-RU}/images/grub.png (100%) rename admin-basics/terminal/basic/images/IPTables.dia.png => ru-RU/images/hello.png (100%) create mode 100644 ru-RU/images/icon.svg rename {install-guide => ru-RU}/images/installer-network.png (100%) rename {desktop-software/office/libreoffice => ru-RU}/images/libreoffice.png (100%) rename {install-guide => ru-RU}/images/license.png (100%) rename admin-basics/terminal/basic/images/PC-Sh-Term-User.dia.png => ru-RU/images/live-system.png (100%) rename {install-guide => ru-RU}/images/luks-create-partition.png (100%) rename {system-start => ru-RU}/images/luks-enter-password.png (100%) rename {install-guide => ru-RU}/images/luks-set-password.png (100%) rename {install-guide => ru-RU}/images/lvm-create-logical-volume.png (100%) rename {install-guide => ru-RU}/images/lvm-create-volume-group.png (100%) rename {system-management/network => ru-RU}/images/nm-applet-LMB.png (100%) rename {system-management/network => ru-RU}/images/nm-applet-RMB.png (100%) rename {system-management/network => ru-RU}/images/nm-applet-help.png (100%) rename {system-management/network => ru-RU}/images/nm-applet-pass.png (100%) rename {desktop-software/internet/im/pidgin => ru-RU}/images/pidgin-settings.png (100%) rename {desktop-software/internet/im/pidgin => ru-RU}/images/pidgin.png (100%) rename admin-basics/terminal/basic/images/PC-Term-User.dia.png => ru-RU/images/pkg-0.png (100%) rename {install-guide => ru-RU}/images/pkg.png (100%) rename admin-basics/terminal/basic/images/dir-tree.tex.png => ru-RU/images/prepare-hdd.png (100%) rename {install-guide => ru-RU}/images/raid-create-partition.png (100%) rename {install-guide => ru-RU}/images/raid-select-members.png (100%) rename {install-guide => ru-RU}/images/release-notes.png (100%) rename admin-basics/terminal/basic/images/focus.ppm.bz2.png => ru-RU/images/set-language.png (100%) rename admin-basics/terminal/basic/images/kde-start.ppm.bz2.png => ru-RU/images/small_cd-writer.png (100%) rename {system-start => ru-RU}/images/system-boot.png (100%) rename {desktop-software/file-manager/thunar => ru-RU}/images/thunar.png (100%) rename {desktop-software/internet/mail/thunderbird => ru-RU}/images/thunderbird-message.png (100%) rename {desktop-software/internet/mail/thunderbird => ru-RU}/images/thunderbird.png (100%) rename {install-guide => ru-RU}/images/users-add.png (100%) rename {install-guide => ru-RU}/images/users-root.png (100%) rename {desktop-xfce => ru-RU}/images/xfce-setting-manager.png (100%) create mode 100644 ru-RU/install-distro/backup-before-install.xml create mode 100644 ru-RU/install-distro/boot-disk.xml create mode 100644 ru-RU/install-distro/index.xml create mode 100644 ru-RU/install-distro/install-add-root.xml create mode 100644 ru-RU/install-distro/install-add-user.xml create mode 100644 ru-RU/install-distro/install-datetime.xml create mode 100644 ru-RU/install-distro/install-grub.xml create mode 100644 ru-RU/install-distro/install-license.xml create mode 100644 ru-RU/install-distro/install-load-from-boot-disk.xml create mode 100644 ru-RU/install-distro/install-luks-set-password.xml create mode 100644 ru-RU/install-distro/install-network.xml create mode 100644 ru-RU/install-distro/install-order.xml create mode 100644 ru-RU/install-distro/install-prepare-hdd.xml create mode 100644 ru-RU/install-distro/install-release-notes.xml create mode 100644 ru-RU/install-distro/install-set-language.xml create mode 100644 ru-RU/install-distro/install-system.xml create mode 100644 ru-RU/install-distro/starting-os.xml create mode 100644 ru-RU/install-packages/index.xml create mode 100644 ru-RU/install-packages/install-from-cd.xml create mode 100644 ru-RU/install-packages/install-from-external-repo.xml create mode 100644 ru-RU/support/index.xml create mode 100644 ru-RU/support/support-free.xml create mode 100644 ru-RU/support/support-paid.xml create mode 100644 ru-RU/system-management/acc.xml create mode 100644 ru-RU/system-management/index.xml create mode 100644 ru-RU/system-management/network-configuration.xml create mode 100644 ru-RU/system-management/printer.xml create mode 100644 ru-RU/whatis/index.xml create mode 100644 ru-RU/whatis/whatis-alt.xml create mode 100644 ru-RU/whatis/whatis-linux.xml create mode 100644 ru-RU/whatis/whatis-simply.xml delete mode 100644 school-software/index.txt delete mode 100644 school-software/integration/index_client.txt delete mode 100644 school-software/integration/index_server.txt delete mode 100644 school-software/moodle/images/admin.png delete mode 100644 school-software/moodle/images/assignment.png delete mode 100644 school-software/moodle/images/blocks.png delete mode 100644 school-software/moodle/images/card.png delete mode 100644 school-software/moodle/images/category-list.png delete mode 100644 school-software/moodle/images/correspondence.png delete mode 100644 school-software/moodle/images/course-add.png delete mode 100644 school-software/moodle/images/course-category.png delete mode 100644 school-software/moodle/images/course-description.png delete mode 100644 school-software/moodle/images/course-elements.png delete mode 100644 school-software/moodle/images/course-home.png delete mode 100644 school-software/moodle/images/course-name.png delete mode 100644 school-software/moodle/images/edit.png delete mode 100644 school-software/moodle/images/editor.png delete mode 100644 school-software/moodle/images/files.png delete mode 100644 school-software/moodle/images/forum.png delete mode 100644 school-software/moodle/images/login.png delete mode 100644 school-software/moodle/images/multi-select.png delete mode 100644 school-software/moodle/images/path.png delete mode 100644 school-software/moodle/images/question-bank.png delete mode 100644 school-software/moodle/images/question-page.png delete mode 100644 school-software/moodle/images/question-page2.png delete mode 100644 school-software/moodle/images/rename-files.png delete mode 100644 school-software/moodle/images/short-answer.png delete mode 100644 school-software/moodle/images/test.png delete mode 100644 school-software/moodle/images/theme.png delete mode 100644 school-software/moodle/images/unzip.png delete mode 100644 school-software/moodle/index.txt delete mode 100644 school-software/programming/basic/index.txt delete mode 100644 school-software/programming/codeblocks/index.txt delete mode 100644 school-software/programming/geany/images/geany.png delete mode 100644 school-software/programming/geany/index.txt delete mode 100644 school-software/programming/index.txt delete mode 100644 school-software/programming/kturtle/index.txt delete mode 100644 school-software/programming/kumir/index.txt delete mode 100644 school-software/programming/pascal/index.txt delete mode 100644 school-software/programming/unified_state_exam.txt delete mode 100644 school-software/trainingsoft/gcompis/images/book.png delete mode 100644 school-software/trainingsoft/gcompis/images/computer.png delete mode 100644 school-software/trainingsoft/gcompis/images/discovery.png delete mode 100644 school-software/trainingsoft/gcompis/images/experience.png delete mode 100644 school-software/trainingsoft/gcompis/images/fun.png delete mode 100644 school-software/trainingsoft/gcompis/images/math.png delete mode 100644 school-software/trainingsoft/gcompis/images/puzzles.png delete mode 100644 school-software/trainingsoft/gcompis/images/strategy.png delete mode 100644 school-software/trainingsoft/gcompis/index.txt delete mode 100644 school-software/trainingsoft/index.txt delete mode 100644 school-software/trainingsoft/kde-edu/images/blinken.png delete mode 100644 school-software/trainingsoft/kde-edu/images/kalgebra.png delete mode 100644 school-software/trainingsoft/kde-edu/images/kalzium.png delete mode 100644 school-software/trainingsoft/kde-edu/images/kanagram.png delete mode 100644 school-software/trainingsoft/kde-edu/images/kbruch.png delete mode 100644 school-software/trainingsoft/kde-edu/images/kgeography.png delete mode 100644 school-software/trainingsoft/kde-edu/images/khangman.png delete mode 100644 school-software/trainingsoft/kde-edu/images/kig.png delete mode 100644 school-software/trainingsoft/kde-edu/images/kiten.png delete mode 100644 school-software/trainingsoft/kde-edu/images/klettres.png delete mode 100644 school-software/trainingsoft/kde-edu/images/kmplot.png delete mode 100644 school-software/trainingsoft/kde-edu/images/kpercentage.png delete mode 100644 school-software/trainingsoft/kde-edu/images/kstars.png delete mode 100644 school-software/trainingsoft/kde-edu/images/ktouch.png delete mode 100644 school-software/trainingsoft/kde-edu/images/kturtle.png delete mode 100644 school-software/trainingsoft/kde-edu/images/kwordquiz.png delete mode 100644 school-software/trainingsoft/kde-edu/images/marble.png delete mode 100644 school-software/trainingsoft/kde-edu/images/parley.png delete mode 100644 school-software/trainingsoft/kde-edu/images/step.png delete mode 100644 school-software/trainingsoft/kde-edu/index.txt delete mode 100644 school-software/trainingsoft/logisim/index.txt delete mode 100644 school-software/trainingsoft/maxima/index.txt delete mode 100644 school-software/trainingsoft/scilab/images/scilab.png delete mode 100644 school-software/trainingsoft/scilab/index.txt delete mode 100644 school-software/trainingsoft/teacher/images/class32.png delete mode 100644 school-software/trainingsoft/teacher/images/edit1.png delete mode 100644 school-software/trainingsoft/teacher/images/flag.png delete mode 100644 school-software/trainingsoft/teacher/images/itest.png delete mode 100644 school-software/trainingsoft/teacher/images/itest32.png delete mode 100644 school-software/trainingsoft/teacher/images/itestserver32.png delete mode 100644 school-software/trainingsoft/teacher/images/savedsessions32.png delete mode 100644 school-software/trainingsoft/teacher/index.txt delete mode 100644 support/index.txt delete mode 100644 system-management/acc/browser.txt delete mode 100644 system-management/acc/gui.txt delete mode 100644 system-management/acc/gui/acc-gnome.txt delete mode 100644 system-management/acc/gui/acc-kde.txt delete mode 100644 system-management/acc/gui/acc-lxde.txt delete mode 100644 system-management/acc/gui/acc-mate.txt delete mode 100644 system-management/acc/gui/acc-xfce.txt delete mode 100644 system-management/acc/images/alterator-datetime.png delete mode 100644 system-management/acc/images/alterator.png delete mode 100644 system-management/acc/images/login.png delete mode 100644 system-management/acc/index.txt delete mode 100644 system-management/images/alterator-datetime.png delete mode 100644 system-management/images/alterator.png delete mode 100644 system-management/images/login.png delete mode 100644 system-management/index.txt delete mode 100644 system-management/network/images/knetworkmanager-settings.png delete mode 100644 system-management/network/images/knetworkmanager.png delete mode 100644 system-management/network/index.txt delete mode 100644 system-management/network/knetworkmanager.txt delete mode 100644 system-management/network/networkmanager.txt delete mode 100644 system-management/printer/printer-cups.txt delete mode 100644 system-start/index.txt delete mode 100644 system-start/system-boot.txt delete mode 100644 system-start/system-login-dm.txt delete mode 100644 whatis-alt/index.txt delete mode 100644 whatis-distro/index.txt delete mode 100644 whatis-linux/index.txt diff --git a/Makefile b/Makefile old mode 100644 new mode 100755 index 8abc858..145f788 --- a/Makefile +++ b/Makefile @@ -1,46 +1,95 @@ -PROJECT = VARIANT -TOPLEVEL_DOC = index.txt -HTMLPAGE = $(TOPLEVEL_DOC:.txt=.html) -RESOURCE_FILES = /etc/asciidoc/ -docdir = /usr/local/share/doc/$(PROJECT) +# based on https://github.com/jhradilek/publican-makefile 87dc33d7e1 + +# General settings; change the path to the publican executable, the lang- +# uage in which the document is authored, the default configuration file, +# or the main file of your DocBook project: +PUBLICAN = publican +LANGUAGE = ru-RU +CONFIG = publican.cfg +MAINFILE = $(if $(findstring Book_Info.xml, $(wildcard $(XML_LANG)/*.xml)),Book,Article)_Info.xml + +# Known file extensions: +FILEEXTS = XML xml ENT ent PO po +IMAGEEXTS = BMP bmp CGM cgm DVI dvi EPS eps EQN eqn FAX fax GIF gif IGS \ + igs PCX pcx PDF pdf PIC pic PNG png SVG svg SWF swf TLB tbl \ + TEX tex WMF wmf WPG wpg PS ps SGML sgml TIFF tiff + +# Known directories: +FILEDIR := $(LANGUAGE) +BUILDDIR := tmp/$(LANGUAGE) + +PROJECT = simply-linux +#docdir = /usr/local/share/doc/$(PROJECT) +docdir = /tmp/$(PROJECT) DESTDIR = -A2X = a2x INSTALL = install -INSTALL_DATA = $(INSTALL) -m 644 -.PHONY: all install clean +# Essential prerequisites: +ALL := $(shell find ru-RU \( -name '.*' -prune \) -o -type f -print) +FILES := $(foreach ext, $(FILEEXTS), $(filter %.$(ext), $(ALL))) +IMAGES := $(foreach ext, $(IMAGEEXTS), $(filter %.$(ext), $(ALL))) -all: $(HTMLPAGE) +# Helper functions: +getoption = $(shell (grep -qe '^[ \t]*$(1):' $(CONFIG) && sed -ne 's/^[ \t]*$(1):[ \t]*"\?\([a-zA-Z0-9._ -]\+\).*/\1/p' $(CONFIG) || sed -ne 's/^.*<$(2)>\(.\+\)<\/$(2)>.*/\1/ip' $(XML_LANG)/$(MAINFILE)) | sed -e 's/[ \t]*$$//') -%.html: %.txt - $(A2X) -d book -f xhtml -a lang=ru \ - --icons -r $(RESOURCE_FILES) -r ./ \ - --xsltproc-opts='--stringparam toc.max.depth 2' \ - $< +# Helper variables: +EMPTY := +SPACE := $(EMPTY) $(EMPTY) +XML_LANG := $(subst $(SPACE),_,$(call getoption,xml_lang,NULL)) -chunked: $(TOPLEVEL_DOC) - $(A2X) -d book -f chunked -a lang=ru \ - --icons -r /etc/asciidoc/ -r ./ \ - --xsltproc-opts='--stringparam toc.max.depth 2' \ - $< +# The following are the make rules. Do not edit the rules unless you really +# know what you are doing: -pdf: $(TOPLEVEL_DOC) - $(A2X) --fop --fop-opts='-c fop.xconf' -d book -f pdf -a lang=ru \ - --xsltproc-opts=' \ - --stringparam toc.max.depth 2 \ - --stringparam title.font.family "Liberation Sans" \ - --stringparam body.font.family "Liberation Sans" \ - --stringparam monospace.font.family "Liberation Mono"' \ - $< +.PHONY: html-single +html-single: $(BUILDDIR)/html-single -install: all - $(INSTALL) -d $(DESTDIR)$(docdir)/images/icons/ - $(INSTALL_DATA) $(HTMLPAGE) $(DESTDIR)$(docdir)/ - $(INSTALL_DATA) docbook-xsl.css $(DESTDIR)$(docdir)/ - $(INSTALL_DATA) images/*.png $(DESTDIR)$(docdir)/images/ - $(INSTALL_DATA) images/icons/* $(DESTDIR)$(docdir)/images/icons/ +.PHONY: html-desktop +html-desktop: $(BUILDDIR)/html-desktop +.PHONY: html +html: $(BUILDDIR)/html + +.PHONY: epub +epub: $(BUILDDIR)/epub + +.PHONY: pdf +pdf: $(BUILDDIR)/pdf + +.PHONY: txt +txt: $(BUILDDIR)/txt + +.PHONY: all +all: html-desktop html-single html epub pdf txt + + +install: html-single $(wildcard html-desktop) + $(INSTALL) -d $(DESTDIR)$(docdir)/ + publican install_brand --path=$(DESTDIR)$(docdir)/ + +.PHONY: clean clean: - $(RM) -r index.xml $(HTMLPAGE) docbook-xsl.css images index.chunked index.fo index.pdf *~ + $(PUBLICAN) clean + +.PHONY: test +test: $(FILES) $(IMAGES) $(CONFIG) + $(PUBLICAN) build --config $(CONFIG) --langs $(LANGUAGE) --formats test + +$(BUILDDIR)/html-desktop: $(FILES) $(IMAGES) $(CONFIG) + $(PUBLICAN) build --config $(CONFIG) --langs $(LANGUAGE) --formats html-desktop --publish && touch $@ + +$(BUILDDIR)/html-single: $(FILES) $(IMAGES) $(CONFIG) + $(PUBLICAN) build --config $(CONFIG) --langs $(LANGUAGE) --formats html-single --publish && touch $@ + +$(BUILDDIR)/html: $(FILES) $(IMAGES) $(CONFIG) + $(PUBLICAN) build --config $(CONFIG) --langs $(LANGUAGE) --formats html --publish && touch $@ + +$(BUILDDIR)/epub: $(FILES) $(IMAGES) $(CONFIG) + $(PUBLICAN) build --config $(CONFIG) --langs $(LANGUAGE) --formats epub && touch $@ + +$(BUILDDIR)/pdf: $(FILES) $(IMAGES) $(CONFIG) + $(PUBLICAN) build --config $(CONFIG) --langs $(LANGUAGE) --formats pdf && touch $@ + +$(BUILDDIR)/txt: $(FILES) $(IMAGES) $(CONFIG) + $(PUBLICAN) build --config $(CONFIG) --langs $(LANGUAGE) --formats txt && touch $@ diff --git a/admin-basics/command-line.txt b/admin-basics/command-line.txt deleted file mode 100644 index fbf7bde..0000000 --- a/admin-basics/command-line.txt +++ /dev/null @@ -1,47 +0,0 @@ -== Знакомство с командной строкой == - -В этой главе вы познакомитесь с некоторыми особенностями командной строки. - -=== Специальные символы $ и # === - -При написании примеров команд довольно часто в начале ставится специальный -символ «$», показывающий, что набранное выполняется от имени простого -пользователя. Если же необходимы привилегии суперпользователя, то ставится -«#». - -Очень часто домашний каталог обозначается как «\~». -То есть, если имя пользователя bill, то ~ эквивалентно пути /home/bill. - -ПРОПИСНЫЕ и строчные буквы - это различные символы, и имена Name и name -- это различные имена. То есть возможно одновременное существование файлов -aaa и ААА в одной папке. - -=== Командные интерпретаторы === - -Bash - это стандартный линуксовский командный интерпретатор. Кроме того, -под linux существуют крайне различные его заменители (ash, fish, csh и другие). -Используемая оболочка прописана в опциях пользователя. - -По умолчанию, bash загружается сразу, как вы вошли в систему или запустили -какой-нибудь эмулятор терминала (Konsole, xterm, gnome-terminal и другие). -Собственно, он и обрабатывает всё, что вы вводите. - -=== Автодополнение. Экранирование === - -При выполнении команды (наборе пути) не нужно полностью всё писать. -Можно пользоваться клавишей «Tab». - -Например, вместо того, чтобы набирать - -$ cd /home/roganik/Рабочий\ стол/ - -можно набрать: - -$ cd /ho\{«TAB»\}/r\{«TAB»\}/Р\{«TAB»\} - -Так как пробел является специальным символом, разделяющим аргументы, -то при указании имени, содержащего пробел, нужно перед ним ставить бэкслэш (\ ). -Аналогично с символами типа *, ? и другими. Хотя можно путь взять в одиночные -или двойные кавычки. Зато это позволяет создавать файлы с именами, которые -невозможны в Windows/DOS. - diff --git a/admin-basics/documentation/index.txt b/admin-basics/documentation/index.txt deleted file mode 100644 index c5167b6..0000000 --- a/admin-basics/documentation/index.txt +++ /dev/null @@ -1,133 +0,0 @@ -== Документация == - -Каждый объект системы Linux обязательно сопровождается -документацией, описывающей их назначение и способы использования. От пользователя -системы не требуется заучивать все возможные варианты -взаимодействия с ней. Достаточно понимать основные принципы её устройства -и уметь находить справочную информацию. - -Не пренебрегайте чтением документации: она поможет вам избежать многих -сложностей, сэкономить массу времени и усилий при установке, настройке и -администрировании системы, поможет найти нужное для работы приложение и -быстро разобраться в нём. - -=== Экранная документация === - -Почти все системы семейства UNIX, включая систему Linux, имеют экранную -документацию. Её тексты содержат документацию по системным -командам, ресурсам, конфигурационным файлам и т. д., а также могут быть выведены на -экран в процессе работы. - -[float] -==== Man ==== - -Для доступа к экранной документации используется команда `man` (сокращение от -manual). Каждая страница руководства посвящена одному -объекту системы. Для того чтобы прочесть страницу руководства по программе, -необходимо набрать `man название_программы`. К примеру, если вы хотите узнать, какие -опции есть у команды `date`, вы можете ввести команду: - ----------------------------------------------------------- -$ man date ----------------------------------------------------------- - -Большинство экранной документации написано для пользователей, имеющих некоторое -представление о том, что делает данная команда. Поэтому -большинство текстов экранной документации содержит исключительно технические -детали команды без особых пояснений. Тем не менее, экранная документация -оказывается очень ценной в том случае, если вы помните название команды, но -её синтаксис просто выпал у вас из памяти. - -Поиск по описаниям `man` осуществляется командой `apropos`. Если вы точно -не знаете, как называется необходимая вам программа, -то поиск осуществляется по ключевому слову, к примеру, -`apropos date` или при помощи ввода слова, обозначающего нужное действие, -после команды `man -k` (например, `man -k copy`). Слово, характеризующее -желаемое для вас действие, можно вводить и на русском языке. При наличии -русского перевода страниц руководства `man` результаты поиска будут выведены -на запрашиваемом языке. - -«Страница руководства» занимает, как правило, больше одной страницы экрана. -Для того чтобы читать было удобнее, `man` запускает программу постраничного -просмотра текстов. Страницы перелистывают пробелом, для выхода из -режима чтения описания команд `man` необходимо нажать на клавиатуре *q*. -Команда `man man` выдаёт справку по пользованию самой командой `man`. - -Документация в подавляющем большинстве случаев пишется на простом английском -языке. Необходимость писать на языке, который будет более или менее -понятен большинству пользователей, объясняется постоянным развитием Linux. -Дело не в том, что страницу руководства нельзя перевести, а в том, что её -придётся переводить всякий раз, когда изменится описываемый ею объект! -Например, выход новой версии программного продукта сопровождается изменением -его возможностей и особенностей работы, а следовательно, и новой версией -документации. - -Тем не менее, некоторые наиболее актуальные руководства существуют -в переводе на русский язык. Свежие версии таких переводов на русский язык -собраны в пакете `man-pages-ru`. Установив этот пакет, вы добавите в систему -руководства, для которых есть перевод, и `man` по умолчанию будет отображать их -на русском языке. - -[float] -==== Info ==== - -Другой источник информации о Linux и составляющих его программах -- справочная -подсистема `info`. Страница руководства, несмотря на обилие ссылок различного -типа, остаётся «линейным» текстом, структурированным только логически. -Документ `info` -- это настоящий гипертекст, в котором множество небольших -страниц объединены в дерево. В каждом разделе документа `info` всегда есть -оглавление, из которого можно перейти к нужному подразделу, а затем -вернуться обратно (ссылки для перемещения по разделам текста помечены `*`). -Для получения вспомогательной информации о перемещении по тексту используйте клавишу `h`. -Полное руководство `info` вызывается командой -`info info`. Команда `info`, введённая без параметров, предлагает пользователю -список всех документов `info`, установленных в системе. - -=== Документация по пакетам === - -Дополнительным источником информации об интересующей вас программе, -в основном на английском языке, является -каталог `/usr/share/doc` -- место хранения разнообразной документации. - -Каждый пакет также содержит поставляемую вместе с включённым в него -ПО документацию, располагающуюся обычно в каталоге -`/usr/share/doc/имя_пакета`. Например, документация к пакету -`foo-1.0-alt1` находится в `/usr/share/doc/foo-1.0-alt1`. -Для получения полного списка файлов документации, относящихся к -пакету, воспользуйтесь командой `rpm -qld имя_установленного_пакета`. - -В документации к каждому пакету вы можете найти такие файлы как -`README`, `FAQ`, `TODO`, `СhangeLog` и другие. В файле `README` -содержится основная информация о программе -- имя и контактные -данные авторов, назначение, полезные советы и пр. `FAQ` -содержит ответы на часто задаваемые вопросы; этот файл стоит -прочитать в первую очередь, если у вас возникли проблемы -или вопросы по использованию программы, поскольку большинство -проблем и сложностей типичны, вполне вероятно, что -в `FAQ` вы тут же найдёте готовое решение. В файле `TODO` записаны -планы разработчиков на реализацию той или иной -функциональности. В файле `СhangeLog` записана история изменений -в программе от версии к версии. - -Для поиска внешней информации о программе, например, адреса сайта программы в -сети Интернет можно использовать команду `rpm -qi имя_установленного_пакета`. -В информационном заголовке соответствующего пакета, среди прочей информации, -будет выведена искомая ссылка. - -Возможно, будет полезно знать расположение собрания практических -рекомендаций по самым различным вопросам, связанным с использованием Linux. -Файлы `HOWTO` в формате HTML (от англ. how to -- «как сделать») каталога -`/usr/share/doc/HOWTO/` (при условии их наличия в системе) содержат -многообразную информацию о работе Linux-систем. - -=== Документация к программам, имеющим графический интерфейс === - -Каждая программа, имеющая графический интерфейс, как правило, сопровождается справочной -информацией, вызываемой из меню программы. Обычно, это разделы меню *Справка*. - -По обыкновению, это меню предоставляет информацию о программе, её версии, -лицензии и авторах. В большинстве случаев, справка содержит встроенное руководство, ссылки на локальные -сведения и интернет-страницы документации на официальных сайтах программ -(традиционная кнопка *F1*), информацию о сочетании клавиш, а также сообщения -о процедурах и отладке в программе. - diff --git a/admin-basics/driver-saga.txt b/admin-basics/driver-saga.txt deleted file mode 100644 index b0afc38..0000000 --- a/admin-basics/driver-saga.txt +++ /dev/null @@ -1,301 +0,0 @@ -== Работа с оборудованием в Linux. «Сага о Драйверах» == - -Когда компьютеры назывались «электронно-вычислительными машинами», они были -размерами в среднем с кухонный гарнитур и занимались почти исключительно -вычислениями. Ввод и вывод данных воспринимался пользователями ЭВМ -- -учёными-математиками -- как нечто необходимое, но к работе ЭВМ имеющее лишь -косвенное отношение. Учёного было довольно просто обучить, чтобы он составлял -программы и оформлял входные данные для расчётов одним каким-нибудь способом, -например, при помощи перфокарт. Подключение к компьютеру какого-нибудь другого -устройства было делом трудоёмким, так как требовало усилий и электронщика, и -программиста. Да и нужно это было нечасто. - -Нынешний компьютер -- игрушка не учёного, а любого рядового обывателя. Это -бытовой прибор. Мало того, компьютер -- это «самый умный» бытовой прибор: -если имеется какой-нибудь другой бытовой прибор (скажем, кофеварка), -прогрессивный обыватель тут же задумывается, нельзя ли обучить компьютер -управлять этим прибором (скажем, варить кофе за минуту до приезда хозяина). В -идеале получается «электронный дом», в котором работу любого оборудования можно -контролировать, не вставая из-за рабочего места или даже не садясь за него, -- -посредством сети Интернет. - -Самое поверхностное суждение об оборудовании и компьютере -- что для подключения -прибора нужна волшебная субстанция по имени «драйвер». Есть драйвер -- компьютер -оборудование «видит», нет драйвера -- «не видит». - -Это суждение во многом неверно. - -=== Что такое «оборудование»? === - -Что и как можно подключить к компьютеру? Во-первых, на поверхности его корпуса -обычно наблюдается множество разнообразных отверстий и разъёмов, очевидно, -предназначенных для того, чтобы туда что-то подключали. Уже подключены: -клавиатура, мышь, монитор, возможно, принтер, наушники или колонки. Много -отверстий остаётся неиспользованными, но и аппаратуры в «электронном доме» ещё -много -- от КПК до той же кофеварки (если на ней есть соответствующий разъём). - -Во-вторых, внутри компьютера имеются специальные разъёмы для подключения к ним -*плат расширения*: устройств, выглядящих не как бытовой прибор, а скорее как -деталь самого компьютера. Таковы видеоадаптеры, сетевые адаптеры, «внутренние» -модемы и т. п. Эти устройства -- главный источник «Саги о Драйверах», потому что -их много, и создатели каждого такого устройства желают сохранить его устройство -втайне от конкурентов, прилагая к ним вместо документации ту самую волшебную субстанцию -с пометкой «нажмите кнопку «Пуск» и попытайтесь расслабиться: от вас уже ничего -не зависит». - -В-третьих, ещё глубже внутри компьютера есть какие-то устройства, которые нельзя -ни отключить, ни подключить, однако они используются при работе, имеют какое-то -название и на разных компьютерах могут весьма отличаться. Например, звуковые -подсистемы могут быть интегрированными, а могут быть выполненными в виде платы -расширения, отличаясь редкостным разнообразием моделей и однообразием функций -(разъём для микрофона, разъём(ы) для колонок, линейный вход, ... что-то ещё?). -Или устройство, к которому подключаются жёсткие диски: оно может быть рассчитано -на 1 диск, 2, 4, иногда -- более, иметь разные дополнительные свойства и тоже -требовать «драйвера» -- по крайней мере, поддержки со стороны системы. - -Что точно отличает один прибор от другого -- это внешний вид разъёма, с помощью -которого они подключаются к компьютеру. Очевидно, приборами, подключёнными к -разъёмам разного типа, машина управляет существенно по-разному. Более того, -разъёмы настолько различны, что соединительный кабель одного типа просто не -влезет в разъём другого. Но всё равно это не решает проблемы идентификации: -например, мышь, подключённая к разъёму (порту) USB, отлично работает, а с -цифровой фотокамерой как-то спроста не получается. Опять «драйвер» нужен? - -Можно добавить, что некоторое оборудование вообще не нуждается в том, чтобы -машине объявляли о его существовании: так, что бы ни подключалось к аналоговому -звуковому входу, работать оно будет одинаково, компьютер не отличит колонки от -наушников, да и отсутствия их не заметит. Словом, наружное наблюдение не даёт -достаточно информации о том, как работать с оборудованием. На помощь должна -прийти документация, но если в ней опять встретится слово «драйвер», оно может -означать что угодно: слишком оно неопределённое. - -=== Как распознаётся оборудование? === - -Попробуем внести определённость. Какую информацию относительно подключаемого -прибора получает компьютер, и как он её получает? - -Очевидно, «с той стороны» каждого разъёма (допустим, USB, в который мы -воткнули flash-диск) имеется какое-то оборудование, которое позволяет им -пользоваться (как и USB-мышкой, USB-принтером и т. п). Это оборудование: - -- определяет тип подключённого устройства; -- управляет им (может, например, выключить или включить); -- передаёт на это устройство данные и/или принимает их оттуда. - -Такое оборудование называется *шиной* (bus). Этимология этого слова, что -русского, что английского, загадочна и восходит к доисторическим временам, -когда компьютеры назывались «ЭВМ». - -Шин в компьютере несколько (по количеству различных типов -разъёмов). Есть совсем «глупые» шины -- например, порт последовательного -ввода-вывода (к нему подключаются мыши и прочая аппаратура «старого образца»). -Глупость их в том, что информацию о типе подключённого оборудования приходится -задавать вручную: либо заранее, либо с помощью наводящих вопросов пользователю. - -Есть шины весьма «умные», способные опросить и понять множество характеристик -подключённого устройства. Такова, например, шина PCI -- наиболее распространённое -на сегодня оборудование для подключения плат расширения. Любопытный пользователь -может посмотреть список устройств, подключённых к шине PCI с помощью команды -`lspci` (от «list PCI», команда из пакета _pciutils_): - ----------------------------------------------------------------- -[tmpuser@arnor tmpuser]$ lspci - -0000:00:00.0 Host bridge: VIA Technologies, Inc. VT8377 [KT400/KT600 AGP] Host Bridge (rev 80) -0000:00:01.0 PCI bridge: VIA Technologies, Inc. VT8237 PCI Bridge -0000:00:0f.0 RAID bus controller: VIA Technologies, Inc. VIA VT6420 SATA RAID Controller (rev 80) -0000:00:0f.1 IDE interface: VIA Technologies, Inc. VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE (rev 06) -0000:00:10.0 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 81) -0000:00:10.1 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 81) -0000:00:10.2 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 81) -0000:00:10.3 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 81) -0000:00:10.4 USB Controller: VIA Technologies, Inc. USB 2.0 (rev 86) -0000:00:11.0 ISA bridge: VIA Technologies, Inc. VT8237 ISA bridge [KT600/K8T800/K8T890 South] -0000:00:11.5 Multimedia audio controller: VIA Technologies, Inc. VT8233/A/8235/8237 AC97 Audio Controller (rev 60) -0000:00:12.0 Ethernet controller: VIA Technologies, Inc. VT6102 [Rhine-II] (rev 78) -0000:01:00.0 VGA compatible controller: ATI Technologies Inc Radeon R100 QD [Radeon 7200] ----------------------------------------------------------------- - -Из устройств на иллюстрации только одно -- видеокарта Radeon 72002 -- в -действительности является платой расширения, все остальные интегрированы в -системную плату (бывает и по-другому). Тип устройства -- «Multimedia audio -controller», «Ethernet controller», «VGA compatible controller» и т. п. --- лишь небольшая часть информации, которую шине рассказали о себе подключённые -к ней устройства. - -К шине PCI в качестве устройства подключена другая шина -- USB, служащая для -подсоединения внешних устройств. Она тоже довольно «умная», а ещё отличается тем, -что устройства подключаются к ней и отключаются от неё довольно часто. Существует -команда `lsusb` (из пакета, естественно, usbutils), но ею, как и `lspci`, -приходится пользоваться нечасто (она даже убрана в каталог `/usr/sbin`): - ---------------------------------------- -[tmpuser@arnor tmpuser]$ /usr/sbin/lsusb -Bus 005 Device 001: ID 0000:0000 -Bus 004 Device 001: ID 0000:0000 -Bus 003 Device 001: ID 0000:0000 -Bus 002 Device 002: ID 046d:c00c Logitech, Inc. Optical Wheel Mouse -Bus 002 Device 001: ID 0000:0000 -Bus 001 Device 003: ID 08ec:0012 M-Systems Flash Disk Pioneers -Bus 001 Device 001: ID 0000:0000 ---------------------------------------- - -Пример показывает пять USB-шин (это совпадает с данными `lspci`), к первой из -которых подключён flash-диск, а ко второй -- мышь. Как правило, устройство -определяется шиной, после чего специально обученная системная программа -производит все действия, необходимые для того, чтобы этим устройством можно -было воспользоваться. Например, для flash-диска потребовалось дополнительно -загрузить модуль ядра usb_storage, и смонтировать содержимое диска -в каталог `/media/usbdisk`. - -Специальный каталог `/sys` отражает представление системы о присоединённых к ней -устройствах. В частности, все найденные на шинах устройства перечислены в виде -подкаталогов `/sys/bus/шина/devices`. Если устройство установлено, а «умная шина», -наподобие PCI или USB, его не заметила -- скорее всего, неполадка аппаратная -(несовместимое или неисправное устройство, таракан в разъёме и т. п.). - -Бывает и так: устройство (видеокарта, модем, кофеварка) на шине появилось, -а воспользоваться им не удаётся. Видимо, чего-то не хватает... драйвера? - -=== Что такое «драйвер» и где он находится? === - -В самом деле, чего может не хватать, если устройство распозналось, марка -устройства известна и как передавать данные по шине -- тоже известно? Не -хватает главного: сведений о том, какие данные надо передавать, чтобы добиться -от устройства желаемого эффекта. Что передать по шине USB, чтобы кофеварка -выключилась? Какие байты записать в последовательный порт модема, чтобы он -повесил трубку? Что сделать с видеокартой, чтобы всё было быстро и -непременно 3d!? - -Это вот «какие данные» -- и есть «драйвер». Драйвер может быть где угодно, на -любом уровне системы: от модуля ядра до пользовательской программы и -даже её конфигурационного файла. - -Типичные варианты: - -- Драйвер -- *модуль ядра*, подсказывающий шине, как правильно обращаться с -устройством. Это, как правило, относится к PCI-устройствам и стандартным -USB-устройствам. Подключается к ядру командой `modprobe` имя_модуля -(или `insmod`). Распознанные и классифицированные устройства (те, -для которых есть драйвер-модуль ядра) отображаются в виде подкаталогов -`/sys/class/класс_устройства/`. - -- Драйвер видеокарты -- модуль графической подсистемы X11 (X.Org). Подгружается -при старте графической оболочки, достаточно лишь указать его в настройках X.Org -(с помощью конфигуратора или вручную в файле `/etc/X11/xorg.conf`). Часто -требуется и специальный модуль ядра (возможно, несколько), организующий доступ -к видеопамяти. - -- Драйверы принтера и модема -- описание характеристик для, соответственно, -подсистемы печати и программы-«звонилки». Что с ними делать дальше, -расскажет документация. - -- Драйвер -- прикладная программа или дополнение (plug-in) к ней (например, -драйвер сканера -- дополнение утилиты _sane_, а с некоторыми цифровыми -проигрывателями звука «iRiver» можно взаимодействовать с помощью утилиты -`ifp` из пакета ifp-line). Здесь главное -- название программы, а драйвер, -скорее всего, уже включён в дистрибутив. - -В последнем случае нет никакой зримой информации о том, что устройством действительно -можно пользоваться -- до тех пор, пока не запущена соответствующая прикладная -программа с соответствующими настройками (особенно это касается «глупых» шин, -наподобие последовательного порта). И в любом случае, самостоятельная установка -«драйвера» должна сопровождаться вдумчивым чтением документации к нему. - -=== Опять «устройство»? === - -В документации Linux термин «устройство» (device) часто используется не в -значении «прибор», а в значении «элемент каталога `/dev`». Что это такое? - -Прибор подключается к машине, как правило, для того чтобы передавать на него -какие-то данные и/или получать их оттуда. Если задача компьютера -- управлять -внешним устройством, это всё равно можно рассматривать как передачу управляющих -данных и приём диагностических. Во многих случаях передачу данных проще всего -вести в синхронном (поточном) режиме, точно так же, как это делается при работе -с файлом: открыть файл -- записать данные -- закрыть файл или открыть -- прочитать --- закрыть. Если бы можно было представить внутренность прибора в виде файла, -работа с ним пошла бы легче. Это означало бы, что система знает, как и куда -передавать данные, а дело пользовательской программы -- эти данные понимать. - -В большинстве случаев именно так и устроено в Linux. После того, как система -распознала внешнее устройство, а служба hotplug, при необходимости, загрузила -соответствующий модуль ядра, в каталоге `/dev` заводится новый «файл», содержимое -которого отражает содержимое подключённого устройства, не занимая при этом места -на жёстком диске. Такой файл называется файлом-дыркой, его можно представить как -отверстие в файловой системе, через которое видно не содержимое жёсткого диска, -а данные, попадающие туда с «другой стороны» -- со стороны подключённого внешнего -устройства. Например, гибкий диск в дисководе представляется в виде файла-дырки -`/dev/fd0`, (от floppy disk 0), а мышь -- в виде `/dev/mouse` (строго говоря -`/dev/mouse` -- это обычно символьная ссылка на актуальный файл-дырку -- скажем -`/dev/psaux`, порт PS/2). - -В документации вместо «файл-дырка» чаще всего пишут просто «устройство» -(device), а устройство-прибор -- «внешним устройством». Если соответствующего -устройства в каталоге `/dev/` нет, значит, в цепочке его распознавания есть -слабое звено. - -Стоит напомнить, что файл-дырка, однако, не обязан существовать и непременно -соответствовать одному внешнему устройству. Устройства, подключаемые ко второму -последовательному порту, например, всегда видны как `/dev/ttyS1` (а к первому -- -как ttyS0). Фактически, ttyS -- это файл-дырка шины, настолько простой, что -дальнейшее выяснение типа устройства перекладывается на программу пользователя. - -Другой пример -- это работа с аппаратурой по шине USB. USB-шин в системе -зарегистрировано несколько, и к каждому можно подключить одно или несколько -устройств. Для них, независимо от типа устройства, заводятся файлы-дырки вида -usbdev.шина.номер, где каждому новому подключённому устройству просто выдаётся -очередной номер. Некоторые звуковые проигрыватели и цифровые фотокамеры -распознаются как flash-диски; тогда в дополнение к нетипизированному -файлу-дырке создаётся одна или даже несколько дисковых (допустим, само дисковое -устройство `/dev/sda` и единственный раздел с файловой системой на нём `/dev/sda1`, -который и монтируется в `/media/usbdisk`). Другие фотокамеры умеют больше, чем -обычный диск: например, транслировать изображение и/или звук. И для них -существуют специальные утилиты, например, gphoto2. В этом случае никакого -дополнительного файла-дырки, за исключением `/dev/usbdev`.шина.номер, не создаётся, -и о типе подключённого аппарата догадывается сама gphoto2. - -=== Кто виноват и что делать? === - -Итак, новый подключённый к компьютеру прибор не распознался «сам собой», -и программы, которые должны были с ним работать, не работают. - -- Для начала стоит посмотреть на системную консоль (клавиши *Ctrl* + *Alt* + *F12*) - и в файл `/var/log/messages`, возможно, системная диагностика подскажет, в чём дело. - (Пропустите этот пункт, если используете систему инициализации `systemd`.) -- Неполадки могут быть аппаратными (проверяется в `/sys/bus` или с помощью lspci, - как сказано выше). -- Hotplug или другая программа автораспознавания может не знать про конкретный - подключённый прибор (придётся в режиме суперпользователя вручную загрузить - модуль с помощью modprobe, а чтобы не делать этого каждый раз -- - отредактировать `/etc/modules.conf`). -- Возможно, внешнее устройство распозналось и модуль для него есть, но служба - udevd, которая заводит файлы-дырки в `/dev`, выбрала другое название или вовсе - не завела нужного устройства (надо проанализировать содержимое `/dev` и, - возможно, настроить udev или саму прикладную программу). -- Ваше устройство может быть слишком новым, а дистрибутив Linux может оказаться - слишком старым. В этом случае рекомендуется обновить части системы, - содержащие «драйвер» (в зависимости от ситуации -- модуль ядра, само ядро, - графическую оболочку или её библиотеку, прикладную программу и т.п.). -- Стоит проверить, что сказано о вашем устройстве в сетевых информационных - ресурсах (здесь поможет `lspci` или подобные ей утилиты, а - также http://www.google.com). Вполне вероятно, там посоветуют загрузить - некий заранее собранный модуль ядра (назовут его, конечно, «драйвером») - либо подскажут, какую именно программу следует использовать. -- Наконец, ваше устройство может просто не поддерживаться. Печально, но факт: - некоторые производители аппаратуры настолько дорожат своими мелкими - секретами, что не только не документируют устройство своих устройств, но - тщательно скрывают его. Как следствие, Linux-сообщество не в состоянии быстро - обеспечить поддержку таинственного прибора. Производители предпочитают писать - «драйверы» (хорошие ли, плохие) за свои деньги, а некоторые - ограничиваются только одной, самой распространённой на сегодня, - пользовательской программной платформой. И это пока, к сожалению, не Linux. - -Сказанное выше означает, что после каждого обновления системы устройство, -ранее распознававшееся с трудом или вовсе не распознававшееся, может -преспокойно заработать, особенно если это устройство относительно новое. -Кроме того, стоит со всем вниманием относиться к ситуации, когда производитель -прибора не просто анонсирует совместимость с Linux, а предлагает «драйверы» -собственного изготовления. И последнее: если вы не в силах справиться с -«драйвером» в одиночку, обращайтесь к Linux-сообществу! Вы или получите -решение задачи, или в очередной раз подтвердите, что её стоит решать -- -и тем самым приблизите решение. diff --git a/admin-basics/index.txt b/admin-basics/index.txt deleted file mode 100644 index 8d3906a..0000000 --- a/admin-basics/index.txt +++ /dev/null @@ -1,19 +0,0 @@ -= Основы администрирования Linux = - -include::terminal/index.txt[] - -include::os-principles/index.txt[Общие принципы работы ОС] - -include::sumode/index.txt[Режим суперпользователя] - -include::command-line.txt[Знакомство с командной строкой] - -include::systemd_and_sysvinit/index.txt[Загрузка системы, systemd и sysvinit] - -include::user-management/index.txt[Управление пользователями] - -include::syslog/index.txt[Что происходит в системе] - -include::driver-saga.txt[Работа с оборудованием в Linux. «Сага о Драйверах»] - -include::documentation/index.txt[] diff --git a/admin-basics/os-principles/index.txt b/admin-basics/os-principles/index.txt deleted file mode 100644 index 50bf8ed..0000000 --- a/admin-basics/os-principles/index.txt +++ /dev/null @@ -1,520 +0,0 @@ -== Общие принципы работы ОС == - -=== Процессы и файлы === - -ОС (DISTRO) является многопользовательской интегрированной системой. Это -значит, что она разработана в расчете на одновременную работу нескольких -пользователей. - -Пользователь может либо сам работать в системе, выполняя некоторую -последовательность команд, либо от его имени могут выполняться прикладные -процессы. - -Пользователь взаимодействует с системой через командный интерпретатор, который -представляет собой, как было сказано выше, прикладную программу, которая -принимает от пользователя команды или набор команд и транслирует их в системные -вызовы к ядру системы. Интерпретатор позволяет пользователю просматривать -файлы, передвигаться по дереву файловой системы, запускать прикладные процессы. -Все командные интерпретаторы UNIX имеют развитый командный язык и позволяют -писать достаточно сложные программы, упрощающие процесс администрирования -системы и работы с ней. - -[float] -==== Процессы функционирования ОС ==== - -Все программы, которые выполняются в текущий момент времени, называются -процессами. Процессы можно разделить на два основных класса: системные процессы -и пользовательские процессы. Системные процессы -- программы, решающие -внутренние задачи ОС, например, организацию виртуальной памяти на диске или -предоставляющие пользователям те или иные сервисы (процессы-службы). - -Пользовательские процессы -- процессы, запускаемые пользователем из командного -интерпретатора для решения задач пользователя или управления системными -процессами. Linux изначально разрабатывался как многозадачная система. Он -использует технологии, опробованные и отработанные другими реализациями UNIX, -которые существовали ранее. - -Фоновый режим работы процесса -- режим, когда программа может работать без -взаимодействия с пользователем. В случае необходимости интерактивной работы с -пользователем (в общем случае) процесс будет «остановлен» ядром и работа его -продолжается только после переведения его в «нормальный» режим работы. - -[float] -==== Файловая система ОС ==== - -В ОС использована файловая система Linux, которая, в отличие от файловых систем -DOS и Windows(™), является единым деревом. Корень этого дерева -- каталог, -называемый root (рут) и обозначаемый `/`. Части дерева файловой системы могут -физически располагаться в разных разделах разных дисков или вообще на других -компьютерах -- для пользователя это прозрачно. Процесс присоединения файловой -системы раздела к дереву называется монтированием, удаление -- размонтированием. -Например, файловая система CD-ROM в изделии монтируется по умолчанию в каталог -`/media/cdrom` (путь в изделии обозначается с использованием `/`, а не `\`, как в -DOS/Windows). Текущий каталог обозначается `./`. - -Файловая система изделия содержит каталоги первого уровня: - -* `/bin` -- командные оболочки (shell), основные утилиты; -* `/boot` -- содержит ядро системы; -* `/dev` -- псевдофайлы устройств, позволяющие работать с ними напрямую; -* `/etc` -- файлы конфигурации; -* `/home` -- личные каталоги пользователей; -* `/lib` -- системные библиотеки, модули ядра; -* `/lib` -- 64-битный системные библиотеки; -* `/media` -- каталоги для монтирования файловых систем сменных устройств; -* `/mnt` -- каталоги для монтирования файловых систем сменных устройств и -внешних файловых систем; -* `/proc` -- файловая система на виртуальном устройстве, её файлы содержат -информацию о текущем состоянии системы; -* `/root` -- личный каталог администратора системы; -* `/sbin` -- системные утилиты; -* `/sys` -- файловая система, содержащая информацию о текущем состоянии системы; -* `/usr` -- программы и библиотеки, доступные пользователю; -* `/var` -- рабочие файлы программ, очереди, журналы; -* `/tmp` -- временные файлы. - -[float] -==== Организация файловой структуры ==== - -Система домашних каталогов пользователей помогает организовывать безопасную -работу пользователей в многопользовательской системе. Вне своего домашнего -каталога пользователь обладает минимальными правами (обычно чтение и выполнение -файлов) и не может нанести ущерб системе, например, удалив или изменив файл. - -Кроме файлов, созданных пользователем, в его домашнем каталоге обычно содержатся -персональные конфигурационные файлы некоторых программ. - -Маршрут (путь) -- это последовательность имён каталогов, представляющая собой -путь в файловой системе к данному файлу, где каждое следующее имя отделяется от -предыдущего наклонной чертой (слешем). Если название маршрута начинается со -слеша, то путь в искомый файл начинается от корневого каталога всего дерева -системы. В обратном случае, если название маршрута начинается непосредственно с -имени файла, то путь к искомому файлу должен начаться от текущего каталога -(рабочего каталога). - -Имя файла может содержать любые символы за исключением косой черты (/). Однако -следует избегать применения в именах файлов большинства знаков препинания и -непечатаемых символов. При выборе имен файлов рекомендуем ограничиться -следующими символам: - -* строчные и ПРОПИСНЫЕ буквы. Следует обратить внимание на то, что регистр -всегда имеет значение; -* символ подчеркивания ( _ ); -* точка ( . ). - -Для удобства работы точку можно использовать для отделения имени файла от расширения -файла. Данная возможность может быть необходима пользователям или некоторым -программам, но не имеет значение для shell. - -[float] -==== Иерархическая организация файловой системы ==== - -Каталог `/`: - -* `/boot` -- место, где хранятся файлы, необходимые для загрузки ядра системы; -* `/lib` -- место, где располагаются файлы динамических библиотек, необходимых для -работы большей части приложений, и подгружаемые модули ядра; -* `/lib64` -- место, где располагаются файлы 64-битных динамических библиотек, -необходимых для работы большей части приложений; -* `/bin` -- минимальный набор программ, необходимых для работы в системе; -* `/sbin` -- набор программ для административной работы с системой (программы, -необходимые только суперпользователю); -* `/home` -- место, где располагаются домашние каталоги пользователей; -* `/etc` -- в данном каталоге обычно хранятся общесистемные конфигурационные -файлы для большинства программ в системе; -* `/etc/rc?.d`, `/etc/init.d`, `/etc/rc.boot`, `/etc/rc.d` -- директории, где -расположены командные файлы, выполняемые при запуске системы или при смене её -режима работы; -* `/etc/passwd` -- база данных пользователей, в которой содержится информация -об имени пользователя, его настоящем имени, личном каталоге, его зашифрованный -пароль и другие данные; -* `/etc/shadow` -- теневая база данных пользователей. При этом информация из -файла `/etc/passwd` перемещается в `/etc/shadow`, который недоступен для чтения -всем, кроме пользователя root. В случае использования альтернативной схемы -управления теневыми паролями (TCB), все теневые пароли для каждого пользователя -располагаются в директории `/etc/tcb/<имя пользователя>/shadow`; -* `/dev` -- в этом каталоге находятся файлы устройств. Файлы в /dev создаются -сервисом udev; -* `/usr` -- обычно файловая система `/usr` достаточно большая по объему, так -как все программы установлены именно здесь. Вся информация в каталоге `/usr` -помещается туда во время установки системы. Отдельно устанавливаемые пакеты -программ и другие файлы размещаются в каталоге. - -Некоторые подкаталоги системы `/usr` рассмотрены ниже: - -* `/usr/bin` -- практически все команды, хотя некоторые находятся в `/bin` или -в `/usr/local/bin`; -* `/usr/sbin` -- команды, используемые при администрировании системы и не -предназначенные для размещения в файловой системе root; -* `/usr/local` -- место, где рекомендуется размещать файлы, установленные без -использования пакетных менеджеров, внутренняя организация каталогов практически -такая же, как и корневого каталога; -* `/usr/man` -- каталог, где хранятся файлы справочного руководства man; -* `/usr/share` -- каталог для размещения общедоступных файлов большей части -приложений. - -Каталог `/var`: - -* `/var/log` -- место, где хранятся файлы аудита работы системы и приложений; -* `/var/spool` -- каталог для хранения файлов, находящихся в очереди на обработку -для того или иного процесса (очередь на печать, отправку почты и т.д.). - -`/tmp` -- временный каталог, необходимый некоторым приложениям. - -`/proc` -- файловая система `/proc` является виртуальной, и в действительности -она не существует на диске. Ядро создает её в памяти компьютера. Система -`/proc` предоставляет информацию о системе. - -[float] -==== Имена дисков и разделов ==== - -Все физические устройства вашего компьютера отображаются в каталог `/dev` -файловой системы изделия (об этом -- ниже). Диски (в том числе IDE/SATA/SCSI -жёсткие диски, USB-диски) имеют имена: - -* `/dev/sda` -- первый диск; -* `/dev/sdb` -- второй диск; -* и т.д. - -Диски обозначаются `/dev/sdX`, где `X` -- `a`, `b`, `c`, `d`, `e`, ... в -порядке обнаружения системой. - -Раздел диска обозначается числом после его имени. Например, `/dev/sdb4` -- -четвертый раздел второго диска. - -[float] -==== Разделы, необходимые для работы ОС ==== - -Для работы ОС необходимо создать на жестком диске (дисках) по крайней мере два -раздела: корневой (то есть тот, который будет содержать каталог `/` ) и раздел -подкачки (swap). Размер последнего, как правило, составляет от однократной до -двукратной величины оперативной памяти компьютера. Если у вас много свободного -места на диске, то можно создать отдельные разделы для каталогов `/usr`, -`/home`, `/var`. - -[float] -==== Утилиты для работы с файловой системой ==== - -`mkfs` -- создание файловой системы. В действительности это программа-оболочка, -вызывающая для каждого конкретного типа файловых систем свою программу. -Например, для файловой системы `ext4` будет вызвана `mkfs.ext4`. - -`fsck` -- используется для проверки и восстановления, если это возможно, -целостности файловых систем. - -`df` -- формирует отчет о доступном и использованном дисковом пространстве на -файловых системах. Без аргументов, `df` выдает отчет по доступному и -использованному пространству для всех файловых систем (всех типов), которые -смонтированы в данный момент. В противном случае, `df` на каждый файл, заданный -как аргумент, выдается отчет по файловой системе, которая его содержит. - -`du` -- формирует отчет об использовании дискового пространства заданными -файлами, а также каждым каталогом иерархии подкаталогов каждого указанного -каталога. Здесь под использованным дисковым пространством понимается -пространство, используемое для всей иерархии подкаталогов указанного каталога. -Запущенная без аргументов, команда `du` выдает отчет о дисковом пространстве -для текущего каталога. - -Часто используемые утилиты: - -* `mount` -- монтирование файловых систем; -* `umount` -- размонтирование файловых систем; -* `find` -- поиск файлов в директориях; -* `which` -- поиск файла, который будет запущен при выполнении данной команды; -* `cd` -- смена текущего каталога/директории; -* `pwd` -- показ текущего каталога/директории; -* `mkdir` -- создание каталога; -* `ls` -- выдача информации о файлах или каталогах; -* `cp` -- копирование файлов; -* `mv` -- перемещение/переименование файлов; -* `rm` -- удаление файлов; -* `cat` -- вывод содержимого заданных файлов на стандартный вывод; -* `more` -- программа постраничного просмотра файлов; -* `ln` -- создание ссылок (альтернативных имен) для файлов; -* `file` -- определение типа файла; -* `chmod` -- изменение прав доступа к файлам; -* `chown` -- смена прав владения (пользовательских и групповых) для файлов; -* `umask` -- установка маски прав доступа для вновь создаваемых файлов; -* `chattr` -- изменение атрибутов файлов; -* `lsattr` -- просмотр атрибутов файлов. - -=== Работа с наиболее часто используемыми компонентами === - -[float] -==== Командные оболочки (интерпретаторы) ==== - -Как было сказано выше, для управления ОС используется командные интерпретаторы -(shell). - -Зайдя в систему, Вы увидите приглашение -- строку, содержащую символ «$» (далее -этот символ будет обозначать командную строку). Программа ожидает ваших команд. -Роль командного интерпретатора -- передавать ваши команды операционной системе. -По своим функциям он соответствует command.com в DOS, но несравненно мощнее. -При помощи командных интерпретаторов можно писать небольшие программы -- -сценарии (скрипты). В Linux доступны следующие командные оболочки: - -* `bash` -- самая распространенная оболочка под linux. Она ведет историю команд и -предоставляет возможность их редактирования; -* `pdksh` -- клон korn shell, хорошо известной оболочки в UNIX(TM) системах. - -Оболочкой по умолчанию является «Bash» (Bourne Again Shell). Чтобы проверить, -какая оболочка используется в данный момент выполните команду: - ------------ -echo $SHELL ------------ - -У каждой оболочки свой синтаксис. Мы рекомендуем Вам использовать Bash. В -дальнейшем мы будем строить свои примеры с использованием этой оболочки. - -[float] -==== Командная оболочка Bash ==== - -В bash имеется несколько приемов для работы со строкой команд. Например, -используя клавиатуру, вы можете: - -* *Ctrl+A* -- перейти на начало строки; -* *Ctrl+U* -- удалить текущую строку; -* *Ctrl+C* -- остановить текущую задачу. - -Вы можете использовать «;» для того, чтобы ввести несколько команд одной -строкой. Клавиши *Стрелка вверx* и *Стрелка вниз*, позволяют Вам перемещаться -по истории команд. Для того чтобы найти конкретную команду в списке набранных, -не пролистывая всю историю, наберите *Ctrl+R*. - -Команды, присутствующие в истории, отображаются в списке пронумерованными. Для -того чтобы запустить конкретную команду наберите: - ---------------- -! номер команды ---------------- - -если вы введете: - ------- -!! ------- - -запустится последняя из набранных команд. - -Иногда имена программ и команд слишком длинны. К счастью, Bash сам может -завершать имена. - -Нажав клавишу *Tab*, вы можете завершить имя команды, программы или каталога. -Например, предположим, что Вы хотите использовать программу декомпрессии -`bunzip2`. Для этого наберите: - ------- -bu ------- - -затем нажмите *Tab*. Если ничего не происходит, то, вероятно, существует -несколько возможных вариантов завершения команды. - -Нажав клавишу *Tab* еще раз, вы получите список имён, начинающихся с «bu». - -Например, у вас есть: - -------------------------- -$ bu -buildhash builtin bunzip2 -------------------------- - -Наберите: - ------ -n ------ - -(`bunzip` -- это единственное имя, третьей буквой которого является «n»), а -затем нажмите клавишу табуляции. Оболочка дополнит имя, и вам остается лишь -нажать *Enter*, чтобы запустить команду. - -Заметим, что программу, вызываемую из командной строки, Bash ищет в каталогах, -определяемых в системной переменной PATH. По умолчанию в этот перечень -каталогов не входит текущий каталог, обозначаемый `./` (точка слеш) (если -только вы не выбрали один из двух самых слабых уровней защиты, см. об этом -ниже), поэтому, для запуска программы prog из текущего каталога, надо дать -команду: `./prog`. - -[float] -==== Базовые команды оболочки Bash ==== - -Все команды, приведенные ниже, могут быть запущены в режиме консоли. Для -получения более подробной информации используйте команду `man`. Пример: - ------- -man ls ------- - -Команда `su`: - -Позволяет Вам получить права администратора. Когда вы набираете `su`, оболочка -запрашивает у вас пароль суперпользователя (root). Введите пароль и нажмите -*Enter*: теперь вы получили привилегии суперпользователя. Чтобы вернуться к -правам вашего пользовательского бюджета, наберите `exit`. - -Команда `cd`: - -Позволяет сменить каталог. Она работает как с абсолютными, так и с -относительными путями. Предположим, что Вы находитесь в своем домашнем -каталоге и хотите перейти в его подкаталог `docs/`. Для этого введите -относительный путь: - --------- -cd docs/ --------- - -Чтобы перейти в каталог `/usr/bin`, наберите (абсолютный путь): - - ------------- -cd /usr/bin/ ------------- - -Некоторые варианты команды: - - ------ -cd .. ------ - -позволяет вам сделать текущим родительский каталог (обратите внимание на пробел -между `cd` и `..`); - ----- -cd - ----- - -позволяет вам вернуться в предыдущий каталог. Команда `cd` без параметров -переводит вас в ваш домашний каталог. - -Команда `ls`: - -`ls` (list) выдает список файлов в текущем каталоге. Две основные опции: - -* `-a` -- просмотр всех файлов, включая скрытые; -* `-l` -- отображение более подробной информации. - -Команда `rm`: - -Эта команда используется для удаления файлов. - -Внимание: удалив файл, вы не сможете его восстановить! - -Синтаксис: - ------------- -rm имя_файла ------------- - -У данной программы существует ряд параметров. Самые часто используемые: `-i` -- -запрос на удаление файла, `-r` -- рекурсивное удаление (т.е. удаление, включая -подкаталоги и скрытые файлы). - -Пример: - -------------------- -rm -i ~/html/*.html -------------------- - -Удаляет все файлы html в вашем каталоге html. - -Команды `mkdir` и `rmdir`: - -Команда `mkdir` позволяет создать каталог, тогда как `rmdir` удаляет каталог, -при условии, что он пуст. - -Синтаксис: - ------------------- -mkdir имя_каталога ------------------- - ------------------- -rmdir имя_каталога ------------------- - -Команда `rmdir` часто заменяется командой `rm -rf`, которая позволяет вам -удалять каталоги, даже если они не пусты. - -Команда `less`: - -`less` позволяет вам постранично просматривать текст. - -Синтаксис: - - --------------- -less имя_файла --------------- - -Крайне полезно просмотреть файл перед тем, как его редактировать. Для выхода -нажмите *q*. - -Команда `grep`: - -Данная команда имеет много опций и предоставляет возможность поиска символьной -строки в файле. - -Синтаксис: - - ------------------------ -grep шаблон_поиска файл ------------------------ - -Команда `ps`: - -Отображает список текущих процессов. Колонка команд указывает имя процесса, -колонка PID (идентификатор процесса) -- номер процесса (этот номер используется -для операций с процессом, например, чтобы завершить его командой `kill`). - -Синтаксис: - ------------- -ps аргументы ------------- - -Аргумент `u` предоставляет вам больше информации, `ax` позволяет вам -просмотреть те процессы, которые не принадлежат вам (такие, как те, что были -запущены во время процесса загрузки.). - -Команда `kill`: - -Если программа перестала отвечать или зависла, используйте данную команду, -чтобы её завершить. - -Синтаксис: - --------------- -kill PID_номер --------------- - -Иногда необходимо будет использовать команду `kill` с параметром `-9` (`kill -9 -PID_номер`), когда обычная команда `kill` не дает желательного эффекта. Номер -PID выясняется при помощи команды `ps`. - -=== Использование многозадачности === - -(DISTRO) -- это многозадачная система. Продемонстрируем на двух примерах, как -это можно использовать. - -Первый пример -- запуск программы в фоновом режиме. Для того чтобы это сделать, -вам нужно лишь набрать «&» после имени программы. После этого оболочка дает -вам возможность запускать другие приложения. Будьте осторожны, так как -некоторые программы интерактивны и их запуск в фоновом режиме бессмысленен. -Подобные программы просто остановятся, будучи запущенными в фоновом режиме. -Для того чтобы вернуть их в обычный режим, наберите: - ----------------- -fg имя_программы ----------------- - -Второй метод представляет собой запуск нескольких независимых сеансов. В -консоли нажмите *Alt* и одну из клавиш, находящихся в интервале от *F1* до -*F6*. На экране появится новое приглашение системы, и вы сможете открыть новый -сеанс. Этот метод также позволяет вам работать на другой консоли, если консоль, -которую вы использовали до этого, не отвечает или вам необходимо остановить -зависшую программу. - diff --git a/admin-basics/sumode/index.txt b/admin-basics/sumode/index.txt deleted file mode 100644 index 74de5be..0000000 --- a/admin-basics/sumode/index.txt +++ /dev/null @@ -1,68 +0,0 @@ -[[superuser]] -== Режим суперпользователя == - -=== Какие бывают пользователи? === - -Linux -- система многопользовательская, а потому пользователь -- ключевое -понятие для организации всей системы доступа в Linux. Файлы всех пользователей -в Linux хранятся раздельно, у каждого пользователя есть собственный домашний -каталог, в котором он может хранить свои данные. Доступ других пользователей к -домашнему каталогу пользователя может быть ограничен. - -Суперпользователь в Linux -- это выделенный пользователь системы, на которого -не распространяются ограничения прав доступа. Именно суперпользователь имеет -возможность произвольно изменять владельца и группу файла. Ему открыт доступ на -чтение и запись к любому файлу или каталогу системы. - -Среди учётных записей Linux всегда есть учётная запись суперпользователя -- root. Поэтому вместо -«суперпользователь» часто говорят «root». Множество системных файлов -принадлежат root, множество файлов только ему доступны для чтения или записи. -Пароль этой учётной записи -- одна из самых больших драгоценностей системы. -Именно с её помощью системные администраторы выполняют самую ответственную -работу. - -=== Для чего может понадобится режим суперпользователя? === - -Системные утилиты, например, такие как «Центр управления системой» или -«Программа управления пакетами Synaptic» требуют для своей работы привилегий -суперпользователя, потому что они вносят изменения в системные файлы. При их -запуске выводится диалоговое окно с запросом пароля системного администратора. - -=== Как получить права суперпользователя? === - -Для опытных пользователей, умеющих работать с командной строкой, существует два -различных способа получить права суперпользователя. - -Первый -- это зарегистрироваться в системе под именем root. - -Второй способ -- воспользоваться специальной утилитой `su` (shell of user), -которая позволяет выполнить одну или несколько команд от лица другого -пользователя. По умолчанию эта утилита выполняет команду `sh` от пользователя -root, то есть запускает командный интерпретатор. Отличие от предыдущего способа -в том, что всегда известно, кто именно запускал `su`, а значит, ясно, кто -выполнил определённое административное действие. - -В некоторых случаях удобнее использовать не `su`, а утилиту `sudo`, которая -позволяет выполнять только заранее заданные команды. - -[NOTE] -Для того чтобы воспользоваться командами `su` и `sudo`, необходимо быть членом -группы `wheel`. Пользователь, созданный при установке системы, по умолчанию уже -включён в эту группу. - -=== Как перейти в режим суперпользователя? === - -Для перехода в режим суперпользователя наберите в терминале команду `su -`. - -Если воспользоваться командой `su` без ключа, то происходит вызов командного -интерпретатора с правами root. При этом значение переменных окружения, в -частности $PATH, остаётся таким же, как у пользователя: в переменной $PATH не -окажется каталогов `/sbin`, `/usr/sbin`, без указания полного имени будут недоступны -команды `route`, `shutdown`, `mkswap` и другие. Более того, переменная $HOME будет -указывать на каталог пользователя, все программы, запущенные в режиме -суперпользователя, сохранят свои настройки с правами root в каталоге -пользователя, что в дальнейшем может вызвать проблемы. - -Чтобы избежать этого, следует использовать `su -`. В этом режиме `su` запустит -командный интерпретатор в качестве `login shell`, и он будет вести себя в точности -так, как если бы в системе зарегистрировался root. diff --git a/admin-basics/syslog/index.txt b/admin-basics/syslog/index.txt deleted file mode 100644 index b9654ad..0000000 --- a/admin-basics/syslog/index.txt +++ /dev/null @@ -1,70 +0,0 @@ -== Что происходит в системе == - -Человеку, отвечающему за работоспособность системы, очень важно всегда -отчётливо представлять происходящие в ней события. Теоретически, никакое -происшествие не должно ускользнуть от его внимания. Однако компьютерные системы -настолько сложны, что отслеживать _все_ события в них -- выше человеческих -возможностей. Для того чтобы довести поток служебной информации до разумного -объёма, её надо _просеять_ (выкинуть незначащие данные), _классифицировать_ -(разделить на несколько групп сообразно тематике) и _журнализировать_ -(сохранить в доступном виде для дальнейшего анализа). - -В Linux эта задача решается с помощью механизма _централизованной -журнализации_, который реализован системной службой syslogd. Все -части системы (включая ядро и системные службы) рапортуют syslogd о -происходящих в них событиях. В этот рапорт включается имя службы, _категория_ -(facility) и _важность_ (priority) произошедшего события. Служба, сообразно -настройкам, классифицирует все эти рапорты в несколько выходных потоков. -Классификация и отсев данных всякого выходного потока происходит так: для -каждой категории событий определяется _наименьшая_ важность, которой событие -должно обладать, чтобы попасть в этот выходной поток. Например, легко -определить поток «ошибки», в который будут попадать только _важные_ рапорты -любых категорий или поток «безопасность», в который будут попадать _все_ -рапорты категории «безопасность» и те рапорты других категорий, важность -которых заставляет подозревать угрозу безопасности системы (например, рапорт -категории «daemon» об аварийном завершении работы системной службы). - -_Главное_ место хранения уже классифицированного syslogd потока событий -- -_системный журнал_ (т. н. log-файл). Системный журнал -- _текстовый файл_, -содержащий рапорты _одного_ потока. Обычно syslogd хранит системные журналы в -каталоге `/var/log` и его подкаталогах. Именно в системные журналы, прежде -всего в `/var/log/messages`, `/var/log/maillog` и `/var/log/dmesg`, необходимо -заглядывать администратору, который хочет знать, что происходит в системе. -Поток рапортов о важных событиях syslogd направляет и на _системную консоль_ -- -выделенное терминальное устройство. В ALT Linux роль системной консоли -выполняет 12-я _виртуальная консоль_, доступная по сочетанию клавиш *Alt+F12* -или *Alt+Ctrl+F12*. Стоит заметить, что некоторые службы (например, WWW-сервер -apache) _самостоятельно_, в обход syslogd, ведут журнализацию своих событий, -поэтому информацию о количестве и местоположении их журналов можно почерпнуть -из их файлов настроек (обычно, журналы хранятся в `/var/log`). - -Новые рапорты, поступающие в системный журнал, наиболее актуальны, а -предыдущие, по мере их устаревания, эту актуальность утрачивают. Если самые -старые данные в журнале не удалять, файловая система рано или поздно окажется -переполненной. В Linux организован механизм _устаревания журналов_, которым -занимается служба logrotate. Запускаясь раз в день, logrotate проверяет, какие -из файлов следует признать устаревшими. Файл объявляется устаревшим один раз в -определённый промежуток времени (например, раз в неделю) или при достижении им -определённого размера. - -Процедура устаревания такова. Для каждого журнала, как, например, для -`/var/log/syslog/alert`, logrotate держит в том же каталоге _очередь устаревших -копий_ -- файлы с именами от `alert.1.bz2` (предыдущая копия) до `alert.5.bz2` -(самая старая копия). Очередь `alert` в нашем примере состоит из пяти -упакованных с помощью `bzip2` файлов. В момент устаревания `alert.4.bz2` -переименовывается в `alert.5.bz2` (старые данные теряются), копия с номером 3 -превращается в четвёртую, вторая -- в третью, первая во вторую. Наконец, сам -журнал упаковывается и переименовывается в `alert.1.bz2`, а на его месте -заводится новый -- пустой. Таким образом, администратор всегда имеет доступ к -_свежему_ журналу и к нескольким его копиям за определённое время. - -Некоторые файлы в `/var/log` -- не текстовые, они являются неполноценными -журналами и представляют собой «свалку событий» для служб авторизации и -учёта. Текстовую информацию о входе пользователей в систему и выходе оттуда -можно получить по команде `last`, а узнать о тех, кто в данный момент -пользуется системой помогут команды `w` и `who`. - -Множество важной информации может дать анализ _загруженности_ системы -- -сведения о процессорном времени и потреблении оперативной памяти (`ps`, `top`, -`vmstat`), сведения об использовании дискового пространства (`du`, `df`, -`lsof`) и сведения о работе сетевых устройств (`netstat`). diff --git a/admin-basics/terminal/basic/docs-linux_basics.txt b/admin-basics/terminal/basic/docs-linux_basics.txt deleted file mode 100644 index 85658ac..0000000 --- a/admin-basics/terminal/basic/docs-linux_basics.txt +++ /dev/null @@ -1,319 +0,0 @@ - -== Что нужно знать о Linux пользователю == - -=== Вход в систему === - -Linux -- это многопользовательская система. На практике это означает, что для -работы в системе нужно в ней зарегистрироваться, т. е. дать понять системе, -кто именно находится за монитором и клавиатурой. Вместо формального -«зарегистрироваться в системе» обычно используют выражение «войти в систему». -Операционная система представляется чем-то вроде замкнутого помещения, внутри -которого можно оказаться, только успешно проникнув через «дверь» -- пройдя -процедуру регистрации. Наиболее распространённый способ регистрации на -сегодняшний день -- использование `системных имён` (login name) и паролей -(password). Это надёжное средство убедиться, что с системой работает тот, кто -нужно, если пользователи хранят свои пароли в секрете и если пароль -достаточно сложен и не слишком короток (иначе его легко угадать или -подобрать). - -Загрузка заканчивается интерфейсом входа в систему: выводится приглашение -ввести системное имя пользователя (`login:`) и пароль. Если вы выбрали загрузку -в графический режим, то можно не вводить системное имя вручную, а нажать на -кнопку с нужным именем, однако пароль при этом всё равно нужно ввести -самостоятельно. - -Пользователи обычно создаются непосредственно в процессе установки системы, -однако всегда можно добавить новых пользователей или удалить существующих при -помощи стандартных средств управления пользователями. - -Не следует входить в систему в качестве пользователя _root_: он необходим для -выполнения административных задач, поэтому _на него не распространяются -ограничения доступа._ Для выполнения обычных администраторских задач -(изменение настроек системы) не требуется _входить в систему_ под именем -_root_, обычный пользователь может временно получить права администратора -(см. об этом далее). - -=== Домашний каталог === - -В Linux у каждого пользователя обязательно есть свой домашний каталог, -предназначенный для хранения _всех собственных данных_ пользователя. Именно с -этого каталога пользователь начинает работу после регистрации в системе. -Домашние каталоги пользователей обычно собраны в каталоге `/home`, их название -чаще всего совпадает с учётным именем пользователя в системе, например, для -пользователя `test` домашним каталогом будет `/home/test`. - -Пользователь является полным хозяином внутри своего каталога, однако -остальная часть `файловой системы` доступна ему только для чтения, но не для -записи. Доступ других пользователей к чужому домашнему каталогу ограничен: -наиболее типична ситуация, когда пользователи могут читать содержимое файлов -друг друга, но не имеют права их изменять или удалять. - -=== Графический и текстовый интерфейс === - -В операционной системе Linux пользователю доступны два режима работы: -графический и текстовый. В текстовом режиме недоступны возможности -графических интерфейсов: рисование окон произвольной формы и размера, -поддержка миллионов цветов, отрисовка изображений. Все возможности текстового -режима ограничены набором текстовых и псевдографических символов и -несколькими десятками базовых цветов. Тем не менее в Linux в текстовом режиме -можно выполнять практически любые действия в системе (кроме тех, которые -требуют непосредственного _просмотра_ изображений). Текстовый режим в Linux --- это полнофункциональный способ управления системой благодаря интерфейсу -командной строки (см. об этом далее). В Linux существует огромное множество -программ (включая даже игры), предназначенных для работы в текстовом режиме. - -Бывают ситуации, когда графический режим недоступен или неработоспособен -(удалённый доступ по сети, проблемы с поддержкой видеокарты, сбои системы и -др.). В таких случаях всегда остаётся возможность работать в текстовом -режиме, поскольку его возможности поддерживаются непосредственно графическим -оборудованием и не требуют специальных драйверов или настройки. - -В процессе работы Linux активно несколько _виртуальных консолей_. Каждая -виртуальная консоль доступна по одновременному нажатию *Alt* и функциональной -клавиши с номером этой консоли. На первых шести виртуальных консолях (*Alt+F1* --- *Alt+F6*) пользователь может зарегистрироваться и работать в текстовом -режиме. 12-ая виртуальная консоль (*Alt+F12*) выполняет функцию системной -консоли -- на неё выводятся сообщения о происходящих в системе событиях. - -Если загрузка системы по каким-то причинам не дошла до графического режима и -завершилась приглашением к регистрации (`login:`) на текстовой виртуальной -консоли, то можно попробовать запустить графический режим вручную. Для этого -следует войти в систему (ввести имя пользователя и пароль) и ввести команду -`startx`. Эта команда запускает графическую подсистему X11, которая займёт -седьмую виртуальную консоль. Можно запустить до трёх графических подсистем -(интерфейсов) одновременно, они займут консоли с седьмой по девятую. Чтобы -переключиться из графического режима на другую консоль, следует нажимать -одновременно *Ctrl*, *Alt* и функциональную клавишу с номером нужной консоли. - -Благодаря виртуальным консолям каждый компьютер, на котором работает Linux, -предоставляет возможность зарегистрироваться и получить доступ к системе -одновременно нескольким пользователям. Даже если в распоряжении всех -пользователей есть только один монитор и одна системная клавиатура, эта -возможность небесполезна: можно переключаться между виртуальными консолями -так, как если бы вы переходили от одного монитора с клавиатурой к другому, -подавая время от времени команды и следя за выполняющимися там программами. -Более того, ничто не препятствует зарегистрироваться в системе несколько раз -под одним и тем же _системным именем_ -- это один из способов организовать -параллельную работу над несколькими задачами. - -=== Завершение работы === - -Linux _нельзя_ выключать, просто лишив компьютер электропитания. Множество -информации, которая должна располагаться на диске, система держит в -оперативной памяти для повышения быстродействия. Неожиданное выключение -питания приводит к потере этой информации. Если вы работаете в графической -среде, то для завершения работы нужно выбрать соответствующий пункт в главном -меню. Если перед вами -- графический интерфейс входа в систему, то там также -есть кнопка меню, в котором имеется пункт «выключить компьютер». В командной -строке (например, на текстовой виртуальной консоли) можно выполнить команду -`halt` (требует привилегий администратора). Процедура выключения завершится -автоматическим отключением питания компьютера, если это возможно. Если -автоматическое отключение невозможно, на экран выведется соответствующее -сообщение, и питание можно отключить кнопкой *Power*. Если компьютер -поддерживает протокол работы ACPI, нажатие на кнопку Power приводит не к -выключению электропитания, а к передаче системе ACPI-сообщения о том, что -кнопка *Power* была нажата. При получении такого сообщения система выполняет ту -же процедуру выключения. Только в этом случае _допустимо_ выключение кнопкой -*Power*. - -=== Командная строка === - -Командная строка -- это способ организации интерфейса, в котором каждая -строка, введённая пользователем, -- это команда системе, которую та должна -выполнить. Термин «командная строка» происходит от того, что команды вводятся -обычно в одну строку, которая завершается нажатием клавиши *Ввод* (*Enter*). В -Linux этот вид интерфейса всегда был основным, а потому хорошо развитым. - -Первое слово в такой строке -- это, как правило, имя исполняемого файла -- -_программы_, все остальные слова -- _параметры_. Программа выполняет нужные -пользователю действия, но может делать это по-разному в зависимости от -полученных параметров. Параметры могут быть общими, например имя файла, -который нужно обработать, или специфическими для этой программы -модификаторами выполнения. - -Чтобы получить командную строку, пользователь должен войти в систему и -запустить программу, которая будет принимать его команды и передавать их на -выполнение -- командную оболочку (её ещё называют `интерпретатор командной -строки`, просто `оболочка`, по-английски «shell»). - -Получить командную строку можно многими способами. Самый простой и -универсальный -- зарегистрироваться на одной из первых шести виртуальных -консолей: после входа в систему запустится командная оболочка и появится -`приглашение командной строки`. Не выходя из графической среды можно получить -командную строку при помощи любого _эмулятора терминала_ -- они перечислены в -главном меню в разделе *Терминалы*. Для пользователей графической среды KDE -командная строка доступна также по нажатию *Alt+F2* (функция «ввести команду»). - -Умение найти командную строку и выполнить в ней команду пригодится любому -пользователю Linux, даже если он работает исключительно в графической оконной -среде. Дело в том, что графические интерфейсы в Linux очень многообразны, -кроме того, пользователь имеет возможность существенно поменять конкретный -вид и расположение частей интерфейса по своему вкусу. Найти общие для всех и -неизменные свойства графического интерфейса в Linux весьма непросто (если -вообще возможно). В то же время командная строка доступна всегда и всюду -выглядит практически одинаково. Поэтому очень часто в документации, -рассчитанной на широкую аудиторию и общие случаи, в пример приводятся именно -фрагменты командной строки. Нередко к командной строке апеллируют и люди, к -которым обратились за советом по Linux. Оно и понятно: процитировать команду, -которая даст нужный результат, гораздо проще и лаконичнее, чем словами -описывать действия, которые нужно произвести для достижения того же эффекта в -графической среде (о том, как это сделать, рассказано ниже). - -================================================= -Когда упоминается команда, которую нужно выполнить в Linux, всегда имеется в -виду команда, которую нужно ввести в командной строке. -================================================= - -Командная строка начинается приглашением -- это подсказка, свидетельствующая -о том, что система готова принимать команды пользователя. В процессе -выполнения команды система может вывести те или иные сообщения, а когда -выполнение завершается -- вновь выводится приглашение командной строки. -Приглашение может быть оформлено по-разному, но чаще всего оно заканчивается -символом `$`. В примерах в документации этим символом условно обозначается -командная строка: всё, что следует после него и до конца строки -- это и есть -команда, которую нужно ввести. Пока не нажат *Enter*, набранную команду можно -редактировать. - ------------------------------------------------------------------------------- -$ date --universal -Пнд Июн 16 15:46:26 UTC 2008 -$ ------------------------------------------------------------------------------- - -`Пример 1`. Пример командной строки - -В этом примере команда `date --universal` состоит из имени программы `date` и -единственного параметра --`universal`, предписывающего ей выводить время по -Гринвичу. Строка `Пнд Июн 16 15:46:26 UTC 2008` -- результат её выполнения, -ответ системы. Если для выполнения команды требуются полномочия системного -администратора, то в примерах для обозначения командной строки при такой -команде ставится символ `#`. - -Если в процессе работы в командной строке понадобилось скопировать часть -текста, например, чтобы процитировать результат выполнения команды, то для -этого нужно всего лишь выделить нужный фрагмент мышью (удерживая левую -кнопку), а затем вставить его в нужное место, нажав на среднюю кнопку мыши. - -О том, как узнать подробнее о разных командах, немного написано в разделе -Документация, и много -- во всевозможных учебниках и пособиях по Linux. -Краткий рекомендательный список книг и сетевых ресурсов приведён в конце того -же раздела «Документация». - -=== Права доступа === - -Для каждого пользователя определена сфера его полномочий в системе: -программы, которые он может запускать, файлы, которые он имеет право -просматривать, изменять, удалять. При попытке сделать что-то, выходящее за -рамки полномочий, пользователь получит сообщение об ошибке -- Permission -denied («в доступе отказано»). В полномочия обычного пользователя входит всё -необходимое для повседневной работы, однако ему запрещено выполнение -действий, изменяющих саму систему. Это позволяет защитить систему от -случайного или злонамеренного повреждения. - -В Linux существует ровно один пользователь, права которого существенно выше -прав остальных пользователей -- это _root_ (администратор). От имени этого -пользователя можно выполнить любые административные (изменяющие систему) -действия -- _на него не распространяются ограничения доступа_. - -Когда нужно сделать что-то, выходящее за рамки полномочий обычного -пользователя, потребуется получить полномочия администратора. В большинстве -случаев достаточно получить полномочия _временно_, для выполнения одного или -нескольких конкретных действий. Некоторые программы (в том числе основное -средство настройки системы -- *Центр управления системой*) при необходимости -запрашивают пароль пользователя _root_. После того как пароль правильно -введён, _эта программа_ (и только она!) будет работать уже с правами -администратора, поэтому следует внимательно относиться к совершаемым -действиям. - -Временно получить `командную оболочку` c правами администратора можно при -помощи команды `su -`. Это операция доступна только тем пользователям, при -добавлении которых был установлен флажок *Разрешить пользователю получать -привилегии администратора (su)* footnote:[Установка этого флажка означает, -что пользователь будет включён в группу wheel.]. По умолчанию этот флажок -установлен только для первого из добавленных при установке пользователей, -хотя впоследствии его можно установить или снять в любой момент для любого -пользователя. - -=== Как задавать вопросы? === - -Если в процессе работы возникнут сложности и сбои, очень важно по возможности -конкретно сформулировать суть проблемы (вопрос). Поиски ответа стоит начать с -документации (локальной и в Интернете), также можно спросить опытных -пользователей и обратиться в службу поддержки. Ниже кратко описаны те шаги, -которые стоит сделать для получения нужной информации. - -==== Почитать документацию ==== - -Прежде всего следует обратиться к уже установленной документации. Основной -массив документации на русском языке -- это документация ALT Linux, к главной -странице документации можно перейти в любом браузере со стартовой страницы -дистрибутива. В документации ALT Linux содержатся вводные сведения о Linux, -основные сведения по установке, настройке и использованию ALT Linux. Каждая -программа также сопровождается собственной документацией, многие -- и -системой помощи, к сожалению, не везде эта документация переведена на русский -язык. Подробнее о том, как найти документацию по конкретной программе, см. -раздел Документация. - -==== Поискать в Интернете ==== - -Если среди установленной документации не удалось найти ответа, стоит -обратиться к поискам в сети Интернет. Самый первый адрес, куда следует -отправиться -- сборник наиболее ЧАсто задаваемых ВОпросов (FAQ) -http://www.altlinux.org/FAQ по использованию программных продуктов ALT Linux. -Большинство затруднений при работе с Linux типичны, поэтому здесь с большой -вероятностью найдётся ответ на вaш вопрос. - -На сайте freesource.info есть довольно разнообразная информация, связанная со -свободным ПО вообще, в частности, стоит обратить внимание на раздел, -посвящённый ALT Linux http://freesource.info/wiki/ALTLinux. Здесь есть -конкретные инструкции и примеры настроек, которые ещё не успели попасть в -документацию, кроме того, предложения и планы разработчиков. Содержание сайта -всё время уточняется и дополняется, поскольку он открыт для пополнения всем -заинтересованным. - -Кроме того, любому пользователю Internet доступен поисковый сайт -http://google.com, наиболее подходящий для поиска чего бы то ни было. Если вы -ищете причину конкретной ошибки и способ её устранить, стоит задать в -качестве поискового выражения то `сообщение об ошибке`, которое было выдано -системой. Программы с графическим интерфейсом обычно выводят такие сообщения -в особых диалоговых окнах, которые появляются поверх основного окна программы -и содержат текст сообщения об ошибке и как минимум одну кнопку -- *OK*. Если -программа была запущена из командной строки, то сообщения о ходе её работы и -об ошибках появятся там же. Сведения о событиях, происходящих в системе, -всегда можно найти на 12-ой виртуальной консоли (*Ctrl+Alt+F12*), многие -сообщения об ошибках тоже туда попадают. - -==== Спросить в списке рассылки ==== - -ALT Linux Team поддерживает несколько списков рассылки, в которых обсуждаются -вопросы использования и разработки дистрибутивов ALT Linux. Вы можете задать -свой вопрос сообществу пользователей дистрибутивов ALT Linux, просто написав -в один из списков рассылки ALT Linux Team -http://www.altlinux.org/MailingLists. Основной список рассылки сообщества -пользователей ALT Linux -- community@lists.altlinux.org. Возможно, в списке -рассылки уже был дан ответ на вaш вопрос (большинство вопросов повторяются), -поэтому прежде чем писать в список рассылки, стоит поискать ответ в архивах -рассылки http://search.altlinux.org/. Списки рассылки читают разработчики и -активные пользователи ALT Linux, и обычно среди них находится тот, кто -ответит на вопрос footnote:[Задавший вопрос пользователь должен принимать в -расчёт, что все подписчики списка рассылки участвуют в нём добровольно и -никто из них не обязан отвечать на какие-либо вопросы, поэтому предъявлять -претензии на этот счёт бессмысленно и невежливо.]. - -==== Обратиться в службу поддержки ==== - -Если вы -- зарегистрированный пользователь дистрибутива, обращайтесь с -вопросами в службу поддержки ALT Linux. Для регистрации потребуется серийный -номер, который помещён на каждом продаваемом экземпляре дистрибутива. - -Приобретая экземпляр дистрибутива, пользователь в том числе приобретает -контракт, по условиям которого он получает право на объём услуг по -информационной и технической поддержке, определённый в купоне технической -поддержки дистрибутива. - -Впрочем, для заключения контракта не обязательно покупать дистрибутив, просто -обращайтесь к нам. Специалисты ALT Linux помогут всегда: от разового решения -любых задач для пользователей любых Linux, до регулярного технического -обслуживания и разработки технологических решений на базе Linux. Более -подробную информацию об услугах ALT Linux по технической поддержке можно -найти на сайте ALT Linux. diff --git a/admin-basics/terminal/basic/docs-linux_firststeps.txt b/admin-basics/terminal/basic/docs-linux_firststeps.txt deleted file mode 100644 index e3dc201..0000000 --- a/admin-basics/terminal/basic/docs-linux_firststeps.txt +++ /dev/null @@ -1,343 +0,0 @@ - -== Первые шаги в системе Linux == - -Прежде всего важно знать, что все имена файлов и названия команд нужно -вводить в правильном регистре (по-английски говорят, что эти имена -«чувствительны к регистру» -- case-sensitive). В этом ситуация отличается от -системы `MS-DOS`. Например, команда `make` -- совсем не то же самое, что -команда `Make` или `make`. То же относится к именам файлов и каталогов. - -=== Движение по дереву каталогов === - -Итак, вы умеете входить в систему и обращаться к файлам либо по их именам, -либо указывая путь к ним. Однако иногда оказывается удобным изменить текущий -каталог, чтобы можно было проще обращаться к файлам. - -Команда, которая используется для движения по дереву каталогов, называется -`cd` -- сокращение от «change directory» («изменить каталог»). Заметим, что -большинство наиболее употребительных команд в системе Linux содержат в своём -названии всего два или три символа. Команда `cd` употребляется следующим -образом: - ------------------------------------------------------------------------------- -cd directory ------------------------------------------------------------------------------- - -где `directory` -- имя каталога, который должен стать текущим. - -Как указывалось выше, при входе в систему текущим каталогом назначается -домашний каталог пользователя. Если пользователь Ларри хочет перейти в -подкаталог `papers`, ему нужно использовать команду - ------------------------------------------------------------------------------- -/home/larry# cd papers -/home/larry/papers# ------------------------------------------------------------------------------- - -Как мы видим, вид приглашения изменился (в приглашение входит имя текущего -каталога, чтобы пользователь знал, где он находится). Таким образом, теперь -текущим каталогом является каталог `papers`, и пользователь может обратиться к -своему файлу следующей командой: - ------------------------------------------------------------------------------- -/home/larry/papers# more history-final ------------------------------------------------------------------------------- - -Теперь Ларри находится в каталоге `papers`. Чтобы вернуться в родительский -каталог, следует отдать команду - ------------------------------------------------------------------------------- -/home/larry/papers# cd .. -/home/larry# ------------------------------------------------------------------------------- - -Обращаем ваше внимание на пробел между `cd` и ... В каждом каталоге имеется -элемент .. -- обращение к родительскому каталогу (ближайшему каталогу более -высокого уровня). Аналогично, ссылка на тот же самый каталог называется . и -также имеется в каждом каталоге. Следовательно, команда - ------------------------------------------------------------------------------- -/home/larry/papers# cd \ . ------------------------------------------------------------------------------- - -текущего каталога не изменит. - -С командой `cd` можно также использовать абсолютный путь. Для того, чтобы -перейти в домашний каталог пользователя karl можно использовать следующую -команду: - ------------------------------------------------------------------------------- -/home/larry/papers# cd /home/karl -/home/karl# ------------------------------------------------------------------------------- - -Команда `cd`, отданная без аргументов, назначает текущим собственный каталог -пользователя. - ------------------------------------------------------------------------------- -/home/karl# cd -/home/larry# ------------------------------------------------------------------------------- - -=== Просмотр содержимого каталогов === - -Вводим новую полезную команду -- `ls` (сокращение от англ. list). Эта команда -выводит на экран список файлов и каталогов, по умолчанию (если не указаны -параметры) -- список, относящийся к вашему домашнему каталогу. Пример: - ------------------------------------------------------------------------------- -/home/larry# ls -Mail -letters -papers -/home/larry# ------------------------------------------------------------------------------- - -Мы видим, что в данном примере в домашнем каталоге пользователя `larry` есть -три элемента: Mail, letters и papers. Однако из этого списка нельзя понять -- -каталоги это или файлы. Чтобы получить более полную информацию от команды -`ls`, можно использовать опцию `-F`: - ------------------------------------------------------------------------------- -/home/larry# ls -F -Mail/ -letters/ -papers/ -/home/larry\# ------------------------------------------------------------------------------- - -Из того, что к концу каждого имени приписан символ `/`, можно понять, что все -три элемента в этом списке -- подкаталоги. - -Если в списке, выданном командой `ls -F`, к имени файла приписан символ `*`, то -значит, данный файл является исполняемым (executable), или программой, -которую можно исполнять. Если к имени файла в этом списке ничего не -приписано, то мы имеем дело с обычным файлом (не каталогом и не исполняемым -файлом). - -Почти каждой команде в системе UNIX можно указывать несколько опций в -дополнение к её обязательным аргументам. Как правило, эти опции начинаются с -символа `-`. Так было в продемонстрированном выше случае, где опция `-F` -сообщала команде `ls`, что надо дать дополнительную информацию о типе файлов. -В приведённом выше случае эта дополнительная информация свелась к тому, что в -конце имени каталогов печатался символ `/`. - -Если команде `ls` сообщается имя каталога, то на экран будет выдано -содержимое этого каталога: - ------------------------------------------------------------------------------- -/home/larry# ls -F -papers -english-lit -history-final -masters-thesis -notes/ -/home/larry\# ------------------------------------------------------------------------------- - -Посмотрим более интересный список -- содержимое системного каталога `/etc`: - ------------------------------------------------------------------------------- - -/home/larry# ls /etc -Images ftpusers lpc rc.new shells -adm getty magic rc0.d startcons -bcheckrc gettydefs motd rc1.d swapoff -brc group mount rc2.d swapon -brc~ inet mtab rc3.d syslog.conf -csh.cshrc init mtools rc4.d syslog.pid -csh.login init.d pac rc5.d syslogd.reload -default initrunlvl passwd rmt termcap -disktab inittab printcap rpc umount -fdprm inittab.old profile rpcinfo update -fstab issue psdatabase securetty utmp -ftpaccess lilo rc services wtmp -/home/larry# -------------------------------------------------------------------------------- - -Если вы были пользователем системы MS-DOS, вы можете отметить, что в Linux -имена файлов могут быть длиннее восьми символов и точка может находится на -любом месте. Более того, в имени файла может быть несколько точек. - -Отправимся в начало дерева каталогов и спустимся теперь в другой каталог. Для -этого используем следующие команды: - ------------------------------------------------------------------------------- -/home/larry# cd .. -/home# cd .. /# cd usr -/usr# cd bin -/usr/bin# ------------------------------------------------------------------------------- - -По дереву каталогов можно также двигаться в один шаг, например, отдав -команду `cd /usr/bin`. - -Попробуйте теперь самостоятельно двигаться по дереву каталогов, используя -команды `ls` и `cd`. В некоторых случаях вам встретится сообщение -`Permission denied` (запрещён доступ). Это сообщение об ошибке выдаёт система -безопасности, предусмотренная в системе UNIX. Для того, чтобы исполнить -команды `ls` или `cd`, надо иметь на это разрешение. Более подробно об этом -будет говориться в разделе, посвящённом правам доступа. - -=== Создание новых каталогов === - -Попробуем теперь создавать новые каталоги командой `mkdir` (сокращение от -`make directory`). Попробуйте использовать следующие команды: - ------------------------------------------------------------------------------- -/home/larry# mkdir foo -/home/larry# ls -F -Mail/ -foo/ -letters/ -papers/ -/home/larry# cd foo -/home/larry/foo# ls -/home/larry/foo# ------------------------------------------------------------------------------- - -Итак, вы создали новый каталог и вошли в него. Этот новый каталог оказывается -пустым, в нем нет никаких файлов. Вскоре мы научимся копировать файлы из -одного каталога в другой. - -=== Копирование файлов === - -Для копирования файлов используется команда `cp` (сокращение от copy). Пример: - ------------------------------------------------------------------------------- -/home/larry/foo# cp /etc/termcap . -/home/larry/foo# cp /etc/shells . -/home/larry/foo# ls -F -shells -termcap -/home/larry/foo# cp shells bells -/home/larry/foo# ls -F -bells -shells -termcap -/home/larry/foo# ------------------------------------------------------------------------------- - -Команда `cp` копирует файлы, перечисленные в командной строке, в файл или -каталог, который указан последним аргументом. Обратите внимание, что для -указания текущего каталога используется символ .. - -=== Перенос файлов === - -Команда `mv` (сокращение от `mov`e) переносит файлы, а не копирует. Синтаксис -команды очень простой: - ------------------------------------------------------------------------------- -/home/larry/foo# mv termcap sells -/home/larry/foo# ls -F -bells -sells -shells -/home/larry/foo\# ------------------------------------------------------------------------------- - -В данном примере файлу `termcap` было дано новое имя `sells`. Команда `mv` -может быть использована также для переноса файлов в совершенно другой каталог. - -============================================================= -Внимание:: -Команды `mv` и `cp` создают файл с новым именем (либо путём копирования, либо -переноса). Однако если файл с этим новым именем _уже существует_, то старый -файл будет уничтожен, а на его месте появится новый, при этом система не -спросит разрешения это сделать и не выдаст никакого предупреждения. При -переносе файлов в другой каталог следует соблюдать осторожность. В этом -каталоге уже может находиться файл с таким именем, и он будет уничтожен, а -вместо него появится новый файл. -============================================================= - -=== Уничтожение файлов и каталогов === - -Для уничтожения файлов используется команда `rm` (сокращение от remove), -например: - ------------------------------------------------------------------------------- -/home/larry/foo# rm bells sells -/home/larry/foo# ls -F -shells -/home/larry/foo\# ------------------------------------------------------------------------------- - -Ещё раз отметим, что по умолчанию команда `rm` не всегда настроена таким -образом, чтобы выдавать предупреждения перед уничтожением файла, так что -нужно быть осторожным. - -Для уничтожения каталогов используется команда `rmdir` (произошло от `remove -directory`). Эта команда уничтожает каталог только в том случае, если каталог -пуст. Если в этом каталоге есть какие-нибудь файлы или подкаталоги, то -команда `rmdir` выдаст сообщение об ошибке. - -=== Просмотр содержимого файлов === - -Для просмотра содержимого файлов используются команды `more` и `cat`. -Команда `more` выводит содержимое файла на экран по одному экрану за один -раз, в то время как команда `cat` выводит весь файл сразу. -Усовершенствованная версия `more` называется `less`. - -Для того, чтобы увидеть содержание файла `shells`, введём следующую команду: - ------------------------------------------------------------------------------ -/home/larry/foo# more ------------------------------------------------------------------------------ - -Тем, кто интересуется, что же записано в файле `shells`, сообщаем, что там -содержится список командных оболочек, доступных пользователю в данной -системе. В большинстве систем в этот список входят `/bin/sh, /bin/bash, -/bin/csh`. О различных командных оболочках речь пойдёт ниже. - -При использовании программы `more` для вывода на экран следующей порции -текста надо нажимать клавишу *Space*, а для того, чтобы вывести предыдущую -порцию -- клавишу *b*. При работе программы `more` доступны ещё несколько -команд -- здесь даются только основные. Чтобы закончить работу команды -`more`, нужно нажать клавишу *q*. - -Итак, заканчивайте работу с командой `more` и попробуйте команду `cat -/etc/termcap`. Весьма возможно, что этот текст промелькнёт по экрану слишком -быстро, чтобы его можно было прочесть. Название команды `cat` происходит от -слова concatenate (связывать). В действительности, команда `cat` используется -именно для того, чтобы приписывать содержимое одного файла к окончанию -другого файла и помещать результат в третий файл. Это также будет обсуждаться -в разделе, посвящённом скриптам командной оболочки. - -=== Экранная документация === - -Почти все системы семейства UNIX, включая систему Linux, имеют экранную -документацию (man pages). Её тексты содержат документацию по системным -командам, ресурсам, конфигурационным файлам и т. д. и могут быть выведены на -экран в процессе работы. - -Для доступа к экранной документации используется команда man (сокращение от -manual). Если вы хотите узнать, какие ещё есть опции у команды `ls`, вы -можете ввести команду: - ------------------------------------------------------------------------------- -`/home/larry# man ls` ------------------------------------------------------------------------------- - -и на экран будет выведена экранная документация для команды `ls` - -К сожалению, большинство экранных документаций написано для тех -пользователей, которые уже имеют некоторое представление о том, что делает -данная команда footnote:[И также владеют английским языком.]. Поэтому -большинство текстов экранной документации содержит исключительно технические -детали команды без особых пояснений. Тем не менее, экранная документация -оказывается очень ценной в том случае, если вы помните название команды, но -её синтаксис просто выпал у вас из памяти. Кроме того, экранная документация -имеются и для тех команд, которые в данной книге не объясняются. - -Попробуйте с помощью команды `man` вывести на экран документацию для тех -команд, которые ранее встречались в этом тексте, а также используйте её -всякий раз, когда встречается новая команда. Для некоторых из этих команд -может не быть экранной документации (по разным причинам). Во-первых, тексты -экранной документации могут быть просто ещё не написаны. Экранная -документация разрабатывается в рамках проекта Linux Documentation Project. -Постепенно в этом проекте собирается вся экранная документация для этой -системы. Во-вторых, команда может быть внутренней командой командной оболочки -или же псевдонимом, для которых не пишутся отдельные экранные документации. -Примером может служить команда `cd`, которая является внутренней командой -командной оболочки. Эта команда интерпретируется самой командной оболочкой, -поэтому не существует отдельной программы для исполнения этой команды. diff --git a/admin-basics/terminal/basic/docs-linux_intro.txt b/admin-basics/terminal/basic/docs-linux_intro.txt deleted file mode 100644 index fb085f6..0000000 --- a/admin-basics/terminal/basic/docs-linux_intro.txt +++ /dev/null @@ -1,15598 +0,0 @@ -== Введение в ОС Linux == - -. <> -. <> -. <> -. <> -. <> -. <> -. <> -. <> -. <> -. <> -. <> -. <> -. <> -. <> -. <> -. <> -. <> -. <> -. <> - -[[introduction]] -== Предисловие == - -=== Структура курса === - -В курсе даются основные понятия операционной системы Linux и важнейшие -навыки работы в ней. Изложение сопровождается большим количеством -практических примеров. Данный курс может рассматриваться как учебник -для студентов, начинающих обучение по специальностям в области -информатики и ещё не знакомых с ОС Linux. Он состоит из двух -основных частей: - -. В первой части вводятся основные понятия и навыки, необходимые -пользователю для того, чтобы начать грамотно работать в Linux. -Здесь рассмотрены: пользователи с точки зрения системы, понятие -терминал и работа с командной строкой, устройства файловой системы -и работа с ней, права доступа в Linux, возможности командной -оболочки, текстовые редакторы. -. Вторая часть посвящена тем понятиям и навыкам, которые требуются -для администрирования ОС Linux. Сюда входит обсуждение этапов -загрузки системы, технологий работы с внешними устройствами, -файловыми системами и сетью в Linux, администрирование системы -посредством конфигурационных файлов, управление пакетами. - -В завершающей лекции курса даётся обзор истории возникновения и -развития Linux. Здесь же приведён обзор социального контекста, -существенного для понимания ОС Linux и работы в ней: сообщество -пользователей, лицензирование свободного программного обеспечения, -место свободного ПО на современном рынке, дистрибутивы Linux и -решения на базе Linux. - -==== Примеры ==== - -Теоретическое изложение материала перемежается практическими -примерами: показаны конкретные действия пользователя и их результат. -Наиболее эффективный способ освоить материал курса -- по ходу чтения -лекций выполнять все примеры самостоятельно. Для этого потребуется -доступ к установленному дистрибутиву Linux. Примеры подобраны с -таким расчётом, чтобы результат был одинаковым в любом современном -дистрибутиве. - -В примерах действует один условный пользователь, работающий «в одном -и том же месте»: все созданные им файлы сохраняются и используются -в последующих лекциях. Он совершает типичные ошибки или, наоборот, -делает всё правильно. - -Примеры набраны моноширинным шрифтом (типа «пишущая машинка») и по -возможности точно воспроизводят то, что пользователь видит на экране -монитора (иногда с некоторыми купюрами). Команды, которые должен -вводить пользователь, в примерах следуют за «приглашением» (оно -завершается знаком `«$»`): все символы от `«$»` до конца строки -- и -есть ввод пользователя. - -Названия объектов системы (имена файлов, программ и т. п.), -встречающиеся в тексте, также набраны моноширинным шрифтом, их -можно в неизменном виде вводить в качестве команд и т. п. Однако -иногда такие строки для удобства чтения заключены в кавычки -- в -этом случае вводить кавычки не нужно. - -==== Цель ==== - -Курс адресован студентам, начинающим обучение по специальностям в -области информационных технологий, а также всем любознательным -пользователям, желающим научиться грамотно и эффективно работать в -Linux. Изучение курса не требует специальных знаний в области -программирования. - -==== Предварительные знания ==== - -Рекомендуемый уровень предварительной подготовки: - -. знакомство с устройством компьютера на уровне пользователя; -. знакомство с устройством и принципом работы TCP/IP-сетей. - -[[session]] -== Сеанс работы в Linux == - -=== Пользователи системы === - -Между включением питания компьютера и моментом, когда система готова к -работе с пользователем, происходит процедура _загрузки системы_. В -процессе загрузки будет запущена основная управляющая программа (_ядро_), -определено и инициализировано имеющееся оборудование, активизированы -сетевые соединения, запущены системные службы. В Linux во время -загрузки на экран выводятся диагностические сообщения о происходящих -событиях, и если всё в порядке и не возникло никаких ошибок, загрузка -завершится выводом на экран приглашения «login:». Оно может быть -оформлено по-разному, в зависимости от настройки системы оно может -отображаться в красиво оформленном окне или в виде простой текстовой -строки вверху экрана. Это приглашение к _регистрации в системе_: система -ожидает, что в ответ на это приглашение будет введено _входное имя -пользователя_, который начинает работу. Естественно, имеет смысл вводить -такое имя, которое уже известно системе, чтобы она могла «узнать», с -кем предстоит работать, выполнять команды «незнакомого» Linux откажется. - -==== Многопользовательская модель разграничения доступа ==== - -Процедура регистрации в системе обязательна для Linux, работать в -системе, не зарегистрировавшись под тем или иным именем пользователя, -просто невозможно footnote:[Вместо формального «зарегистрироваться в -системе» обычно используют выражение «войти в систему». -Операционная система представляется чем-то вроде замкнутого -помещения, внутри которого можно оказаться, только успешно -проникнув через «дверь» -- пройдя процедуру регистрации.]. -Для каждого пользователя определена сфера -его полномочий в системе: программы, которые он может запускать, -файлы, которые он имеет право просматривать, изменять, удалять. -При попытке сделать что-то, выходящее за рамки полномочий, пользователь -получит сообщение об ошибке. Такая строгость может показаться -необязательной, если пользователи компьютера доверяют друг другу, -и особенно если у компьютера только один пользователь. Такая ситуация -очень распространена на сегодняшний день, когда слово «компьютер» -означает в первую очередь «персональный компьютер». - -Однако _персональный компьютер_ -- довольно-таки позднее явление в мире -вычислительной техники, получившее широкое распространение только в -последние два десятилетия. Несколько раньше «компьютер» ассоциировался -с огромным и дорогостоящим (занимавшем целые залы) вычислительным -центром, предназначенным в первую очередь для решения разного рода -научных задач. Машинное время такого центра стоит очень недёшево, и -при этом его возможности необходимы одновременно многим сотрудникам, -которые могут ничего не знать о работе друг друга. Требуется следить -за тем, чтобы не произошло случайного вмешательства пользователей в -чужую работу и повреждения чужих данных (файлов), выделять каждому -машинное время (по возможности избежав простаивания), пространство -на диске и при этом не допустить узурпирования всех ресурсов одним -пользователем и его задачей, а равномерно делить ресурсы между всеми. -Для такой системы принципиально важно знать, кому принадлежат задачи -и файлы, поэтому и возникла необходимость выдавать доступ к ресурсам -системы только после того, как пользователь зарегистрируется в системе -под тем или иным именем. - -Такая модель была реализована в _многопользовательской операционной -системе_ UNIX. Именно от неё Linux -- также многопользовательская -система -- унаследовал принципы работы с пользователями. Но это не -просто дань традиции или стремление к универсальности: -многопользовательская модель позволяет решить ряд задач, весьма -актуальных и для современных _персональных компьютеров_, и для серверов, -работающих в локальных и глобальных сетях, и вообще в любых системах, -одновременно выполняющих разные задачи, отвечают за которые разные люди. - -Компьютер -- это всего лишь инструмент для решения разного рода -прикладных задач: от набора и распечатывания текста до вычислений. -Сложность состоит в том, что для изменения этого инструмента и для -работы с его помощью используются одни и те же операции: изменение -файлов, выполнение программ. Получается, что, если не соблюдать -осторожности, побочным результатом работы может стать выход из строя -самой системы. Поэтому первоочередная задача для систем любого -масштаба -- разделять повседневную работу и изменение самой системы. -В многопользовательской модели эта задача решается очень просто: -разделяются _обычные пользователи и администратор (ы)_. В полномочия -обычного пользователя входит все необходимое для выполнения прикладных -задач, попросту говоря, для работы, однако ему запрещено выполнение -действий, изменяющих саму систему. Таким образом можно избежать -повреждения системы в результате ошибки пользователя (нажал не ту -кнопку) или ошибки в программе, или даже по злому умыслу (например, -вредительской программой-вирусом). Полномочия администратора обычно -е ограничены. - -Для персонального компьютера, с которым работают несколько человек, -довольно важно обеспечить каждому независимую рабочую среду. Это -снижает вероятность случайного повреждения чужих данных, а также -позволяет каждому пользователю настроить внешний вид рабочей среды -по своему вкусу и, например, сохранить расположение открытых окон -между сеансами работы. Эта задача очевидным образом решается в -многопользовательской модели: организуется _домашний каталог_, где -хранятся данные пользователя, настройки внешнего вида и поведения -его системы и т. п., доступ остальных пользователей к этому -каталогу ограничивается. - -Если компьютер подключён к глобальной или локальной сети, то вполне -вероятно, что какую-то часть хранящихся на нем ресурсов имеет смысл -сделать публичной и доступной по сети. Напротив, часть данных, -скорее всего, делать публичными не следует (например, личную переписку). -Ограничив публичный доступ пользователей к персональным данным друг -друга, мы решим и эту задачу. - -Именно благодаря гибкости многопользовательской модели разграничения -доступа она используется сегодня не только на серверах, но и на -домашних персональных компьютерах. В самом простом варианте -- для -персонального компьютера, на котором работает только один человек -- эта -модель сводится к двум пользователям: обычному пользователю для -повседневной работы и администратору -- для настройки, обновления, -дополнения системы и исправления неполадок. Но даже в таком -сокращённом варианте это даёт целый ряд названных выше преимуществ. - -==== Учётные записи ==== - -Конечно, система может быть «знакома» с человеком только в переносном -смысле: в ней должна храниться запись о пользователе с таким именем и -о связанной с ним системной информации -- _учётная запись_. Английский -эквивалент термина _учётная запись -- account_, «счёт». Именно с -учётными записями, а не с самими пользователями, и работает система. -В действительности, соотношение учётных записей и пользователей-людей -в Linux обычно не является однозначным: несколько человек могут -использовать одну учётную запись -- система не может их различить. -И в то же время в Linux имеются учётные записи для _системных -пользователей_, от имени которых работают некоторые программы и -которые не предназначены для работы людей. - -================================= -Учётная запись:: - объект системы, при помощи которого Linux ведёт учёт работы - пользователя в системе. Учётная запись содержит данные о - пользователе, необходимые для регистрации в системе и дальнейшей - работы с ней. -================================= - -Учётные записи могут быть созданы во время установки системы или -после установки. Подробно процедура создания учётных записей -(добавления пользователей) описана в -лекции <>. - -Главное для человека в учётной записи -- её название, _входное имя -пользователя_. Именно о нём спрашивает система, выводя приглашение -«login:». Помимо входного имени в учётной записи содержатся некоторые -сведения о пользователе, необходимые системе для работы с ним. Ниже -приведён список этих сведений. - -================================= -Входное имя:: - название учётной записи пользователя, которое нужно вводить при - регистрации пользователя в системе. -================================= - -===== Идентификатор пользователя ===== - -Linux связывает _входное имя c идентификатором пользователя_ в -системе -- _UID_ (User ID). _UID_ -- это положительное целое число, -по которому система и отслеживает пользователей footnote:[Это может -оказаться важным, например, в такой ситуации: учётную запись -пользователя с именем `test` удалили из системы, а потом добавили -снова. Однако с точки зрения системы это уже другой пользователь, -потому что у него другой UID.]. Обычно это -число выбирается автоматически при регистрации учётной записи, однако -оно не может быть совершенно произвольным. В Linux есть некоторые -соглашения относительно того, каким типам пользователей могут быть -выданы идентификаторы из того или иного диапазона. В частности, _UID_ -от «0» до «100» зарезервированы для _псевдопользователей_ -footnote:[Обычно Linux выдаёт нормальным пользователям UID, -начиная с «500» или «1000».]. - -================================= -Идентификатор пользователя:: - уникальное число, однозначно идентифицирующее _учётную запись_ - пользователя в Linux. Таким числом снабжены все _процессы_ Linux - и все объекты _файловой системы_. Используется для персонального - учёта действий пользователя и определения _прав доступа_ к другим - объектам системы -================================= - -===== Идентификатор группы ===== - -Кроме идентификационного номера пользователя с учётной записью связан -_идентификатор группы_. _Группы пользователей_ применяются для организации -доступа нескольких пользователей к некоторым ресурсам. У группы, так же, -как и у пользователя, есть имя и идентификационный номер -- _GID_ -(Group ID). В Linux пользователь должен принадлежать как минимум к -одной группе -- _группе по умолчанию_. При создании учётной записи -пользователя обычно создаётся и группа, имя которой совпадает с -_входным именем_ footnote:[Как правило, численное значение GID -в этом случае совпадает со значением UID.], именно -эта группа будет использоваться как -группа по умолчанию для этого пользователя. Пользователь может входить -более чем в одну группу, но в учётной записи указывается только номер -группы по умолчанию. - -===== Полное имя ===== - -Помимо _входного имени_ в учётной записи содержится и _полное имя_ -(имя и фамилия) использующего данную учётную запись человека. Конечно, -пользователь может указать что угодно в качестве своего имени и фамилии. -Полное имя необходимо не столько системе, сколько людям -- чтобы иметь -возможность определить, кому принадлежит учётная запись. - -===== Домашний каталог ===== - -Файлы всех пользователей в Linux хранятся раздельно, у каждого -пользователя есть собственный _домашний каталог_, в котором он может -хранить свои данные. Доступ других пользователей к домашнему каталогу -пользователя может быть ограничен. Информация о домашнем каталоге -обязательно должна присутствовать в учётной записи, потому что именно -с него начинает работу пользователь, зарегистрировавшийся в системе. - -===== Командная оболочка ===== - -Каждому пользователю нужно предоставить способ взаимодействовать с -системой: передавать ей команды и получать её ответы. Для этой цели -служит специальная программа -- _командная оболочка_ (или интерпретатор -командной строки), она должна быть запущена для каждого пользователя, -зарегистрировавшегося в системе. Поскольку в Linux доступно несколько -разных командных оболочек, в учётной записи указано, какую из командных -оболочек нужно запустить для данного пользователя. Если специально не -указывать командную оболочку при создании учётной записи, она будет -назначена по умолчанию, вероятнее всего это будет `bash`. - -===================================================== -Интерпретатор командной строки:: - программа, используемая в Linux для организации диалога человека и - системы. Командный интерпретатор имеет три основных ипостаси: - -. редактор и анализатор команд в _командной строке_, -. высокоуровневый системно-ориентированный язык программирования, -. средство организации взаимодействия команд друг с другом и с системой. -===================================================== - -==== Понятие «администратор» ==== - -В Linux есть ровно один пользователь, полномочия которого в системе -принципиально отличаются от полномочий остальных пользователей -- это -пользователь с идентификатором «0». Обычно учётная запись пользователя -с `UID=0` называется `root` (англ., «корень»). Пользователь `root` -- это -«администратор» системы Linux, учётная запись для `root` обязательно -присутствует в любой системе Linux, даже если в ней нет никаких других -учётных записей. Пользователю с таким UID разрешено выполнять любые -действия в системе, а значит, любая ошибка или неправильное действие -может повредить систему, уничтожить данные и привести к другим -печальным последствиям. Поэтому категорически не рекомендуется -регистрироваться в системе под именем `root` для повседневной работы. -Работать в `root` следует только тогда, когда это действительно -необходимо: при настройке и обновлении системы, восстановлении -после сбоев. - -Именно `root` обладает достаточными полномочиями для создания новых -учётных записей. - -=== Регистрация в системе === - -Вернёмся теперь к нашей загруженной операционной системе Linux, -которая по-прежнему ожидает ответа на своё приглашение `login:`. Если -Ваша система настроена таким образом, что это приглашение оформлено в -виде графического окна в центре экрана, нажмите комбинацию клавиш -*Ctrl+Alt+F1* -- произойдёт переключение видеорежима и Вы увидите -перед собой чёрный экран с примерно следующим текстом: - ------------------------------------- -Welcome to Some Linux / tty1 - -localhost login: ------------------------------------- - -Мы переключились в так называемый _текстовый режим_, в котором нам -недоступны возможности графических интерфейсов: рисование окон -произвольной формы и размера, поддержка миллионов цветов, отрисовка -изображений. Все возможности текстового режима ограничены набором -текстовых и псевдографических символов и несколькими десятками -базовых цветов. Однако в Linux в текстовом режиме можно выполнять -практически любые действия в системе (кроме тех, которые требуют -непосредственного просмотра изображений). Текстовый режим в Linux -- -это полнофункциональный способ управления системой. В различных -реализациях Linux работа в графическом режиме может выглядеть очень -по-разному footnote:[Разнообразие -графических интерфейсов Linux гораздо выше, -чем, например, в Windows, поэтому составить учебный курс, не -ориентируясь специально на ту или иную версию, -просто невозможно.], более того, графический -режим может быть даже недоступен -после установки системы без специальной настройки. Текстовый режим, -напротив, доступен в любой реализации Linux и всегда выглядит -практически одинаково. Именно поэтому все дальнейшие примеры и -упражнения мы будем проделывать в текстовом режиме, возможностей -которого будет достаточно для освоения всего излагаемого в курсе -материала. - -Первая строка в примере -- это просто приглашение, она носит -информационный характер. Существует очень много различных реализаций -Linux (существующие реализации будут обсуждаться в -лекции <>. История Linux: от ядра к дистрибутивам), и -в каждом из них принят свой формат первой пригласительной строки, -хотя почти наверняка там будет указано, с какой именно версией Linux -Вы имеете дело, и, возможно, будут присутствовать ещё некоторые -параметры. В наших примерах мы будем использовать условную -реализацию Linux -- `Some Linux`. - -Вторая строка начинается с _имени хоста_ -- собственного имени системы, -установленной на данном компьютере. Это имя существенно в том случае, -если компьютер подключён к локальной или глобальной сети, если же он -ни с кем более не связан, это имя может быть любым. Обычно имя хоста -определяется уже при установке системы, однако в нашем случае этого -сделано не было, и используется вариант по умолчанию -- `localhost`. -Заканчивается эта строка собственно приглашением к регистрации в -системе -- словом `login:`. - -Теперь понятно, что в ответ на это приглашение мы должны ввести _входное -имя_, для которого есть соответствующая _учётная запись_ в системе. В -правильно установленной операционной системе Linux должна существовать -как минимум одна учётная запись для _обычного пользователя_. Во всех -дальнейших примерах у нас будет участвовать Мефодий Кашин, владелец -учётной записи `methody` в системе `Some Linux`. Вы можете пользоваться -для выполнения примеров любой учётной записью, которая создана в Вашей -системе (естественно, кроме `root`). - -Итак, Мефодий вводит своё входное имя в ответ на приглашение системы: - ------------------------------------- -Welcome to Some Linux / tty1 -localhost login: Methody - -Password: -Login incorrect - -login: ------------------------------------- - -В ответ на это система запрашивает _пароль_. Пароль Мефодия нам -неизвестен, поскольку он его никому не говорит. Когда Мефодий вводил -свой пароль, на экране монитора он не отображался (это сделано, чтобы -пароль нельзя было подсмотреть), однако Мефодий точно знает, что не -сделал опечатки. Тем не менее система отказала ему в регистрации, -выдав сообщение об ошибке (`Login incorrect`). Если же внимательно -посмотреть на введённое им имя пользователя, можно заметить, что оно -начинается с заглавной буквы, в то время как учётная запись называется -`methody`. Linux всегда делает различие между заглавными и строчными -буквами, поэтому `Methody` для него -- уже другое имя. Теперь Мефодий -повторит попытку: - ------------------------------------------------- -login: methody -Password: -[methody@localhost methody]$ ------------------------------------------------- - -В этот раз регистрация прошла успешно, о чём свидетельствует последняя -строка примера -- _приглашение командной строки_. Приглашение -- это -подсказка, выводимая _командной оболочкой_ и свидетельствующая о том, -что система готова принимать команды пользователя. Приглашение может -быть оформлено по-разному, более того, пользователь может сам -управлять видом приглашения (подробнее это будет рассмотрено в лекции -<>), но -почти наверняка в приглашении -содержатся _входное имя_ и _имя хоста_ -- в нашем примере это `methody` и -`localhost` соответственно. Заканчивается приглашение чаще всего -символом `«$»`. Это _командная строка_, в которой будут отображаться все -введённые пользователем с клавиатуры команды, а при нажатии на клавишу -*Enter* содержимое командной строки будет передано для исполнения -системе. - -==== Идентификация (authentication) ==== - -Когда система выводит на экран приглашение командной строки после -того, как правильно введены имя пользователя и пароль, это означает, -что произошла _идентификация пользователя_ (authentication, «проверка -подлинности»). Пароль может показаться излишней сложностью, но у -системы нет другого способа удостовериться, что за монитором находится -именно тот человек, который имеет право на использование данной -учётной записи. - -Конечно, процедура идентификации имеет очевидное значение для систем, -к которым имеют непосредственный или сетевой доступ многие не связанные -друг с другом пользователи. Процедура идентификации даёт уверенность, -что к такой системе не получит доступ случайный человек, не имеющий -права использовать её ресурсы и хранящуюся там информацию. Одновременно -она даёт определённую гарантию безопасности от злонамеренного -вмешательства: даже если навредить попытается пользователь, имеющий -учётную запись, его действия будут зарегистрированы в системе -(поскольку системе всегда известно, от имени какой учётной записи -выполняются те или иные действия), и злоумышленника можно будет найти -и остановить. - -Для тех пользователей, кому процедура идентификации кажется -утомительной и необязательной (например, единственным пользователям -персональных компьютеров), существует возможность получить доступ к -системе, минуя процедуру идентификации. Для этой цели служит программа -`autologin`. Она предоставляет доступ к работе с графическим интерфейсом -сразу после загрузки системы, не запрашивая имя пользователя и пароль. -В действительности, `autologin` запускает все программы от имени одного -пользователя, зарегистрированного в системе. Например, Мефодий мог бы -использовать свою учётную запись `methody` для автоматического входа в -систему. Однако у этого подхода есть свои минусы: - -* Теряется возможность определить, кто, что и когда делал в системе, -потому что все реальные пользователи работают с одной учётной записью, -с точки зрения системы все они -- один и тот же пользователь. -* Вся личная информация этого пользователя становится «общественной». -* Пароль легко забывается (пароль всё равно есть у любого пользователя), -потому что его не нужно вводить каждый день. При этом `autologin` даёт -доступ только человеку, сидящему перед монитором и только к работе с -графическим интерфейсом. Если же потребуется, например, скопировать -файлы с Вашего компьютера по сети, пароль всё равно нужно будет вводить. - -Учитывая все перечисленные минусы, можно заключить, что использовать -`autologin` разумно только в тех системах, которые не подключены к -локальной или глобальной сети, и к которым при этом открыт публичный -доступ (например, в библиотеке). - -==== Смена пароля ==== - -Если учётная запись была создана не самим пользователем, а -администратором многопользовательской системы (скажем, -администратором компьютерного класса), скорее всего был выбран -тривиальный пароль с тем расчётом, что пользователь его изменит -при первом же входе в систему. Распространены тривиальные пароли -«123456», «empty» и т. п. Поскольку пароль -- это единственная -гарантия, что Вашей учётной записью не воспользуется никто, кроме -Вас, есть смысл выбирать в качестве пароля неочевидные -последовательности символов. В Linux нет серьёзных ограничений на -длину пароля или входящие в него символы (в частности, использовать -пробел можно), но нет смысла делать пароль слишком длинным -- сразу -возрастает опасность его забыть. Надёжность паролю придаёт его -непредсказуемость, а не длина. Например, пароль, представляющий собой -Ваше имя или повторяющий название учётной записи, очень предсказуем. -Наименее предсказуемы пароли, представляющие собой случайную -комбинацию прописных и строчных букв, цифр, знаков препинания, но -их и труднее всего запомнить. - -Пользователь может в любой момент поменять свой пароль. Единственное, -что требуется для смены пароля -- знать текущий пароль. Допустим, -Мефодий придумал более удачный пароль и решил его поменять. Он уже -зарегистрирован в системе, поэтому ему нужно только набрать в -командной строке команду `passwd` и нажать *Enter*. - ---------------------------------------------- -[methody@localhost methody]$ passwd -Changing password for methody. -Enter current password: - -You can now choose the new password or passphrase. - -A valid password should be a mix of upper and lower case letters, -digits, and other characters. You can use an 8 character long -password with characters from at least 3 of these 4 classes, or -a 7 character long password containing characters from all the -classes. An upper case letter that begins the password and a -digit that ends it do not count towards the number of character -classes used. - -A passphrase should be of at least 3 words, 12 to 40 characters -long and contain enough different characters. - -Alternatively, if noone else can see your terminal now, you can -pick this as your password: "spinal&state:buy". - -Enter new password: ---------------------------------------------- - -Набрав в командной строке `passwd`, Мефодий запустил программу `passwd`, -которая предназначена именно для замены информации о пароле в учётной -записи пользователя. Она вывела приглашение ввести текущий пароль -(`Enter current password`), а затем, в ответ на правильно введённый -пароль, предложила подсказку про грамотное составление пароля и даже -вариант надёжного пароля, который Мефодий вполне может использовать, -если никто в данный момент не видит его монитора. При каждом запуске -`passwd` генерирует новый случайный пароль и предлагает его -пользователю. Однако Мефодий не воспользовался подсказкой и -придумал пароль сам. - ---------------------------------------------- -Enter new password: -Weak password: not enough different characters or classes for this length. -Try again. - -. . . - -Enter new password: ---------------------------------------------- - -В данном случае операция не удалась, поскольку с точки зрения `passwd` -пароль, придуманный Мефодием, оказался слишком простым footnote:[В -разных дистрибутивах Linux используется разные версии программы -`passwd`, поэтому не всегда она будет столь -придирчива, как в дистрибутиве Мефодия.]. -В следующий раз ему придётся ввести более -сложный пароль. `passwd` запрашивает -новый пароль дважды, чтобы удостовериться, что в первый раз не было -сделано опечатки, если же всё в порядке, она выведет сообщение о том, -что операция смены пароля прошла успешно, и завершит работу, вернув -Мефодию приглашение командной строки. - ---------------------------------------------- -Enter new password: -Re-type new password: -passwd: All authentication tokens updated successfully -[methody@localhost methody]$ ---------------------------------------------- - -Придирчивость, с которой `passwd` относится к паролю пользователя, -не случайна. Пароль пользователя -- одно из самых важных и зачастую -одно из самых слабых мест безопасности системы. Отгадавший Ваш пароль -(причём не имеет значение, человек это сделал или злонамеренная -программа) получит доступ к ресурсам системы ровно в том объёме, в -котором он предоставляется Вам, сможет читать и удалять Ваши файлы -и т. п. Особенно это важно в случае пароля администратора, потому -что его полномочия в системе гораздо шире, а действия от его имени -могут повредить и саму систему. Обычному пользователю в некоторых -обстоятельствах также могут быть переданы полномочия администратора -(этот вопрос будет подробно обсуждаться -в лекции <>), в -таком случае не менее важно, чтобы и его пароль был надёжным. - -Пароль пользователя `root` изначально назначается при установке системы, -однако он может быть изменён в любой момент впоследствии точно так же, -как и пароль обычного пользователя. - -=== Одновременный доступ к системе === - -То, что Linux -- многопользовательская и многозадачная система, -проявляется не только в разграничении прав доступа, но и в -организации рабочего места. Каждый компьютер, на котором работает -Linux, предоставляет возможность зарегистрироваться и получить -доступ к системе одновременно нескольким пользователям. Даже если -в распоряжении всех пользователей есть только один монитор и одна -системная клавиатура, эта возможность небесполезна: одновременная -регистрация в системе нескольких пользователей позволяет работать -по очереди без необходимости каждый раз завершать все начатые задачи -(закрывать все окна, прерывать исполнение всех программ) и затем -возобновлять их. Более того, ничто не препятствует зарегистрироваться -в системе несколько раз под одним и тем же входным именем. Таким -образом, можно получить доступ к одним и тем же ресурсам (своим -файлам) и организовать параллельную работу над несколькими задачами. - -==== Виртуальные консоли ==== - -Характерный для Linux способ организации параллельной работы -пользователей -- виртуальные консоли. - -Допустим, что Мефодий хочет зарегистрироваться в системе ещё раз, -чтобы иметь возможность следить за выполнением двух программ -одновременно. Он может сделать это, не покидая текстового режима: -достаточно нажать комбинацию клавиш *Alt+F2*, и на экране появится -новое приглашение к регистрации в системе. - ---------------------------------------------- -Welcome to Some Linux / tty2 -localhost login: methody -Password: -[methody@localhost methody]$ ---------------------------------------------- - -Мефодий ввёл свой новый пароль и получил приглашение командной -строки, аналогичное тому, которое мы уже видели в предыдущих -примерах. Нажав комбинацию клавиш *Alt+F1*, Мефодий вернётся к -только что покинутой им командной строке, в которой он выполнял -команду `passwd` для смены пароля. Приглашение в обоих случаях -выглядит одинаково, и это не случайно -- обе командные строки -предоставляют совершенно эквивалентный доступ к системе, в любой -из них можно выполнять любые доступные команды. - -Наблюдательный Мефодий обратил внимание, что в последнем примере -(`tty2`) первая строка приглашения оканчивается словом `«tty2»`. -`«tty2»` -- это обозначение _второй виртуальной консоли_. Можно -переключаться между виртуальными консолями так, как если бы Вы -переходили от одного монитора с клавиатурой к другому, подавая -время от времени команды и следя за выполняющимися там программами. -По умолчанию в Linux доступно не менее 6-ти виртуальных консолей, -переключаться между которыми можно при помощи сочетания клавиши *Alt* -с одной из функциональных клавиш (*F1–F6*), с каждым сочетанием -связана соответствующая по номеру виртуальная консоль. Виртуальные -консоли обозначаются `«ttyN»`, где `«N»` -- номер виртуальной консоли. - -================================================== -Виртуальная консоль:: - виртуальные консоли -- это несколько параллельно выполняемых - операционной системой программ, предоставляющих пользователю - возможность зарегистрироваться в системе в текстовом режиме и - получить доступ к командной строке. -================================================== - -Во многих дистрибутивах Linux одна из виртуальных консолей по умолчанию -не может быть использована для регистрации пользователя, однако она не -менее, если не более полезна. Если Мефодий нажмёт *Alt+F12*, он увидит -консоль, заполненную множеством сообщений системы о происходящих -событиях. В частности, там он может обнаружить две записи о том, -что в системе зарегистрирован пользователь `methody`. На эту консоль -выводятся сообщения обо всех важных событиях в системе: регистрации -пользователей, выполнении действий от имени администратора (`root`), -подключении устройств и подгрузке драйверов к ним и многое другое. - -Пример двенадцатой виртуальной консоли показывает, что виртуальные -консоли -- довольно гибкий механизм, поддерживаемый Linux, при помощи -которого можно решать разные задачи, а не только организацию -одновременного доступа к системе. Для того чтобы на виртуальной -консоли появилось приглашение `login`: после загрузки системы, для -каждой такой консоли должна быть запущена программа `getty`. Попробуйте -нажать *Alt+F10* -- с большой вероятностью Вы увидите просто чёрный -экран. Десятая виртуальная консоль поддерживается системой, однако -чёрный экран означает, что для этой консоли не запущена никакая -программа, поэтому воспользоваться её существованием не получится. -Для каких именно консолей будет запущена программа -`getty` -- определяется настройкой конкретной системы. Впоследствии эта -настройка может быть изменена пользователем. О том, как это может быть -сделано, речь пойдёт в лекции <>. - -==== Графические консоли ==== - -Впрочем, как ни широки возможности текстового режима, Linux ими не -ограничен. Подробно работа в графическом режиме будет разбираться -в последующих лекциях -(см. лекцию <>). Сейчас -важно заметить, что если при загрузке системы приглашение «login:» было -представлено в виде графического окна, можно вернуться к этому -приглашению, нажав комбинацию клавиш *Ctrl+Alt+F7*. Процедура регистрации -здесь будет совершенно аналогична регистрации в текстовом режиме. С -той разницей, что после _идентификации_ пользователя (правильно -введённого имени пользователя и пароля) Вы увидите не приглашение -командной строки, а графическую рабочую среду. Как именно она будет -выглядеть -- зависит от того, какую систему Вы используете, и как -она настроена. - -Кроме того, что несколько пользователей (или несколько «копий» -одного и того же пользователя) могут работать параллельно на разных -виртуальных консолях, они могут параллельно зарегистрироваться и -работать параллельно в разных графических средах. Обычно в стандартно -настроенной Linux-системе можно организовать не менее трёх графических -консолей, работающих одновременно. Переключаться между ними можно при -помощи сочетаний клавиш *Ctrl+Alt+F7–Ctrl+Alt+F9*. - -Чтобы переключиться из графического режима в одну из текстовых -виртуальных консолей, достаточно нажать комбинацию клавиш *Ctrl+Alt+FN*, -где «N» -- номер необходимой виртуальной консоли. - -=== Простейшие команды === - -Работа в Linux при помощи командной строки напоминает диалог с -системой: пользователь вводит команды (реплики), получая от системы -ответные реплики, содержащие сведения о произведённых операциях, -дополнительные вопросы к пользователю, сообщения об ошибках или -просто молчаливое согласие выполнить следующую -команду footnote:[Реплики в таком диалоге строго чередуются, -а собеседники не могут говорить одновременно -- в естественном -диалоге так никогда не происходит. Скорее это напоминает диалог -в учебнике иностранного языка. Однако и в диалоге с Linux у -собеседников есть возможность «перебить» друг друга -- об этом -речь пойдёт в последующих лекциях.]. - -Простейшая команда в Linux состоит из одного «слова» -- названия -программы, которую необходимо выполнить. Одну такую команду (`passwd`) -Мефодий уже использовал для того, чтобы изменить свой пароль. Теперь -Мефодий решил вернуться на одну из виртуальных консолей, на которой -он зарегистрировался, и попробовать выполнить несколько простых команд. - ---------------------------------------------------------- -[methody@localhost methody]$ whoami -methody -[methody@localhost methody]$ ---------------------------------------------------------- - -Название этой команды происходит от английского выражения «Who am I?» -(«Кто я?»). В ответ на эту команду система вывела только одно слово: -`methody` и завершила свою работу, о чём свидетельствует вновь -появившееся _приглашение командной строки_. Программа `whoami` возвращает -название учётной записи того пользователя, от имени которого она -была выполнена. Эта команда полезна в системах, в которых работает -много разных пользователей, чтобы не воспользоваться по ошибке чужой -учётной записью. Однако, в приглашении командной строки зачастую -указывается имя пользователя (как и в наших примерах), поэтому без -команды `whoami` можно обойтись. Следующий пример демонстрирует -программу, которая выдаст Мефодию уже больше полезной информации: -`who` («Кто»). - ---------------------------------------------------------- -[methody@localhost methody]$ who -methody tty1 Sep 23 16:31 (localhost) -methody tty2 Sep 23 17:12 (localhost) -[methody@localhost methody]$ -[methody@localhost methody]$ who am i -methody tty2 Sep 23 17:12 (localhost) -[methody@localhost methody]$ ---------------------------------------------------------- - -`who` выводит список пользователей, которые в настоящий момент -зарегистрированы в системе (вошли в систему). Данная программа -выводит по одной строке на каждого зарегистрированного пользователя: -в первой колонке указывается _имя пользователя_, во второй -- «точка -входа» в систему, далее следует дата и время регистрации и _имя -хоста_. Из выведенной `who` информации можно заключить, что в системе -дважды зарегистрирован пользователь `methody`, который сначала -зарегистрировался на первой виртуальной консоли (`tty1`), а примерно -через сорок минут -- на второй (`tty2`). Конечно, Мефодий и так это -знает, однако администратору больших систем, когда пользователи -могут зарегистрироваться со многих компьютеров и даже по Сети, -программа `who` может быть очень полезна. Могло создаться впечатление, -что `who` -- очень умная программа, понимающая английский, но это не -так. Из всех английских слов она понимает только сочетание -«am i» -- таким способом Мефодий узнал, за какой консолью он -сейчас работает. - -Ещё одна программа, выдающая информацию о пользователях, работавших в -системе в последнее время -- `last` footnote:[В некоторых -Linux-системах эта программа может называться `lastlog`.]. -Выводимые этой программой строки -напоминают вывод программы `who`, с той разницей, что здесь перечислены -и те пользователи, которые уже завершили работу. - ---------------------------------------------------------- -[methody@localhost methody]$ last -methody tty2 localhost Thu Sep 23 17:12 still logged in -methody tty1 localhost Thu Sep 23 16:31 still logged in -cacheman ??? localhost Thu Sep 23 16:15 - 16:17 (00:01) -cacheman ??? localhost Thu Sep 23 16:08 - 16:08 (00:00) -cyrus ??? localhost Thu Sep 23 16:08 - 16:08 (00:00) -reboot system boot 2.4.26-std-up-al Thu Sep 23 16:03 (04:13) ---------------------------------------------------------- - -В этом примере Мефодий неожиданно обнаружил кроме себя самого -неизвестных ему пользователей `cacheman` и `cyrus` -- он совершенно -точно знает, что не создавал учётных записей с такими именами. -Это _псевдопользователи_ (или _системные пользователи_) -- специальные -учётные записи, которые используются для работы некоторыми программами. -Поскольку эти «пользователи» регистрируются в системе без помощи -монитора и клавиатуры, их «точка входа» в систему не определена -(во второй колонке записано «???»). В выводе программы `last` появляется -даже пользователь `reboot` (перезагрузка). В действительности такой -учётной записи нет, программа `last` таким способом выводит информацию -о том, когда была загружена система. - -=== Выход из системы === - -В строках, выведенных программой `last`, указан не только момент -регистрации пользователя в системе, но и момент завершения работы. -Можно представлять Linux как закрытое помещение: чтобы начать работать -нужно сначала войти в систему (зарегистрироваться, пройти процедуру -идентификации), а после того, как работа закончена, нужно из системы -выйти. В том случае, если в систему вошло несколько пользователей, -каждый из них должен выйти, завершив работу, причём совершенно не -имеет значения, разные это пользователи или «копии» одного и того же. - -Вход пользователя в систему означает, что нужно принимать и выполнять -его команды и возвращать ему отчёты о выполненных действиях, например, -предоставив ему интерфейс командной строки. Выход означает, что работа -от имени данного пользователя завершена и более не следует принимать -от него команды. Весь процесс взаимодействия пользователя с системой -с момента регистрации до выхода называется _сеансом работы_. Причём -если пользователь входит в систему несколько раз под одним и тем же -именем, ему будут доступны несколько разных сеансов работы, не -связанных между собой. - -В наших примерах Мефодий зарегистрирован в системе дважды: -на первой и второй виртуальных консолях. Чтобы завершить работу -на любой из них, ему достаточно в соответствующей командной строке -набрать команду `logout`. - ------------------------------------------- -[methody@localhost methody]$ logout -Welcome to Some Linux / tty1 -localhost login: ------------------------------------------- - -В ответ на эту команду вместо очередного приглашения командной -строки возобновляется приглашение к регистрации в системе. На -данной виртуальной консоли работа с Мефодием завершена, и теперь -здесь снова может зарегистрироваться любой пользователь. - -Есть и другой, ещё более «немногословный» способ сообщить -системе, что пользователь хочет завершить текущий сеанс работы. -Нажав *Alt+F2* Мефодий попадёт на вторую виртуальную консоль, -где всё ещё открыт сеанс для пользователя `methody` и нажмёт -сочетание клавиш *Ctrl+D*, чтобы прекратить и этот сеанс. Комбинация -клавиш *Ctrl+D* приводит не к передаче компьютеру очередного -символа, а к закрытию текущего _входного потока данных_. Грубо -говоря, командная оболочка вводит команды пользователя с консоли, -как если бы она читала их построчно из файла. Нажатие *Ctrl+D* -сигнализирует ей о том, что этот «файл» закончился, и теперь ей -неоткуда больше считывать команды. Такой способ завершения -совершенно аналогичен явному завершению командной оболочки -командой `logout`. - -[[commandline]] -== Терминал и командная строка == - -=== Терминал === - -Как стало понятно из предыдущей лекции -(<>), основное средство общения -с Linux -- системная клавиатура и экран монитора, работающий в -_текстовом режиме_. Вводимый пользователем текст немедленно отображается -на мониторе соответствующими буквами, однако может и не отображаться, -как в случае ввода пароля. Для управления вводом используются -некоторые не текстовые клавиши на клавиатуре: *Backspace* -(он же «Забой») -- для удаления последнего введённого символа или -*Enter* -- для передачи команды системе. Нажатие на эти клавиши не -приводит к отображению символа, вместо этого вводимый текст -обрабатывается системой тем или иным способом. - ------------------------------------------------- -[methody@localhost methody]$ data - -bash: data: command not found -[methody@localhost methody]$ date - Вск Сен 12 13:59:36 MSD 2004 ------------------------------------------------- - -Вначале Мефодий ошибся, и вместо команды `date` написал `data`. В ответ -он получил _сообщение об ошибке_, поскольку такой команды система не -понимает. Затем (этого не видно в примере, но случилось именно так!) -он снова набрал `data`, но вовремя одумался и, нажав клавишу *Backspace*, -удалил последнее «a», вместо которого ввёл «e», превратив -`data` в `date`. Такая команда в системе есть, и на экране -возникла текущая дата. - -Диалог машины и пользователя неспроста выглядит как обмен текстами. -Именно письменную речь используют люди для постановки и описания -решения задач в заранее определённом, формализованном виде. Поэтому -и задача управления системой может целиком быть представлена и решена -в виде формализованного текста -- программы. При этом машине отводится -роль аккуратного исполнителя этой программы, а человеку -- роль автора. -Кроме того, человек анализирует текст, получаемый от системы: -запрошенную им информацию и т. н. _сообщения_ -- текст, описывающий -состояние системы в процессе решения задачи (например, сообщение об -ошибке `command not found`). - -Текстовый принцип работы с машиной позволяет отвлечься от конкретных -частей компьютера, вроде системной клавиатуры и видеокарты с монитором, -рассматривая единое _оконечное устройство_, посредством которого -пользователь вводит текст и передаёт его системе, а система выводит -необходимые пользователю данные и сообщения. Такое устройство -называется _терминалом_. В общем случае терминал -- это точка входа -пользователя в систему, обладающая способностью передавать текстовую -информацию. Терминалом может быть отдельное _внешнее устройство_, -подключаемое к компьютеру через порт последовательной передачи -данных (в персональном компьютере он называется «COM port»). В -роли терминала может работать (с некоторой поддержкой со стороны -системы) и программа (например, `xterm` или `ssh`). Наконец, _виртуальные -консоли_ Linux -- тоже терминалы, только организованные программно с -помощью подходящих устройств современного компьютера. - -===================================================== -Терминал:: - Устройство последовательного ввода и вывода символьной информации, - способное воспринимать часть символов как _управляющие_ для - редактирования ввода, посылки _сигналов_ и т. п. Используется - для взаимодействия пользователя и системы. -===================================================== - -Для приёма и передачи текста терминалу достаточно уметь принимать и -передавать _символы_, из которых этот текст состоит. Более того, -желательно чтобы единицей обмена с компьютером был именно один байт -(один acsii-символ). Тогда каждая буква, набранная на клавиатуре, -может быть передана системе для обработки, если это понадобится. С -другой стороны, типичный способ управления системой в Linux -- работа -в _командной строке_ -- требует построчного режима работы, когда -набранный текст передаётся компьютеру только после нажатия клавиши -*Enter* (что соответствует символу конца строки). Размер такой -строки в байтах предугадать, конечно, нельзя, поэтому терминал, -работающий в построчном режиме, ничем, по сути, не отличается от -терминала, работающего в посимвольном режиме -- за исключением того, -что активность системы по обработке приходящих с этого терминала -данных падает в несколько раз (обмен ведётся не байтами, а -целыми строками). - -Свойство терминала передавать только символьную информацию приводит к -тому, что некоторые из передаваемых символов должны восприниматься -не как текстовые, а как _управляющие_ (например, символы, возвращаемые -клавишами *Backspace* и *Enter*). На самом деле управляющих символов -больше: часть из них предназначены для экстренной передачи команд -системе, часть -- для редактирования вводимого текста. Многие из -этих символов не имеют специальной клавиши на клавиатуре, поэтому -их необходимо извлекать с помощью _клавиатурного модификатора_ *Ctrl*. - -===================================================== -Команды, подаваемые с клавиатуры с помощью *Ctrl*, как и символы, -передаваемые при этом системе, принято обозначать знаком `^`, после -которого следует имя клавиши, нажимаемой вместе с *Ctrl*: например, -одновременное нажатие *Ctrl* и «a» обозначается `^A`. -===================================================== - -Так, для завершения работы программы `cat`, которая считывает построчно -данные с клавиатуры и выводит их на терминал, можно воспользоваться -командой `^C` или `^D`: - --------------------------------------------------------------- -[methody@localhost methody]$ cat -Any Text - Any Text -^C - -[methody@localhost methody]$ cat -Any Text agaim^[[Dn - Any Text again -^D -[methody@localhost methody]$ ---------------------------------------------------------------- - -Одну строчку вида `Any Tex...` Мефодий вводит с клавиатуры (что -отображается на экране), и после того, как Мефодий нажмёт *Enter*, -она немедленно выводится программой `cat` (что тоже отображается на -экране). С каждой последующей строкой программа cat поступила бы -аналогично, но в примере Мефодий оба раза завершил работу программы, -в первом случае нажав `^C`, а во втором -- `^D`. Эффект команды -оказали одинаковый, а работают они по-разному: `^C` посылает программе, -которая считывает с клавиатуры, _сигнал_ аварийного прекращения работы, -а `^D` сообщает ей, что ввод данных с клавиатуры закончен, можно -продолжать работу дальше (поскольку программа cat больше ничего не -делает, она завершается самостоятельно естественным путём). Можно -считать, что `^C` -- это сокращение от *Cancel*, а `^D` -- от *Done*. - -В пример не попало, как, набирая первый `cat`, Мефодий вновь ошибся и -написал `ccat` вместо `cat`. Чтобы исправить положение, он -воспользовался клавишами со стрелочками: с помощью клавиши -*Стрелка влево* подвёл курсор к одному из `c` и нажал *Backspace*, а -затем *Enter*. В режиме ввода команды это ему удалось, а при передаче -данных программе `cat` клавиша Стрелка влево не сдвинула курсор, а -передала целую последовательность символов: `^[`, `[` и `D`. Дело -в том, что на клавиатуре терминала может быть так много разных -не текстовых клавиш, что на всех них не хватает ограниченного -количества разных управляющих символов. Поэтому большинство -не текстовых клавиш возвращают т. н. _управляющую последовательность_, -которая начинается управляющим символом (как правило -- *Escape*, -т. е. `^[`), за которым следует строго определённое число обычных -(для клавиши Стрелка влево -- `[` и `D`). - -То же самое можно сказать и о выводе управляющих последовательностей -на терминал. Современный терминал умеет довольно много помимо простого -вывода текста: перемещать курсор по всему экрану (чтобы вывести текст -там), удалять и вставлять строки на экране, использовать цвет и т. п. -Всем этим заведуют управляющие последовательности, которые при выводе -на экран терминала не отображаются как текст, а выполняются заранее -заданным способом. В некоторых случаях управляющие последовательности, -возвращаемые клавишами, совпадают с теми, что управляют поведением -терминала. Поэтому-то Мефодий и не увидел `Any Text agaim^[[Dn` в -выдаче `cat`: `^[[D` при выводе на терминал перемещает курсор на одну -позицию влево, так что было выведено `Any Text agaim`, затем курсор -встал прямо над `m` и поверх него было выведено `n`. Если бы терминал -имел вместо дисплея печатающее устройство, в этом месте обнаружилось -бы нечто, состоящее из начертаний `m` и `n` footnote:[Некоторые -терминалы умеют и так. Следует ещё иметь в виду, что терминалы -разных типов имеют разные управляющие последовательности.]. - -image::images/PC-Term-User.dia.png[] - -Иллюстрация 1. Интерфейс командной строки. Взаимодействие пользователя -с компьютером посредством терминала. - -Требования к терминалу как к точке входа пользователя в систему -получаются весьма невысокими. Формально говоря, терминал должен -удовлетворять трём обязательным требованиям и одному необязательному. -Терминал должен уметь: - -. передавать текстовые данные от пользователя системе; -. передавать от пользователя системе немногочисленные управляющие -команды; -. передавать текстовые данные от системы пользователю; -. (необязательно) интерпретировать некоторые данные, передаваемые от -системы пользователю, как управляющие последовательности и -соответственно обрабатывать их. - -Ограничения на интерфейс напрямую не сказываются на эффективности -работы пользователя в системе. Однако чем меньше требований к -интерфейсу, тем важнее разумно его организовать. Любое взаимодействие -может быть описано с трёх точек зрения: во-первых, какую задачу решает -пользователь (что он хочет от системы); во-вторых, как он формулирует -задачу в доступном пониманию системы виде; и, в-третьих, какими -средствами он пользуется при взаимодействии с системой. В частности, -текстовый интерфейс удобно рассматривать с точки зрения предоставляемого -им _языка_ общения с машиной: во-первых, описанием этого языка задаётся -диапазон решаемых с его помощью задач, а во-вторых, слова этого -компьютерного языка (называемые в программировании _операторами_) -предоставляют способ решения пользовательских задач (в виде небольших -программ-сценариев). Команды, помогающие пользователю быстро и -эффективно обмениваться с машиной предложениями на этом языке, и будут -третьей составляющей интерфейса командной строки. - -=== Командная строка === - -Основная среда взаимодействия с Linux -- _командная строка_. Суть её в -том, что каждая строка, передаваемая пользователем системе, -- это -_команда_, которую та должна выполнить. Пока не нажат *Enter*, строку -можно редактировать, затем она отсылается системе. - ---------------------------------------------------------- -[methody@localhost methody]$ cal - Сентября 2004 - Вс Пн Вт Ср Чт Пт Сб - 1 2 3 4 - 5 6 7 8 9 10 11 - 12 13 14 15 16 17 18 - 19 20 21 22 23 24 25 - 26 27 28 29 30 - -[methody@localhost methody]$ echo Hello, world! -Hello, world! ---------------------------------------------------------- - -Команда `cal` выводит календарь на текущий месяц, а команда `echo` просто -выводит на терминал всё, что следовало в командной строке _после неё_. -Получается, что одну и ту же команду можно использовать с разными -_параметрами_ (или _аргументами_), причём параметры эти изменяют поведение -команды. Здесь Мефодий захотел посмотреть календарь за март -2005-го года, для чего и передал команде `cal` два -параметра -- `3` и `2005`: - ---------------------------------------------------------- -[methody@localhost methody]$ cal 3 2005 - Марта 2005 - Вс Пн Вт Ср Чт Пт Сб - 1 2 3 4 5 - 6 7 8 9 10 11 12 - 13 14 15 16 17 18 19 - 20 21 22 23 24 25 26 - 27 28 29 30 31 ---------------------------------------------------------- - -В большинстве случаев при разборе командной строки первое слово -считается именем команды, а остальные -- её параметрами. Более подробно -о разборе командной строки и работе с ней рассказано в разделе -<> и в -лекции <>. - -=== Подсистема помощи === - -Пока же Мефодий решил, что узнал о командной строке достаточно для того, -чтобы воспользоваться главными командами Linux (по частоте их -употребления при изучении системы) -- `man` и `info`. - -Работать с Linux, не заглядывая в документацию, практически невозможно. -На это способны только седые аксакалы, у которых все нужные знания не -то что в голове -- в кончиках пальцев, и предубеждённые новички. -Всем прочим настоятельно рекомендуется, приступая к работе, а тем -более -- к изучению Linux, пользоваться всеми доступными руководствами. - -Все утилиты, все системные службы Linux, все функции ядра и библиотек, -структура -большинства конфигурационных файлов, наконец, многие умозрительные, но -важные понятия системы описаны либо в руководствах, либо в -info-страницах, либо, на худой конец, в не систематизированной -сопроводительной документации. Поэтому от пользователя системы не -требуется заучивать все возможные варианты взаимодействия с ней. -Достаточно понимать основные принципы её устройства и уметь находить -справочную информацию. Эйнштейн говорил на этот счёт так: -«Зачем запоминать то, что всегда можно посмотреть в справочнике?». - -==== Страницы руководства (man) ==== - -Больше всего различной полезной информации содержится в _страницах -руководства (manpages)_. Каждая страница руководства (для -краткости -- просто «руководство») посвящена какому-нибудь одному -объекту системы. Для того чтобы посмотреть страницу руководства, -нужно дать команду системе `man объект`: - ----------------------------------------------------------------------- -[methody@localhost methody]$ man cal - CAL(1) BSD General Commands Manual CAL(1) - - NAME - cal - displays a calendar - - SYNOPSIS - cal [-smjy13] [[month] year] - - DESCRIPTION - Cal displays a simple calendar. If arguments are not specified, the cur- - rent month is displayed. The options are as follows: - . . . ----------------------------------------------------------------------- - -«Страница руководства» занимает, как правило, больше одной страницы -_экрана_. Для того чтобы читать было удобнее, `man` запускает -программу постраничного просмотра текстов -- `less`. Управлять -программой `less` просто: страницы перелистываются пробелом, а когда -читать надоест, надо нажать *q* (Quit). Перелистывать страницы можно -и клавишами *Page Up/Page Down*, для сдвига на одну строку вперёд можно -применять *Enter* или стрелку вниз, а на одну строку назад -- стрелку -вверх. Переход на начало и конец текста выполняется по командам `g` -и `G` соответственно (Go). Полный список того, что можно делать с -текстом в `less`, выводится по команде `H` (Help). - -Страница руководства состоит из _полей_ -- стандартных разделов, с -разных сторон описывающих заинтересовавший Мефодия объект -- команду -`cal`. В поле `NAME` содержится краткое описание объекта (такое, чтобы -его назначение было понятно с первого взгляда). В поле `SYNOPSIS` даётся -_формализованное_ описание способов использования объекта (с данном -случае -- того, как и с какими параметрами запускать команду `cal`). -Как правило, в квадратные скобки в этом поле заключены необязательные -параметры команды, которые можно ей передать, а можно и опустить. -Например, строка `«[[month] year]»` означает, что в это месте командной -строки параметров у команды может не быть вообще, может быть указан -год или пара -- месяц и год. Наконец, текст в поле `DESCRIPTION` -- это -развёрнутое описание объекта, достаточное для того, чтобы им -воспользоваться. - -Одно из самых важных полей руководства находится в конце текста. -Если в процессе чтения `NAME` или `DESCRIPTION` пользователь понимает, -что не нашёл в руководстве того, что искал, он может захотеть -посмотреть, а есть ли другие руководства или иные источники -информации по той же теме. Список таких источников содержится в -поле `SEE ALSO`: - ---------------------------------------------------------- -[methody@localhost methody]$ man man - . . . - SEE ALSO - apropos(1), whatis(1), less(1), groff(1), man.conf(5). - . . . ---------------------------------------------------------- - -До этого поля Мефодий добрался с помощью уже известной команды `G`. -Не то, чтобы ему неинтересно было читать руководство по `man`, скорее -наоборот: им двигала любознательность. В Поле `SEE ALSO` обнаружились -ссылки на руководства по `less`, `groff` (программе форматирования -страницы руководства), структуре _конфигурационного файла_ для `man`, а -также по двум сопутствующим командам с такими говорящими -названиями footnote:[«Apropos» по-французски означает «кстати», -а «whatis» -- по-английски -- «что такое».], что Мефодий немедленно -применяет одну команду к имени другой, не заглядывая даже в документацию. -_Так ни в коем случае_ не следует делать! А что если запущенная -Вами программа начнёт с того, что сотрёт все файлы в Вашем каталоге? - ------------------------------------------------------------- -[methody@localhost methody]$ whatis apropos - apropos (1) - search the whatis database for strings -[methody@localhost methody]$ man apropos - apropos(1) apropos(1) - - NAME - apropos - search the whatis database for strings - . . . ------------------------------------------------------------- - -На этот раз Мефодию повезло: команда `whatis` не делает ничего -разрушительного. Как и команда `apropos`, `whatis` ищет подстроку в -некоторой базе данных, состоящей из полей `NAME` всех страниц -помощи в системе. Различие между ними -- в том, что `whatis` ищет -только среди имён объектов (в левых частях полей `NAME`), -а `apropos` -- по всей базе. В результате у `whatis` получается список -кратких описаний объектов с именами, включающими в себя искомое -слово, а у `apropos` -- список, в котором это слово упоминается. Для -того, чтобы это узнать, всё равно пришлось один раз прочесть -документацию. - -В системе может встретиться несколько объектов разного типа, но с -одинаковым названием. Часто совпадают, например, имена _системных -вызовов_ (функций _ядра_) и программ, которые позволяют пользоваться -этими функциями из командной строки (т. н. _утилит_). - ------------------------------------------------------------- -[methody@localhost methody]$ whatis passwd - passwd (1) - update a user's authentication tokens(s) - passwd (5) - password file - passwd (8) - manual page for passwd wrapper version 1.0.5 ------------------------------------------------------------- - -Описания объектов, выводимые `whatis`, отличаются числом в -скобках -- номером раздела. В системе руководств Linux девять -разделов, каждый из которых содержит страницы руководства к -объектам определённого типа. Все разделы содержат по одному -руководству с именем «intro», в котором в общем виде и на -примерах рассказано, что за объекты имеют отношение к данному разделу: - ------------------------------------------------------------- -george@localhost:~> whatis intro -intro (1) - Introduction to user commands -intro (2) - Introduction to system calls -intro (3) - Introduction to library functions -intro (4) - Introduction to special files -intro (5) - Introduction to file formats -intro (6) - Introduction to games -intro (7) - Introduction to conventions and miscellany section -intro (8) - Introduction to administration and privileged commands -intro (9) - Introduction to kernel interface ------------------------------------------------------------- - -Вот названия разделов в переводе на русский: - -. Команды пользователя. -. Системные вызовы (пользовательские функции ядра Linux; руководства -рассчитаны на программиста, знающего язык Си). -. Библиотечные функции (функции, принадлежащие всевозможным библиотекам -подпрограмм; руководства рассчитаны на программиста, знающего язык Си). -. Внешние устройства и работа с ними (в Linux они называются -_специальными файлами_, см. лекцию <>). -. Форматы различных стандартных файлов системы (например -_конфигурационных_). -. Игры, безделушки и прочие вещи, не имеющие системной ценности. -. Теоретические положения, договорённости и всё, что не может -быть классифицировано. -. Инструменты администратора (часто недоступные обычному пользователю). -. Интерфейс ядра (_внутренние_ функции и структуры данных ядра -Linux, необходимы только системному программисту, исправляющему -или дополняющему ядро). - -В частности, пример с `passwd` показывает, что в системе `Some Linux`, -которую использует Мефодий, есть программа `passwd` (именно с её -помощью Мефодий поменял себе пароль на прошлой лекции), файл `passwd`, -содержащий информацию о пользователях и администраторская программа -`passwd`, обладающая более широкими возможностями. По умолчанию `man` -просматривает все разделы и показывает первое найденное руководство с -заданным именем. Чтобы посмотреть руководство по объекту из -определённого раздела, необходимо в качестве первого параметра команды -`man` указать номер раздела: - --------------------------------------------------------------- -[methody@localhost methody]$ man 8 passwd - PASSWD(8) System Administration Utilities PASSWD(8) - . . . -[methody@localhost methody]$ man -a passwd - PASSWD(1) Some Linux PASSWD(1) - . . . - PASSWD(8) System Administration Utilities PASSWD(8) - . . . - PASSWD(5) Linux Programmer's Manual PASSWD(5) - . . . --------------------------------------------------------------- - -Если в качестве первого параметра `man` использовать `-a`, будут -последовательно выданы _все_ руководства с заданным именем. _Внутри_ -страниц руководства принято непосредственно после имени объекта -ставить в круглых скобках номер раздела, в котором содержится -руководство по этому объекту: `man(1)`, `less(1)`, `passwd(5)` и т. д. - -=== Info === - -Другой источник информации о Linux и составляющих его программах -- -справочная подсистема `info`. Страница руководства, несмотря на обилие -ссылок различного типа, остаётся «линейным» текстом, структурированным -только логически. Документ `info` структурирован прежде всего -топологически -- это настоящий гипертекст, в котором множество -небольших страниц объединены в дерево. В каждом разделе документа -`info` всегда есть оглавление, из которого можно перейти сразу к -нужному подразделу, откуда всегда можно вернуться обратно. Кроме того, -info-документ можно читать и как непрерывный текст, поэтому в каждом -подразделе есть ссылки на предыдущий и последующий подразделы. - -------------------------------------------------------------- -[methody@localhost methody]$ info info - File: info.info, Node: Top, Next: Getting Started, Up: (dir) - - Info: An Introduction - . . . - * Menu: - - * Getting Started:: Getting started using an Info reader. - * Expert Info:: Info commands for experts. - * Creating an Info File:: How to make your own Info file. - * Index:: An index of topics, commands, and variables. - . . . - --zz-Info: (info.info.bz2)Top, строк: 24 --All------------------------------ - Welcome to Info version 4.6. Type ? for help, m for menu item. -------------------------------------------------------------- - -Программа `info` использует весь экран: на большей его части она -показывает текст документа, а первая и две последних строки отведены -для ориентации в его структуре. - -Одна или несколько страниц, которые можно перелистывать клавишей -*Пробел* или *Page Up/Page Down* -- это _узел (node)_. Узел содержит обычный -текст и _меню (menu)_ -- список ссылок на другие узлы, лежащие в дереве -на более низком уровне. Ссылки внутри документа имеют вид `* -имя_узла::` и перемещать по ним курсор можно клавишей *Tab*, а -переходить к просмотру выбранного узла -- клавишей *Enter*. Вернуться к -предыдущему просмотренному узлу можно клавишей *l* (oт «Last»). И, -главное, выйти из программы `info` можно, нажав *q* («Quit»). Более -подробную справку об управлении программой `info` можно в любой момент -получить у самой `info`, нажав *?*. - -Узлы, составляющие документ `info`, можно просматривать и подряд, -один за другим (с помощью команд `n`, Next, и `p`, Previous), -однако это бывает нужно нечасто. В верхней строке экрана `info` -показывает имя текущего узла, имя следующего узла и имя -родительского (или верхнего) узла, в котором находится ссылка на -текущий. Показанные Мефодию имя узла `Top` и имя верхнего узла `(dir)` -означают, что просматривается _корневой узел_ документа, выше которого --- только каталог со списком всех info-деревьев. В нижней части экрана -расположена строка с информацией о текущем узле, а за ней -- строка -для ввода длинных команд (например, для поиска текста с помощью -команды `«/»`). - -Команде `info` можно указывать в параметрах всю _цепочку узлов_, -приводящую к тому или иному разделу документации, однако это бывает -нужно довольно редко: - --------------------------------------------------------- -[methody@localhost methody]$ info info "Getting Started" Help-Q - File: info.info, Node: Help-Q, Prev: Help-Int, Up: Getting Started - - Quitting Info - . . . --------------------------------------------------------- - -Сам ли Мефодий это придумал, или подсказал кто, но совершенно -правильно было заключить в кавычки имя узла «Getting Started» -- в -этом случае `info` искала узел по «адресу» `«info -> Getting Started -> -Help-Q»`. Если бы команда имела вид `info info Getting Started Help-Q`, -то «адрес» получился бы неправильный: `«info -> Getting -> Started -> -Help-Q»`. Ничего таинственного в этом нет, и уже к концу лекции станет -понятно, в чём здесь дело <>. - -=== RTFM === - -Оказывается, использование кавычек Мефодий придумал не сам: спросил -у товарища, опытного пользователя Linux по фамилии Гуревич. Гуревич -охотно показал, где ставить кавычки, а вот объяснять, что они делают, -отказался, и заявил: «Там отличное руководство! Читай!». Документация -в Linux играет важнейшую роль. Решение любой задачи должно начинаться -с изучения руководств. Не стоит жалеть на это времени. Даже если рядом -есть опытный пользователь Linux, который, возможно, _знает_ ответ, не -стоит беспокоить его _сразу же_. Вполне возможно, что, даже зная, _что_ -нужно сделать, он не помнит _как_ именно -- и поэтому (а также потому, -что он -- опытный пользователь) начнёт с изучения руководства. -Это -- закон, у которого есть даже собственное название: _RTFM_, -что означает «Read That Fine Manual» - -============================================================= -RTFM:: - правило, согласно которому решение любой задачи надо начинать - с изучения документации. -============================================================= - -Слова Гуревича -- практически дословный перевод этой фразы, так что её -смысл и происхождение очевидны. Linux рассчитан в основном на тех, кто -хочет знать, как им пользоваться. - -Руководство -- это совсем не учебник, это -- справочник. В нём -содержится информация, _достаточная_ для освоения описываемого объекта, -но никаких обучающих приёмов, никаких определений, повторений и -выделения главного в нём обычно нет. Тем более не допускается _усечение_ -руководства с целью представить небольшие по объёму, но наиболее -важные сведения. Так принято в учебниках, причём главные сведения -раскрываются и объясняются очень подробно, а остальные присутствуют -в виде ссылки на документацию для профессионалов. Страницы -руководств -- и есть эта самая документация для профессионалов. -Руководство чаще всего читает человек, который уже знает, о чём оно. - -Это не значит, что из руководства нельзя понять, как, например, -пользоваться командой в простейших случаях. Напротив, часто -встречается поле EXAMPLES, которое как раз и содержит примеры -использования команды в разных условиях. Однако всё это преследует -цель не научить, а раскрыть смысл, пояснить сказанное в других полях. -Мефодий нашёл описание работы двойных кавычек в руководстве по sh, -однако понял из него далеко не всё -- главным образом, потому, что -встретил слишком много незнакомых терминов. - -Система `info` может содержать больше, чем `man`, поэтому в неё часто -включают и учебники (принято называть учебник термином «tutorial»), и -т. н. «howto» (примеры постановки и решения типовых задач), и даже -статьи по теме. Таким образом info-документ может стать, в отличие от -страницы руководства, полным сводом сведений. Разработка такого -документа -- дело трудоёмкое, поэтому далеко не все объекты системы им -сопровождаются. Кроме того, и прочесть большой info-документ целиком -зачастую невозможно. Поэтому имеет смысл начинать именно и -руководства, а если его недостаточно -- изучать info. - -Если некоторый объект системы не имеет документации ни в формате -`man`, ни в формате `info`, это нехорошо. В этом случае можно -надеяться, что при нём есть сопроводительная документация, не -имеющая, увы, ни стандартного формата, ни тем более -- ссылок на -руководства по другим объектам системы. Такая документация (равно как -и примеры использования объекта), обычно помещается в каталог -`/usr/share/doc/имя_объекта`. - -Документация в подавляющем большинстве случаев пишется на простом -английском языке. Если английский -- не родной язык для автора -документации, она будет только проще. Традиция писать по-английски -идёт от немалого вклада США в развитие компьютерной науки вообще и -Linux в частности. Кроме того, английский становится языком -международного общения во всех областях, не только в компьютерной. -Необходимость писать на языке, который будет более или менее понятен -большинству пользователей, объясняется постоянным развитием Linux. -Дело не в том, что страницу руководства нельзя перевести, а в том, -что её придётся переводить _всякий раз_, когда изменится описываемый ею -объект! Например, выход новой версии программного продукта -сопровождается изменением его возможностей и особенностей работы, а -следовательно, и новой версией документации. Тогда _перевод_ этой -документации превращается в «moving target», сизифов труд. - -=== Ключи === - -Работая в системе и изучая руководства, Мефодий заметил, что -параметры команд можно отнести к двум различным категориям. Некоторые -параметры имеют собственный смысл: это имена файлов, названия -разделов и объектов в `man` и `info`, числа и т. п. Другие параметры -собственного смысла не имеют, их значение можно истолковать, лишь -зная, к какой команде они относятся. Например, параметр «-a» можно -передать не только команде `man`, но и команде `who`, и команде `last`, -при этом значить для них он будет разное. Такого рода параметры -называются модификаторами выполнения или ключами (options). - ------------------------------------------------ -[methody@localhost methody]$ date -Вск Сен 19 23:01:17 MSD 2004 -[methody@localhost methody]$ date -u -Вск Сен 19 19:01:19 UTC 2004 ------------------------------------------------ - -Для решения разных задач одни и те же действия необходимо выполнять -слегка по-разному. Например, для синхронизации работ в разных точках -земного шара лучше использовать единое для всех время (по Гринвичу), -а для организации собственного рабочего дня -- местное время (с учётом -сдвига по часовому поясу и разницы зимнего и летнего времени). И то, -и другое время показывает команда `date`, только для работы по Гринвичу -ей нужен дополнительный параметр-ключ `«-u»` (он же «--universal»). - -==== Однобуквенные ключи ==== - -Для формата ключей нет жёсткого стандарта, однако существуют -договорённости, нарушать которые в наше время уже неприлично. -Во-первых, если параметр начинается на `«-»`, это -- однобуквенный -ключ. За `«-»`, как правило, следует один символ, чаще всего -- буква, -обозначающая действие или свойство, которое этот ключ придаёт команде. -Так проще отличать ключи от других параметров -- и пользователю при -наборе командной строки, и программисту, автору команды. - -Во-вторых, желательно, чтобы имя ключа было значащим -- как правило, -это первая буква названия пресловутого действия или свойства. -Например, ключ `«-a»` в `man` и `who` происходит от слова «All» (всё), -и изменяет работу этих команд так, что они начинают показывать -информацию, о которой они обычно умалчивают. А в командах `cal` и -`who` смысл ключа `«-m»` -- разный: - -------------------------------------------------- -[methody@localhost methody]$ who -m - methody tty1 Sep 20 13:56 (localhost) -[methody@localhost methody]$ cal -m - Сентября 2004 - Пн Вт Ср Чт Пт Сб Вс - 1 2 3 4 5 - 6 7 8 9 10 11 12 - 13 14 15 16 17 18 19 - 20 21 22 23 24 25 26 - 27 28 29 30 -------------------------------------------------- - -Для `who` ключ `-m` означает «Me», то есть «Я», и в результате -`who` работает похоже на `whoami`footnote:[Кстати, с незапамятных -времён `who` поддерживает один нестандартный набор параметров: -`who am i` делает то же, что и `who -m`.>]. А для `cal` ключ `-m` -- это -команда выдать календарь, считая первым днём понедельник («Monday»), -как это принято в России. - -Свойство ключа быть, с одной стороны, предельно коротким, а с другой -стороны -- информативным, называется аббревиативностью. Не только -ключи, но и имена наиболее распространённых команд Linux обладают -этим свойством. - -В-третьих, иногда ключ изменяет поведение команды таким образом, -что меняется и толкование параметра, следующего в командной строке -за этим ключом. Выглядит это так, будто ключ сам получает параметр, -поэтому ключи такого вида называются параметрическими. Как правило, -их параметры -- имена файлов различного применения, числовые -характеристики и прочие значения, которые нужно передать команде. - -------------------------------------------------- -[methody@localhost methody]$ info info "Expert info" Cross-refs Help-Cross -o text -info: Запись ноды (info.info.bz2)Help-Cross... -info: Завершено. -[methody@localhost methody]$ cat text -n - 1 File: info.info, Node: Help-Cross, Up: Cross-refs - 2 - 3 The node reached by the cross reference in Info - 4 ----------------------------------------------- - . . . -------------------------------------------------- - -Здесь `info` запустилась не в качестве интерактивной программы, а -как обработчик info-документа. Результат работы -- текст узла -`info -> Expert info -> Cross-refs -> Help-Cross` footnote:[Странное -слово «нода» Мефодий решил оставить на совести -неизвестного переводчика сообщений info.>], программа -поместила в файл `text`. А программа `cat` вывела содержимое этого -файла на терминал, пронумеровав все строки (по просьбе ключа `-n`, -«number»). - -Теперь стало более-менее понятно, что означают неудобочитаемые -строки в поле `SYNOPSIS` руководства. Например `[-smjy13]` из -руководства по `cal` (`$ManCal`) говорит о том, что команду можно -запускать с необязательными ключами `-s`, `-m», `-j`, `-y`, `-1` и `-3`. - -В-четвёртых, есть некоторые менее жёсткие, но популярные договорённости -о значении ключей. Ключ `-h` («Help») обычно (но, увы, не всегда) -заставляет команды выдать краткую справку (нечто похожее на ``SYNOPSIS`, -иногда с короткими пояснениями). Если указать `-` вместо имени -выходного файла в соответствующем параметрическом ключе (нередко -это ключ `-o`), вывод будет производиться на терминал footnote:[Точнее, -на стандартный вывод, см. лекцию <>.]. -Наконец,бывает необходимо передать команде параметр, -а не ключ, начинающийся с `-`. Для этого нужно использовать ключ `--`: - -------------------------------------------------- -[methody@localhost methody]$ info -o -filename-with- -info: Запись ноды (dir)Top... -info: Завершено. -[methody@localhost methody]$ head -1 -filename-with- -head: invalid option -- f -Попробуйте `head --help' для получения более подробного описания. -[methody@localhost methody]$ head -1 -- -filename-with- -File: dir Node: Top This is the top of the INFO tree -------------------------------------------------- - -Здесь Мефодий сначала создал файл `-filename-with-`, а потом пытался -посмотреть его первую строку (команда `head -количество_строк имя_файла` -выводит первые `количество_строк` из указанного файла). Ключ `--` -(первый `-` -- признак ключа, второй -- сам ключ) обычно запрещает -команде интерпретировать все последующие параметры командной строки -как ключи, независимо от того, начинаются ли они на `-` или нет. -Только после `--` head согласилась с тем, что `-filename-with-` -- это -имя файла. - -==== Полнословные ключи ==== - -Аббревиативность ключей трудно соблюсти, когда их у команды слишком -много. Некоторые буквы латинского алфавита (например, «s» или «o») -используются очень часто, и могли бы служить сокращением сразу -нескольких команд, а некоторые (например, «z») -- редко, под них и -название-то осмысленное трудно придумать. На такой случай существует -другой, _полнословный_ формат: ключ начинается на два знака `-`, за -которыми следует полное имя обозначаемой им сущности. Таков, -например, ключ `--help` (аналог `-h`): - -------------------------------------------------- -[methody@localhost methody]$ head --help -Использование: head [КЛЮЧ]... [ФАЙЛ]... -Print the first 10 lines of each FILE to standard output. -With more than one FILE, precede each with a header giving the file name. -With no FILE, or when FILE is -, read standard input. -------------------------------------------------- - -Аргументы, обязательные для длинных ключей, обязательны и для коротких. - -------------------------------------------------- - -c, --bytes=[-]N print the first N bytes of each file; - with the leading `-', print all but the last - N bytes of each file - -n, --lines=[-]N print the first N lines instead of the first 10; - with the leading `-', print all but the last - N lines of each file - -q, --quiet, --silent не печатать заголовки с именами файлов - -v, --verbose всегда печатать заголовки с именами файлов - --help показать эту справку и выйти - --version показать информацию о версии и выйти - - -N may have a multiplier suffix: b 512, k 1024, m 1024*1024. - -Об ошибках сообщайте по адресу . -------------------------------------------------- - -Мефодий сделал то, о чём просила его утилита `head`. Видно, что -некоторые ключи `head` имеют и однобуквенный, и полнословный формат, -а некоторые -- только полнословный. Так обычно и бывает: часто -используемые ключи имеют аббревиатуру, а редкие -- нет. Значения -параметрических полнословных ключей принято передавать не следующим -параметром командной строки, а с помощью конструкции `=значение` -непосредственно после ключа. - -[[interpreter]] -== Интерпретатор командной строки (shell) == - -В Linux нет отдельного объекта под именем «система». Система -- она на -то и система, чтобы состоять из многочисленных компонентов, -взаимодействующих друг с другом. Главный из системных -компонентов -- пользователь. Это он командует машиной, а та -его команды выполняет. В руководствах второго и третьего разделов -описаны системные вызовы (функции ядра) и библиотечные функции. -Они-то и есть непосредственные команды системе. Правда, воспользоваться -ими можно только написав программу (чаще всего -- на языке Си), -нередко -- программу довольно сложную. Дело в том, что функции ядра -реализуют низкоуровневые операции, и для решения даже самой простой -задачи пользователя необходимо выполнить несколько таких операций, -преобразуя результат работы одной для нужд другой. Возникает -необходимость выдумать для пользователя другой -- более высокоуровневый -и более удобный в использовании -- язык управления системой. Все -команды, которые использовал Мефодий в работе, были частью именно -этого языка. - -Из чего несложно было заключить, что обрабатывать эти команды, -превращать их в последовательность системных и библиотечных вызовов -должна тоже какая-нибудь специальная программа, и именно с ней -непрерывно ведёт диалог пользователь сразу после входа в систему. Так -оно и оказалось: программа эта называется _интерпретатор командной -строки_ или _командная оболочка_ («shell»). «Оболочкой» она названа как -раз потому, что всё управление системой идёт как бы «изнутри» неё: -пользователь общается с нею на удобном ему языке (с помощью текстовой -командной строки), а она общается с другими частями системы на -удобном им языке (вызывая запрограммированные функции). - -Таким образом, упомянутые выше правила разбора командной строки -- -это правила, действующие именно в командном интерпретаторе: -пользователь вводит с терминала строку, shell считывает её, иногда -- -преобразует по определённым правилам, получившуюся строку разбивает -на команду и параметры, а затем выполняет команду, передавая ей эти -параметры. Команда, в свою очередь, анализирует параметры, выделяет -среди них ключи, и делает что попросили, попутно выводя на терминал -данные для пользователя, после чего завершается. По завершении -команды возобновляется работа «отступившего на задний план» -командного интерпретатора, он снова считывает командную строку, -разбирает её, вызывает команду... Так продолжается до тех пор, пока -пользователь не скомандует оболочке завершиться самой (с помощью -`logout` или управляющего символа `^D`, который для shell значит то же, -что и для других программ: больше с терминала ввода не будет). - -Конечно, командных интерпретаторов в Linux несколько. Самый простой -из них, появившийся в ранних версиях UNIX, назывался `sh`, или «Bourne -Shell» -- по имени автора, Стивена Борна (Stephen Bourne). Со временем -его -- везде, где только можно -- заменили на более мощный, `bash`, -«Bourne Again Shell» footnote:[Игра слов: «Bourne Again» вслух читается -как «born again», т. е. «возрождённый».]. -`bash` превосходит `sh` во всём, особенно в -возможностях редактирования командной строки. Помимо `sh` и `bash` в -системе может быть установлен «The Z Shell», `zsh`, самый мощный на -сегодняшний день командный интерпретатор (шутка ли, 22 тысячи строк -документации), или `tcsh`, обновлённая и тоже очень мощная версия -старой оболочки C Shell, синтаксис команд которой похож на язык -программирования Си. - -Когда Гуревич добавлял учётную запись Мефодия в систему, он не стал -спрашивать того, какой командный интерпретатор ему нужен, потому что -знал: для новичка имя командного интерпретатора -- пустой звук. Тем не -менее имя оболочки, запускаемой для пользователя сразу после входа в -систему -- т.н. _стартовый командный интерпретатор_ (login shell), -- -это часть пользовательской учётной записи, которую пользователь может -изменить командой `chsh` (change shell). - -Какая бы задача, связанная с управлением системой, ни встала перед -пользователем Linux, она должна иметь решение в терминах командного -интерпретатора. Фактически, решение пользовательской задачи -- это -описание её на языке shell. Язык общения пользователя и командного -интерпретатора -- это высокоуровневый язык программирования, -дополненный, с одной стороны, средствами организации взаимодействия -команд и системы, а с другой стороны -- средствами взаимодействия с -пользователем, облегчающими и ускоряющими работу с командной строкой. - -image::images/PC-Sh-Term-User.dia.png[Интерфейс командной строки.] - -=== Команды и утилиты === - ----------------------------------------------- -[methody@localhost methody]$ apropos s - . . . (четыре с половиной тысячи строк!) ----------------------------------------------- - -Одного неудачного запуска `apropos` Мефодию было достаточно для того, -чтобы понять: команд в Linux очень много. Ему пришло в голову, что -никакая программа -- пусть даже и оболочка -- не может самостоятельно -разбираться во всех задокументированных командах. Кроме того, Гуревич -называл большинство команд _утилитами_, то есть полезными программами. -Стало быть, командный интерпретатор не обязан уметь выполнять всё, -что вводит пользователь. Ему достаточно разобрать командную строку, -выделить из неё команду и параметры, а затем запустить утилиту -- -программу, имя которой совпадает с именем команды. - -В действительности собственных команд в командном интерпретаторе -немного. В основном это -- операторы языка программирования и прочие -средства управления самим интерпретатором. Все знакомые Мефодию -команды, даже `echo`, существуют в Linux в виде отдельных утилит. shell -занимается только тем, что подготавливает набор параметров в -командной строке (например, раскрывая шаблоны), запускает программы и -обрабатывает результаты их работы. - ----------------------------------------------- -[methody@localhost methody]$ type info - info is /usr/bin/info -[methody@localhost methody]$ type echo - echo is a shell builtin -[methody@localhost methody]$ type -a echo - echo is a shell builtin - echo is /bin/echo -[methody@localhost methody]$ type -a -t echo - builtin - file -[methody@localhost methody]$ type -a -t date - file -[methody@localhost methody]$ type -at cat - file ----------------------------------------------- - -В `bash` тип команды можно определить с помощью команды `type`. -Собственные команды `bash` называются `builtin` (встроенная команда), -а для утилит выводится путь, содержащий название каталога, в котором -лежит файл с соответствующей программой, и имя этой программы. -Некоторые -- самые нужные -- команды встроены в `bash`, даже несмотря на -то, что они имеются в виде утилит (например, `echo`). Работает -встроенная команда так же, но так как времени на её выполнение уходит -существенно меньше, командный интерпретатор выберет именно её, если -будет такая возможность. Ключ `-a` («all», конечно), заставляет -`type` вывести все возможные варианты интерпретации команды, -а ключ `-t` -- вывести тип команды вместо пути. - -По совету Гуревича Мефодий сгруппировал ключи, написав `-at` -вместо `-a -t`. Многие утилиты позволяют так делать, уменьшая длину -командной строки. Если встречается параметрический ключ, он должен -быть последним в группе, а его значение -- следовать, как и полагается, -после. Группировать можно только однобуквенные ключи. - -[[words]] -=== Слова и разделители === - -При разборе командной строки shell использует понятие _разделитель_ -(delimiter). Разделитель -- это символ, разделяющий слова; таким -образом командная строка -- это последовательность слов (которые -имеют значение) и разделителей (которые значения не имеют). Для -shell разделителями являются символ пробела, символ табуляции и -символ перевода строки (который всё-таки может попасть между словами -способом, описанным в лекциях <> -и <>). Количество -разделителей между двумя соседними словами значения не имеет. - -Первое слово в тройке передаётся команде как первый параметр, -второе -- как второй и т. д. Для того чтобы разделитель попал -внутрь слова (и получившаяся строка с разделителем передалась -как один параметр), всю нужную подстроку надо окружить одинарными -или двойными кавычками: - ----------------------------------------------------------- -[methody@localhost methody]$ echo One Two Three - One Two Three -[methody@localhost methody]$ echo One "Two Three" - One Two Three -[methody@localhost methody]$ echo 'One -> -> Ой. И что дальше? -> А, кавычки забыл!' - One - - Ой. И что дальше? - А, кавычки забыл! -[methody@localhost methody]$ ----------------------------------------------------------- - -В первом случае команде `echo` было передано три параметра -- `One`, -`Two` и `Three`. Она их и вывела, разделяя пробелом. Во втором случае -параметров было два: `One` и `Two Three`. В результате эти два -параметра были также выведены через пробел. В третьем случае параметр -был всего один -- от открывающего апострофа `'One` до закрывающего -`...забыл!'`. Всё время ввода `bash` услужливо выдавал Мефодию -подсказку `«> »` -- в знак того, что набор командной строки -продолжается, но в режиме ввода содержимого кавычек. - -[[structure]] -== Структура файловой системы == - -=== Файл === - -_Файл_ -- это понятие, привычное любому пользователю компьютера. Для -пользователя каждый файл -- это отдельный предмет, у которого есть -начало и конец и который отличается от всех остальных файлов именем -и расположением («как называется» и «где лежит»). Как и любой предмет, -файл можно создать, переместить и уничтожить, однако без внешнего -вмешательства он будет сохраняться неизменным неопределённо долгое -время. Файл предназначен для хранения данных любого типа -- текстовых, -графических, звуковых, исполняемых программ и многого другого. Аналогия -файла с предметом позволяет пользователю быстро освоиться при работе -с данными в операционной системе. - -Для операционной системы Linux файл -- не менее важное понятие, чем -для её пользователя: все данные, хранящиеся на любых носителях, -обязательно находятся внутри какого-нибудь файла, в противном случае -они просто недоступны ни для операционной системы, ни для её -пользователей. Более того, все устройства, подключённые к компьютеру -(начиная клавиатурой и заканчивая любыми внешними устройствами, -например, принтерами и сканерами) Linux представляет как файлы (так -называемые _файлы-дырки_). Конечно, файл, содержащий обычные данные, -сильно отличается от файла, предназначенного для обращения к -устройству, поэтому в Linux определены несколько различных типов -файлов. В основном пользователь имеет дело с файлами трёх типов: -_обычными файлами_, предназначенными для хранения данных, _каталогами_ и -_файлами-ссылками_, именно о них и пойдёт речь в данной лекции, о -файлах других типов -см. лекцию <>. - -============================================ -Файл:: - отдельная область данных на одном из носителей информации, у - которой есть собственное _имя_. -============================================ - -[[Filesystem]] -=== Система файлов: каталоги === - -_Файловая система_ с точки зрения пользователя -- это «пространство», -в котором размещаются файлы, наличие файловой системы позволяет -определить не только «как называется файл», но и «где он находится». -Различать файлы только по имени было бы слишком неэффективным: про -каждый файл приходилось бы помнить, как он называется и при этом -заботиться о том, чтобы имена никогда не повторялись. Более того, -необходим механизм, позволяющий работать с группами тематически -связанных между собой файлов (например, компонентов одной и той же -программы или разных главы одной диссертации). Иначе говоря, файлы -нужно _систематизировать_. - -============================================ -Файловая система:: - способ хранения и организации доступа к данным на информационном - носителе или его разделе. Классическая файловая система имеет - иерархическую структуру, в которой файл однозначно определяется - полным путём к нему. -============================================ - -Linux может работать с различными типами файловых систем, которые -различаются списком поддерживаемых возможностей, производительностью -в разных ситуациях, надёжностью и другими признаками. Подробнее о -работе Linux с разными файловыми системами речь пойдёт в лекции -<>. В этой лекции будут -описаны возможности файловой системы Ext2/Ext3, на сегодня de facto -стандартной файловой системы для Linux. - -Большинство современных файловых систем (но не все!) используют в -качестве основного организационного принципа каталоги. Каталог -- это -список ссылок на файлы или другие каталоги. Принято говорить, что -каталог содержит в себе файлы или другие каталоги, хотя в -действительности он только ссылается на них, физическое размещение -данных на диске обычно никак не связано с размещением каталога. Каталог, -на который есть ссылка в данном каталоге, называется _подкаталогом_ -или _вложенным каталогом_. Каталог в файловой системе более всего -напоминает библиотечный каталог, содержащий ссылки на объединённые по -каким-то признакам книги и другие разделы каталога (файлы и -подкаталоги). Ссылка на один и тот же файл может содержаться в -нескольких каталогах одновременно, это может сделать доступ к файлу -более удобным. В файловой системе Ext2 каждый каталог -- это отдельный -файл особого типа («d», от англ. «directory»), отличающийся от _обычного -файла_ с данными: в нём могут содержаться только ссылки на другие -файлы и каталоги. - -============================================ -В файловой системе Linux нет _папок_ и _документов_. Есть _каталоги_ и -_файлы_, возможности которых куда шире. -============================================ - -Довольно часто вместо термина _каталог_ можно встретить -_папка_ (англ. _folder_). Этот термин хорошо вписывается в -представление о файлах как о предметах, которые можно раскладывать по -папкам, однако часть возможностей файловой системы, которая -противоречит этому представлению, таким образом затемняется. В -частности, с термином «папка» плохо согласуется то, что ссылка на -файл может присутствовать одновременно в нескольких каталогах, файл -может быть ссылкой на другой файл и т. д. В Linux эти возможности -файловой системы весьма важны для эффективной работы, поэтому будем -всюду использовать более подходящий термин «каталог». - -В файловой системе, организованной при помощи каталогов, на любой файл -должна быть ссылка как минимум из одного каталога, в противном случае -файл просто не будет доступен внутри этой файловой системы, иначе -говоря, не будет существовать. - -=== Имена файлов и каталогов === - -==== Допустимые имена ==== - -Главные отличительные признаки файлов и каталогов -- их имена. В Linux -имена файлов и каталогов могут быть длиной не более 256 символов, и -могут содержать любые символы, кроме `/`. Причина этого ограничения -очевидна: этот символ используется как разделитель имён в составе пути, -поэтому не должен встречаться в самих именах. Причём Linux всегда -различает прописные и строчные буквы в именах файлов и каталогов, -поэтому `methody`, `Methody` и `METHODY` будут тремя разными именами. - -Есть несколько символов, допустимых в именах файлов и каталогов, -которые, при этом, нужно использовать с осторожностью. Это -- так -называемые спецсимволы `*`, `\`, `&»`, `<`, `>`, `;`, `(`, `)`, «`|`, а -также пробелы и табуляции. Дело в том, что эти символы имеют особое -значение для любой командной оболочки, поэтому нужно будет специально -позаботиться о том, чтобы командная оболочка воспринимала эти символы -как часть имени файла или каталога. О специальном значении символа `-` -для команд Linux уже шла речь в лекции -<>, -там же обсуждалось, как изменить его интерпретацию -footnote:[Символ `-` означает, что следующее слово -- ключ,а пробелы и -табуляции разделяют параметры в командной строке.]. О том, зачем -командной оболочке нужны спецсимволы, речь пойдёт в лекции -<>. - -==== Кодировки и русские имена ==== - -Как можно было заметить, пока во всех встречавшихся именах файлов и -каталогов употреблялись только символы латинского алфавита и -некоторые знаки препинания. Это не случайно и вызвано желанием -обеспечить, чтобы приводимые примеры совершенно одинаково выглядели -на любых системах. В Linux в именах файлов и каталогов допустимо -использовать любые символы любого языка, однако такая свобода требует -жертв, на которые Мефодий, например, пойти не смог. - -Дело в том, что с давних пор каждый символ (буква) каждого языка -традиционно представлялся в виде одного байта. Такое представление -накладывает очень жёсткие ограничения на количество букв в алфавите: -их может быть не больше 256, а за вычетом управляющих символов, цифр, -знаков препинания и прочего -- и того меньше. Обширные алфавиты -(например, иероглифические японский и китайский) пришлось заменять -упрощённым их представлением. Вдобавок, первые 128 символов из этих -256 лучше всегда оставлять неизменными, соответствующими стандарту -ASCII, включающему латиницу, цифры, знаки препинания и наиболее -популярные символы из тех, что встречаются на клавиатуре печатной -машинки. Интерпретация остальных 128 символов зависит от того, какая -_кодировка_ установлена в системе. Например, в русской кодировке -KOI8-R 228-й символ такой таблицы соответствует букве «Д», а в -западноевропейской кодировке ISO-8859-1 этот же символ соответствует -букве «a» с двумя точками на ней (как у нашей буквы «ё»). - -Имена файлов, записанные на диск в одной кодировке, выглядят нелепо, -если при просмотре каталога была установлена другая. Хуже того. -Многие кодировки заполняют диапазон символов с номерами от 128 то 255 -не полностью, поэтому соответствующего символа может вообще не быть! -Это означает, что ввести такое искажённое имя файла с клавиатуры -(например, для того, чтобы его переименовать) напрямую не удастся, -придётся пускаться на разные ухищрения, описанные в лекции -<>. -Наконец, многие языки, в том числе и -русский, исторически имеют несколько кодировок footnote:[Мефодий и сам -несколько раз получал электронные письма, начинающиеся словами -«бНОПНЯ» или «бМХЛЮМХЕ» -- результат представления текста, имеющего -кодировку CP-1251, в кодировке KOI8-R.]. К сожалению, в -настоящее время нет стандартного способа указывать кодировку прямо в -имени файла, поэтому в рамках одной файловой системы стоит -придерживаться единой кодировки при именовании файлов. - -Существует универсальная кодировка, включающая символы всех -письменностей мира -- UNICODE. Стандарт UNICODE в настоящее время -получает всё бОльшее распространение и претендует на статус общего -для всех текстов, хранящихся в электронной форме. Однако пока он не -достиг желаемой универсальности, особенно в области имён файлов. Один -символ в UNICODE может занимать больше одного байта -- и в этом -главный его недостаток, так как множество полезных прикладных -программ, отлично работающих с однобайтными кодировками, необходимо -основательно или даже полностью перерабатывать для того, чтобы -научить их обращаться с UNICODE. Возможно, причина недостаточной -распространённости этой кодировки также и в том, что UNICODE -- очень -громоздкий стандарт, и он может оказаться неэффективным при работе с -файловой системой, где скорость и надёжность обработки -- очень -существенные качества. - -Это не означает, что называя файлы, не следует использовать языки, -отличные от английского. Пока точно известно, в какой кодировке -задано имя файла -- проблем не возникнет. Однако Мефодий решил, что -гарантий в передаче названного по-русски файла на какую-нибудь другую -систему можно добиться только передавая вместе с ним настройку -кодировки, даже две: в своей системе и в системе адресата (неизвестно -какой!). Другой, гораздо более лёгкий, способ передать файл -- -использовать в его названии только символы ASCII. - -==== Расширения ==== - -Многим пользователям знакомо понятие _расширение_ -- часть имени файла -после точки, обычно ограничивающаяся несколькими символами и -указывающая на тип содержащихся в файле данных. В файловой системе -Linux нет никаких предписаний по поводу расширения: в имени файла -может быть любое количество точек (в том числе и ни одной), а после -последней точки может быть любое количество символов -footnote:[В отличие от старых файловых систем, организованных -по принципу «8+3» (DOS, ISO9660 и т. п.), где в имени файла -допустимо не более одной точки и расширение может быть не -длиннее 3-х символов. Это ограничение определило вид многих из -известных сегодня расширений файлов, например, -`txt` для текстового файла.]. Хотя -расширения не обязательны и не навязываются технологией в Linux, они -широко используются: расширение позволяет человеку или программе, не -открывая файл, только по его имени определить, какого типа данные в -нём содержатся. Однако нужно учитывать, что расширение -- это только -набор соглашений по наименованию файлов разных типов. Строго говоря, -данные в файле могут не соответствовать заявленному расширению по той -или иной причине, поэтому всецело полагаться на расширение просто -нельзя. - -Определить тип содержимого файла можно и на основании самих данных. -Многие форматы предусматривают указание в начале файла, как следует -интерпретировать дальнейшую информацию: как программу, исходные -данные для текстового редактора, страницу HTML, звуковой файл, -изображение или что-то другое. В распоряжении пользователя Linux -всегда есть утилита `file`, которая предназначена именно для -определения типа данных, содержащихся в файле. - ---------------------------------------------------------- -[methody@localhost methody]$ file -- -filename-with- --filename-with-: ASCII English text -[methody@localhost methody]$ file /home/methody -/home/methody: directory ---------------------------------------------------------- - -Мефодий, забыв, что содержится в файле «-filename-with-», который он -создал на прошлой лекции, хотел было уже посмотреть его содержимое -при помощи команды cat. Однако его остановил Гуревич, который -посоветовал сначала выяснить, что за данные содержатся в этом файле. -Не исключено, что это двоичный файл исполняемой программы, в таком -файле могут встречаться последовательности, которые случайно совпадут -с управляющими последовательностями терминала. Поведение терминала -после этого может стать непредсказуемым, а неопытный Мефодий вряд ли -сможет с ним справиться. Мефодий получил вполне точный ответ от -утилиты `file`: в его файле -- английский текст в кодировке ASCII. -`file` умеет различать очень многие типы данных и почти наверняка -выдаст правильную информацию. Эта утилита никогда не «доверяет» -расширению файла (если оно присутствует), и анализирует сами данные. -`file` различает не только разные данные, но и разные типы файлов, в -частности, сообщит, если исследуемый не является _обычным файлом_, а, -например, каталогом. - -==== Дерево каталогов ==== - -Понятие каталога позволяет систематизировать все объекты, размещённые -на носителе данных (например, на диске). В большинстве современных -файловых систем используется иерархическая модель организации данных: -существует один каталог, объединяющий все данные в файловой -системе -- это «корень» всей файловой системы, _корневой каталог_. -Корневой каталог может содержать любые объекты файловой системы, и в -частности, подкаталоги (каталоги первого _уровня вложенности_). Те, в -свою очередь, также могут содержать любые объекты файловой системы -и подкаталоги (второго уровня вложенности) и т. д. Таким образом. всё, -что записано на диске -- файлы, каталоги и специальные файлы -- -обязательно «принадлежит» корневому каталогу: либо непосредственно -(содержится в нём), либо на некотором уровне вложенности. - -Иерархию вложенных друг в друга каталогов можно соотнести с иерархией -данных в системе: объединить тематически связанные файлы в каталог, -тематически связанные каталоги -- в один общий каталог и т. д. Если -строго следовать иерархическому принципу, то чем глубже будет уровень -вложенности каталога, тем более частным признаком должны быть -объединены содержащиеся в нём данные. Если этому принципу не следовать, -то вскоре окажется гораздо проще складывать все файлы в один каталог и -искать нужный среди них, чем проделывать такой поиск по всем -подкаталогам системы. Однако в этом случае о какой бы то ни было -систематизации файлов говорить не приходится. - -Структуру файловой системы можно представить наглядно в виде дерева -footnote:[Здесь имеется в виду дерево в строгом математическом смысле: -ориентированный граф без циклов с одной корневой вершиной, в котором в -каждую вершину входит ровно одно ребро.], «корнем» которого является -корневой каталог, а в вершинах расположены все остальные каталоги. -На рисунке изображено дерево каталогов, курсивом обозначены -имена файлов, прямым начертанием -- имена каталогов. - -image::images/dir-tree.tex.png[] - -В любой файловой системе Linux всегда есть только один _корневой каталог_, -который называется `/`. Пользователь Linux всегда работает с единым -деревом каталогов, даже если разные данные расположены на разных -носителях: нескольких жёстких или сетевых дисках, съёмных дисках, -CD-ROM и т. п. footnote:[Это отличается от технологии, применяемой -в Windows или Amiga, где для каждого устройства, на котором есть -файловая система, используется свой корневой каталог, обозначенный -литерой, например «a», «c», «d» и т. д.]. Для того, -чтобы подключать и отключать файловые -системы на разных устройствах в одно общее дерево, используются -процедуры _монтирования_ и _размонтирования_, о которых речь пойдёт в -лекции <> После того, как -файловые системы на разных носителях подключены к общему дереву, -содержащиеся на них данные доступны так, как если бы все они составляли -единую файловую систему: пользователь может даже не знать, на -каком устройстве какие файлы хранятся. - -Положение любого каталога в дереве каталогов точно и однозначно -описывается при помощи _полного пути_. Полный путь всегда начинается -от корневого каталога и состоит из перечисления всех вершин, -встретившихся при движении по рёбрам дерева до искомого каталога -включительно. Названия соседних вершин разделяются символом `/` -(«слеш»). В Linux полный путь, например, до каталога `methody` в -файловой системе, приведённой на рисунке записывается следующим -образом: сначала символ `/`, обозначающий корневой каталог, затем к -нему добавляется `home`, затем разделитель `/`, за которым следует -название искомого каталога `methody`, в результате получается полный -путь `/home/methody` footnote:[Весьма похожий способ записи -полного пути используется в системах Windows, с той разницей, -что корневой раздел обозначается литерой устройства с последующим -двоеточием, а в качестве разделителя используется -символ `\` («обратный слеш»).]. - -Расположение файла в файловой системе аналогичным образом определяется -при помощи полного пути, только последним элементом в данном случае -будет не название каталога, а название файла. Например, полный путь -до созданного Мефодием файла `-filename-with-` будет выглядеть так: -`/home/methody/-filename-with-` footnote:[Полный путь к каталогу -формально ничем не отличается от пути к файлу, т. е. по полному пути -нельзя сказать наверняка, является ли его последний элемент файлом -или каталогом. Чтобы отличать путь к каталогу, иногда используют -запись с символом `/` в конце пути: `/home/methody/`.]. - -Организация каталогов файловой системы в виде дерева не допускает -появления циклов: т. е. каталог не может содержать в себе каталог, -в котором содержится сам. Благодаря этому ограничению полный путь -до любого каталога или файла в файловой системе всегда будет _конечным_. - -=== Размещение компонентов системы: Стандарт FHS === - -Попробуем более подробно разобраться, как устроено дерево каталогов -Linux и где что в нём можно найти. Фрагмент дерева каталогов типичной -файловой системы Linux (`Some Linux`, которую использует Мефодий) -приведён на рисунке. Мефодий решил обследовать свою файловую -систему, начиная с корневого каталога: Гуревич посоветовал использовать -для этого команду `ls` каталог, где каталог -- это полный путь к каталогу: -утилита `ls` выведет список всего, что в этом каталоге содержится. - ---------------------------------------------------------- -[methody@localhost methody]$ ls / -bin dev home mnt root tmp var -boot etc lib proc sbin usr -[methody@localhost methody]$ ---------------------------------------------------------- - -Утилита `ls` вывела список подкаталогов корневого каталога. Этот -список будет таким же или почти таким же в любом дистрибутиве Linux. -В корневом каталоге Linux-системы обычно находятся только подкаталоги -со _стандартными_ именами. Более того, не только имена, но и тип данных, -которые могут попасть в тот или иной каталог, также регламентированы -этим стандартом. Этот стандарт называется _Filesystem -Hierarchy Standard_ («стандартная структура файловых систем»). - -Опишем кратко, что находится в каждом из подкаталогов корневого -каталога. Мы не будем приводить полные списки файлов для каждого -описываемого каталога, а Мефодий сможет просмотреть их при помощи -команды `ls` имя каталога. - -/bin:: - Название этого каталога происходит от слова «binaries» - («двоичные», «исполняемые»). В этом каталоге находятся - исполняемые файлы самых необходимых утилит. Сюда попадают такие - программы, которые могут понадобиться системному администратору - или другим пользователям для устранения неполадок в системе или - при восстановлении после сбоя. -/boot:: - «Boot» -- загрузка системы. В этом каталоге находятся файлы, - необходимые для самого первого этапа загрузки: загрузки ядра и, - обычно, само ядро. Пользователю практически никогда не требуется - непосредственно работать с этими файлами. -/dev:: - В этом каталоге находятся все имеющиеся в системе _файлы-дырки_: - файлы особого типа, предназначенные для обращения к различным - системным ресурсам и устройствам (англ. «devices» -- «устройство», - отсюда и сокращённое название каталога). Например, файлы - `/dev/ttyN` соответствуют _виртуальным консолям_, где `N` -- номер - виртуальной консоли. Данные, введённые пользователем на первой - виртуальной консоли, система считывает из файла `/dev/tty1`, в этот - же файл записываются данные, которые нужно вывести пользователю - на эту консоль. В файлах-дырках в действительности не хранятся - никакие данные, при их помощи данные передаются. Подробнее о - принципе работы с _файлами-дырками_ речь пойдёт в лекции - <>. -/etc:: - Каталог для системных _конфигурационных файлов_. Здесь хранится - информация о специфических настройках данной системы: информация - о зарегистрированных пользователях, доступных ресурсах, - настройках различных программ. Подробно системные - конфигурационные файлы будут рассмотрены в - лекции <>. -/home:: - Здесь расположены каталоги, принадлежащие пользователям системы - -- _домашние каталоги_, отсюда и название «home». Отделение всех - файлов, создаваемых пользователями, от прочих системных файлов - даёт очевидное преимущество: серьёзное повреждение системы или - необходимость обновления не затронет наиболее ценной информации -- - пользовательских файлов. -/lib:: - Название этого каталога -- сокращение от «libraries» (англ. - «библиотеки»). _Библиотеки_ -- это собрания наиболее стандартных - функций, необходимых многим программам: операций ввода/вывода, - рисования элементов графического интерфейса и проч. Чтобы не - включать эти функции в текст каждой программы, используются - стандартные функции библиотек -- это значительно экономит место - на диске и упрощает написание программ. В этом каталоге - содержатся библиотеки, необходимые для работы наиболее важных - системных утилит (размещённых в `/bin` и `/sbin`). -/mnt:: - Каталог для _монтирования_ (от англ. «mount») -- временного - подключения файловых систем, например, на съёмных носителях - (CD-ROM и др.). Подробно о монтировании файловых систем речь - пойдёт в лекции <>. -/proc:: - В этом каталоге все файлы «виртуальные» -- они располагаются не - на диске, а в оперативной памяти. В этих файлах содержится - информация о программах (_процессах_), выполняемых в данный момент - в системе. -/root:: - _Домашний каталог_ администратора системы -- пользователя root. - Смысл размещать его отдельно от домашних каталогов остальных - пользователей состоит в том, что /home может располагаться на - отдельном устройстве, которое не всегда доступно (например, на - сетевом диске), а домашний каталог root должен присутствовать в - любой ситуации. -/sbin:: - Каталог для важнейших системных утилит (название каталога -- - сокращение от «system binaries»): в дополнение к утилитам `/bin` - здесь находятся программы, необходимые для загрузки, резервного - копирования, восстановления системы. Полномочия на исполнение - этих программ есть только у системного администратора. -/tmp:: - Этот каталог предназначен для _временных файлов_: в таких файлах - программы хранят промежуточные данные, необходимые для работы. - После завершения работы программы временные файлы теряют смысл и - должны быть удалены. Обычно каталог `/tmp` очищается при каждой - загрузке системы. -/usr:: - Каталог `/usr` -- это «государство в государстве». Здесь можно - найти такие же подкаталоги `bin`, `etc`, `lib`, `sbin`, как и в - корневом каталоге. Однако в корневой каталог попадают только - утилиты, необходимые для загрузки и восстановления системы в - аварийной ситуации, все остальные программы и данные - располагаются в подкаталогах `/usr`. Прикладных программ в - современных системах обычно установлено очень много, поэтому этот - раздел файловой системы может быть очень большим. -/var:: - Название этого каталога -- сокращение от «variable» («переменные» - данные). Здесь размещаются те данные, которые создаются в - процессе работы разными программами и предназначены для передачи - другим программам и системам (очереди печати и электронной почты - и др.) или для сведения системного администратора (_системные - журналы_, содержащие протоколы работы системы). В отличие от - каталога `/tmp` сюда попадают те данные, которые могут понадобиться - после того, как создавшая их программа завершила работу. - -Стандарт _FHS_ регламентирует не только перечисленные каталоги, но и -их подкаталоги, а иногда даже приводит список конкретных файлов, -которые должны присутствовать в определённых каталогах -footnote:[Краткое описание стандартной иерархии каталогов -Linux можно получить, отдав команду `man hier`. Полный текст -и последнюю редакцию стандарта _FHS_ можно прочесть -по адресу http://www.pathname.com/fhs/.]. Этот -стандарт последовательно соблюдается во всех Linux-системах, хотя и -не без горячих споров между разработчиками при выходе каждой новой -его версии. - -Стандартное размещение файлов позволяет и человеку, и даже программе -предсказать, где находится тот или иной компонент системы. Для -человека это означает, что он сможет быстро сориентироваться в любой -системе Linux (где файловая система организована в соответствии со -стандартом) и найти то, что ему нужно. Для программ стандартное -расположение файлов -- это возможность организации автоматического -взаимодействия между разными компонентами системы. - -Мефодий уже успел воспользоваться некоторыми преимуществами, которые -даёт использование стандартного расположения файлов: на предыдущих -лекциях он запускал утилиты, не указывая полный путь к исполняемому -файлу, например, `cat` вместо `/bin/cat`. _Командная оболочка_ «знает», что -исполняемые файлы располагаются в каталогах `/bin`, `/usr/bin` и т. д. -- -именно в этих каталогах она ищет исполняемый файл `cat`. Благодаря -этому каждая вновь установленная в системе программа немедленно -оказывается доступна пользователю из командной строки, для этого не -требуется ни перезагружать систему, ни запускать никаких процедур -- -достаточно просто поместить исполняемый файл в один из -соответствующих каталогов. - -Рекомендации стандарта по размещению файлов и каталогов основываются -на принципе разносить в разные подкаталоги файлы, которые по-разному -используются в системе. По типу использования файлов их можно -разделить на следующие группы: - -====================================================== -Пользовательские/системные файлы:: - пользовательские файлы -- это все файлы, созданные пользователем и - не принадлежащие ни одному из компонентов системы. О пользе - разграничения пользовательских и системных файлов речь уже шла выше. -====================================================== - -====================================================== -Изменяющиеся/неизменные файлы:: - к неизменным файлам относятся все статические компоненты - программного обеспечения: библиотеки, исполняемые файлы и - др. -- всё, что не изменяется само без вмешательства системного - администратора. Изменяющиеся -- это те, которые изменяются без - вмешательства человека в процессе работы системы: _системные - журналы_, очереди печати и пр. Выделение неизменных файлов в - отдельную структуру (например, `/usr`) позволяет использовать - соответствующую часть файловой системы в режиме «только чтение», - что уменьшает вероятность случайного повреждения данных и позволяет - использовать для хранения этой части файловой системы CD-ROM и - другие носители, доступные только для чтения. -====================================================== - -====================================================== -Разделяемые/не разделяемые файлы:: - это разграничение становится полезным, если речь идёт о сети, в - которой работает несколько компьютеров. Значительная часть - информации при этом может храниться на одном из компьютеров и - использоваться всеми остальными по сети (к такой информации - относятся, например, многие программы и домашние каталоги - пользователей). Однако часть файлов нельзя разделять между - системами (например, файлы для начальной загрузки системы). -====================================================== - -[[work]] -== Работа с файловой системой == - -=== Текущий каталог === - -Файловая система не только систематизирует данные, но и является -основой метафоры «рабочего места» в Linux. Каждая выполняемая программа -«работает» в строго определённом каталоге файловой системы. Такой -каталог называется _текущим каталогом_, можно представлять, что -программа во время работы «находится» именно в этом каталоге, это её -«рабочее место». В зависимости от текущего каталога может меняться -поведение программы: зачастую программа будет по умолчанию работать -с файлами, расположенными именно в текущем каталоге -- до них она -«дотянется» в первую очередь. Текущий каталог есть у любой программы, -в том числе и у командной оболочки (shell) пользователя. Поскольку -взаимодействие пользователя с системой обязательно опосредовано -командной оболочкой, можно говорить о том, что пользователь «находится» -в том каталоге, который в данный момент является текущим каталогом его -командной оболочки. - -Все команды, отдаваемые пользователем при помощи shell, наследуют -текущий каталог shell, т. е. «работают» в том же каталоге. По этой -причине пользователю важно знать текущий каталог shell. Для этого -служит утилита `pwd`: - ---------------------------------------------- -[methody@localhost methody]$ pwd -/home/methody -[methody@localhost methody]$ ---------------------------------------------- - -`pwd` (аббревиатура от print working directory) возвращает полный -путь текущего каталога командной оболочки, естественно, именно той -командной оболочки, при помощи которой была выполнена команда `pwd`. В -данном случае Мефодий узнал, что в этот момент (на этой _виртуальной -консоли_) текущим является каталог `/home/methody`. - -Почти все утилиты, с которыми работал Мефодий в предыдущих лекциях, -по умолчанию читают и создают файлы в текущем каталоге. Так, Мефодий -обращался к файлам, не используя никаких путей, просто по имени. -Например, использовал утилиту `cat`, чтобы вывести на экран содержимое -файла `text`. - ---------------------------------------------- -[methody@localhost methody]$ cat text -File: info.info, Node: Help-Cross, Up: Cross-refs - -The node reached by the cross reference in Info - . . . -[methody@localhost methody]$ cat /home/methody/text -File: info.info, Node: Help-Cross, Up: Cross-refs - -The node reached by the cross reference in Info - . . . ---------------------------------------------- - -В действительности, командная оболочка, прежде чем передавать -параметр «`text` (имя файла) утилите `cat`, подставляет значение -текущего каталога -- получается полный путь к этому файлу в файловой -системе: `/home/methody/text`. Содержимое именно этого файла утилита -`cat` выведет на экран footnote:[Вообще говоря, в нескольких разных -каталогах файловой системы могут оказаться файлы с именем `text`, -именно поэтому командная оболочка всегда передаёт программам и -утилитам «точный адрес» файла в файловой системе -- полный -путь.]. Набирая только имя файла без пути к текущему -каталогу, Мефодий воспользовался _относительным путём_ к этому файлу. - -===================================================== -Относительный путь:: - _путь_ к объекту _файловой системы_, не начинающийся в _корневом - каталоге_. Для каждого _процесса_ Linux определён _текущий каталог_, - с которого система начинает относительный путь при выполнении - файловых операций. -===================================================== - -Относительный путь строится точно так же, как и полный -- перечислением -через `/` всех названий каталогов, встретившихся при движении к -искомому каталогу или файлу. Между полным путём и относительным есть -только одно существенное различие: относительный путь начинается от -текущего каталога, в то время как полный путь всегда начинается от -корневого каталога. Относительный путь любого файла или каталога в -файловой системе может иметь любую конфигурацию: чтобы добраться до -искомого файла можно двигаться как по направлению к корневому каталогу, -так и от него (см. раздел <>). Linux различает полный и относительный пути очень -просто: если имя объекта начинается на `/` -- это полный путь, -в любом другом случае -- относительный. - -Пользователь может обращаться к файлу при помощи полного или -относительного пути -- результат будет совершенно тот же. Так, -команды `cat text` и `cat /home/methody/text`, отданные Мефодием, -дали одинаковый результат, поскольку выводился один и тот же файл. -Если в относительном пути встречаются символы `/`, рассматриваются -подкаталоги текущего каталога, их подкаталоги и т. д. Короче говоря, -_относительный путь_ строится по тем же правилам, что и _полный_, с той -разницей, что относительный путь начинается не с символа `/`. Сам -_текущий каталог_, каков бы ни был полный путь к нему, всегда имеет -ещё одно обозначение, `.`, которое можно использовать, если по -каким-то причинам требуется, чтобы даже в относительном пути к -файлу, находящемуся в текущем каталоге, присутствовал элемент -«имя каталога». Так, пути `text` и `./text` тоже приводят к одному -и тому же файлу, однако в первом случае в строке пути не содержится -ничего, кроме имени файла. - -Отделить путь к файлу от его имени можно с помощью команд -`dirname` и `basebane` соответственно: - ---------------------------------------------- -[methody@localhost methody]$ basename /home/methody/text -text -[methody@localhost methody]$ basename text -text -[methody@localhost methody]$ dirname /home/methody/text -/home/methody -[methody@localhost methody]$ dirname ./text -. -[methody@localhost methody]$ dirname text -. ---------------------------------------------- - -Мефодий заметил, что для `text` и `./text dirname` выдало одинаковый -результат: `.`, что понятно: как было сказано выше, эти формы пути -совершенно эквивалентны, а при автоматической обработке результатов -`dirname` гораздо лучше получить `.`, чем пустую строку. - -=== Домашний каталог === - -Мефодий заметил, что на прошлых лекциях и на этой, заходя с разных -виртуальных консолей по очереди и одновременно, он всегда оказывался -в одном и том же _текущем каталоге_: он всё время обращался к своим -файлам при помощи относительного пути и всегда находил нужные. Это не -случайно -- в Linux у каждого пользователя обязательно есть свой -собственный каталог, который и становится текущим сразу после -_регистрации в системе_ -- _домашний каталог_ footnote:[Домашний каталог -указывается в _учётной записи_ пользователя, -см. лекцию <>]. -Для Мефодия домашним каталогом является `/home/methody`. - -================================================ -Домашний каталог:: - Каталог, предназначенный для хранения собственных данных - пользователя Linux. Как правило, является _текущим_ непосредственно - после регистрации пользователя в системе. _Полный путь_ к домашнему - каталогу хранится в _переменной окружения_ `HOME`. -================================================ - -Поскольку каждый пользователь располагает своим собственным каталогом -и по умолчанию работает в нём, решается задача разделения файлов разных -пользователей. Обычно доступ других пользователей к чужому домашнему -каталогу ограничен: наиболее типична ситуация, когда пользователи -могут читать содержимое файлов друг друга, но не имеют права их -изменять или удалять. - -=== Информация о каталоге === - -Чтобы иметь возможность ориентироваться в файловой системе, нужно знать, -что содержится в каждом каталоге. Запомнить всю структуру файловой -системы невозможно и не нужно: в любой момент можно просмотреть -содержимое любого каталога при помощи утилиты `ls` (сокращение от -англ. «list» -- «список»): - ---------------------------------------------- -[methody@localhost methody]$ ls --filename-with- text -[methody@localhost methody]$ ---------------------------------------------- - -Поданная без параметров, команда `ls` выводит список файлов и каталогов, -содержащихся в _текущем каталоге_ footnote:[Вот пример утилиты, которая -по умолчанию работает с файлами в текущем каталоге.]. -При помощи этой утилиты Мефодий -обнаружил, что в его _домашнем каталоге_ (который в данный момент -является текущим) содержатся два файла, созданные на прошлой -лекции: `-filename-with-` и `text`. - -Утилита `ls` принимает один _параметр_: имя каталога, содержимое которого -нужно вывести. Имя может быть задано любым доступным способом: в -виде _полного_ или _относительного пути_. Например, чтобы получить список -в файлов в своём домашнем каталоге, Мефодий мог бы использовать -команды `ls /home/methody` и `ls .` -- результат был бы аналогичным. - -Кроме параметра, утилита `ls` «понимает» множество ключей, которые -нужны главным образом для того, чтобы выводить дополнительную -информацию о файлах в каталоге или выводить список файлов выборочно. -Чтобы узнать обо всех возможностях `ls`, нужно, конечно же, прочесть -_руководство_ по этой утилите (`man ls`). - -Почитав руководство по `ls`, Мефодий решил изучить содержимое своей -файловой системы и начал с начала -- с _корневого каталога_. - ---------------------------------------------- -[methody@localhost methody]$ ls -F / -bin/ dev/ home/ mnt/ root/ swap/ tmp/ var/ -boot/ etc/ lib/ proc/ sbin/ sys/ usr/ -[methody@localhost methody]$ ---------------------------------------------- - -Мефодий использовал ключ `-F`, чтобы отличать файлы от каталогов. -При наличии этого ключа `ls` в конце имени каждого каталога ставит -символ `/`, чтобы показать, что в нём может содержаться что-то ещё. -В выведенном списке нет ни одного файла -- в корневом каталоге -содержатся только подкаталоги. - -Кроме того, Мефодий решил получить более подробную информацию о -содержимом своего домашнего каталога: - ---------------------------------------------- -[methody@localhost methody]$ ls -aF --filename-with- .bash_history .bashrc .lpoptions .rpmmacros Documents/ -./ .bash_logout .emacs .mutt/ .xemacs/ text -../ .bash_profile .i18n .pinerc .xsession.d/ tmp/ -[methody@localhost methody]$ ---------------------------------------------- - -Внезапно он обнаружил, что файлов в его домашнем каталоге не два, -а гораздо больше. Дело в том, что утилита `ls` по умолчанию не выводит -информацию об объектах, чьё имя начинается с `.` -- в том числе о `.` -и `..`. Для того чтобы посмотреть полный список содержимого каталога, -и используется ключ `-a` (all) footnote:[Такое поведение `ls` напоминает -принцип работы файловых менеджеров со скрытыми файлами в -системах MS-DOS/Windows. Разница в том, что в MS-DOS/Windows -скрытые файлы предусмотрены файловой системой -- файл может иметь -атрибут «скрытый» и при этом называться как угодно. В Linux скрытые -файлы -- это не свойство файловой системы, а только _соглашение по -наименованию файлов_.]. Как правило, с `.` начинаются имена -_конфигурационных файлов_ и _конфигурационных каталогов_ (вроде `.bashrc`, -описанного в лекции <>), -работа с которыми (т. е. настройка окружения, «рабочего места») не -пересекается с работой над какой-нибудь прикладной задачей (хотя, -конечно, эффективность работы зависит от хорошо настроенного окружения). -Кроме того, подобных файлов в домашнем каталоге активно работающего -пользователя со временем заводится немало (по одному на каждую -приличную утилиту) и их присутствие в выдаче `ls` сильно загромождает -её. - -Разберёмся подробно в списке файлов в домашнем каталоге Мефодия. -Начнём с весьма лаконичных имён `.` и `..`. Мефодий уже знает, -что `.` -- это имя текущего каталога. Следующее имя в списке, `..` -- -это ссылка на родительский каталог. Родительский каталог -- это тот -каталог, в котором находится данный. Родительским каталогом для -`/home/methody` будет каталог `/home`: он получается просто -отбрасыванием последнего имени каталога в полном пути. Иначе -можно сказать, что родительский каталог -- это один шаг по дереву -каталогов по направлению к корню. `..` -- это сокращённый способ -сослаться на родительский каталог: пока текущим каталогом -является `/home/methody`, относительный путь `..` (или, что то же -самое, `./..`) будет эквивалентен `/home`. С использованием `..` -можно строить сколь угодно длинные пути, такие как -`../../usr/../var/log/../run/../../home` - -=================================================== -Не сразу понятно, что приводит этот путь всё туда же, в `/home`. -=================================================== - -, однако в действительности они применяются только при автоматической -подстановке в программах, а во время работы пользователя необходимости -в такого рода усложнениях не возникает. - -=================================================== -Родительский каталог:: - каталог, в котором содержится данный. Для корневого каталога - родительским является он сам. -=================================================== - -Ссылки на текущий и на родительский каталог обязательно присутствуют -в каждом каталоге в Linux. Даже если каталог пуст, т. е. не содержит -ни одного файла или подкаталога, команда `ls -a` выведет список из -двух имён: `.` и `..`. - -За ссылками на текущий и родительский каталоги следуют несколько файлов -и каталогов, имена которых начинаются на `.`. В них содержатся настройки -командной оболочки (файлы, начинающиеся с `.bash`) и других программ. -В домашнем каталоге каждого пользователя Linux всегда присутствует -несколько таких файлов. Использование этих файлов позволяет -пользователям независимо друг от друга настраивать поведение командной -оболочки и других программ -- организовывать своё «рабочее место» в -системе. Подробнее речь об этом пойдёт в -лекции <>. - -[[tree]] -=== Перемещение по дереву каталогов === - -Пользователь может работать с файлами не только в своём домашнем -каталоге, но и в других каталогах. В этом случае будет удобно сменить -_текущий каталог_, т. е. «переместиться» в другую точку файловой системы. -Для смены текущего каталога командной оболочки используется команда -`cd` (от англ. «change directory» -- «сменить каталог»). Команда `cd` -принимает один параметр: имя каталога, в который нужно переместиться -- -сделать текущим. Как обычно, в качестве имени каталога можно -использовать полный или относительный путь. - ---------------------------------------------- -[methody@localhost methody]$ cd /home -[methody@localhost home]$ ls -methody shogun -[methody@localhost home]$ cd methody -[methody@localhost methody]$ ---------------------------------------------- - -Сначала Мефодий решил переместиться в каталог `/home`, и посмотреть, -что ещё есть в этом каталоге, кроме его домашнего каталога. Он -обнаружил ещё один каталог -- `shogun`, и догадался, что это домашний -каталог Гуревича, _входное имя_ которого -- `shogun`. Кроме того, он -заметил, что изменился вид _приглашения командной строки_ (подсказки -shell) -- слово `methody` заменилось на `home`. В приглашении -командной строки часто указывается текущий каталог shell -- чтобы -пользователю легче было ориентироваться, в каком каталоге он -«находится» в данный момент. - -После этого Мефодий решил вернуться в свой домашний каталог, но в -этом случае он использовал уже не полный, а относительный путь -- -`cd methody`. Вводя эту команду, Мефодий не стал целиком набирать имя -своего домашнего каталога, а набрал только первые буквы «me» и нажал -клавишу Tab, как ему советовал Гуревич. Командная оболочка умеет -достраивать имена файлов и каталогов: пользователю достаточно набрать -несколько первых символов имени файла или каталога и нажать *Tab*. Если -есть только один вариант завершения имени -- оболочка закончит его -сама, и пользователю не придётся набирать оставшиеся символы. -Достраивание -- весьма серьёзное средство экономии усилий и повышения -эффективности при работе с командной строкой. Современные командные -оболочки умеют достраивать имена файлов и каталогов, а также имена -команд. Достраивание наиболее развито в командном интерпретаторе `zsh`. - -Те же самые перемещения -- в родительский каталог и обратно -- -Мефодий мог бы сделать и набирая значительно меньше символов. Для -перемещения в родительский каталог (`/home`) удобно воспользоваться -ссылкой `..`. Необходимость вернуться в домашний каталог из -произвольной точки файловой системы возникает довольно часто, поэтому -командная оболочка поддерживает обозначение домашнего каталога при -помощи символа `~`. Поэтому чтобы перейти в домашний каталог из -любого другого, достаточно выполнить команду `cd ~`. При исполнении -команды символ `~` будет заменён командной оболочкой на полный путь к -домашнему каталогу пользователя. - ---------------------------------------------- -[methody@localhost methody]$ cd .. -[methody@localhost home]$ cd ~ -[methody@localhost methody]$ cd ~shogun -[methody@localhost shogun]$ cd -[methody@localhost methody]$ ---------------------------------------------- - -При помощи символа `~` можно ссылаться и на домашние каталоги других -пользователей: `~имя пользователя`. В примере `$cd..` Мефодий перешёл в -домашний каталог Гуревича командой `cd ~shogun`. Команда `cd`, поданная -без параметров, эквивалента команде `cd ~` и делает текущим каталогом -домашний каталог пользователя. - -=== Создание каталогов === - -Пользователь, конечно, не должен хранить все свои файлы в одном -каталоге. В домашнем каталоге пользователя, как и в любом другом, -можно создавать сколь угодно много подкаталогов, в них -- свои -подкаталоги и т. д. Другими словами, пользователю принадлежит -фрагмент (поддерево) файловой системы, корнем которого является -домашний каталог пользователя. - -Чтобы организовать такое поддерево, потребуется создать каталоги -внутри домашнего. Для этого используется утилита `mkdir`. Она -используется с одним обязательным параметром: именем создаваемого -каталога. По умолчанию каталог будет создан в текущем каталоге. - ---------------------------------------------- -[methody@localhost methody]$ mkdir examples -[methody@localhost methody]$ ls -F --filename-with- Documents/ examples/ text tmp/ -[methody@localhost methody]$ ---------------------------------------------- - -Мефодий решил навести некоторый порядок в своём домашнем каталоге и -поместить все файлы с примерами и упражнениями в отдельном -подкаталоге -- `examples`. Теперь, создав каталог, нужно переместить в -него все файлы с примерами. - -=== Копирование и перемещение файлов === - -Для перемещения файлов и каталогов предназначена утилита `mv` -(сокращение от англ. «move» -- «перемещать»). У `mv` два обязательных -параметра: первый -- перемещаемый файл или каталог, второй -- файл или -каталог назначения. Имена файлов и каталогов могут быть заданы в -любом допустимом виде: при помощи полного или относительного пути. -Кроме того, mv позволяет перемещать не только один файл или каталог, -а сразу несколько. За подробностями о допустимых параметрах и ключах -следует обратиться к руководству по `mv`. - ---------------------------------------------- -[methody@localhost methody]$ mv -- -filename-with- examples/ -[methody@localhost methody]$ cd examples -[methody@localhost examples]$ mv ../text . -[methody@localhost examples]$ ls --filename-with- text -[methody@localhost examples]$ ---------------------------------------------- - -Мефодий сначала переместил в каталог `examples` файл `-filename-with-`, -поскольку имя этого файла начинается с `-`, ему потребовалось предварить -его ключом `--`, чтобы следующее слово было воспринято командной -оболочкой как параметр (этот приём был описан в лекции -<>). Затем -он перешёл в каталог `examples` и переместил -из родительского каталога (`../`) файл `text` в текущий каталог (`.`). -Теперь в каталоге `examples` два файла с примерами. - -Перемещение файла внутри одной файловой системы в действительности -равнозначно его переименованию: данные самого файла при этом остаются -на тех же секторах диска, изменяются каталоги, в которых произошло -перемещение. Перемещение предполагает удаление ссылки на файл из того -каталога, откуда он перемещён, и добавление ссылки на этот самый файл -в тот каталог, куда он перемещён. В результате изменяется полное имя -файла -- _полный путь_, т. е. положение файла в файловой системе. - -Иногда требуется создать копию файла: для большей сохранности данных, -для того, чтобы создать модифицированную версию файла и т. п. В Linux -для этого предназначена утилита `cp` (сокращение от англ. «copy» -- -«копировать»). Утилита `cp` требует присутствия двух обязательных -параметров: первый -- копируемый файл или каталог, второй -- файл -или каталог назначения. Как обычно, в именах файлов и каталогов -можно использовать полные и относительные пути. Есть несколько -возможностей при комбинации файлов и каталогов в параметрах `cp` -- о -них можно прочесть в _руководстве_. - ---------------------------------------------- -[methody@localhost examples]$ cp text text.bak -[methody@localhost examples]$ ls --filename-with- text text.bak ---------------------------------------------- - -Мефодий решил создать резервную копию файла `text`, `text.bak` в том же -каталоге, что и исходный файл. Для этой простейшей операции копирования -достаточно передать `cp` в качестве двух параметров имя исходного файла и -имя копии. По умолчанию `cp`, как и многие другие утилиты, будет работать -с файлами в текущем каталоге. - -Нужно иметь в виду, что в Linux утилита `cp` нередко настроена таким -образом, что при попытке скопировать файл поверх уже существующего не -выводится никакого предупреждения. В этом случае файл будет просто -перезаписан, а данные, которые содержались в старой версии файла, -бесповоротно потеряны. Поэтому при использовании cp следует всегда -быть внимательным и проверять имена файлов, которые нужно скопировать. - -Говоря о копировании, уместно вспомнить широко известное высказывание, -приписываемое Уильяму Оккаму: «Не следует умножать сущности сверх -необходимого». Созданная при помощи cp копия файла связана с оригиналом -только в воспоминаниях пользователя, в файловой системе исходный файл -и его копия -- две совершенно независимые и ничем не связанные единицы. -Поэтому при наличии нескольких копий одного и того же файла в рамках -одной файловой системы повышается вероятность запутаться в копиях или -забыть о некоторых из них. Если задача состоит в том, чтобы обеспечить -доступ к одному и тому же файлу из разных точек файловой системы, нужно -использовать специально предназначенный для этого механизм файловой -системы Linux -- ссылки. - -== Файл и его имена: ссылки == - -=== Жёсткие ссылки === - -Каждый файл представляет собой область данных на жёстком диске -компьютера или на другом носителе информации, которую можно найти по -имени. В файловой системе Linux содержимое файла связывается с его -именем при помощи жёстких ссылок. Создание файла с помощью любой -программы означает, что будет создана жёсткая ссылка -- имя файла, и -открыта новая область данных на диске. Причём количество ссылок на одну -и ту же область данных (файл) не ограничено, т. е. у файла может быть -несколько имён. - -Пользователь Linux может добавить файлу ещё одно имя (создать ещё одну -жёсткую ссылку на файл) при помощи утилиты `ln` сокращение от англ. -«link» -- «соединять, связывать»). Первый параметр -- это имя файла, -на который нужно создать ссылку, второй -- имя новой ссылки. По -умолчанию ссылка будет создана в текущем каталоге. - ---------------------------------------------- -[methody@localhost methody]$ ln examples/text text-hardlink -[methody@localhost methody]$ ls -lR -./: - -. . . - -drwxr-xr-x 3 methody methody 4096 Окт 16 04:45 examples --rw-r--r-- 2 methody methody 653 Окт 6 10:31 text-hardlink - -./examples: -итого 92 --rw-r--r-- 1 methody methody 84718 Окт 6 10:31 -filename-with- --rw-r--r-- 2 methody methody 653 Окт 6 10:31 text ---------------------------------------------- - -Мефодий создал в своём домашнем каталоге жёсткую ссылку с именем -`text-hardlink` на файл `text`, который находится в подкаталоге -`examples`. Выведя подробный список файлов текущего каталога и его -подкаталогов (`ls -lR`), Мефодий обратил внимание, что у файлов -`text` и `text-hardlink` совпадают и размер (`653`), и время создания. -Это его совершенно не удивило, поскольку он знает, что теперь -`/home/methody/text-hardlink` и `/home/methody/examples/text` -- это -два имени одного и того же файла. В подробном описании, выведенном -командой `ls -l`, Мефодию остались непонятны только два первых поля. -Как объяснил Гуревич, первое «слово», состоящее из знаков `-drwx`, -- -это обозначение _прав доступа_ к файлу, о которых речь пойдёт в -лекции <>. А следующее за ним число -- количество -жёстких ссылок на данный файл или каталог. У `text` и `text-hardlink` -стоит число `2` -- у этого файла два имени. - -Доступ к одному и тому же файлу при помощи нескольких имён может -понадобиться в следующих случаях: - -. Одна и та же программа известна под несколькими именами. - -. Доступ пользователей к некоторым каталогам в системе может быть -ограничен из соображений безопасности. Однако если всё же нужно -организовать доступ пользователей к файлу, который находится в таком -каталоге, можно создать жёсткую ссылку на этот файл в другом каталоге. - -. Современные файловые системы даже на домашних персональных -компьютерах могут насчитывать до нескольких десятков тысяч файлов -и тысячи каталогов. Обычно у таких файловых систем сложная -многоуровневая иерархическая организация -- в результате пути ко -многим файлам становятся очень длинными. Чтобы организовать более -удобный доступ к файлу, который находится очень «глубоко» в иерархии -каталогов, также можно использовать жёсткую ссылку в более -доступном каталоге. - -. Полное имя некоторых программ может быть весьма длинным (например, -i586-alt-linux-gcc-3.3), к таким программам удобнее обращаться при -помощи сокращённого имени (жёсткой ссылки) -- gcc-3.3. - -=== Индексные дескрипторы === - -Поскольку благодаря жёстким ссылкам у файла может быть несколько имён, -понятно, что вся существенная информация о файле в файловой системе -привязана не к имени. В файловых системах Linux вся информация, -необходимая для работы с файлом, хранится в индексном декрипторе. -Для каждого файла существует индексный дескриптор: не только для -обычных файлов, но и для каталогов footnote:[Каталоги в Linux -- тоже файлы -особого типа, см. раздел <>], -файлов-дырок и т. д. Каждому файлу соответствует ровно один индексный -дескриптор. - -Индексный дескриптор -- это описание файла, в котором содержится: - -* тип файла (обычный файл, каталог, файл-дырка и т. д.); -* права доступа к файлу; -* информация о том, кому принадлежит файл; -* отметки о времени создания, модификации, последнего доступа к файлу; -* размер файла; -* указатели на физические блоки на диске, принадлежащие этому -файлу -- в этих блоках хранится «содержимое» файла. - -Все индексные декрипторы пронумерованы, поэтому номер индексного -дескриптора -- это уникальный идентификатор файла в файловой системе -- -в отличие от имени файла (жёсткой ссылки на него), которых может быть -несколько. Узнать номер индексного дескриптора любого файла можно при -помощи всё той же утилиты `ls` с ключом `-i`: - ---------------------------------------------- -[methody@localhost methody]$ ls -i ./text-hardlink examples/text -127705 examples/text 127705 ./text-hardlink ---------------------------------------------- - -Мефодий решил поинтересоваться номерами индексных дескрипторов файла -`text` и жёсткой ссылки на него `text-hardlink` -- он обнаружил, что -эти номера совпадают (`127705`), то есть этим двум именам соответствует -один индексный дескриптор, т. е. один и тот же файл. - -Все операции с файловой системой -- создание, удаление и перемещение -файлов -- производятся на самом деле над индексными дескрипторами, -имена нужны только для того, чтобы пользователь мог легко -ориентироваться в файловой системе. (Было бы очень неудобно запоминать -многозначный номер каждого нужного файла или каталога.) Более того, -имя (или имена) файла не указаны в его индексном дескрипторе. В -файловой системе Ext2 имена файлов хранятся в каталогах: каждый каталог -представляет собой список имён файлов и номеров их индексных -дескрипторов. Жёсткую ссылку (имя файла, хранящееся в каталоге) -можно представлять как каталожную карточку, на которой указан номер -индексного дескриптора -- идентификатор файла. - -======================================================== -Жёсткая ссылка:: - запись вида `имя файла+номер индексного дескриптора` в _каталоге_. - Жёсткие ссылки в Linux -- основной способ обратиться к файлу по - имени. -======================================================== - -=== Символьные ссылки === - -У жёстких ссылок есть два существенных ограничения: - -. Жёсткая ссылка может указывать только на файл, но не каталог, потому -что в противном случае в файловой системе могут возникнуть циклы -- -бесконечные пути. -. Жёсткая ссылка не может указывать на файл на другой файловой системе. -Например, невозможно создать на жёстком диске жёсткую ссылку на файл, -расположенный на дискете footnote:[Причина этого ограничения в том, что номер -индексного дескриптора уникален только в рамках одной файловой системы. -В разных файловых системах могут оказаться два разных файла с -одинаковым номером индексного дескриптора, в результате будет -невозможно установить, на какой из них указывает жёсткая ссылка.]. - -Чтобы избежать этих ограничений, были разработаны _символьные ссылки_. -Символьная ссылка -- это просто файл, в котором содержится имя другого -файла. Символьные ссылки, как и жёсткие, предоставляют возможность -обращаться к одному и тому же файлу по разным именам. Кроме того, -символьные ссылки могут указывать и на каталог, чего не позволяют -жёсткие ссылки. Символьные ссылки называются так потому, что содержат -символы -- путь к файлу или каталогу. - -============================================================== -Символьная ссылка:: - файл особого типа (`l`), в котором содержится путь к другому файлу. - Если на пути к файлу встречается символьная ссылка, система - выполняет подстановку: исходный путь заменяется на тот, что - содержится в ссылке. -============================================================== - -Символьную ссылку можно создать при помощи команды `ln` с ключом `-s` -(сокращение от «symbolic»): - ---------------------------------------------- -[methody@localhost methody]$ ln -s examples/text text-symlink -[methody@localhost methody]$ ls -li - -. . . - -127699 drwxr-xr-x 2 methody methody 4096 Окт 4 17:12 examples -127705 -rw-r--r-- 2 methody methody 653 Сен 30 10:04 text-hardlink - 3621 lrwxrwxrwx 1 methody methody 13 Окт 4 18:05 text-symlink -> examples/text -[methody@localhost methody]$ ---------------------------------------------- - -Теперь Мефодий решил создать в своём домашнем каталоге и символьную -ссылку на файл `text` и назвать её `text-symlink`. Команда `ls -li` -отобразила этот файл совсем не так, как остальные: стрелочка («->») -указывает, куда направлена ссылка. Кроме того, Мефодий обратил -внимание, что номер индексного дескриптора (первое поле), размер и -время создания файла `text-symlink` отличаются `text-hardlink`, а также -во втором поле (количество жёстких ссылок на файл) `text-symlink` -указано `1`. Все эти признаки недвусмысленно свидетельствуют о том, -что `text-symlink` и `text` -- это разные файлы. Однако если выполнить -команду `cat text-symlink`, то на экран будет выведено содержимое -файла `text`. - -Символьная ссылка вполне может содержать имя несуществующего файла, в -этом случае ссылка будет существовать, но не будет «работать»: -например, если попробовать вывести содержимое такой «битой» ссылки -при помощи команды cat, будет выдано сообщение об ошибке. - -Узнать, куда указывает символьная ссылка, можно при помощи утилиты -`realpath`: - ---------------------------------------------- -[methody@localhost methody]$ realpath text-symlink -/home/methody/examples/text ---------------------------------------------- - -=== Удаление файлов и каталогов === - -В Linux для удаления файлов предназначена утилита `rm` -(сокращение от англ. «remove» -- «удалять»). - ---------------------------------------------- -[methody@localhost methody]$ rm examples/text -[methody@localhost methody]$ ls -l text-hardlink --rw-r--r-- 1 methody methody 653 Сен 30 10:04 text-hardlink -[methody@localhost methody]$ rm text-hardlink -[methody@localhost methody]$ ls -l text-hardlink -ls: text-hardlink: No such file or directory ---------------------------------------------- - -Разобравшись в ссылках, Мефодий решил удалить файл `text` в каталоге -`examples`. После этого файл `text-hardlink` в домашнем каталоге Мефодия, -который является жёсткой ссылкой на удалённый файл text продолжает -благополучно существовать. Единственное отличие, которое заметил -Мефодий -- количество жёстких ссылок на этот файл теперь уменьшилось с -`2` до `1` -- действительно, `text-hardlink` -- теперь единственное имя -этого файла. Получается, что Мефодий удалил только одно из имён этого -файла (_жёсткую ссылку_), сам файл остался нетронутым. - -Однако если Мефодий удалит и жёсткую ссылку `text-hardlink` -- у этого -файла больше не останется ни одного имени, он станет недоступным -пользователю файловой системы и будет уничтожен. - -Утилита `rm` предназначена именно для удаления жёстких ссылок, а не -самих файлов. В Linux, чтобы полностью удалить файл, требуется -последовательно удалить все жёсткие ссылки на него. При этом все -жёсткие ссылки на файл (его имена) равноправны -- среди них нет -«главной», с исчезновением которой исчезнет файл. Пока есть хоть одна -ссылка, файл продолжает существовать. Впрочем, у большинства файлов -в Linux есть только одно имя (одна жёсткая ссылка на файл), поэтому -команда `rm имя файла` успешно удалит файл в большинстве случаев. - -Как уже говорилось, символьные ссылки -- это отдельные файлы, поэтому -после того, как Мефодий удалил файл `text`, `text-symlink`, который -ссылался на этот файл, продолжает существовать, однако теперь это -- -«битая ссылка», поэтому его также можно удалить командой `rm`. - -Мефодий решил создать каталог для разных упражнений -- `test`, а -потом решил обойтись одним каталогом `examples`. Однако команда `rm` не -сработала, заявив, что `test` -- это каталог: - ---------------------------------------------- -[methody@localhost methody]$ mkdir test -[methody@localhost methody]$ rm test -rm: невозможно удалить `test': Is a directory -[methody@localhost methody]$ rmdir test -[methody@localhost methody]$ ---------------------------------------------- - -Для удаления каталогов предназначена другая утилита -- `rmdir` (от -англ. «remove directory»). Впрочем, `rmdir` согласится удалить каталог -только в том случае, если он пуст: в нём нет никаких файлов и -подкаталогов. Удалить каталог вместе со всем его содержимым можно -командой `rm` с ключом `-r` (recursive). Команда `rm -r` каталог -- очень -удобный способ потерять в одночасье все файлы: она рекурсивно -footnote:[«Рекурсивно» по отношению к каталогам обозначает, -что действие будет произведено над самим каталогом, его -подкаталогами, подкаталогами его подкаталогов и т. д.] -обходит весь каталог, удаляя всё, что попадётся: файлы, подкаталоги, -символьные ссылки... а ключ `-f` (force) делает её работу ещё -неотвратимее, так как подавляет запросы вида «удалить защищённый -от записи файл», так что `rm` работает безмолвно и безостановочно. - -================================================================= -Помните: если вы удалили файл, значит, он уже не нужен, и не подлежит -восстановлению! -================================================================= - -В Linux не предусмотрено процедуры восстановления удалённых файлов и -каталогов. Поэтому стоит быть очень внимательным, отдавая команду -`rm` и, тем более, `rm -r`: нет никакой гарантии, что удастся восстановить -случайно удалённые данные. Узнав об этом, Мефодий не огорчился, но -подумал, что впредь будет удалять только действительно ненужные -файлы, а всё сомнительное -- перемещать с помощью mv в подкаталог -`~/tmp`, где оно не будет мозолить глаза, и где можно периодически -наводить порядок. - -[[access]] -== Доступ процессов к файлам и каталогам == - -=== Процессы === - -Как уже упоминалось в лекции <>, -загрузка Linux завершается тем, что на всех виртуальных консолях (на -самом деле -- на всех терминалах системы), предназначенных для работы -пользователей, запускается программа `getty`. Программа выводит -приглашение и ожидает активности пользователя, который может захотеть -работать именно на этом терминале. Введённое входное имя `getty` -передаёт программе `login`, которая вводит пароль и определяет, -разрешено ли работать в системе с этим входным именем и этим паролем. -Если `login` приходит к выводу, что работать можно, он запускает -_стартовый командный интерпретатор_, посредством которого пользователь -и командует системой. - -Выполняющаяся программа называется в Linux _процессом_. Все процессы -система регистрирует в _таблице процессов_, присваивая каждому -уникальный номер -- _идентификатор процесса_ (process identificator, -PID). Манипулируя процессами, система имеет дело именно с их -идентификаторами, другого способа отличить один процесс от другого, -по большому счёту, нет. Для просмотра своих процессов можно -воспользоваться утилитой `ps` («process status»): - ------------------------------------------------------------------ -[methody@localhost methody]$ ps -f - UID PID PPID C STIME TTY TIME CMD - methody 3590 1850 0 13:58 tty3 00:00:00 -bash - methody 3624 3590 0 14:01 tty3 00:00:00 ps -f ------------------------------------------------------------------ - -Здесь Мефодий вызвал `ps` с ключом `-f` («full»), чтобы добыть побольше -информации. Представлены оба принадлежащих ему процесса: стартовый -командный интерпретатор, `bash`, и выполняющийся `ps`. Оба процесса -запущены с терминала tty3 (третьей системной консоли), и имеют -идентификаторы `3590` и `3624` соответственно. В поле PPID («parent -process identificator») указан идентификатор _родительского процесса_, -т. е. процесса, породившего данный. Для `ps` это -- `bash`, а для `bash`, -очевидно, `login`, так как именно он запускает стартовый shell. В -выдаче не оказалось строки для этого `login`, равно как и для -большинства других процессов системы, так как они не принадлежат -пользователю `methody`. - -======================================================== -Процесс:: - выполняющаяся программа в Linux. Каждый процесс имеет уникальный - _идентификатор процесса_, PID. Процессы получают доступ к ресурсам - системы (оперативной памяти, файлам, внешним устройствам и т. п.) - и могут изменять их содержимое. Доступ регулируется с помощью - _идентификатора пользователя_ и _идентификатора группы_, которые - система присваивает каждому процессу. -======================================================== - -=== Запуск дочерних процессов === - -Запуск одного процесса вместо другого устроен в Linux с помощью -системного вызова `exec()`. Старый процесс из памяти удаляется -навсегда, вместо него загружается новый, при этом настройка окружения -не меняется, даже PID остаётся прежним. Вернуться к выполнению -старого процесса невозможно, разве что запустить его по новой с -помощью того же `exec()` (от «execute» -- «исполнить»). Кстати, имя -файла (программы), из которого запускается процесс, и собственное имя -процесса (в таблице процессов) могут и не совпадать. Собственное имя -процесса -- это такой же параметр командной строки, как и те, что -передаются ему пользователем: для `exec()` требуется и путь к файлу, и -полная командная строка, нулевой (стартовый) элемент которой -- как -раз название команды - -======================================================== -Нулевой параметр -- `argv[0]` в терминах языка Си и `$0` в -терминах shell -======================================================== - -Вот откуда «-» в начале имени стартового командного интерпретатора -(`-bash`): его «подсунула» программа `login`, чтобы была возможность -отличать его от других запущенных тем же пользователем оболочек. - -Для работы командного интерпретатора недостаточно одного `exec()`. В -самом деле, shell не просто запускает утилиту, а дожидается её -завершения, обрабатывает результаты её работы и продолжает диалог с -пользователем. Для этого в Linux служит системный вызов `fork()` -(«вилка, развилка»), применение которого приводит к возникновению ещё -одного, дочернего, процесса -- точной копии породившего его -родительского. _Дочерний процесс_ ничем не отличается от родительского: -имеет такое же окружение, те же стандартный ввод и стандартный вывод, -одинаковое содержимое памяти и продолжает работу с той же самой -точки (возврат из `fork()`). Отличия два: во-первых, эти процессы имеют -разные PID, под которыми они зарегистрированы в таблице процессов, а -во-вторых, различается _возвращаемое значение_ `fork()`: родительский -процесс получает в качестве результата `fork()` идентификатор -процесса-потомка, а процесс-потомок получает «0». - -Дальнейшие действия shell при запуске какой-либо программы -очевидны. Shell-потомок немедленно вызывает эту программу с помощью -`exec()`, а shell-родитель дожидается завершения работы -процесса-потомка (PID которого ему известен) с помощью ещё одного -системного вызова, `wait()`. Дождавшись и проанализировав результат -команды, shell продолжает работу. - ------------------------------------------------------------------ -[methody@localhost methody]$ cat > loop - while true; do true; done -^D -[methody@localhost methody]$ sh loop -^C -[methody@localhost methody]$ ------------------------------------------------------------------ - -По совету Гуревича Мефодий создал _сценарий_ для `sh` (или `bash`, на -таком уровне их команды совпадают), который ничего не делает. Точнее -было бы сказать, что этот сценарий делает ничего, бесконечно повторяя -в цикле команду, вся работа которой состоит в том, что она -завершается без ошибок (в лекции <> будет сказано о том, что `> файл` в -командной строке просто перенаправляет -стандартный вывод команды в файл). Запустив этот сценарий с помощью -команды вида `sh имя_сценария`, Мефодий ничего не увидел, но услышал, -как загудел вентилятор охлаждения центрального процессора: машина -трудилась! Управляющий символ `^C`, как обычно, привёл к завершению -активного процесса, и командный интерпретатор продолжил работу. - -Если бы в описанной выше ситуации родительский процесс не ждал, пока -дочерний завершится, а сразу продолжал работать, получилось бы, что -оба процесса выполняются «параллельно»: пока запущенный процесс -что-то делает, пользователь продолжает командовать оболочкой. Для -того, чтобы запустить процесс параллельно, в shell достаточно -добавить `&` в конец командной строки: - ------------------------------------------------------------------ -[methody@localhost methody]$ sh loop& - [1] 3634 -[methody@localhost methody]$ ps -f - UID PID PPID C STIME TTY TIME CMD - methody 3590 1850 0 13:58 tty3 00:00:00 -bash - methody 3634 3590 99 14:03 tty3 00:00:02 sh loop - methody 3635 3590 0 14:03 tty3 00:00:00 ps -f ------------------------------------------------------------------ - -В результате стартовый командный интерпретатор (PID 3590) оказался -отцом сразу двух процессов: `sh`, выполняющего сценарий `loop` и `ps`. - -Процесс, запускаемый параллельно, называется _фоновым_ (background). -Фоновые процессы не имеют возможности вводить данные с того же -терминала, что и породивший их shell (только из файла), зато выводить -на это терминал могут (правда, когда на одном и том же терминале -вперемежку появляются сообщения от нескольких фоновых процессов, -начинается сущая неразбериха). При каждом терминале в каждый момент -времени может быть не больше одного _активного_ (foreground) процесса, -которому разрешено с этого терминала вводить. На время, пока команда -(например, `cat`) работает в активном режиме, породивший её командный -интерпретатор «уходит в фон», и там, в фоне, выполняет свой `wait()`. - -======================================================== -Активный процесс:: - процесс, имеющий возможность вводить данные с терминала. В каждый - момент у каждого терминала может быть не более одного активного - процесса. -======================================================== - -======================================================== -Фоновый процесс:: - процесс, не имеющий возможность вводить данные с терминала. - Пользователь может запустить любое, не превосходящее заранее - заданного в системе, число фоновых процессов. -======================================================== - -Стоит заметить, что параллельность работы процессов в Linux -- -дискретная. Здесь и сейчас выполняться может столько процессов, -сколько центральных процессоров есть в компьютере (например, один). -Дав этому одному процессу немного поработать, система запоминает всё, -что тому для работы необходимо, приостанавливает его, и запускает -следующий процесс, потом следующий и так далее. Возникает очередь -процессов, ожидающих выполнения. Только что поработавший процесс -помещается в конец этой очереди, а следующий выбирается из её начала. -Когда очередь вновь доходит до того, первого процесса, система -вспоминает необходимые для его выполнения данные (они называются -_контекстом процесса_), и он продолжает работать, как ни в чём не -бывало. Такая схема разделения времени между процессами носит -названия _псевдопараллелизма_. - -В выдаче ps, которую получил Мефодий, можно заметить, что PID -стартовой оболочки равен `3590`, а PID запущенных из-под него команд -(одной фоновой и одной активной) -- `3634` и `3635`. Это значит, что за -время, прошедшее с момента входа Мефодия в систему до момента -запуска `sh loop&`, в системе было запущено ещё `3634-3590=44` процесса. -Что ж, в Linux могут одновременно работать несколько пользователей, -да и самой системе иногда приходит в голову запустить какую-нибудь -утилиту (например, выполняя действия по расписанию). А вот `sh` и `ps` -получили соседние PID, значит, пока Мефодий нажимал *Enter* и набирал -`ps -f`, никаких других процессов не запускалось. - -В действительности далеко не всем процессам, зарегистрированным в -системе, на самом деле необходимо давать поработать наравне с -другими. Большинству процессов работать прямо сейчас не нужно: они -ожидают какого-нибудь события, которое им нужно обработать. Чаще -всего процессы ждут завершения операции ввода-вывода. Чтобы -посмотреть, как потребляются ресурсы системы, можно использовать -утилиту `top`. Но сначала Мефодий решил запустить ещё один бесконечный -сценарий: ему было интересно, как два процесса конкурируют за ресурсы -между собой: - ------------------------------------------------------------------ -[methody@localhost methody]$ bash loop& - [2] 3639 -[methody@localhost methody]$ top - 14:06:50 up 3:41, 5 users, load average: 1,31, 0,76, 0,42 - 4 processes: 1 sleeping, 3 running, 0 zombie, 0 stopped - CPU states: 99,4% user, 0,5% system, 0,0% nice, 0,0% iowait, 0,0% idle - Mem: 514604k av, 310620k used, 203984k free, 0k shrd, 47996k buff - 117560k active, 148388k inactive - Swap: 1048280k av, 0k used, 1048280k free 184340k cached - - PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND - 3639 methody 20 0 1260 1260 1044 R 50,3 0,2 0:12 bash - 3634 methody 18 0 980 980 844 R 49,1 0,1 3:06 sh - 3641 methody 9 0 1060 1060 872 R 0,1 0,2 0:00 top - 3590 methody 9 0 1652 1652 1264 S 0,0 0,3 0:00 bash ------------------------------------------------------------------ - -Оказалось, что дерутся даже не два процесса, а три: `sh` (первый из -запущенных интерпретаторов `loop`), `bash` (второй) и сам `top`. Правда, по -сведениям из поля `%CPU`, львиную долю процессорного времени отобрали -`sh` и `bash` (они без устали вычисляют!), а `top` довольствуется десятой -долей процента (а то и меньшей: ошибки округления). Стартовый `bash` -вообще не хочет работать, он спит (значение `S`, `Sleep`, поля `STAT`, -`status`): ждёт завершения активного процесса, `top`. - -Увидев такое разнообразие информации, Мефодий кинулся читать -руководство по `top`, однако скоро понял, что без знания архитектуры -Linux большая её часть не имеет смысла. Впрочем, некоторая часть всё -же понятна: объём оперативной памяти (всей, используемой и -свободной), время работы машины, объём памяти, занимаемой процессами -и т. п. - -Последний процесс, запущенный из оболочки в фоне, можно из этой -оболочки сделать активным при помощи команды `fg` («foreground» -- -«передний план»). - ------------------------------------------------------------------ -[methody@localhost methody]$ fg - bash loop -^C ------------------------------------------------------------------ - -Услужливый `bash` даже написал командную строку, какой был запущен -этот процесс: `bash loop`. Мефодий решил «убить» его с помощью -управляющего символа `^C`. Теперь последним запущенным в фоне -процессом стал `sh`, выполняющий сценарий `loop`. - -=== Сигналы === - -Чтобы завершить работу фонового процесса с помощью `^C`, Мефодию -пришлось сначала сделать его активным. Это не всегда возможно, и не -всегда удобно. На самом деле, `^C` -- это не волшебная кнопка-убийца, -а предварительно установленный символ (с ascii-кодом 3), при -получении которого с терминала Linux передаст активному процессу -_сигнал_ 2 (по имени INT, от «interrupt» -- «прервать»). - -_Сигнал_ -- это способность процессов обмениваться стандартными -короткими сообщениями непосредственно с помощью системы. -Сообщение-сигнал не содержит никакой информации, кроме номера -сигнала (для удобства вместо номера можно использовать -предопределённое системой имя). Для того чтобы передать сигнал, -процессу достаточно задействовать системный вызов `kill()`, а для того, -чтобы принять сигнал, не нужно ничего. Если процессу нужно как-то -по-особенному реагировать на сигнал, он может зарегистрировать -обработчик, а если обработчика нет, за него отреагирует система. Как -правило, это приводит к немедленному завершению процесса, получившего -сигнал. Обработчик сигнала запускается асинхронно, немедленно после -получения сигнала, что бы процесс в это время ни делал. - -============================================================ -Сигнал:: - короткое сообщение, посылаемое системой или процессом другому - процессу. Обрабатывается асинхронно специальной - подпрограммой-обработчиком. Если процесс не обрабатывает - сигнал самостоятельно, это делает система. -============================================================ - -Два сигнала -- 9 (`KILL`) и 19 (`STOP`) -- всегда обрабатывает система. -Первый из них нужен для того, чтобы убить процесс наверняка (отсюда и -название). Сигнал `STOP` приостанавливает процесс: в таком состоянии -процесс не удаляется из таблицы процессов, но и не выполняется до тех -пор, пока не получит сигнал 18 (`CONT`) -- после чего продолжит работу. -В Linux сигнал `STOP` можно передать активному процессу с помощью -управляющего символа `^Z`: - ------------------------------------------------------------------ -[methody@localhost methody]$ sh loop -^Z - [1]+ Stopped sh loop -[methody@localhost methody]$ bg - [1]+ sh loop & -[methody@localhost methody]$ fg - sh loop -^C -[methody@localhost methody]$ ------------------------------------------------------------------ - -Мефодий сначала запустил вечный цикл в качестве активного процесса, -затем передал ему сигнал `STOP` с помощью `^Z`, после чего дал команду -`bg` (back ground), запускающую в фоне последний остановленный процесс. -Затем он снова перевёл этот процесс в активный режим, и, наконец, -убил его. - -Передавать сигналы из командной строки можно любым процессам с -помощью команды `kill -сигнал PID` или просто `kill PID`, которая -передаёт сигнал `15 (TERM)`. - ------------------------------------------------------------------ -[methody@localhost methody]$ sh -sh-2.05b$ sh loop & bash loop & - [1] 3652 - [2] 3653 -sh-2.05b$ ps -fH - UID PID PPID C STIME TTY TIME CMD - methody 3590 1850 0 13:58 tty3 00:00:00 -bash - methody 3634 3590 87 14:03 tty3 00:14:18 sh loop - methody 3651 3590 0 14:19 tty3 00:00:00 sh - methody 3652 3651 34 14:19 tty3 00:00:01 sh loop - methody 3653 3651 35 14:19 tty3 00:00:01 bash loop - methody 3654 3651 0 14:19 tty3 00:00:00 ps -fH ------------------------------------------------------------------ - -Мефодий решил поназапускать процессов, а потом выборочно поубивать -их. Для этого он, вдобавок к уже висящему в фоне `sh loop`, запустил в -качестве активного процесса новый командный интерпретатор, sh (при -этом изменилась _приглашение командной строки_). Из этого `sh` он -запустил в фоне ещё один `sh loop` и новый `bash loop`. Сделал он это -одной командной строкой (при этом команды разделяются символом `&`, -т. е. `И`; выходит так, что запускается и та, и другая команда). В `ps` -он использовал новый ключ -- `-H` («Hierarchy», «иерархия»), который -добавляет в выдачу ps отступы, показывающие отношения -«родитель–потомок» между процессами. - ------------------------------------------------------------------ -sh-2.05b$ kill 3634 - [1]+ Terminated sh loop -sh-2.05b$ ps -fH - UID PID PPID C STIME TTY TIME CMD - methody 3590 1850 0 13:58 tty3 00:00:00 -bash - methody 3651 3590 0 14:19 tty3 00:00:00 sh - methody 3652 3651 34 14:19 tty3 00:01:10 sh loop - methody 3653 3651 34 14:19 tty3 00:01:10 bash loop - methody 3658 3651 0 14:23 tty3 00:00:00 ps -fH ------------------------------------------------------------------ - -Мефодий принялся убивать! Для начала он остановил работу давно -запущенного `sh`, выполнявшего сценарий с вечным циклом (`PID 3634`). Как -видно из предыдущего примера, этот процесс за 16 минут работы системы -съел не менее 14 минут процессорного времени, и конечно, ничего -полезного не сделал. Сигнал о том, что процесс-потомок умер, дошёл до -обработчика в стартовом `bash` (`PID 3590`, и на терминал вывелось -сообщение `[1]+ Terminated sh loop`, после чего стартовый `bash` -продолжил ждать завершения активного процесса -- `sh` (`PID 3651`). - ------------------------------------------------------------------ -sh-2.05b$ exit -[methody@localhost methody]$ ps -fH - UID PID PPID C STIME TTY TIME CMD - methody 3590 1850 0 15:17 tty3 00:00:00 -bash - methody 3663 3590 0 15:23 tty3 00:00:00 ps -fH - methody 3652 1 42 15:22 tty3 00:00:38 bash loop - methody 3653 1 42 15:22 tty3 00:00:40 sh loop -[methody@localhost methody]$ kill -HUP 3652 3653 -[methody@localhost methody]$ ps - PID TTY TIME CMD - 3590 tty3 00:00:00 bash - 3664 tty3 00:00:00 ps ------------------------------------------------------------------ - -Ждать ему оставалось недолго. Этот `sh` завершился естественным путём, -от команды `exit`, оставив после себя двух детей-сирот -(PID `3652` и `3653`), которые тотчас же усыновил «отец всех процессов» --- `init` (PID `1`). Когда кровожадный Мефодий расправился и с ними -- с -помощью сигнала 1 (`HUP`, то есть «Hang UP», «повесить» footnote:[Имя -этого сигнала происходит не от казни через повешение, а от повешенной -телефонной трубки.]) -- некому было даже сообщить об их кончине -(если бы процесс-родитель был жив, на связанный с ним терминал -вывелось бы что-нибудь вроде `[1]+ Hangup sh loop`). - -=== Доступ к файлу и каталогу === - -Довольно насилия. Пора Мефодию задуматься и о другой стороне работы с -Linux: о правах и свободах. Для начала -- о свободах. Таблица процессов -содержит список важнейших объектов системы -- процессов. Однако не менее -важны и объекты другого класса, те, что доступны в _файловой системе_: -файлы, каталоги и специальные файлы (символьные ссылки, устройства и -т. п.). По отношению к объектам файловой системы процессы выступают в -роли действующих субъектов: именно процессы пользуются файлами, -создают, удаляют и изменяют их. Факт использования файла процессом -называется _доступом_ к файлу, а способ воспользоваться файлом -(каталогом, ссылкой и т. д.) -- видом доступа. - -==== Чтение, запись и использование ==== - -Видов доступа в файловой системе Linux три. Доступ на _чтение_ (read) -разрешает получать информацию из объекта, доступ на запись (write) -- -изменять информацию в объекте, а доступ на использование (execute) -- -выполнить операцию, специфичную для данного типа объектов. Доступ к -объекту можно изменить командой `chmod` (change mode, сменить режим -(доступа)). В простых случаях формат этой команды таков: `chmod` доступ -объект, где объект -- это имя файла, каталога и т. п., а доступ -описывает вид доступа, который необходимо разрешить или запретить. -Значение `+r` разрешает доступ к объекту на чтение (read), `-r` -- -запрещает. Аналогично `+w`, `-w`, `+x` и `-x` разрешают и запрещают -доступ на запись (write) и использование (execute). - -==== Доступ к файлу ==== - -Доступ к файлу на чтение и запись -- довольно очевидные понятия: - ------------------------------------------------------------------ -[methody@localhost methody]$ date > tmpfile -[methody@localhost methody]$ cat tmpfile - Срд Сен 22 14:52:03 MSD 2004 -[methody@localhost methody]$ chmod -r tmpfile -[methody@localhost methody]$ cat tmpfile - cat: tmpfile: Permission denied -[methody@localhost methody]$ date -u > tmpfile -[methody@localhost methody]$ chmod +r tmpfile; chmod -w tmpfile -[methody@localhost methody]$ cal > tmpfile - -bash: tmpfile: Permission denied -[methody@localhost methody]$ cat tmpfile - Срд Сен 22 10:52:35 UTC 2004 -[methody@localhost methody]$ rm tmpfile - rm: удалить защищённый от записи обычный файл `tmpfile'? y ------------------------------------------------------------------ - -Следует заметить, что Мефодию известна операция _перенаправления -вывода_ -- `>`, с помощью которой он создаёт файлы в своём домашнем -каталоге. Добавление `> файл` в командную строку приводит к тому, -что всё, что вывелось бы на экран терминала footnote:[Точнее, на -_стандартный вывод_ программы, такое перенаправление -не касается _стандартного вывода ошибок_.], попадает в файл. -Мефодий создаёт файл, проверяет, можно ли из него читать, командой -`cat`, запрещает доступ на чтение и снова проверяет: на этот раз `cat` -сообщает об отказе в доступе (`Permission denied`). Тем не менее -записать в этот файл, перенаправив выдачу `date -u` оказывается -возможным, потому что доступ на запись не закрыт. Если же закрыть -доступ на запись, а доступ на чтение открыть (Мефодий сделал это в -одной командной строке, разделив команды символом `;`), невозможным -станет изменение этого файла: попытка перенаправить вывод программы -`cal` будет не успешной, а чтение снова заработает. Сработает и удаление -этого файла, хотя `rm`, на всякий случай, предупредит о том, что файл -защищён от записи. - -Доступ к файлу на использование означает возможность запустить этот -файл в качестве программы, выполнить его. Например, все файлы из -каталога `/bin` (в том числе `/bin/ls`, `/bin/rm`, `/bin/cat`, `/bin/echo` и -`/bin/date`) -- исполняемые, т. е. доступны на использование, и оттого -их можно применять в командной строке в качестве команд. В общем -случае необходимо указать путь к программе, например, `/bin/ls`, однако -программы, находящиеся в каталогах, перечисленных в _переменной -окружения_ `PATH`, можно вызывать просто по имени: `ls` (подробнее о -переменных окружения рассказано в лекции -<>). - -==== Сценарий ==== - -Исполняемые файлы в Linux бывают ровно двух видов. Первый -- это файлы -в собственно исполняемом (executable) формате. Как правило, такие -файлы -- результат компиляции программ, написанных на классических -языках программирования, вроде Си. Попытка прочитать такой файл с -помощью, например, `cat` не приведёт ни к чему полезному: на экран -полезут разнообразные бессмысленные символы, в том числе -- управляющие. -Это -- так называемые машинные коды -- язык, понятный только компьютеру. -В Linux используется несколько форматов исполняемых файлов, состоящих из -машинных кодов и служебной информации, необходимой операционной системе -для запуска программы: согласно этой информации, ядро Linux выделяет -для запускаемой программы оперативную память, загружает программу из -файла и передаёт ей управление. Большинство утилит Linux -- программы -именно такого, «двоичного» формата. - -Второй вид исполняемых файлов -- _сценарии_. Сценарий -- это текстовый -файл, предназначенный для обработки какой-нибудь утилитой. Чаще всего -такая утилита -- это интерпретатор некоторого языка программирования, -а содержимое такого файла -- программа на этом языке. Мефодий уже -написал один сценарий для `sh`: бесконечно выполняющуюся программу `loop`. -Поскольку к тому времени он ещё не знал, как пользоваться `chmod`, ему -всякий раз приходилось явно указывать интерпретатор (`sh` или `bash`), -а сценарий передавать ему в виде параметра (см. примеры -в разделе <>). - -========================================================== -Сценарий:: - исполняемый текстовый файл. Для выполнения сценария требуется - программа-интерпретатор, путь к которой может быть указан в начале - сценария в виде `#!путь_к_интерпретатору`. Если интерпретатор - не задан, им считается `/bin/sh`. -========================================================== - -Если же сделать файл исполняемым, то ту же самую процедуру -- запуск -интерпретатора и передачу ему сценария в качестве параметра командной -строки -- будет выполнять система: - ------------------------------------------------------ -[methody@localhost methody]$ cat > script - echo 'Hello, Methody!' -^D -[methody@localhost methody]$ ./script - -bash: ./script: Permission denied -[methody@localhost methody]$ sh script - Hello, Methody! -[methody@localhost methody]$ chmod +x script -[methody@localhost methody]$ ./script - Hello, Methody! ------------------------------------------------------ - -С первого раза Мефодию не удалось запустить сценарий `script`, потому -что по умолчанию файл создаётся доступным на запись и чтение, но не на -использование. После `chmod +x` файл стал исполняемым. Поскольку домашний -каталог Мефодия не входил в `PATH`, пришлось использовать путь до -созданного сценария, благо путь оказался недлинным: -`текущий_каталог/имя_сценария`, т. е. `./script`. - -Если системе не намекнуть специально, в качестве интерпретатора она -запускает стандартный shell `/bin/sh`. Однако есть возможность -написать сценарий для любой утилиты, в том числе и написанной -самостоятельно. Для этого первыми двумя байтами сценария должны -быть символы `#!`, тогда всю его первую строку, начиная с третьего -байта, система воспримет как команду обработки. Исполнение такого -сценария приведёт к запуску указанной после `#!` команды, последним -параметром которой добавится имя самого файла сценария. - ------------------------------------------------------ -[methody@localhost methody]$ cat > to.sort - #!/bin/sort - some - unsorted - lines -[methody@localhost methody]$ sort to.sort - #!/bin/sort - lines - some - unsorted -[methody@localhost methody]$ chmod +x to.sort -[methody@localhost methody]$ ./to.sort - #!/bin/sort - lines - some - unsorted ------------------------------------------------------ - -Утилита `sort` сортирует -- расставляет их в алфавитном, обратном -алфавитном или другом порядке -- строки передаваемого ей файла. -Совершенно то же самое произойдёт, если сделать этот файл исполняемым, -вписав в начало `/bin/sort` в качестве интерпретатора, а затем выполнить -получившийся сценарий: запустится утилита `sort`, а сценарий (файл с -не отсортированными строками) передастся ей в качестве параметра. -Оформлять файлы, которые необходимо отсортировать, в виде sort-сценариев -довольно бессмысленно, просто Мефодий хотел ещё раз убедиться, что -сценарий можно написать для чего угодно. - -==== Доступ к каталогу ==== - -В отличие от файла, новый каталог создаётся (с помощью `mkdir`) -доступным и на чтение, и не запись, и на использование. Суть всех -трёх видов доступа к каталогу менее очевидна, чем суть доступа к файлу. -Вкратце она такова: доступ по чтению -- это возможность просмотреть -содержимое каталога (список файлов), доступ по записи -- это возможность -изменить содержимое каталога, а доступ на использование -- возможность -воспользоваться этим содержимым: во-первых, сделать этот каталог -текущим, а во-вторых, обратиться за доступом к содержащемуся в нём файлу. - ------------------------------------------------------ -[methody@localhost methody]$ mkdir dir -[methody@localhost methody]$ date > dir/smallfile -[methody@localhost methody]$ /bin/ls dir - smallfile -[methody@localhost methody]$ cd dir -[methody@localhost dir]$ pwd - /home/methody/dir -[methody@localhost dir]$ cd -[methody@localhost methody]$ pwd - /home/methody -[methody@localhost methody]$ cat dir/smallfile - Срд Сен 22 13:15:20 MSD 2004 ------------------------------------------------------ - -Мефодий создал каталог `dir` и файл в `smallfile` в нём. При смене -текущего каталога `bash` автоматически изменил строку-подсказку: -как было сказано в лекции <>, -последнее слово этой подсказки -- имя текущего каталога. Описанная -в той же лекции команда `pwd` (print work directory) подтверждает это. -Команда `cd` без параметров, как ей это и полагается, делает текущим -_домашний каталог_ пользователя. - ------------------------------------------------------ -[methody@localhost methody]$ chmod -x dir -[methody@localhost methody]$ ls dir - ls: dir/smallfile: Permission denied -[methody@localhost methody]$ alias ls - alias ls='ls --color=auto' -[methody@localhost methody]$ /bin/ls dir - smallfile -[methody@localhost methody]$ cd dir - -bash: cd: dir: Permission denied -[methody@localhost methody]$ cat dir/smallfile - cat: dir/smallfile: Permission denied ------------------------------------------------------ - -Мефодий запретил доступ на использование каталога, ожидая, что -просмотреть его содержимое с помощью `ls` будет можно, а сделать -его текущим и добыть содержимое находящегося в нём файла -- нельзя. -Неожиданно команда `ls` выдала ошибку. Проницательный Мефодий заметил, -что имя файла -- `smallfile`, команда `ls` всё-таки добыла, но ей -зачем-то понадобился и сам файл. Гуревич посоветовал посмотреть, -что выдаст команда `alias ls`. Оказывается, вместо простого ls умный -`bash` подставляет специфичную для Linux команду `ls --color=auto`, -которая раскрашивает имена файлов в разные цвета в зависимости от -их типа. Для того чтобы определить тип файла (например, запускаемый -ли он) необходимо получить к нему доступ, а этого-то и нельзя -сделать, когда нельзя использовать каталог. Если явно вызывать -утилиту `ls` (`/bin/ls`), поведение каталога становится вполне -предсказуемым. Подробнее о том, чем занимается команда `alias` (о -_сокращениях_), рассказывается в лекции -<>. - ------------------------------------------------------ -[methody@localhost methody]$ chmod +x dir; chmod -r dir -[methody@localhost methody]$ /bin/ls dir - /bin/ls: dir: Permission denied -[methody@localhost methody]$ cat dir/smallfile - Срд Сен 22 13:15:20 MSD 2004 -[methody@localhost methody]$ cd dir -[methody@localhost dir]$ /bin/ls - ls: .: Permission denied -[methody@localhost dir]$ cd -[methody@localhost methody]$ ------------------------------------------------------ - -Если каталог, доступный на чтение, но недоступный на использование, -мало когда нужен, то каталог, доступный на использование, но не на -чтение, может пригодиться. Как видно из примера, получить список -файлов, находящихся в таком каталоге, не удастся, но получить доступ -к самим файлам, зная из имена -- можно. Мефодий тут же захотел положить -в созданный каталог какой-нибудь нужный, но очень секретный файл, -чтобы имя этого файла никто, кроме близких друзей не знал. Поразмыслив, -Мефодий отказался от этой затеи: во-первых, не без оснований -подозревая, что администратор (суперпользователь) всё равно сможет -просмотреть содержимое такого каталога, а во-вторых, потому что нужного, -но очень секретного файла под рукой не оказалось. - ------------------------------------------------------ -[methody@localhost methody]$ rm -rf dir - rm: невозможно открыть каталог `dir': Permission denied -[methody@localhost methody]$ chmod -R +rwx dir -[methody@localhost methody]$ rm -rf dir ------------------------------------------------------ - -Потеряв интерес к секретным файлам, Мефодий решил удалить каталог -`dir`. Из лекции <> он знает, что это можно -сделать не с помощью `rmdir`, а с помощью `rm` с ключом `-r` (recursive). -Но сходу воспользоваться `rm` не удалось: чтение-то из каталога -невозможно, и потому неизвестно, какие файлы там надо удалять. -Поэтому сначала надо разрешить все виды доступа к `dir`. На всякий -случай (а вдруг внутри `dir` попадётся такой же не читаемый подкаталог?) -Мефодий выполняет рекурсивный вариант `chmod` -- с ключом `-R` («R» -здесь большое, а не маленькое, потому что `-r` уже занято: означает -запрет чтения). Команда `chmod -R +rwx dir` делает все файлы и -каталоги в `dir` доступными на чтение, запись и использование; -при этом все файлы становятся исполняемыми, но кого это тревожит, -если следующей командой будет `rm`? - -[[rights]] -== Права доступа == - -Работая с Linux, Мефодий заметил, что некоторые файлы и каталоги -недоступны ему ни на чтение, ни на запись, ни на использование. -Зачем такие нужны? Оказывается, другие пользователи могут обращаться -к этим файлам, а у Мефодия просто не хватает прав. - -=== Идентификатор пользователя === - -Говоря о правах доступа пользователя к файлам, стоит заметить, что в -действительности манипулирует файлами не сам пользователь, а -запущенный им процесс (например, утилита `rm` или `cat`). Поскольку и -файл, и процесс создаются и управляются системой, ей нетрудно -организовать какую угодно политику доступа одних к другим, -основываясь на любых свойствах процессов как субъектов и файлов как -объектов системы. - -В Linux, однако, используются не какие угодно свойства, а результат -_идентификации_ пользователя -- его `UID`. Каждый процесс системы -обязательно принадлежит какому-нибудь пользователю, и _идентификатор -пользователя_ (`UID`) -- обязательное свойство любого процесса Linux. -Когда программа `login` запускает _стартовый командный интерпретатор_, -она приписывает ему `UID`, полученный в результате диалога. Обычный -запуск программы (exec()) или порождение нового процесса (`fork()`) не -изменяют `UID` процесса, поэтому все процессы, запущенные пользователем -во время терминальной сессии, будут иметь его идентификатор. - -Поскольку `UID` однозначно определяется _входным именем_, оно нередко -используется вместо идентификатора -- для наглядности. Например, -вместо выражения «идентификатор пользователя, соответствующий -входному имени methody», говорят `UID methody` (в примере ниже этот -идентификатор равен `503`), - ----------------------------------------------------------------- -[methody@localhost methody]$ id - uid=503(methody) gid=503(methody) группы=503(methody) -[methody@localhost methody]$ id shogun - uid=400(shogun) gid=400(shogun) группы=400(shogun),4(adm),10(wheel),19(proc) ----------------------------------------------------------------- - -Утилита `id`, которой воспользовался Мефодий, выводит _входное имя_ -пользователя и соответствующий ему `UID`, а также _группу по умолчанию_ и -полный список _групп_, членом которых он является. - -=== Идентификатор группы === - -Как было рассказано в лекции <>, -пользователь может -быть членом нескольких групп, равно как и несколько пользователей -может быть членами одной и той же _группы_. Исторически сложилось так, -что одна из групп -- _группа по умолчанию_ -- является для пользователя -основной: когда (не вполне точно) говорят о «GID пользователя», имеют -в виду именно идентификатор группы по умолчанию. В лекции <> будет рассказано, что GID пользователя вписан -в _учётную запись_ и хранится в `/etc/passwd`, а информация о -соответствии имён групп их идентификаторам, равно как и о том, в -какие ещё группы входит пользователь -- в файле `/etc/group`. Из этого -следует, что пользователь не может не быть членом как минимум одной -группы, как снаряд не может не попасть в эпицентр взрыва -footnote:[Здесь есть тонкость. В файле group указываются не -идентификаторы, а _входные имена_ пользователей. Формально говоря, -можно создать двух пользователей с одинаковым `UID`, но разными `GID` и -списками групп. Обычно так не делают: надобности -- почти никакой, а -неразберихи возникнет много.]. - -Часто процедуру создания пользователя проектируют так, что имя группы -по умолчанию совпадает с _входным именем_ пользователя, а `GID` -пользователя -- с его `UID`. Однако это совсем не обязательно: не всегда -нужно заводить для пользователя отдельную группу, а если заводить, то -не всегда удаётся сделать так,чтобы желаемый идентификатор группы -совпадал с желаемым идентификатором пользователя. - -==== Ярлыки объектов файловой системы ==== - -При создании объектов файловой системы -- файлов, каталогов и т. п. --- каждому в обязательном порядке приписывается _ярлык_. Ярлык включает -в себя `UID` -- идентификатор пользователя-хозяина файла, `GID` -- -идентификатор группы, которой принадлежит файл, тип объекта и набор -т. н. _атрибутов_, а также некоторую дополнительную информацию. -_Атрибуты_ определяют, кто и что с файлом имеет право делать, и описаны -ниже. - --------------------------------------------------------------- -[methody@arnor methody]$ ls -l - итого 24 - drwx------ 2 methody methody 4096 Сен 12 13:58 Documents - drwxr-xr-x 2 methody methody 4096 Окт 31 15:21 examples - -rw-r--r-- 1 methody methody 26 Сен 22 15:21 loop - -rwxr-xr-x 1 methody methody 23 Сен 27 13:27 script - drwx------ 2 methody methody 4096 Окт 1 15:07 tmp - -rwxr-xr-x 1 methody methody 32 Сен 22 13:26 to.sort --------------------------------------------------------------- - -Ключ `-l` утилиты `ls` определяет «длинный» (long) формат выдачи -(справа налево): имя файла, время последнего изменения файла, размер -в байтах, группа, хозяин, количество _жёстких ссылок_ и строчка -_атрибутов_. Первый символ в строчке атрибутов определяет тип файла. -Тип `-` отвечает «обычному» файлу, а тип `d` -- каталогу (directory). -Имя пользователя и имя группы, которым принадлежит содержимое -домашнего каталога Мефодия, -- естественно, `methody`. - -Быстрый разумом Мефодий немедленно заинтересовался вот чем: несмотря -на то, что создание жёстких ссылок на каталог невозможно, поле -«количество жёстких ссылок» для всех каталогов примера равно двум, а -не одному. На самом деле этого и следовало ожидать, потому что любой -каталог файловой системы Linux всегда имеет не менее двух имён: -собственное (например, `tmp`) и имя «.» в самом этом каталоге (`tmp/.`). -Если же в каталоге создать подкаталог, количество жёстких ссылок на -этот каталог увеличится на 1 за счёт имени `..` в подкаталоге -(например, `tmp/subdir1/..`): - --------------------------------------------------------------- -[methody@arnor methody]$ ls -ld tmp - drwx------ 3 methody methody 4096 Окт 1 15:07 tmp -[methody@arnor methody]$ mkdir tmp/subdir2 -[methody@arnor methody]$ ls -ld tmp - drwx------ 4 methody methody 4096 Окт 1 15:07 tmp -[methody@arnor methody]$ rmdir tmp/subdir* -[methody@arnor methody]$ ls -ld tmp - drwx------ 2 methody methody 4096 Окт 1 15:07 tmp --------------------------------------------------------------- - -Здесь Мефодий использовал ключ `-d` (directory) для того, чтобы `ls` -выводил информацию не о содержимом каталога `tmp`, а о самом этом -каталоге. - -Пример от рута есть смысл приводить только в том случае, если пример -на что-то совершенно универсальное, что обязательно будет устроено -точно так же в любом Линуксе. Иначе есть опасность, что пользователь -начнёт мудрить -- и что он там намудрит... В Linux определено -несколько _системных групп_, задача которых -- обеспечивать доступ -членов этих групп к разнообразным ресурсам системы. Часто такие -группы носят говорящие названия: `disk`, `audio`, `cdwriter` и т. п. -Тогда обычным пользователям доступ к некоторому файлу, каталогу или -файлу-дырке Linux закрыт, но открыт членам группы, которой этот -объект принадлежит. - -Например, в Linux почти всегда используется _виртуальная файловая -система_ `/proc` -- каталог, в котором в виде подкаталогов и файлов -представлена информация из _таблицы процессов_. Имя подкаталога `/proc` -совпадает с PID соответствующего процесса, а содержимое этого -подкаталога отражает свойства процесса. Хозяином такого подкаталога -будет хозяин процесса (с правами на чтение и использование), поэтому -любой пользователь сможет посмотреть информацию о своих процессах. -Именно каталогом `/proc` пользуется утилита `ps`: - --------------------------------------------------------------- -[methody@arnor methody]$ ls -l /proc - . . . - dr-xr-x--- 3 methody proc 0 Сен 22 18:17 4529 - dr-xr-x--- 3 shogun proc 0 Сен 22 18:17 4558 - dr-xr-x--- 3 methody proc 0 Сен 22 18:17 4589 - . . . -[methody@localhost methody]$ ps -af - UID PID PPID C STIME TTY TIME CMD - methody 4529 4523 0 13:41 tty1 00:00:00 -bash - methody 4590 4529 0 13:42 tty1 00:00:00 ps -af --------------------------------------------------------------- - -Оказывается, запущено немало процессов, в том числе один -- -пользователем `shogun` (`PID 4558`). Однако, несмотря на ключ `-a` -(`all`), ps выдала Мефодию только сведения о его процессах: `4529` -- это -входной shell, а `4589` -- видимо, сам `ls`. - -Другое дело -- Гуревич. Он, как видно из примера `$ID`, входит в -группу proc, членам которой разрешено читать и использовать каждый -подкаталог `/proc`. - ------------------------------------------------------------- -shogun@localhost ~ $ ps -af - UID PID PPID C STIME TTY TIME CMD - methody 4529 4523 0 13:41 tty1 00:00:00 -bash - shogun 4558 1828 0 13:41 tty3 00:00:00 -zsh - shogun 4598 4558 0 13:41 tty3 00:00:00 ps -af ------------------------------------------------------------- - -Гуревич, опытный пользователь Linux, предпочитает `bash`-у «The Z -Shell», `zsh`. Отсюда и различие приглашения в командной строке. Во -всех shell-ах, кроме самых старых, символ `~` означает домашний -каталог. Этим сокращением удобно пользоваться, если текущий каталог --- не домашний, а оттуда (или туда) нужно скопировать файл. -Получается команда наподобие `cp ~/нужный_файл .` или `cp -нужный_файл ~` соответственно. - -Команда `ps -a` выводит информацию обо всех процессах, запущенных -«живыми» (а не системными) пользователями footnote:[Более точно -- обо -всех процессах, имеющих право выводить на какой-нибудь терминал, а -значит, запущенными из терминального сеанса.]. Для просмотра всех -процессов Гуревич пользуется командой `ps -efH`. - -==== Разделяемые каталоги ==== - -Проанализировав систему прав доступа к каталогам в Linux, Мефодий -пришёл к выводу, что в ней имеется существенный недочёт. Тот, кто -имеет право изменять каталог, может удалить любой файл оттуда, даже -такой, к которому совершенно не имеет доступа. Формально всё -правильно: удаление файла из каталога -- всего лишь изменение -содержимого каталога. Если у файла было больше одного имени -(существовало несколько жёстких ссылок на этот файл), никакого -удаления данных не произойдёт, а если ссылка была последней -- файл в -самом деле удалится. Вот это-то, по мнению Мефодия, и плохо. - -Чтобы доказать новичку, что право на удаление любых файлов полезно, -кто-то создал прямо в домашнем каталоге Мефодия файл, совершенно ему -недоступный, да к тому же с подозрительным именем, содержащим пробел: - ------------------------------------------------------------- -[methody@localhost methody]$ ls - 4TO-TO Mep3koe Documents examples loop script tmp to.sort -[methody@localhost methody]$ ls -l 4* - -rw------- 1 root root 0 Сен 22 22:20 4TO-TO Mep3koe -[methody@localhost methody]$ rm -i 4* - rm: удалить защищённый от записи пустой обычный файл `4TO-TO Mep3koe'? y ------------------------------------------------------------- - -Подозревая, что от хулиганов всего можно ожидать, Мефодий не решился -набрать имя удаляемого файла с клавиатуры, а воспользовался шаблоном -и ключом `-i` (interactive) команды `rm`, чтобы та ожидала -подтверждения перед тем, как удалять очередной файл. Несмотря на -отсутствие доступа к самому файлу, удалить его оказалось возможно. - ------------------------------------------------------------- -[methody@localhost methody]$ ls -dl /tmp - drwxrwxrwt 4 root root 1024 Сен 22 22:30 /tmp -[methody@localhost methody]$ ls -l /tmp - итого 4 - -rw-r--r-- 1 root root 13 Сен 22 17:49 read.all - -rw-r----- 1 root methody 23 Сен 22 17:49 read.methody - -rw------- 1 methody root 25 Сен 22 22:30 read.Methody - -rw-r----- 1 root wheel 21 Сен 22 17:49 read.wheel -[methody@localhost methody]$ rm -f /tmp/read.* - rm: невозможно удалить `/tmp/read.all': Operation not permitted - rm: невозможно удалить `/tmp/read.methody': Operation not permitted - rm: невозможно удалить `/tmp/read.wheel': Operation not permitted -[methody@localhost methody]$ ls /tmp - read.all read.methody read.wheel ------------------------------------------------------------- - -Убедившись, что любой доступ в каталог `/tmp` открыт всем, Мефодий -захотел удалить оттуда все файлы. Затея гораздо более хулиганская, -чем заведение файла: а вдруг они кому-нибудь нужны? Удивительно, но -удалить удалось только файл, принадлежащий самому Мефодию... - -Дело в том, что Мефодий проглядел особенность атрибутов каталога -`/tmp:` вместо «`x»` в тройке «для посторонних» `ls` выдал `t`. Это ещё -один атрибут каталога, наличие которого как раз и запрещает -пользователю удалять оттуда файлы, которым он не хозяин. Таким образом, -права записи в каталог с ярлыком `drwxrwxrwt группа хозяин` и для -членов группы группа, и для посторонних ограничены их собственными -файлами, и только хозяин имеет право изменять список файлов в каталоге, -как ему вздумается. Такие каталоги называются _разделяемыми_, потому что -предназначены они, как правило, для совместной работы всех пользователей -в системе, обмена информацией и т. п. - -При установке атрибута `t` доступ на использование для посторонних -(`t` в строчке атрибутов стоит на месте последнего `x`) не -отменяется. Просто они так редко используются друг без друга, что `ls` -выводит их в одном и том же месте. Если кому-нибудь придёт в голову -организовать разделяемый каталог без доступа посторонним на -использование, `ls` выведет на месте девятого атрибута не `t`, а `T`. - -------------------------------------------------------- -[methody@localhost methody]$ ls -l loop - -rw-r--r-- 1 root root 26 Сен 22 22:10 loop -[methody@localhost methody]$ chown methody loop - chown: изменение владельца `loop': Operation not permitted -[methody@localhost methody]$ cp loop loopt -[methody@localhost methody]$ ls -l loop* - -rw-r--r-- 1 root root 26 Сен 22 22:10 loop - -rw-r--r-- 1 methody methody 26 Сен 22 22:15 loopt -[methody@localhost methody]$ mv -f loopt loop -[methody@localhost methody]$ ls -l loop* - -rw-r--r-- 1 methody methody 26 Сен 22 22:15 loop -------------------------------------------------------- - -Оказывается, мелкие пакости продолжаются. Кто-то сменил файлу `loop` -хозяина, так что теперь Мефодий может только читать его, но не -изменять. Удалить этот файл -- проще простого, но хочется «вернуть -всё как было»: чтобы получился файл с тем же именем и тем же -содержанием, принадлежащий Мефодию, а не root-у. Это несложно: чужой -файл можно переименовать (это действие над каталогом, а не над -файлом), скопировать переименованный файл в файл с именем старого -(доступ по чтению открыт) и, наконец, удалить чужой файл с глаз -долой. Ключ `-f` (force, «силком») позволяет утилите `mv` делать своё -дело, не спрашивая подтверждений. В частности, увидев, что файл с -именем, в которое необходимо переименовывать, существует, даже чужой, -даже недоступный на запись, mv преспокойно удалит его и выполнит -операцию переименования. - -=== Суперпользователь === - -Мефодий изрядно возмутился, узнав, что кто-то может проделывать над -ним всякие штуки, которые сам Мефодий ни над кем проделывать не может. -Обоснованное подозрение пало на Гуревича, единственного администратора -этой системы, обладающего правами _суперпользователя_. - -============================================================ -Суперпользователь:: - единственный пользователь в Linux, на которого не распространяются - ограничения _прав доступа_. Имеет нулевой _идентификатор - пользователя_. -============================================================ - -_Суперпользователь_ в Linux -- это выделенный пользователь системы, на -которого не распространяются ограничения прав доступа. `UID` -суперпользовательских процессов равен 0: так система отличает их от -процессов других пользователей. Именно суперпользователь имеет -возможность произвольно изменять владельца и группу файла. Ему открыт -доступ на чтение и запись к любому файлу системы и доступ на чтение, -запись и использование к любому каталогу. Наконец, суперпользовательский -процесс может на время сменить свой собственный `UID` с нулевого на любой -другой. Именно так и поступает программа `login`, когда, проведя -процедуру идентификации пользователя, запускает _стартовый командный -интерпретатор_. - -Среди учётных записей Linux всегда есть запись по имени `root` («корень» -footnote:[Вместо полного имени такому пользователю часто пишут «root -of all evil».]), соответствующая нулевому идентификатору, поэтому -вместо «суперпользователь» часто говорят «root». Множество системных -файлов принадлежат root-у, множество файлов только ему доступны на -чтение или запись. Пароль этой учётной записи -- одна из самых больших -драгоценностей системы. Именно с её помощью системные администраторы -выполняют самую ответственную работу. Свойство `root` иметь доступ ко -всем ресурсам системы накладывает очень высокие требования на человека, -знающего пароль `root`. Суперпользователь может всё -- в том числе и всё -поломать, поэтому любую работу стоит вести с правами обычного -пользователя, а к правам `root` прибегать только по необходимости. - -Существует два различных способа получить права суперпользователя. -Первый -- это зарегистрироваться в системе под этим именем, ввести -пароль и получить стартовую оболочку, имеющую нулевой `UID`. Это -- -самый неправильный способ, пользоваться которым стоит, только если -нельзя применить другие. Что в этом случае выдаст команда `last`? Что -тогда-то с такой-то консоли в систему вошёл неизвестно кто с правами -суперпользователя и что-то там такое делал. С точки зрения системного -администратора, это -- очень подозрительное событие, особенно, если -сам он в это время к указанной консоли не подходил... сами -администраторы такой способ не любят. - -Второй способ -- это воспользоваться специальной утилитой `su` -(shell of user), которая позволяет выполнить одну или несколько -команд от лица другого пользователя. По умолчанию эта утилита -выполняет команду `sh` от лица пользователя `root`, то есть запускает -командный интерпретатор с нулевым `UID`. Отличие от предыдущего -способа -- в том, что всегда известно, кто именно запускал su, а -значит, с кого спрашивать за последствия. В некоторых случаях удобнее -использовать не `su`, а утилиту `sudo`, которая позволяет выполнять -только заранее заданные команды. - -=== Подмена идентификатора === - -Утилиты `su` и `sudo` имеют некоторую странность, объяснить которую -Мефодий пока не в состоянии. Эта же странность распространяется и на -давно известную программу `passwd`, которая позволяет редактировать -собственную _учётную запись_. Запускаемый процесс наследует `UID` от -родительского, поэтому, если этот `UID` -- не нулевой, он не в -состоянии поменять его. Тогда как же `su` запускает для обычного -пользователя суперпользовательский shell? Как `passwd` получает доступ -к хранилищу всех учётных записей? Должен существовать механизм, -позволяющий пользователю запускать процессы с идентификаторами -другого пользователя, причём механизм строго контролируемый, иначе с -его помощью можно натворить немало бед. - -В Linux этот механизм называется _подменой идентификатора_ и устроен -очень просто. Процесс может сменить свой `UID`, если запустит вместо -себя при помощи `exec()` другую программу из файла, имеющего специальный -атрибут `SetUID` footnote:[Строго говоря, при этом меняется не собственно -идентификатор пользователя, а т. н. _исполнительный идентификатор -пользователя, `EUID`_; это нужно для того, чтобы знать, кто на самом -деле запустил программу.]. В этом случае `UID` процесса становится -равным `UID` файла, из которого программа была запущена. - ------------------------------------------------------- -[foreigner@somewhere foreigner]$ ls -l /usr/bin/passwd /bin/su - -rws--x--x 1 root root 19400 Фев 9 2004 /bin/su - -rws--x--x 1 root root 5704 Янв 18 2004 /usr/bin/passwd -[foreigner@somewhere foreigner]$ ls -l /etc/shadow - -r-------- 1 root root 5665 Сен 10 02:08 /etc/shadow ------------------------------------------------------- - -Как и в случае с t-атрибутом, `ls` выводит букву `s` вместо буквы `x` в -тройке «для хозяина». Точно так же, если соответствующего x-атрибута -нет (что бывает редко), `ls` выведет `S` вместо `s`. Во многих -дистрибутивах Linux и `/bin/su`, и `/usr/bin/passwd` имеют установленный -SetUID и принадлежат пользователю `root`, что и позволяет `su` запускать -процессы с правами этого пользователя (а значит, и любого другого), а -`passwd` -- модифицировать файл `/etc/shadow`, содержащий в таких системах -сведения обо всех учётных записях. Как правило, SetUID-ные файлы -доступны обычным пользователям только на выполнение, чтобы не -провоцировать этих обычных пользователей рассматривать содержимое этих -файлов и исследовать их недокументированные возможности. Ведь если -обнаружится способ заставить, допустим, программу passwd выполнить -любую другую программу, то все проблемы с защитой системы от взлома -будут разом решены -- нет защиты, нет и проблемы. - -Однако Мефодий работает с такой системой, где `/usr/bin/passwd` -вообще не имеет атрибута `SetUID`. Зато эта программа принадлежит -группе `shadow` и имеет другой атрибут, `SetGID`, так что при её запуске -процесс получает идентификатор группы `shadow`. Утилита `ls` выводит -SetGID в виде `s` вместо `x` во второй тройке атрибутов («для -группы»). Замечания касательно `s`, `S` и `x` действительны для -`SetGID` так же, как и для `SetUID`. - ----------------------------------------------------------- -[root@localhost root]# ls -l /usr/bin/passwd - -rwx--s--x 1 root shadow 5704 Jan 18 2004 /usr/bin/passwd -[root@localhost root]# ls -al /etc/tcb/methody - total 3 - drwx--s--- 2 methody auth 1024 Sep 22 12:58 . - drwx--x--- 55 root shadow 1024 Sep 22 18:41 .. - -rw-r----- 1 methody auth 81 Sep 22 12:58 shadow - -rw------- 1 methody auth 0 Sep 12 13:58 shadow- - -rw------- 1 methody auth 0 Sep 12 13:58 shadow.lock ----------------------------------------------------------- - -Каталог `/etc/tcb` в этой системе содержит подкаталоги, -соответствующие входным именам всех её пользователей. В каждом -подкаталоге хранится, в числе прочего, собственный файл `shadow` -соответствующего пользователя. Доступ к каталогу `/etc/tcb` на -использование (а следовательно, и ко всем его подкаталогам) имеют, -кроме `root`, только члены группы `shadow`. Доступ на запись к каталогу -`/etc/tcb/methody` и к файлу `/etc/tcb/methody/shadow` имеет только -пользователь `methody`. Значит, чтобы изменить что-либо в этом файле, -процесс обязан иметь `UID methody` и `GID shadow` (или нулевой `UID`, -конечно). Именно такой процесс запускается из `/usr/bin/passwd:` он -наследует `UID` у командного интерпретатора и получает `GID` shadow из-за -атрибута `SetGID`. Выходит, что даже найдя в программе `passwd` ошибки и -заставив её делать что угодно, злоумышленник всего только и сможет, -что... отредактировать собственную учётную запись! - -Оказывается, атрибут `SetGID` можно присваивать каталогам. В -последнем примере каталог `/etc/tcb/method`y имел `SetGID`, поэтому все -создаваемые в нём файлы получают `GID`, равный `GID` самого каталога -- -`auth`. Используется это разнообразными процессами идентификации, -который, не будучи суперпользовательскими, но входя в группу `auth` и -shadow, могут прочесть информацию из файлов -`/etc/tcb/входное_имя/shadow`. - -Вполне очевидно, что подмена идентификатора распространяется на -программы, но не работает для сценариев. В самом деле, при исполнении -сценария процесс запускается не из него, а из -программы-интерпретатора. Файл со сценарием передаётся всего лишь как -параметр командной строки, и подавляющее большинство интерпретаторов -просто не обращают внимания на атрибуты этого файла. Интерпретатор -наследует `UID` у родительского процесса, так что если он и обнаружит -`SetUID` у сценария, поделать он всё равно ничего не сможет. - -==== Восьмеричное представление атрибутов ==== - -Все двенадцать атрибутов можно представить в виде битов двоичного -числа, равных 1, если атрибут установлен, и 0, если нет. Порядок -битов в числе следующий: `sU|sG|t|rU|wU|xU|rG|wG||xG|rO|wO|xO`. где `sU` --- это `SetUID`, `sG` -- это `SetGID`, `t` -- это t-атрибут, после чего -следуют три тройки атрибутов доступа. Этим форматом можно -пользоваться в команде `chmod` вместо конструкции `роли=виды_доступа`, -причём число надо записывать в восьмеричной системе счисления. Так, -атрибуты каталога `/tmp` будут равны `1777`, атрибуты `/bin/su` -- `4711`, -атрибуты `/bin/ls` -- `755` и т. д. - -Тем же побитовым представлением атрибутов регулируются и права доступа -по умолчанию при создании файлов и каталогов. Делается это с помощью -команды `umask`. Единственный параметр `umask` -- восьмеричное число, -задающее атрибуты, которые не надо устанавливать новому файлу или -каталогу. Так, `umask 0` приведёт к тому, что файлы будут создаваться -с атрибутами `rw-rw-rw-`, а каталоги -- `rwxrwxrwx`. Команда `umask -022` убирает из атрибутов по умолчанию права доступа на запись для -всех, кроме хозяина (получается `rw-r--r--` и `rwxr-xr-x` -соответственно), а с `umask 077` новые файлы и каталоги становятся -для них полностью недоступны (`rw-------` и `rwx------`) -footnote:[Параметр команды `umask` должен обязательно начинаться -на `0`, как это принято для восьмеричных чисел в языке Си.]. - -[[text]] -== Работа с текстовыми данными == - -=== Ввод и вывод === - -Любая программа -- это автомат, предназначенный для обработки данных: -получая на вход одну информацию, они в результате работы выдают -некоторую другую. Хотя входящая и/или выходящая информация может быть -и нулевой, т. е. попросту отсутствовать. Те данные, которые -передаются программе для обработки -- это её _ввод_, то, что она выдаёт -в результате работы -- _вывод_. Организация ввода и вывода для каждой -программы -- это задача операционной системы. - -Каждая программа работает с данными определённого типа: текстовыми, -графическими, звуковыми и т. п. Как, наверное, уже стало понятно из -предыдущих лекций, основной интерфейс управления системой в Linux -- -это _терминал_, который предназначен для передачи текстовой информации -от пользователя системе и обратно (см. лекцию -<>). Поскольку ввести с терминала и вывести на терминал можно -только текстовую информацию, то ввод и вывод программ, связанных с -терминалом footnote:[Т. е. в первую очередь командной оболочки и её -процессов-потомков, см. лекцию <>], тоже должен быть текстовым. Однако необходимость -оперировать с текстовыми данными не ограничивает возможности -управления системой, а, наоборот, расширяет их. Человек может -прочитать вывод любой программы и разобраться, что происходит в -системе, а разные программы оказываются совместимыми между собой, -поскольку используют один и тот же вид представления данных -- -текстовый. Возможностям, которые даёт Linux при работе с данными в -текстовой форме, и посвящена данная лекция. - -«Текстовость» данных -- всего лишь договорённость об их формате. -Никто не мешает выводить на экран не текстовый файл, однако пользы в -том будет мало. Во-первых, раз уж файл содержит не текст, то не -предполагается, что человек сможет что-либо понять из его -содержимого. Во-вторых, если в не текстовых данных, выводимых на -терминал, случайно встретится _управляющая последовательность_, -терминал её выполнит. Например, если в скомпилированной программе -записано число `1528515121`, оно представлено в виде четырёх байтов: -27, 91, 49 и 74. Соответствующий им текст состоит из четырёх символов -ASCII: `ESC`, `[`, `1` и `J`, и при выводе файла на виртуальную -консоль Linux в этом месте выполнится очистка экрана, так как -`^[[1J` -- именно такая управляющая последовательность для -виртуальной консоли. Не все управляющие последовательности столь -безобидны, поэтому использовать не текстовые данные в качестве текстов -не рекомендуется. - -Что же делать, если содержимое не текстового файла всё-таки желательно -просмотреть (то есть превратить в текст)? Можно воспользоваться -программой hexdump, которая выдаёт содержимое файла в виде -шестнадцатеричных ASCII-кодов, или `strings`, которая показывает только -те части файла, что могут быть представлены в виде текста: - ------------------------------------------------- -[methody@localhost methody]$ hexdump -C /bin/cat | less - 00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| - 00000010 02 00 03 00 01 00 00 00 90 8b 04 08 34 00 00 00 |............4...| - 00000020 e0 3a 00 00 00 00 00 00 34 00 20 00 07 00 28 00 |Ю:......4. ...(.| - . . . - 00000100 00 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 |................| - 00000110 04 00 00 00 2f 6c 69 62 2f 6c 64 2d 6c 69 6e 75 |..../lib/ld-linu| - 00000120 78 2e 73 6f 2e 32 00 00 04 00 00 00 10 00 00 00 |x.so.2..........| - 00000130 01 00 00 00 47 4e 55 00 00 00 00 00 02 00 00 00 |....GNU.........| - . . . -[methody@localhost methody]$ strings /bin/cat | less - /lib/ld-linux.so.2 - _Jv_RegisterClasses - __gmon_start__ - libc.so.6 - stdout - . . . -[methody@localhost methody]$ strings -n3 /bin/cat | less - /lib/ld-linux.so.2 - GNU - _Jv_RegisterClasses - __gmon_start__ - libc.so.6 - stdout - . . . ------------------------------------------------- - -В примере Мефодий, зная заранее, что текста будет выдано много, -воспользовался _конвейером_ `| less`, описанным в разделе <>. С ключом `-C` утилита hexdump выводит в правой стороне -экрана текстовое представление данных, заменяя непечатные символы -точками (чтобы среди выводимого текста не встретилось управляющей -последовательности). Мефодий заметил, что `strings` «не нашла» в -файле `/bin/cat` явно текстовых подстрок `ELF` и `GNU`: первая из -них -- вообще не текст (перед ней стоит непечатный символ с кодом `7f`, -а после -- символ с кодом `1`), а вторая -- слишком короткая, хоть и -ограничена символами с кодом 0, как это и полагается строке в -скомпилированной программе. Наименьшая длина строки передаётся -`strings` ключом `-n`. - -=== Перенаправление ввода и вывода === - -Для того чтобы записать данные в файл или прочитать их оттуда, процессу -необходимо сначала открыть этот файл (при открытии на запись, возможно, -придётся предварительно создать его). При этом процесс получает -_дескриптор_ (описатель) открытого файла -- уникальное для этого -процесса число, которое он и будет использовать во всех операциях -записи. Первый открытый файл получит дескриптор 0, второй -- 1 и -так далее. Закончив работу с файлом, процесс закрывает его, при -этом дескриптор освобождается и может быть использован повторно. -Если процесс завершается, не закрыв файлы, за него это делает -система. Строго говоря, только в операции открытия дескриптора -указывается, какой именно файл будет использоваться. В качестве -«файла» используются и обычные файлы, и файлы-дырки -(чаще всего -- терминалы), и каналы, описанные в разделе -<>. Дальнейшие операции -- чтение, запись -и закрытие, работают с дескриптором, как с потоком данных, а -куда именно ведёт этот поток, неважно. - -Каждый процесс Linux получает при старте три «файла», открытых для -него системой. Первый из них (дескриптор 0) открыт на чтение, это -_стандартный ввод_ процесса. Именно со стандартным вводом работают -все операции чтения, если в них не указан дескриптор файла. Второй -(дескриптор 1) -- открыт на запись, это _стандартный вывод_ процесса. -С ним работают все операции записи, если дескриптор файла не указан -в них явно. Наконец, третий поток данных (дескриптор 2) предназначается -для вывода диагностических сообщений, он называется _стандартный вывод -ошибок_. Поскольку эти три дескриптора уже открыты к моменту запуска -процесса, первый файл, открытый самим процессом, будет, скорее всего, -иметь дескриптор 3. - -=================================================== -Дескриптор:: - описатель потока данных, открытого процессом. Дескрипторы нумеруются - начиная с `0`. При открытии нового потока данных его дескриптор - получает наименьший из неиспользуемых в этот момент номеров. - Три заранее открытых дескриптора: _стандартный ввод_ (`0`), - _стандартный вывод_ (`1`) и _стандартный вывод ошибок_ (`2`) процессу - выдаются при запуске. -=================================================== - -Механизм копирования _окружения_, описанный в лекции <>, подразумевает, в числе прочего, -копирование всех открытых дескрипторов родительского процесса -дочернему. В результате, и родительский, и дочерний процесс имеют -под одинаковыми дескрипторами одни и те же потоки данных. Когда -запускается _стартовый командный интерпретатор_, все три заранее -открытых дескриптора связаны у него с терминалом (точнее, с -соответствующим файлом-дыркой типа tty): пользователь вводит -команды с клавиатуры и видит сообщения на экране. Следовательно, -любая команда, запускаемая из командной оболочки, будет выводить -на тот же терминал, а любая команда, запущенная интерактивно (не в -фоне) -- вводить оттуда. - -==== Стандартный вывод ==== - -Мефодий уже сталкивался с тем, что некоторые программы умеют выводить -не только на терминал, но и в файл, например, `info` при указании -_параметрического ключа_ `-o` с именем файла выведет текст руководства -в файл, вместо того, чтобы отображать его на мониторе. Даже если -разработчиками программы не предусмотрен такой ключ, Мефодию известен -и другой способ сохранить вывод программы в файле вместо того, чтобы -выводить его на монитор: поставить знак `>` и указать после него -имя файла. Таким образом Мефодий уже создавал короткие текстовые -файлы (сценарии) при помощи утилиты `cat` (см. лекцию <>). - ------------------------------------------------- -[methody@localhost methody]$ cat > textfile - Это файл для примеров. - ^D - [methody@localhost methody]$ ls -l textfile - -rw-r--r-- 1 methody methody 23 Ноя 15 16:06 textfile ------------------------------------------------- - -От использования символа `>` возможности самой утилиты `cat`, -конечно, не расширились. Более того, `cat` в этом примере не получила -от _командной оболочки_ никаких параметров: ни знака `>`, ни -последующего имени файла. В этом случае `cat` работала как обычно, не -зная (и даже не интересуясь!), куда попадут выведенные данные: на -экран монитора, в файл или куда-нибудь ещё. Вместо того, чтобы самой -обеспечивать доставку вывода до конечного адресата (будь то человек -или файл), `cat` отправляет все данные на _стандартный вывод_ -(сокращённо -- `stdout`). - -Подмена стандартного вывода -- задача командной оболочки (shell). В -данном примере shell создаёт пустой файл, имя которого указано после -знака `>`, и дескриптор этого файла передаётся программе `cat` под -номером `1` (_стандартный вывод_). Делается это очень просто. В лекции -<> было рассказано о -том, как запускаются команды из оболочки. В частности, после -выполнения `fork()` появляется два одинаковых процесса, один из -которых -- дочерний -- должен запустить вместо себя команду -(выполнить `exec()`). Так вот, перед этим он закрывает стандартный -вывод (дескриптор `1` освобождается) и открывает файл (с ним -связывается первый свободный дескриптор, т. е. `1`), а запускаемой -команде ничего знать и не надо: её стандартный вывод уже подменён. -Эта операция называется перенаправлением стандартного вывода. В том -случае, если файл уже существует, shell запишет его заново, полностью -уничтожив всё, что в нём содержалось до этого. Поэтому Мефодию, чтобы -продолжить записывать данные в `textfile`, потребуется другая операция --- «>>». - ------------------------------------------------- -[methody@localhost methody]$ cat >> textfile - Пример 1. -^D -[methody@localhost methody]$ cat textfile - Это файл для примеров. - Пример 1. -[methody@localhost methody]$ ------------------------------------------------- - -Мефодий получил именно тот результат, который ему требовался: добавил -в конец уже существующего файла данные со стандартного вывода -очередной команды. - -=================================================== -Стандартный вывод:: - поток данных, открываемый системой для каждого процесса в момент - его запуска, и предназначенный для данных, выводимых процессом. -=================================================== - -=== Стандартный ввод === - -Аналогичным образом для передачи данных на вход программе может быть -использован _стандартный ввод_ (сокращённо -- `stdin`). При работе с -командной строкой стандартный ввод -- это символы, вводимые -пользователем с клавиатуры. Стандартный ввод можно перенаправить при -помощи командной оболочки, подав на него данные из некоторого файла. -Символ `<` служит для перенаправления содержимого файла на -стандартный ввод программе. Например, если вызвать утилиту `sort` без -параметра, она будет читать строки со стандартного ввода. Команда -`sort < имя_файла` подаст на ввод `sort` данные из файла. - ------------------------------------------------- -[methody@localhost methody]$ sort < textfile - Пример 1. - Это файл для примеров. -[methody@localhost methody]$ ------------------------------------------------- - -Результат действия этой команды совершенно аналогичен команде `sort -textfile`, разница в том, что когда используется `<`, `sort` получает -данные со стандартного ввода, ничего не зная о файле `textfile`, -откуда они поступают. Механизм работы shell в данном случае тот же, -что и при перенаправлении вывода: shell читает данные из файла -`textfile`, запускает утилиту `sort` и передаёт ей на стандартный ввод -содержимое файла. - -Стоит помнить, что операция `>` деструктивна: она всегда создаёт файл -нулевой длины. Поэтому для, допустим, сортировки данных в файле надо -применять последовательно `sort < файл > новый_файл` и `mv новый_файл -файл`. Команда вида команда `< файл > тот_же_файл` просто урежет его до -нулевой длины! - -=================================================== -Стандартный ввод:: - поток данных, открываемый системой для каждого процесса в момент - его запуска, и предназначенный для ввода данных. -=================================================== - -=== Стандартный вывод ошибок === - -В качестве первого примера и упражнения на перенаправление Мефодий -решил записать руководство по `cat` в свой файл `cat.info`: - ------------------------------------------------- -[methody@localhost methody]$ info cat > cat.info - info: Запись ноды (coreutils.info.bz2)cat invocation... - info: Завершено. -[methody@localhost methody]$ head -1 cat.info - File: coreutils.info, Node: cat invocation, Next: tac invocation, Up: Output of entire files -[methody@localhost methody]$ ------------------------------------------------- - -Удивлённый Мефодий обнаружил, что вопреки его указанию отправляться в -файл две строки, выведенные командой `info`, всё равно проникли на -терминал. Очевидно, эти строки не попали на _стандартный вывод_ потому, -что не относятся непосредственно к руководству, которое должна -вывести программа, они информируют пользователя о ходе выполнения -работы: записи руководства в файл. Для такого рода _диагностических -сообщений_, а также для сообщений об ошибках, возникших в ходе -выполнения программы, в Linux предусмотрен _стандартный вывод ошибок_ -(сокращённо -- `stderr`). - -======================================================== -Стандартный вывод ошибок:: - поток данных, открываемый системой для каждого процесса в момент - его запуска, и предназначенный для _диагностических сообщений_, - выводимых процессом. -======================================================== - -Использование стандартного вывода ошибок наряду со стандартным выводом -позволяет отделить собственно результат работы программы от -разнообразной сопровождающей информации, например, направив их в -разные файлы. Стандартный вывод ошибок может быть перенаправлен так -же, как и стандартный ввод/вывод, для этого используется комбинация -символов `2>`. - ------------------------------------------------- -[methody@localhost methody]$ info cat > cat.info 2> cat.stderr -[methody@localhost methody]$ cat cat.stderr - info: Запись ноды (coreutils.info.bz2)cat invocation... - info: Завершено. -[methody@localhost methody]$ ------------------------------------------------- - -В этот раз на терминал уже ничего не попало, стандартный вывод -отправился в файл `cat.info`, стандартный вывод ошибок -- в `cat.stderr`. -Вместо `>` и `2>` Мефодий мог бы написать `1>` и `2>»`. Цифры в данном -случае обозначают номера дескрипторов открываемых файлов. Если некая -утилита ожидает получить открытый дескриптор с номером, допустим, 4, -то чтобы её запустить обязательно потребуется использовать сочетание -`4>`. - -Иногда, однако, требуется объединить стандартный вывод и стандартный -вывод ошибок в одном файле, а не разделять их. В командной оболочке -`bash` для этого имеется специальная последовательность `2>&1`. Это -означает «направить стандартный вывод ошибок туда же, куда и -стандартный вывод»: - ------------------------------------------------- -[methody@localhost methody]$ info cat > cat.info 2>&1 -[methody@localhost methody]$ head -3 cat.info - info: Запись ноды (coreutils.info.bz2)cat invocation... - info: Завершено. - File: coreutils.info, Node: cat invocation, Next: tac invocation, Up: Output of entire files -[methody@localhost methody]$ ------------------------------------------------- - -В этом примере важен порядок перенаправлений: в командной строке -Мефодий сначала указал, куда перенаправить стандартный вывод (`> -cat.info`) и только потом велел направить туда же стандартный вывод -ошибок. Сделай он наоборот («`2>&1 > cat.info`), результат получился -бы неожиданный: в файл попал бы только стандартный вывод, а -диагностические сообщения появились бы на терминале. Однако логика -здесь железная: на момент выполнения операции `2>&1` стандартный -вывод был связан с терминалом, значит, после её выполнения -стандартный вывод ошибок тоже будет связан с терминалом. А -последующее перенаправление стандартного вывода в файл, конечно, -никак не отразится на стандартном выводе ошибок. Номер в конструкции -`&номер` -- это номер открытого дескриптора. Если бы упомянутая выше -утилита, записывающая в четвёртый дескриптор, была написана на shell, -в ней бы использовались перенаправления вида `>&4`. Чтобы не набирать -громоздкую конструкцию `> файл 2>&1` в `bash` используются сокращения: -`&> файл` или, что то же самое, `>& файл`. - -==== Перенаправление в никуда ==== - -Иногда заведомо известно, что какие-то данные, выведенные программой, -не понадобятся. Например, предупреждения со стандартного вывода -ошибок. В этом случае можно перенаправить стандартный вывод ошибок в -_файл-дырку_, специально предназначенный для уничтожения данных -- -`/dev/null`. Всё, что записывается в этот файл, просто будет выброшено -и нигде не сохранится. - ------------------------------------------------- -[methody@localhost methody]$ info cat > cat.info 2> /dev/null -[methody@localhost methody]$ ------------------------------------------------- - -Точно таким же образом можно избавиться и от стандартного вывода, -отправив его в `/dev/null`. - -=== Обработка данных в потоке === - -[[conveyor]] -==== Конвейер ==== - -Нередко возникают ситуации, когда нужно обработать вывод одной программы -какой-то другой программой. Пользуясь перенаправлением ввода-вывода, -можно сохранить вывод одной программы в файле, а потом направить этот -файл на ввод другой программе. Однако то же самое можно сделать и более -эффективно: перенаправлять вывод можно не только в файл, но и -непосредственно на стандартный ввод другой программе. В этом случае -вместо двух команд потребуется только одна -- программы передают друг -другу данные «из рук в руки», в Linux такой способ передачи данных -называется _конвейер_. - -В `bash` для перенапрвления стандартного вывода на стандартный ввод -другой программе служит символ `|`. Самый простой и наиболее -распространённый случай, когда требуется использовать конвейер, -возникает, если вывод программы не умещается на экране монитора и -очень быстро «пролетает» перед глазами, так что человек не успевает -его прочитать. В этом случае можно направить вывод в программу -просмотра (`less`), которая позволит не торопясь пролистать весь текст, -вернуться к началу и т. п. - ------------------------------------------------- -[methody@localhost methody]$ cat cat.info | less ------------------------------------------------- - -Можно последовательно обработать данные несколькими разными программами, -перенаправляя вывод на ввод следующей программе и организуя сколь -угодно длинный _конвейер_ для обработки данных. В результате получаются -очень длинные командные строки вида `cmd1 | cmd2 | ... | cmdN`, -которые могут показаться громоздкими и неудобными, но оказываются -очень полезными и эффективными при обработке большого количества -информации, как мы увидим далее в этой лекции. - -Организация конвейера устроена в shell по той же схеме, что и -перенаправление в файл, но с использованием особого объекта системы -- -_канала_. Если файл можно представить в виде Коробки с Данными, -снабжённой Клапаном для Чтения или Клапаном для Записи, то _канал_ -- -это оба Клапана, приклеенные друг к другу вообще без Коробки. Для -определённости между Клапанами можно представить Трубу, немедленно -доставляющую данные от входа к выходу (английский термин -- «pipe» -- -основан как раз на этом представлении, а в роли Трубы выступает, -конечно же, сам Linux). Каналом пользуются сразу два процесса: один -пишет туда, другой читает. Связывая две команды конвейером, shell -открывает _канал_ (заводится два дескриптора -- входной и выходной), -подменяет по уже описанному алгоритму _стандартный вывод_ первого -процесса на входной дескриптор канала, а _стандартный ввод_ второго -процесса -- на выходной дескриптор канала. После чего остаётся -запустить по команде в этих процессах и стандартный вывод первой -попадёт на стандартный ввод второй. - -========================================================= -Канал:: - неделимая пара дескрипторов (входной и выходной), связанных друг - с другом таким образом, что данные, записанные во входной - дескриптор, будут немедленно доступны на чтение с выходного - дескриптора. -========================================================= - -=== Фильтры === - -Если программа и вводит данные, и выводит, то её можно рассматривать -как трубу, в которую что-то входит, а что-то выходит. Обычно смысл -работы таких программ заключается в том, чтобы определённым образом -обработать поступившие данные. В Linux такие программы называют -_фильтрами_: данные проходят через них, причём что-то «застревает» в -фильтре и не появляется на выходе, что-то изменяется, что-то проходит -сквозь фильтр неизменным. Фильтры в Linux обычно по умолчанию читают -данные со стандартного ввода, а выводят на стандартный вывод. -Простейшим фильтром Мефодий уже пользовался много раз -- это -программа cat: собственно, никакой «фильтрации» данных она не -производит, она просто копирует стандартный ввод на стандартный вывод. - -Данные, проходящие через фильтр, представляют собой текст: в -стандартных потоках ввода-вывода все данные передаются в виде -символов, строка за строкой, как и в терминале. Поэтому могут быть -состыкованы при помощи конвейера ввод и вывод любых двух программ, -поддерживающих стандартные потоки ввода-вывода. Это напоминает -стандартный конструктор, где все детали совмещаются между собой. - -В любом дистрибутиве Linux присутствует набор стандартных утилит, -предназначенных для работы с файловой системой и обработки текстовых -данных. Многими из них Мефодий уже успел воспользоваться: это `who`, -`cat`, `ls`, `pwd`, `cp`, `chmod`, -`id`, `sort` и др. Мефодий уже успел заметить, -что каждая из этих утилит предназначена для исполнения какой-то одной -операции над файлами или текстом: вывод списка файлов в каталоге, -копирование, сортировка строк, хотя каждая утилита может выполнять -свою функцию несколько по-разному, в зависимости от переданных ей -ключей и параметров. При этом все они работают со стандартными -потоками ввода/вывода, поэтому хорошо приспособлены для построения -конвейеров: последовательно выполняя простые операции над потоком -данных, можно решать довольно нетривиальные задачи. - -Принцип комбинирования элементарных операций для выполнения сложных -задач унаследован Linux от операционной системы UNIX (как и многие -другие принципы). Подавляющее большинство утилит UNIX, не потеряли -своего значения и в Linux. Все они ориентированы на работу с данными -в текстовой форме, многие являются фильтрами, все не имеют -графического интерфейса и вызываются из командной строки. Этот пакет -утилит называется `coreutils`. - -[[structuretext]] -=== Структурные единицы текста === - -Работу в системе Linux почти всегда можно представить как работу с -текстами. Поиск файлов и других объектов системы -- это получение от -системы текста особой структуры -- списка имён. Операции над файлами: -создание, переименование, перемещение, а также сортировка, -перекодировка и прочее, означает замену одних символов и строк на -другие либо в каталогах, либо в самих файлах. Настройка системы в -Linux сводится непосредственно к работе с текстами -- редактированию -_конфигурационных файлов_ и написанию _сценариев_ (подробнее об этом см. -лекции <> и -<>). - -Работая с текстом в Linux, нужно принимать во внимание, что текстовые -данные, передаваемые в системе, структурированы. Большинство утилит -обрабатывает не непрерывный поток текста, а последовательность -единиц. В текстовых данных в Linux выделяются следующие структурные -единицы: - -======================================== -Строки:: - строка -- основная единица передачи текста в Linux. Терминал - передаёт данные от пользователя системе строками (командная - строка), множество утилит вводят и выводят данные построчно, - при работе многих утилит одной строке соответствует один объект - системы (имя файла, путь и т. п.), sort сортирует строки. - Строки разделяются символом конца строки «\n» (newline). -======================================== - -======================================== -Поля:: - в одной строке может упоминаться и больше одного объекта. - Если понимать объект как последовательность символов из - определённого набора (например, букв), то строку можно - рассматривать как состоящую из слов и _разделителей_ - footnote:[Например, в командной строке разделителями - являются символы пробела и табуляции - (см. раздел <>.]. - В этом случае текст от начала строки до первого - разделителя -- это первое _поле_, от первого разделителя до - второго -- второе поле и т. д. В качестве разделителя можно - рассматривать любой символ, который не может использоваться - в объекте. Например, если в пути `/home/methody` разделителем - является символ `/`, то первое поле пусто, второе содержит - слово `home`, третье -- `methody`. Некоторые утилиты позволяют - выбирать из строк отдельные поля (по номеру) и работать со - строками как с таблицей: выбирать и объединять нужные колонки и проч. -======================================== - -======================================== -Символы:: - минимальная единица текста -- _символ_. Символ -- это одна буква - или другой письменный знак. Стандартные утилиты Linux позволяют - заменять одни символы другими (производить транслитерацию), - искать и заменять в строках символы и комбинации символов. -======================================== - -Символ конца строки в кодировке ASCII совпадает с управляющей -последовательностью `^J»`, «перевод строки», однако в других -кодировках он может быть иным. Кроме того, на большинстве терминалов --- но не на всех! -- вслед за переводом строки необходимо выводить -ещё символ возврата каретки (`^M`). Это вызвало путаницу: некоторые -системы требуют, чтобы в конце текстового файла стояло оба этих -символа в определённом порядке. Чтобы путаницы избежать, в UNIX (и, -как следствие, в Linux), было принято единственно верное решение: -содержимое файла соответствует кодировке, а при выводе на терминал -концы строки преобразуются в управляющие последовательности согласно -настройке терминала. - -В распоряжении пользователя Linux есть ряд утилит, выполняющих -элементарные операции с единицами текста: поиск, замену, разделение и -объединение строк, полей, символов. Эти утилиты, как правило, имеют -одинаковое представление о том, как определяются единицы текста: что -такое строка, какие символы являются разделителями и т. п. Во многих -случаях их представления можно изменять при помощи настроек. Поэтому -такие утилиты легко взаимодействуют друг с другом. Комбинируя их, -можно автоматизировать довольно сложные операции по обработке текста. - -==== Примеры задач ==== - -Этот раздел посвящён нескольким примерам использования стандартных -утилит для решения разных типичных (и не очень) задач. Эти примеры не -следует воспринимать как исчерпывающий список возможностей, они -приведены просто для демонстрации того, как можно организовать -обработку данных при помощи конвейера. Чтобы освоить их, нужно читать -руководства и экспериментировать. - -==== Подсчёт ==== - -В европейской культуре очень большим авторитетом пользуются точные -числа и количественные оценки. Поэтому пользователю часто бывает -любопытно и даже необходимо точно посчитать что-нибудь -многочисленное. Компьютер как нельзя более удобен для такой -процедуры. Стандартная утилита для подсчёта строк, слов и символов --- `wc` (от англ. «word count» -- «подсчёт слов»). Однако Мефодий -запомнил, что в Linux многое можно представить как слова и строки, и -решил с её помощью посчитать свои файлы. - ------------------------------------------------------ -[methody@localhost methody]$ find . | wc -l - 42 -[methody@localhost methody]$ ------------------------------------------------------ - -Удовлетворённый Мефодий получил желаемое число -- «42». Для этого ему -потребовалась команда `find` -- рекомендованный ему Гуревичем -инструмент поиска нужных файлов в системе. Мефодий вызвал `find` с -одним параметром -- каталогом, с которого начинать поиск. `find` -выводит список найденных файлов по одному на строку, а поскольку -критерии поиска в данном случае не уточнялись, то `find` просто вывела -список всех файлов во всех подкаталогах текущего каталога (домашнего -каталога Мефодия). Этот список Мефодий передал утилите `wc`, попросив -её посчитать количество полученных строк `-l`. `wc` выдала в ответ -искомое число. - -Задав `find` критерии поиска, можно посчитать и что-нибудь менее -тривиальное, например, файлы, которые создавались или были изменены в -определённый промежуток времени, файлы с определённым режимом -доступа, с определённым именем и т. п. Узнать обо всех возможностях -поиска при помощи `find` и подсчёта при помощи wc можно из руководств -по этим программам. - -==== Отбрасывание ненужного ==== - -Иногда пользователя интересует только часть из тех данных, которые -собирается выводить программа. Мефодий уже пользовался утилитой `head`, -которая нужна, чтобы вывести только первые несколько строк файла. Не -менее полезна утилита `tail` (англ. «хвост»), выводящая только -последние строки файла. Если же пользователя интересует только -определённая часть каждой строки файла -- поможет утилита `cut`. - -Допустим, Мефодию потребовалось получить список всех файлов и -подкаталогов в `/etc`, которые принадлежат группе `adm`. И при этом -ему почему-то нужно, чтобы найденные файлы в списке были представлены -не полным путём, а только именем файла (скорее всего, это требуется -для последующей автоматической обработки этого списка). - ------------------------------------------------------ -[methody@localhost methody]$ find /etc -maxdepth 1 -group adm 2> /dev/null \ -> | cut -d / -f 3 - syslog.conf - anacrontab -[methody@localhost methody]$ ------------------------------------------------------ - -Если команда получается такой длинной, что её неудобно набирать в -одну строку, можно разбить её на несколько строк, не передавая -системе: для этого в том месте, где нужно продолжить набор со -следующей строки, достаточно поставить символ `\` и нажать *Enter*. При -этом в начале строки `bash` выведет символ `>`, означающий, что команда -ещё не передана системе и набор продолжается footnote:[Вид этого -приглашения определяется значением переменной окружения `PS2`, -описанной в лекции <>]. Для системы -безразлично, в сколько строк набрана команда, возможность набирать в -несколько строк нужна только для удобства пользователя. - -Мефодий получил нужный результат, задав параметры `find` -- каталог, -где нужно искать и параметр поиска -- наибольшую допустимую глубину -вложенности и группу, которой должны принадлежать найденные файлы. -Ненужные диагностические сообщения о запрещённом доступе он отправил -в `/dev/null`, а потом указал утилите `cut`, что в полученных со -стандартного ввода строках нужно считать разделителем символ `/` и -вывести только третье поле. Таким образом от строк вида -`/etc/filename` осталось только `filename` footnote:[Как уже указывалось -в разделе <>, -первым полем считается текст от начала строки до первого разделителя, -в приведённом примере первое поле -- пусто, `etc` -- содержимое -второго поля, и т. д.]. - -=== Выбор нужного === - -==== Поиск ==== - -Зачастую пользователю нужно найти только упоминания чего-то -конкретного среди данных, выводимых утилитой. Обычно эта задача -сводится к поиску строк, в которых встречается определённое слово или -комбинация символов. Для этого подходит стандартная утилита `grep`. -`grep` может искать строку в файлах, а может работать и как фильтр: -получив строки со стандартного ввода, она выведет на стандартный -вывод только те строки, где встретилось искомое сочетание символов. -Мефодий решил поинтересоваться процессами `bash`, которые выполняются в -системе: - ------------------------------------------------------ -[methody@susanin methody]$ ps aux | grep bash - methody 3459 0.0 3.0 2524 1636 tty2 S 14:30 0:00 -bash - methody 3734 0.0 1.1 1644 612 tty2 S 14:50 0:00 grep bash ------------------------------------------------------ - -Первый аргумент команды grep -- та строка, которую нужно искать в -стандартном вводе, в данном случае это `bash`, а поскольку `ps` выводит -сведения по строке на каждый процесс, то Мефодий получил только -процессы, в имени которых есть `bash`. Однако Мефодий неожиданно -нашёл больше, чем искал: в списке выполняющихся процессов -присутствовали две строки, в которых встретилось слово «bash», т. е. -два процесса: один -- искомый -- командный интерпретатор `bash`, а -другой -- процесс поиска строки `grep bash`, запущенный Мефодием -после `ps`. Это произошло потому, что после разбора командной строки -`bash` запустил оба дочерних процесса, чтобы организовать конвейер, и -на момент выполнения команды `ps` процесс `grep bash` уже был запущен и -тоже попал в вывод `ps`. Чтобы в этом примере получить правильный -результат, Мефодию следовало бы добавить в конвейер ещё одно звено: -`| grep -v grep`, эта команда исключит из конечного вывода все строки, -в которых встречается «grep». - -==== Поиск по регулярному выражению ==== - -Очень часто точно не известно, какую именно комбинацию символов нужно -будет найти. Точнее, известно только то, как примерно должно -выглядеть искомое слово, что в него должно входить и в каком порядке. -Так обычно бывает, если некоторые фрагменты текста имеют строго -определённый формат. Например, в руководствах, выводимых программой -`info`, принят такой формат ссылок: `*Note название_узла::`. В этом -случае нужно искать не конкретное сочетание символов, а `Строку -*Note`, за которой следует название узла (одно или несколько слов и -пробелов), оканчивающееся символами `::`. Компьютер вполне способен -выполнить такой запрос, если его сформулировать на строгом и понятном -ему языке, например, на языке _регулярных выражений_. Регулярное -выражение -- это способ одной формулой задать все последовательности -символов, подходящие пользователю. - ------------------------------------------------------ -[methody@susanin methody]$ info grep > grep.info 2> /dev/null -[methody@susanin methody]$ grep -on "\*Note[^:]*::" grep.info - 324:*Note Grep Programs:: - 684:*Note Invoking:: -[methody@susanin methody]$ ------------------------------------------------------ - -Первый параметр grep, который взят в кавычки -- это и есть регулярное -выражение для поиска ссылок в формате info, второй параметр -- имя -файла, в котором нужно искать. Ключ «-o» заставляет grep выводить -строку не целиком, а только ту часть, которая совпала с регулярным -выражением (шаблоном поиска), а «-n» -- выводить номер строки, в -которой встретилось данное совпадение. - -В регулярном выражении большинство символов обозначают сами себя, как -если бы мы искали обыкновенную текстовую строку, например, «Note» и -«::» в регулярном выражении соответствуют строкам «Note» и «::» в -тексте. Однако некоторые символы обладают специальным значением, -самый главный из таких символов -- звёздочка. «*», поставленная после -элемента регулярного выражения обозначает, что могут быть найдены -тексты, где этот элемент повторён любое количество раз, в том числе и -ни одного, т. е. просто отсутствует. В нашем примере звёздочка -встретилась дважды: в первый раз потребовалось включить в регулярное -выражение именно символ «звёздочка», для этого потребовалось лишить -его специального значения, поставив перед ним «\». - -Вторая звёздочка обозначает, что стоящий перед ней элемент может быть -повторён любое количество раз от нуля до бесконечности. В нашем -случае звёздочка относится к выражению в квадратных скобках -- -«[^:]», что означает «любой символ, кроме «:»». Всё регулярное -выражение можно прочесть так: «Строка «*Note», за которой следует -ноль или больше любых символов, кроме «:», за которыми следует строка -«::»». Особенность работы «*» состоит в том, что она пытается выбрать -совпадение максимальной длины. Именно поэтому элемент, к которому -относилась «*», был задан как «не «:»». Выражение «ноль или более -любых символов» (оно записывается как «.*») в случае, когда, -например, в одной строке встречается две ссылки, вбирает подстроку от -конца первого «*Note» до начала последнего «::» (символы «:», -поместившиеся внутри этой подстроки, отлично распознаются как -«любые»). - -На языке регулярных выражений можно также обозначить «любой символ» -(«.»), «одно или более совпадений» («+»), начало и конец строки («^» -и «$» соответственно) и т. д. Благодаря регулярным выражениям можно -автоматизировать очень многие задачи, которые в противном случае -потребовали бы огромной и кропотливой работы человека. Более -подробные сведения о возможностях языка регулярных выражений можно -получить из руководства regex(7). Однако руководство -- это не -учебник по использованию, поэтому чтобы научиться экономить время и -усилия при помощи регулярных выражений, полезно прочесть -соответствующие главы книги [Курячий:2004] и книгу [Фридл:2000]. - -Регулярные выражения в Linux используются не только для поиска -программой grep. Очень многие программы, так или иначе работающие с -текстом, в первую очередь текстовые редакторы, поддерживают -регулярные выражения. К таким программам относятся два «главных» -текстовых редактора Linux -- Vi и Emacs, о которых речь пойдёт в -следующей лекции <>. Однако нужно учитывать, что в -разных программах используются разные диалекты языка регулярных -выражений, где одни и те же понятия имеют разные обозначения, поэтому -всегда нужно обращаться к руководству по конкретной программе. - -В заключение можно сказать, что регулярные выражения позволяют резко -повысить эффективность работы, хорошо интегрированы в рабочую среду в -системе Linux, и есть смысл потратить время на их изучение. - -==== Замены ==== - -Удобство работы с потоком не в последнюю очередь состоит в том, что -можно не только выборочно передавать результаты работы программ, но и -автоматически заменять один текст другим прямо в потоке. - -Для замены одних символов на другие предназначена утилита `tr` -(сокращение от англ. «translate», «преобразовывать, переводить»), -работающая как фильтр. Мефодий решил употребить её прямо по -назначению и выполнить при её помощи транслитерацию -- замену -латинских символов близкими по звучанию русскими. - ------------------------------------------------------ -[methody@localhost methody]$ cat cat.info | tr abcdefghijklmnopqrstuvwxyz абцдефгхийклмнопкрстуввсиз \ -> | tr ABCDEFGHIJKLMNOPRSTUVWXYZ АБЦДЕФГХИЙКЛМНОПКРСТУВВСИЗ | head -4 - Филе: цореутилс.инфо, Ноде: цат инвоцатион, Нест: тац инвоцатион, Тп: Оутпут оф ентире филес - - `цат': Цонцатенате анд врите филес - ================================== -[methody@localhost methody]$ ------------------------------------------------------ - -Мефодий потрудился, составляя два параметра для утилиты `tr`: -соответствия латинских букв кириллическим. Первый символ из первого -параметра `tr` заменяет первым символом второго, второй -- вторым и т. -д. Мефодий обработал поток фильтром `tr` дважды: сначала чтобы заменить -строчные буквы, а затем -- прописные, он мог бы сделать это и за один -проход (просто добавив к параметрам прописные после строчных), но не -захотел выписывать столь длинные строки. Полученному на выходе тексту -вряд ли можно найти практическое применение, однако транслитерацию -можно употребить и с пользой. Если не указать `tr` второго параметра, -то все символы, перечисленные в первом, будут заменены на «ничто», т. -е. попросту удалены из потока. При помощи `tr` можно также удалить -дублирующиеся символы (например, лишние пробелы или переводы -строки), заменить пробелы переводами строк и т. п. - -Помимо простой замены отдельных символов, возможна замена -последовательностей (слов). Специально для этого предназначен -потоковый редактор `sed` (сокращение от англ. «stream editor»). Он -работает как фильтр и выполняет редактирование поступающих строк: -замену одних последовательностей символов на другие, причём можно -заменять и _регулярные выражения-. - -Например, Мефодий с помощью `sed` может сделать более понятным для -непривычного читателя список файлов, выводимый `ls`: - ------------------------------------------------------ -[methody@localhost methody]$ ls -l | sed s/^-[-rwx]*/Файл:/ | sed s/^d[-rwx]*/Каталог:/ - итого 124 - Файл: 1 methody methody 2693 Ноя 15 16:09 cat.info - Файл: 1 methody methody 69 Ноя 15 16:08 cat.stderr - Каталог: 2 methody methody 4096 Ноя 15 12:56 Documents - Каталог: 3 methody methody 4096 Ноя 15 13:08 examples - Файл: 1 methody methody 83459 Ноя 15 16:11 grep.info - Файл: 1 methody methody 26 Ноя 15 13:08 loop - Файл: 1 methody methody 23 Ноя 15 13:08 script - Файл: 1 methody methody 33 Ноя 15 16:07 textfile - Каталог: 2 methody methody 4096 Ноя 15 12:56 tmp - Файл: 1 methody methody 32 Ноя 15 13:08 to.sort -[methody@oblomov methody]$ ------------------------------------------------------ - -У `sed` очень широкие возможности, но довольно непривычный синтаксис, -например, замена выполняется командой -`s/что_заменять/на_что_заменять/`. Чтобы в нём разобраться, нужно -обязательно прочесть руководство `sed(1)` и знать регулярные выражения. - -==== Упорядочение ==== - -Для того чтобы разобраться в данных, нередко требуется их -упорядочить: по алфавиту, по номеру, по количеству употреблений. -Основной инструмент для упорядочивания -- утилита `sort` -- уже знакома -Мефодию. Однако теперь он решил использовать её в сочетании с -несколькими другими утилитами: - ------------------------------------------------------ -[methody@localhost methody]$ cat grep.info | tr "[:upper:]" "[:lower:]" | tr "[:space:][:punct:]" "\n" \ -> | sort | uniq -c | sort -nr | head -8 - 15233 - 720 the - 342 of - 251 to - 244 a - 213 and - 180 or - 180 is -[methody@localhost methody]$ ------------------------------------------------------ - -Мефодий (вернее, компьютер по плану Мефодия) подсчитал, сколько раз -какие слова были употреблены в файле `grep.info` и вывел несколько -самых частотных с указанием количества употреблений в файле. Для -этого потребовалось сначала заменить все большие буквы маленькими, -чтобы не было разных способов написания одного слова, затем заменить -все пробелы и знаки препинания концом строки (символ `n`), чтобы в -каждой строке было ровно по одному слову (Мефодий всюду взял -параметры `tr` в кавычки, чтобы `bash` не понял их неправильно). Потом -список был отсортирован, все повторяющиеся слова заменены одним -словом с указанием количества повторений (`uniq -c`), затем строки -снова отсортированы по убыванию чисел в начале строки (`sort -nr`) и -выведены первые 8 строк (`head -8`). - -==== Запуск команд ==== - -Полученные в конвейере данные можно превратить в руководство к -действию для компьютера. Например, для каждой полученной со -стандартного ввода строки можно запустить какую-нибудь команду, -передав ей эту строку в качестве параметра. Для этой цели служит -утилита `xargs`. - ------------------------------------------------------ -[methody@localhost methody]$ find /bin -type f -perm +a=x \ -> | xargs grep -l -e '^#!/' 2> /dev/null - /bin/egrep - /bin/fgrep - /bin/unicode_start - /bin/bootanim -[methody@localhost methody]$ ------------------------------------------------------ - -Здесь Мефодий решил определить, какие из исполняемых файлов в -каталоге `/bin` являются сценариями. Для этого он нашёл все обычные -исполняемые файлы (указывать `-type f` -- «обычные файлы» -потребовалось, чтобы в результат не попали каталоги, которые все -исполняемые), а затем для каждого найденного файла вызвал grep, чтобы -поискать в нём сочетание символов `#!/` в начале строки. Ключ `-l` -велел grep выводить не обнаруженную строку, а имя файла, в котором -найдено совпадение. Так Мефодий получил список исполняемых файлов, в -которых есть строка с указанием интерпретатора -- несомненных -сценариев footnote:[Возможны сценарии, в которых не указана -программа-интерпретатор, но для автоматического обнаружения такого -сценария потребуются более сложные инструменты.]. - -[[terminal]] -== Возможности командной оболочки == - -=== Редактирование ввода === - -Уже некоторое время поработав в Linux, понабирав команды в командной -строке, Мефодий пришёл к выводу, что в общении с оболочкой не помешают -кое-какие удобства. Одно из таких удобств -- возможность редактировать -вводимую строку с помощью клавиши *Backspace* (удаление последнего -символа), `^W` (удаление слова) и `^U` (удаление всей строки) -- -предоставляет сам терминал Linux. Эти команды работают для любого -построчного ввода: например, если запустить программу `cat` без -параметров, чтобы та немедленно отображала вводимые с терминала -строки. Если по каким-то причинам в строчку на экране влез мусор, -можно нажать `^R` (redraw) -- система выведет в новой строке -содержимое входного буфера. - -Мефодий не забыл, что `cat` без параметров следует завершать командой -`^D`(конец ввода). Эту команду, как и предыдущие, интерпретирует при -вводе с терминала система. Система же превращает некоторые другие -управляющие символы (например, `^C` или `^Z`) в _сигналы_. В -действительности все управляющие символы, интерпретируемые системой, -можно перенастроить с помощью команды `stty`. Полный список того, что -можно настраивать, выдаёт команда `stty -a`: - ---------------------------------------------------------- -[methody@localhost methody]$ stty -a - localhost 38400 baud; rows 30; columns 80; line = 0; - intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; - eol2 = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; - lnext = ^V; flush = ^O; min = 1; time = 0; - -parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts - -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff - -iuclc -ixany -imaxbel -iutf8 - opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 - isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt - echoctl echoke ---------------------------------------------------------- - -При виде столь обширных возможностей Мефодий немедленно взялся читать -руководство (`man stty`), однако нашёл в нём не так уж много для себя -полезного. Из управляющих символов (строки со второй по четвёртую) -интересны `^S` и `^Q`, с помощью которых можно, соответственно, -приостановить и возобновить выдачу на терминал (если текста вывелось -уже много, а прочесть его не успеваешь). Можно заметить, что настройка -erase (удаление одного символа) соответствует управляющему символу, -который возвращается клавишей *Backspace* именно виртуальной консоли -Linux -- `^?`. На многих терминалах клавиша *Backspace* возвращает -другой символ -- `^H`. Если необходимо переопределить настройку `erase`, -можно воспользоваться командой `stty erase ^H`, причём `^H` (для -удобства) разрешено вводить и как два символа: `^` и `H`. - -Наконец, чтобы лишить передаваемый символ его управляющих функций (если, -например, требуется передать программе на ввод символ с кодом 3, т. е. -`^C`), непосредственно перед вводом этого символа нужно подать команду -`^V` (`lnext`): - ---------------------------------------------------------- -[methody@localhost methody]$ cat | hexdump -C - Сейчас нажмём Ctrl+C -[methody@localhost methody]$ cat | hexdump -C - Теперь Ctrl+V, Ctrl+C, enter и Ctrl+D^C - 00000000 f4 c5 d0 c5 d2 d8 20 43 74 72 6c 2b 56 2c 20 43 |Теперь Ctrl+V, C| - 00000010 74 72 6c 2b 43 2c 20 45 6e 74 65 72 20 c9 20 43 |trl+C, enter и C| - 00000020 74 72 6c 2b 44 03 0a |trl+D..| - 00000027 ---------------------------------------------------------- - -Здесь Мефодий прервал, как и собирался, работу первого из `cat`. При -этом до `hexdump`, фильтра, переводящего входной поток в -шестнадцатеричное представление, дело даже не дошло, потому что `cat` -не успел обработать ни одной строки. Во втором случае `^C` после `^V` -потеряло управляющий смысл и отобразилось при вводе. С ключом `-C` -`hexdump` выводит также и текстовое представление входного потока, -заменяя непечатные символы точками. Так на точки были заменены и -`^C` (ASCII-код 03), и возвращаемый *Enter* символ конца строки -(ASCII-код 0a, в десятичном виде -- 12). Ни `^V`, ни `^D` на вход -`hexdump`, конечно, не попали: их, как управляющие, обработала -система. - -Прочие настройки `stty` относятся к обработке текста при выводе на -терминал и вводе с него. Они интересны только в том смысле, что при -их изменении работать с командной оболочкой становится неудобно. -Например, настройка echo определяет, будет ли система отображать на -экране всё, что вводит пользователь. При включённом `echo` нажатие -любой алфавитно-цифровой клавиши (ввод символа) приводит к тому, что -система (устройство типа `tty`) выведет этот символ на терминал. -Настройка отключается, когда с клавиатуры вводится пароль. При этом -трудно отделаться от ощущения, что ввода с клавиатуры не происходит. -Ещё хуже обстоит дело с настройками, состоящими из кусков вида `i`, -`o`, `cr` и `nl`. Эти настройки управляют преобразованием при вводе и -выводе исторически сложившегося обозначения конца строки двумя -символами в один, принятый в Linux. Может случиться так, что клавиша -*Enter* терминала возвращает как раз неправильный символ конца -строки, а преобразование отключено. Тогда вместо *Enter* следует -использовать `^J` -- символ, на самом деле соответствующий концу -строки. - -Во всех случаях, когда терминал находится в непонятном состоянии -- -не реагирует на *Enter*, не показывает ввода, не удаляет символов, -выводит текст «ступеньками» и т. п., рекомендуется «лечить» настройки -терминала с помощью `stty sane` -- специальной формы `stty`, -сбрасывающей настройки терминала в некоторое пригодное к работе -состояние. Если непонятное состояние терминала возникло однократно, -например, после аварийного завершения экранной программы (редактора -`vim` или оболочки `mc`), то можно воспользоваться командой `reset`. -Она заново настраивает терминал в полном соответствии с системной -конфигурацией (указанной в файле `/etc/inittab`, см. лекцию <>) и `terminfo`. - -Если терминал ведёт себя странно, последовательность `^J stty sane^J` -может его вылечить! - -=== Редактирование командной строки === - -Даже не изучая специально возможностей командной оболочки, Мефодий -активно использовал некоторые из них, не доступные при вводе текста -большинству утилит (в частности, ни `cat`, ни `hexdump`). Речь идёт о -клавишах *Стрелка влево* и *Стрелка вправо*, с помощью которых можно -перемещать курсор по командной строке, и клавише *Del*, удаляющей -символ под курсором, а не позади него. В лекции <> он уже убедился, что эти команды работают в -`bash`, но не работают для `cat`. Более того, для простого командного -интерпретатора -- `sh` -- они тоже не работают. - -Следовательно, возможности редактора командной строки специфичны для -разных командных оболочек. Однако самые необходимые команды -редактирования поддерживаются во всех разновидностях shell сходным -образом. По словам Гуревича «во всех видах Linux обязательно есть -`bash`, а если ты достаточно опытен, чтобы устанавливать и настраивать -пакеты, можешь установить `zsh`, у него возможностей больше, чем может -понадобиться одному человеку». Поэтому Мефодий занялся изучением -документации по `bash`, что оказалось делом непростым, ибо в `bash.info` -он насчитал более восьми с половиной тысяч строк. Даже про -редактирование командной строки написано столько, что за один -раз прочесть трудно. - -Попытка «наскоком» узнать всё про работу в командной строке принесла -некоторую пользу. Во-первых, перемещаться в командной строке можно не -только по одному символу вперёд и назад, но и по словам: команды -`ESCF/ESCB` или *Alt+F/Alt+B* соответственно (от `forward` и `bckward`), -работают также клавиши *&home&* и *&end&*, или, что то же самое, `^A` и -`^E`. А во-вторых, помимо работы с одной командной строкой, существует -ещё немало других удобств, о которых и пойдёт речь в этой лекции. - -==== История команд ==== - -Двумя другими клавишами со стрелками -- вверх и вниз -- Мефодий тоже -активно пользовался, не подозревая, что задействует этим весьма мощный -механизм `bash` -- работу с _историей команд_. Все команды, набранные -пользователем, `bash` запоминает и позволяет обращаться к ним -впоследствии. По стрелке вверх (можно использовать и `^P`, previous), -список поданных команд «прокручивается» от последней к первой, а по -стрелке вниз (`^N`, next) -- обратно. Соответствующая команда -отображается в командной строке как только что набранная, её можно -отредактировать и подать оболочке (подгонять курсор к концу строки -при этом не обязательно). - -Если необходимо добыть из истории какую-то давнюю команду, проще не -гонять список истории стрелками, а поискать в ней с помощью команды -`^R` (reverse search). При этом выводится подсказка специального вида -(`(reverse-i-search)`), подстрока поиска (окружённая символами ` и ') -и последняя из команд в истории, в которой эта подстрока присутствует: - ---------------------------------------------------------- -[methody@localhost methody]$ - ^R | (reverse-i-search)`': - i | (reverse-i-search)`i': ls i - n | (reverse-i-search)`in': info - f | (reverse-i-search)`inf': info - o | (reverse-i-search)`info': info - ^R | (reverse-i-search)`info': man info - ^R | (reverse-i-search)`info': info "(bash.info.bz2)Commands For History" ---------------------------------------------------------- - -Пример представляет символы вводимые Мефодием (в левой части до `|`) и -содержимое последней строки терминала. Это «кадры» работы с одной и той -же строкой, показывающие, как она меняется при наборе. Набрав `info`, -Мефодий продолжил поиск этой подстроки, повторяя `^R` до тех пор, -пока не наткнулся на нужную ему команду, содержащую подстроку `info`. -Осталось только передать её `bash` с помощью *Enter*. - -Чтобы история команд могла сохраняться между сеансами работы -пользователя, `bash` записывает её в файл `.bash_history`, находящийся в -домашнем каталоге пользователя. Делается это в момент завершения -оболочки: накопленная за время работы история дописывается в конец -этого файла. При следующем запуске `bash` считывает `.bash_history` -целиком. История хранится не вечно, количество запоминаемых команд -в `.bash_history` ограничено (обычно 500 командами, но это можно и -перенастроить). - -==== Сокращения ==== - -Поиск по истории -- удобное средство: длинную командную строку можно -не набирать целиком, а выискать и использовать. Однако давнюю команду -придётся добывать с помощью нескольких `^R` -- а можно и совсем не -доискаться, если она уже выбыла оттуда. Для того чтобы оперативно -заменять короткие команды длинными, стоит воспользоваться _сокращениями_ -(aliases). В конфигурационных файлах командного интерпретатора -пользователя обычно уже определено несколько сокращений, список -которых можно посмотреть с помощью команды `alias` без параметров: - ---------------------------------------------------------- -[methody@localhost methody]$ alias - alias cd..='cd ..' - alias cp='cp -i' - alias l='ls -lapt' - alias ll='ls -laptc' - alias ls='ls --color=auto' - alias md='mkdir' - alias mv='mv -i' - alias rd='rmdir' - alias rm='rm -i' ---------------------------------------------------------- - -С сокращениями Мефодий уже сталкивался в лекции -<>, где -команда `ls` отказалась работать в согласии с теорией. Выяснилось, -что по команде `ls` вместо утилиты `/bin/ls bash` запускает собственную -команду-сокращение, превращающееся в команду `ls --color=auto`. -Повторно появившуюся в команде подстроку `ls` интерпретатор уже не -обрабатывает, во избежание вечного цикла. Например, команда `ls -al` -превращается в результате в `ls --color=auto -al`. Точно так же любая -команда, начинающаяся с `rm`, превращается в `rm -i` (interactive), что -Мефодия крайне раздражает, потому что ни одно удаление не обходится -без вопросов в стиле `rm: удалить обычный файл `файл'?`. - ---------------------------------------------------------- -[methody@localhost methody]$ unalias cp rm mv -[methody@localhost methody]$ alias pd=pushd -[methody@localhost methody]$ alias pp=popd -[methody@localhost methody]$ pd /bin - /bin ~ -[methody@localhost bin]$ pd /usr/share/doc - /usr/share/doc /bin ~ -[methody@localhost doc]$ cd /var/tmp -[methody@localhost tmp]$ dirs - /var/tmp /bin ~ -[methody@localhost tmp]$ pp - /bin ~ -[methody@localhost bin]$ pp - ~ -[methody@localhost methody]$ pp - -bash: popd: directory stack empty ---------------------------------------------------------- - -От надоедливого `-i` Мефодий избавился с помощью команды `unalias`, а -заодно ввёл сокращения для полюбившихся ему команд `bash` -- `pushd` -и `popd`. Эти команды footnote:[Они названы по аналогии с операциями -работы со стеком -- `push` и `pop.`], подобно `cd`, меняют текущий -каталог. Разница состоит в том, что `pushd` все каталоги, которые -пользователь делает текущими, запоминает в особом списке (стеке). -Команда `popd` удаляет последний элемент этого стека, и делает текущим -каталогом предпоследний. Обе команды вдобавок выводят содержимое -стека каталогов (то же самое делает и команда `dirs`). Команда `cd` в -`bash` также работает со стеком каталогов: она заменяет его последний -элемент новым. - -======================================================= -Команда-сокращение:: - внутренняя команда shell, задаваемая пользователем. Обычно заменяет - одну более длинную команду, которая часто используется при работе в - командной строке. Сокращения не наследуются с окружением. -======================================================= - -==== Достраивание ==== - -Сокращения позволяют быстро набирать команды, однако никак не -затрагивают имён файлов, которые чаще всего и оказываются параметрами -этих команд. Бывает, что набранной строки -- пути к файлу и нескольких -первых букв его имени -- достаточно для однозначного указания на этот -файл, потому что по введённому пути больше файлов, чьё имя начинается -на эти буквы, просто нет. Чтобы не дописывать оставшиеся буквы (а имена -файлов в Linux могут быть весьма длинными), Гуревич посоветовал Мефодию -нажать клавишу *Tab*. И -- о чудо! -- `bash` сам достроил начало имени -файла до целого (снова воспользуемся методом «кадров»): - ---------------------------------------------------------- -[methody@localhost methody]$ ls -al /bin/base - Tab | [methody@localhost methody]$ ls -al /bin/basename --rwxr-xr-x 1 root root 12520 Июн 3 18:29 /bin/basename -[methody@localhost methody]$ base - Tab | [methody@localhost methody]$ basename - Tab | [methody@localhost methody]$ basename ex - Tab | [methody@localhost methody]$ basename examples/ - Tab | [methody@localhost methody]$ basename examples/-filename-with- --filename-with- ---------------------------------------------------------- - -Дальше -- больше. Оказывается, и имя команды можно вводить не целиком: -оболочка догадается достроить набираемое слово именно до команды, раз -уж это слово стоит в начале командной строки. Таким образом, команду -`basename examples/-filename-with-` Мефодий набрал за восемь нажатий на -клавиатуру (`base` и четыре *Tab*)! Ему не пришлось вводить начало имени -файла в каталоге `examples`, потому что файл там был всего один. - -Выполняя _достраивание_ (completion), `bash` может вывести не всю строку, -а только ту её часть, относительно которой у него нет сомнений. Если -дальнейшее достраивание может пойти несколькими путями, то однократное -нажатие *Tab* приведёт к тому, что `bash` растерянно пискнет -footnote:[Все терминалы должны уметь выдавать звуковой сигнал при -выводе управляющего символа `^G`. Для этого не нужно запускать никаких -дополнительных программ: «настоящие» терминалы имеют встроенный динамик, -а виртуальные консоли обычно пользуются системным («пищалкой»). В -крайнем случае разрешается привлекать внимание пользователя другими -способами: например, эмулятор терминала `screen` пишет -в служебной строке `wuff-wuff` («гав-гав»).], а -повторное -- к выводу под командной строкой списка всех возможных -вариантов. В этом случае надо подсказать командной оболочке -продолжение: дописать несколько символов, определяющих, по -какому пути пойдёт достраивание, и снова нажать *Tab*. - -Поиск ключевого слова `completion` по документации `bash` выдал так -много информации, что Мефодий обратился к Гуревичу за помощью. Однако -тот ответил, что не использует `bash`, и поэтому не в состоянии объяснять -тонкости его настройки. Если в `bash` -- несколько типов достраивания -(по именам файлов, по именам команд и т. п.), то в `zsh` их сколько -угодно: существует способ запрограммировать любой алгоритм достраивания -и задать шаблон командной строки, в которой именно этот способ будет -применяться. - -==== Генерация имён файлов ==== - -Достраивание очень удобно, когда цель пользователя -- задать один -конкретный файл в командной строке. Если же нужно работать сразу с -несколькими файлами -- например для перемещения их в другой каталог с -помощью `mv`, достраивание не помогает. Необходим способ задать одно -«общее» имя для группы файлов, с которыми будет работать команда. В -подавляющем большинстве случаев это можно сделать при помощи шаблона. - -=== Шаблоны === - -Шаблон в командном интерпретаторе используется примерно в тех же целях, -что и _регулярное выражение_, упомянутое в лекции -<> для поиска строк определённой -структуры среди множества разнообразных строк. В отличие от -регулярного выражения, шаблон всегда примеряется к строке целиком, -кроме того, он устроен значительно проще (а значит, и беднее). - -Символы в шаблоне разделяются на обычные и _специальные_. Обычные символы -соответствуют таким же символам в строке, а специальные обрабатываются -особым образом: - -* Шаблону, состоящему только из обычных символов, соответствует -единственная строка, состоящая из тех же символов в том же порядке. -Например, шаблону «abc» соответствует строка abc, но не aBc или ABC, -потому что большие и маленькие буквы различаются. -* Шаблону, состоящему из единственного спецсимвола «*», соответствует -любая строка любой длины (в том числе и пустая). -* Шаблону, состоящему из единственного спецсимвола «?», соответствует -любая строка длиной в один символ, например, a, + или @, но не ab -или 8888. -* Шаблону, состоящему из любых символов, заключённых в квадратные -скобки «[» и «]» соответствует строка длиной в один символ, причём -этот символ должен встречаться среди заключённых в скобки. Например, -шаблону «[bar]» соответствуют только строки a, b и r, но не c, B, -bar или ab. Символы внутри скобок можно не перечислять полностью, а -задавать диапазон, в начале которого стоит символ с наименьшим -ASCII-кодом, затем следует «-», а затем -- символ с наибольшим -ASCII-кодом. Например, шаблону «[0-9a-fA-F]» соответствует одна -шестнадцатеричная цифра (скажем, 5, e или C). Если после «[» в шаблоне -следует «!», то ему соответствует строка из одного символа не -перечисленного между скобками. -* Шаблону, состоящему из нескольких частей, соответствует строка, -которую можно разбить на столько же подстрок (возможно, пустых), -причём первая подстрока будет отвечать первой части шаблона, -вторая -- второй части и т. д. Например, шаблону «a*b?c» будут -соответствовать строки ab@c («*» соответствует пустая подстрока), -a+b=c и aaabbc, но не соответствовать abc («?» соответствует подстрока -c, а для «c» соответствия не находится), @ab@c (нет соответствия для -«a») или aaabbbc (из трёх b превое соответствует «b», второе -- «?», -а вот третье приходится на «c»). - -======================================================== -Шаблон:: - строка специального формата, используемая в процедурах текстового - поиска. Говорят, что строка _соответствует_ шаблону, если можно по - определённым правилам каждому символу строки поставить в - соответствие символ шаблона. В Linux наиболее популярны шаблоны в - формате командного интерпретатора и _регулярные выражения_. -======================================================== - -==== Использование шаблонов ==== - -Шаблоны используются в нескольких конструкциях shell. Главное место их -применения -- командная строка. Если оболочка видит в командной строке -шаблон, она немедленно заменяет его на список файлов, имена которых ему -соответствуют. Команда, которая затем вызывается, получает в качестве -параметров список файлов уже безо всяких шаблонов, как если бы этот -список пользователь ввёл вручную. Эта способность командного -интерпретатора называется _генерацией имён файлов_. - ---------------------------------------------------------- -[methody@localhost methody]$ ls .bash* - .bash_history .bash_logout .bash_profile .bashrc -[methody@localhost methody]$ /bin/e* - /bin/ed /bin/egrep /bin/ex -[methody@localhost methody]$ ls *a* - -filename-with- -[methody@localhost methody]$ ls -dF *[ao]* - Documents/ examples/ loop to.sort* ---------------------------------------------------------- - -Мефодий, как это случается с новичками, немедленно натолкнулся на -несколько «подводных камней», неизбежных в ситуации, когда конечный -результат неизвестен. Только первая команда сработала не вопреки его -ожиданиям: шаблон `.bash*` был превращён командной оболочкой в список -файлов, начинающихся на `.bash`, этот список получила в качестве -параметров командной строки `ls`, после чего честно его вывела. С -`/bin/e*` Мефодию повезло -- этот шаблон превратился в список файлов -из каталога `/bin`, начинающихся на «e», и первым файлом в списке -оказалась безобидная утилита `/bin/echo`. Поскольку в командной строке -ничего, кроме шаблона, не было, именно строка `/bin/echo` была -воспринята оболочкой в качестве команды footnote:[Можно вспомнить про -нулевой параметр командной строки, обсуждавшийся в лекции <>.], которой -- в качестве -параметров -- были переданы остальные элементы списка -- `/bin/ed`, -`/bin/egrep` и `/bin/ex`. - -Что же касается `ls *a*`, то, по расчётам Мефодия, эта команда -должна была выдать список файлов в текущем каталоге, имя которых -содержит `a`. Вместо этого на экран вывелось имя файла из -подкаталога `examples`... Впрочем, никакой чёрной магии тут нет. -Во-первых, имена файлов вида `.bash*` хотя и содержат `a`, но -начинаются на точку, и, стало быть, считаются _скрытыми_. Скрытые файлы -попадают в результат генерации имён только если точка в начале -указана явно (как в первой команде примера). Поэтому по шаблону `*a*` -в домашнем каталоге Мефодия `bash` нашёл только подкаталог с именем -`examples`, его-то он и передал в качестве параметра утилите `ls`. Что -вывелось на экран в результате образовавшейся команды `ls examples`? -Конечно, содержимое каталога. Шаблон в последней команде из примера, -`*[ao]*`, был превращён в список файлов, чьи имена содержат `a` или -`o` -- `Documents examples loop to.sort`, а ключ `-d` потребовал у `ls` -показывать информацию о каталогах, а не об их содержимом. В -соответствии с ключом `-F`, `ls` расставил `/` после каталогов и `*` -после исполняемых файлов. - -Ещё одно отличие генерации имён от стандартной обработки шаблона -- в -том, что символ `/`, разделяющий элементы пути, никогда не ставится в -соответствие `*` или диапазону. Происходит это не потому, что искажён -алгоритм, а потому, что при генерации имён шаблон применяется именно -к элементу пути, внутри которого уже нет `/`. Например, получить -список файлов, которые находятся в каталогах `/usr/bin` и `/usr/sbin` и -содержат подстроку «ppp» в имени, можно с помощью шаблона -`/usr/*bin/*ppp*`. Однако одного шаблона, который бы включал в этот -список ещё и каталоги `/bin` и `/sbin` -- то есть подкаталоги другого -уровня вложенности -- по стандартным правилам сделать нельзя -footnote:[Генерация имён файлов в `zsh` предусматривает -специальный шаблон «**», которому соответствуют подстроки с -любым количеством `/`. Пользоваться им следует крайне осторожно, -понимая, что при генерации имён по такому шаблону выполняется -операция, аналогичная не `ls`, а `ls -R` или `find`. Так, -использование `/**` в начале шаблона вызовет просмотр всей -файловой системы!]. - -Если перед любым специальным символом стоит `\`, этот символ лишается -специального значения, _экранируется_: пара `\символ` заменяется -командным интерпретатором на «символ» и передаётся в командную строку -безо всякой дальнейшей обработки: - ---------------------------------------------------------- -[methody@localhost methody]$ echo *o* - Documents loop to.sort -[methody@localhost methody]$ echo \*o\* - *o* -[methody@localhost methody]$ echo "*o*" - *o* -[methody@localhost methody]$ echo *y* - *y* -[methody@localhost methody]$ ls *y* - ls: *y*: No such file or directory ---------------------------------------------------------- - -Мефодий заметил, что шаблон, которому не соответствует ни одного имени -файла, `bash` раскрывать не стал, как если бы все `*` в нём были -экранированы. В самом деле, какое из двух зол меньшее: изменять -интерпретацию спецсимволов в зависимости от содержимого каталога, или -сохранять логику интерпретации с риском превратить команду с параметрами -в команду без параметров? Если бы, допустим, шаблон, которому не нашлось -соответствия, попросту удалялся, то команда `ls y` превратилась бы в -`ls` и неожиданно выдала бы содержимое всего каталога. Авторы `bash` -(как и Стивен Борн, автор самой первой командной оболочки -- `sh`) -выбрали более непоследовательный, но и более безопасный первый способ -footnote:[Авторы `zsh` пошли по другому пути: в этой версии shell -использование шаблона, которому не соответствует ни одно имя файла, -приводит к ошибке, и соответствующая команда не выполняется.]. - -Лишить специальные символы их специального значения можно и другим -способом. В лекции <> было -рассказано, что разделители (пробелы, символы табуляции и символы -перевода строки) перестают восприниматься таковыми, если часть -командной строки, их содержащую, окружить двойными или одинарными -кавычками. В кавычках перестаёт «работать» и генерация имён (как это -видно из примера), и интерпретация других специальных символов. Двойные -кавычки, однако, допускают выполнение _подстановок_ переменной окружения -и результата работы команды, описанных в двух следующих разделах. - -=== Окружение === - -В лекции <> уже -упоминалось, что системный вызов `fork()`, создавая точную копию -родительского процесса, копирует также и _окружение_. Необходимость в -«окружении» происходит вот из какой задачи. Акт передачи данных от -этого конкретно родительского процесса дочернему, и, что ещё важнее, -системе, должен обладать свойством _атомарности_. Если использовать для -этой цели файл (например, конфигурационный файл запускаемой -программы), всегда сохраняется вероятность, что за время между -изменением файла и последующим чтением запущенной программой кто-то --- например, другой процесс того же пользователя -- снова изменит -этот файл footnote:[Эта ситуация называется «race condition» -(«состояние гонки»), и часто встречается в плохо спроектированных -системах, где есть хотя бы два параллельных процесса.]. -Хорошо бы, чтобы изменение данных и их передача делались -бы одной операцией. Например, завести для каждого процесса такой -«файл», содержимое которого, во-первых, мог бы изменить только этот -процесс, и, во-вторых, оно автоматически копировалось бы в -аналогичный «файл» дочернего процесса при его порождении. - -Эти свойства и реализованы в понятии «_окружение_». Каждый запускаемый -процесс система снабжает неким информационным пространством, которое -этот процесс вправе изменять как ему заблагорассудится. Правила -пользования этим пространством просты: в нём можно задавать -именованные хранилища данных (_переменные окружения_), в которые -записывать какую угодно информацию (присваивать значение переменной -окружения), а впоследствии эту информацию считывать (подставлять -значение переменной). Дочерний процесс -- точная копия родительского, -поэтому его окружение -- также точная копия родительского. Если про -дочерний процесс известно, что он использует значения некоторых -переменных из числа передаваемых ему с окружением, родительский может -заранее указать, каким из копируемых в окружении переменных нужно -изменить значение. При этом, с одной стороны, никто (кроме системы, -конечно) не сможет вмешаться в процесс передачи данных, а с другой -стороны, одна и та же утилита может быть использована одним и тем же -способом, но в изменённом окружении -- и выдавать различные -результаты: - ---------------------------------------------------------- -[methody@localhost methody]$ date - Птн Ноя 5 16:20:16 MSK 2004 -[methody@localhost methody]$ LC_TIME=C date - Fri Nov 5 16:20:23 MSK 2004 ---------------------------------------------------------- - -================================================= -Окружение:: - набор данных, приписанных системой процессу. Процесс может - пользоваться информацией из окружения для настройки, изменять - и дополнять его. Окружение представлено в виде _переменных - окружения_ и их значений. При порождении процесса окружение - родительского процесса _наследуется_ дочерним (копируется). -================================================= - -==== Работа с переменными в shell ==== - -В последнем примере Мефодий воспользовался подсмотренным у Гуревича -приёмом: присвоил некоторое значение переменной окружения в командной -строке перед именем команды. Командный интерпретатор, увидев `=` -внутри первого слова командной строки, приходит к выводу, что это -- -операция присваивания, а не имя команды, и запоминает, как надо -изменить окружение команды, которая последует после. Переменная -окружения `LC_TIME` предписывает использовать определённый язык при -выводе даты и времени а значение `C» соответствует «стандартному -системному» языку (чаще всего -- английскому). - -Если рассматривать shell в качестве высокоуровневого языка -программирования, его переменные -- самые обычные строковые -переменные. Записать значение в переменную можно с помощью операции -присваивания, а прочесть его оттуда -- с помощью операции _подстановки_ -вида `$переменная`: - ---------------------------------------------------------- -[methody@localhost methody]$ A=dit -[methody@localhost methody]$ C=dah -[methody@localhost methody]$ echo $A $B $C - dit dah -[methody@localhost methody]$ B=" " -[methody@localhost methody]$ echo $A $B $C - dit dah -[methody@localhost methody]$ echo "$A $B $C" - dit dah -[methody@localhost methody]$ echo '$A $B $C' - $A $B $C ---------------------------------------------------------- - -Как видно из примера, значение неопределённой переменной `(B)` в -shell считается пустым и при подстановке не выводится никаких -предупреждений. Сама подстановка происходит, как и генерация имён, -перед разбором командной строки, набранной пользователем. Поэтому -вторая команда echo в примере получила, как и первая два параметра -(`dit` и `dah`), несмотря на то, что переменная B была к тому времени -определена и содержала _разделитель_-пробел. А вот третья и четвёртая -команды echo получили по одному параметру. Здесь сказалось различие -между одинарными и двойными кавычками в shell: внутри двойных кавычек -действует подстановка значений переменных. - -Переменные, которые командный интерпретатор `bash` определяет после -запуска, не принадлежат окружению, и, стало быть, не наследуются -дочерними процессами. Чтобы переменная `bash` попала в окружение, её -надо проэкспортировать командой `export`: - ---------------------------------------------------------- -[methody@localhost methody]$ echo "$Qwe -- $LANG" - -- ru_RU.KOI8-R -[methody@localhost methody]$ Qwe="Rty" LANG=C -[methody@localhost methody]$ echo "$Qwe -- $LANG" - Rty -- C -[methody@localhost methody]$ sh -sh-2.05b$ echo "$Qwe -- $LANG" - -- C -sh-2.05b$ exit -[methody@localhost methody]$ echo "$Qwe -- $LANG" - Rty -- C -[methody@localhost methody]$ export Qwe -[methody@localhost methody]$ sh -sh-2.05b$ echo "$Qwe -- $LANG" - Rty -- C -sh-2.05b$ exit ---------------------------------------------------------- - -Здесь Мефодий завёл новую переменную `Qwe` и изменил значение переменной -окружения `LANG`, доставшейся стартовому `bash` от программы `login`. В -результате запущенный дочерний процесс `sh` получил изменённое значение -`LANG` и никакой переменной `Qwe` в окружении. После `export Qwe` эта -переменная была добавлена в окружение и, соответственно, передалась `sh`. - -=== Переменные окружения, используемые системой и командным интерпретатором === - -Во время сеанса работы пользователя стартовый командный интерпретатор -получает от `login` довольно богатое окружение, к которому добавляет -и собственные настройки. Просмотреть окружение в `bash` можно с помощью -команды `set`. Большинство заранее определённых переменных используются -либо самой командной оболочкой, либо утилитами системы, поэтому их -изменение приводит к тому, что оболочка или утилиты начинают работать -слегка иначе. - -Весьма примечательна переменная окружения `PATH`. В ней содержится -список каталогов, элементы которого разделяются двоеточиями. Если -команда в командной строке -- не собственная команда shell (вроде `cd`) -и не представлена в виде пути к запускаемому файлу (как `/bin/ls` или -`./script`), то shell будет искать эту команду среди имён запускаемых -файлов во всех каталогах `PATH`, и только в них. Точно так же будут -поступать и другие утилиты, использующие _библиотечную функцию_ -`execlp()` или `execvp()` (запуск программы). - -По этой причине исполняемые файлы невозможно запускать просто по -имени, если они лежат в текущем каталоге, и текущий каталог не входит -в `PATH`. Мефодий в таких случаях пользовался кратчайшим из возможных -путей, `./` (например, вызывая сценарий `./script`). - ---------------------------------------------------------- -[methody@localhost methody]$ echo $PATH - /home/methody/bin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin:/usr/games -[methody@localhost methody]$ mkdir /home/methody/bin -[methody@localhost methody]$ mv to.sort loop script bin/ -[methody@localhost methody]$ script - Hello, Methody! ---------------------------------------------------------- - -Пути, указанные в `PATH` не обязаны существовать на самом деле. -Обнаружив в `$PATH` элемент `/home/methody/bin` (подкаталог `bin` -домашнего каталога), Мефодий решил, что гораздо правильнее будет -складывать исполняемые файлы не куда попало, а именно в этот каталог: -во-первых, это упорядочит структуру домашнего каталога, а в во-вторых, -позволит запускать эти файлы по имени. Но для начала пришлось этот -каталог создать. Порядок, при котором собственные программы лежат в -специальном каталоге, куда безопаснее беспорядка, при котором поиск -запускаемого файла по имени начинается с текущего каталога. Если в -текущем каталоге окажется программа `ls`, и этот каталог -- не `/bin`, -а, допустим, `/home/shogun/dontrunme`, стоит ожидать подвоха... - -Переменных окружения, влияющих на работу разных утилит, довольно -много. Например, переменные семейства LC_ (полный их список выдаётся -командой `locale`), определяющие язык, на котором выводятся -диагностические сообщения, стандарты на формат даты, денежных единиц, -чисел, способы преобразования строк и т. п. Очень важна переменная -TERM, определяющая тип терминала: как известно из лекции <> разные терминалы имеют различные -управляющие последовательности, поэтому программы, желающие эти -последовательности использовать, обязательно сверяются с переменной -`TERM` footnote:[В действительности такие программы обычно используют -библиотеку `curses`, оперируя не зависящими от типа терминала понятиями -(вроде «очистка экрана» или «позиционирование курсора», а процедуры из -`curses` преобразуют их в управляющие последовательности конкретного -терминала, сверившись сначала с `$TERM`, а затем -- с содержимым -соответствующего раздела базы данных по терминалам, -которая называется `terminfo`.]. Если какая-то утилита -требует редактирования файла, этот файл -передаётся программе, путь к которой хранится в переменной `EDITOR` -(обычно это `/usr/bin/vi`, о котором речь пойдёт в лекции Текстовые -редакторы). Наконец, некоторые переменные вроде `UID`, `USER` или `PWD` -просто содержат полезную информацию, которую можно было бы добыть и -другими способами. - -Некоторые переменные окружения предназначены специально для `bash`: они -задают его свойства и особенности поведения. Таковы переменные -семейства PS (Prompt String). В этих переменных хранится -строка-подсказка, которую командный интерпретатор выводит в разных -состояниях. В частности, содержимое `PS1` -- это подсказка, которую -shell показывает, когда вводит командную строку, а `PS2` -- когда -пользователь нажимает *Enter*, а интерпретатор по какой-то причине -считает, что ввод командной строки не завершён (например, не закрыты -кавычки). С `$PS2` (символом «>») Мефодий уже сталкивался в лекциях -<> и <>. - ---------------------------------------------------------- -[methody@localhost methody]$ cd examples/ -[methody@localhost examples]$ echo $PS1 - [\u@\h \W]\$ -[methody@localhost examples]$ PS1="--> " ---> ---> -PS1="\t \w " -22:11:47 -22:11:48 ~ -22:11:48 ~ PS1="\u@\h:\w \$ " -methody@localhost:~/examples $ -methody@localhost:~/examples $ -methody@localhost:~/examples $ cd -methody@localhost:~ $ -methody@localhost:~ $ ---------------------------------------------------------- - -Мефодий экспериментировал с `PS1`, параллельно читая документацию по -`bash` (`(bash.info)Printing a Prompt`). Оказывается, в этом -командном интерпретаторе содержимое `PS1` не просто подставляется при -выводе, оно ещё и преобразуется, позволяя выводить всякую полезную -информацию: имя пользователя (соответствует подстроке `\u`, user), -имя компьютера (`\h`, host), время (`\t`, time), путь к текущему -каталогу (`\w`, work directory) и т. п. В примере Мефодий заменил в -конце концов `\W` (показывающую последний элемент пути, то есть -собственное имя текущего каталога) на `\w`, полный путь, потому что -`\w` обладает свойством выделять в полном пути домашний каталог и -заменять его на `~`. Такое преобразование значений переменных -семейства `PS1` происходит только когда их использует `bash` в качестве -подсказки, а при обычной подстановке этого не происходит. - -=== Язык программирования sh === - -Некогда Мефодий выучил несколько языков программирования, и уже -собрался было написать кое-какие нужные программы на Си или Python, -однако Гуревич его остановил. Большая часть того, что нужно -начинающему пользователю Linux, делается с помощью одной правильной -команды, или вызовом нескольких команд в конвейере. От пользователя -только требуется оформить решение задачи в виде сценария на shell. На -самом же деле уже самый первый из командных интерпретаторов, `sh`, был -настоящим высокоуровневым языком программирования -- если, конечно, -считать все утилиты системы его операторами. При таком подходе от sh -требуется совсем немного: возможность вызывать утилиты, возможность -свободно манипулировать результатом их работы и несколько -алгоритмических конструкций (условия и циклы). - -К сожалению, программирование на shell, а также и других, более -мощных интерпретируемых языках в Linux, не помещается в рамки нашего -курса. Так что, пока Мефодий читает документацию по `bash` и -самозабвенно упражняется в написании сценариев, нам остаётся только -поверхностно рассмотреть свойства shell как языка программирования и -интегратора команд. Заметим попутно, что писать сценарии для `bash` -- -непрактично, так как исполняться они смогут лишь при помощи `bash`. -Если же ограничить себя рамками `sh`, совместимость с которым объявлена -и в `bash`, и в `zsh`, и в `ash` (наиболее близком к `sh` по возможностям), и -в других командных интерпретаторах, выполняться эти сценарии смогут -любым из sh-подобных интерпретаторов, и не только в Linux. - -==== Интеграция процессов ==== - -Каждый процесс Linux при завершении передаёт родительскому код -возврата (exit status), который равен нулю, если процесс считает, что -его работа была успешной, или номеру ошибки в противном случае. -Командный интерпретатор хранит код возврата последней команды в -специальной переменной `?`. Что более важно, код возврата -используется в условных операторах: если он равен нулю, условие -считается выполненным, а если нет -- невыполненным: - ---------------------------------------------------------- -[methody@localhost methody]$ grep Methody bin/script -echo 'Hello, Methody!' -[methody@localhost methody]$ grep -q Methody bin/script ; echo $? -0 -[methody@localhost methody]$ grep -q Shogun bin/script ; echo $? -1 -[methody@localhost methody]$ if grep -q Shogun bin/script ; then echo "Yes"; fi -[methody@localhost methody]$ if grep -q Methody bin/script ; then echo "Yes"; fi -Yes ---------------------------------------------------------- - -_Условный оператор_ `if` запускает команду-условие, `grep -q`, которая -ничего не выводит на экран, зато возвращает 0, если шаблон найден, и -1, если нет. В зависимости от кода возврата этой команды, `if` -выполняет или не выполняет тело: список команд, заключённый между -`then` и `fi`. Точка с запятой разделяет операторы в `sh`; либо она, либо -перевод строки необходимы перед `then` и `fi`, иначе всё, что идёт после -grep интерпретатор посчитает параметрами этой утилиты. - -Множеством функций обладает команда `test`: она умеет сравнивать числа -и строки, проверять ярлык объекта файловой системы и наличие самого -этого объекта. У `test` есть второе имя: `[` (как правило, -`/usr/bin/[` -- символьная или даже жёсткая ссылка на `/usr/bin/test`), -позволяющее оформлять оператор `if` более привычным образом: - ---------------------------------------------------------- -[methody@localhost methody]$ if test -f examples ; then ls -ld examples ; fi -[methody@localhost methody]$ if [ -d examples ] ; then ls -ld examples ; fi -drwxr-xr-x 2 methody methody 4096 Окт 31 15:26 examples -[methody@localhost methody]$ A=8; B=6; if [ $A -lt $B ] ; then echo "$A<$B" ; fi -[methody@localhost methody]$ A=5; B=6; if [ $A -lt $B ] ; then echo "$A<$B" ; fi -5<6 ---------------------------------------------------------- - -Команда `test -f` проверяет, на является ли её аргумент файлом; -поскольку `examples` -- это каталог, результат -- не успешный. -Команда `[ -d` -- то же самое, что и `test -d` (не каталог ли первый -параметр), только последним параметром этой команды -- исключительно -для красоты -- должен быть символ `]`. Результат -- успешный, и -выполняется команда `ls -ld`. Команда `test параметр1 -lt параметр3` -проверяет, является ли `параметр1` числом, меньшим, чем (less then) -`параметр3`. В более сложных случаях оператор `if` удобнее записывать -«лесенкой», выделяя переводами строки окончание условия и команды -внутри тела (их может быть много). - -Второй тип подстановки, которую shell делает внутри двойных кавычек --- это _подстановка вывода_ команды. Подстановка вывода имеет вид -`команда` (другой вариант -- `$(команда)`). Как и подстановка -значения переменной, она происходит перед тем, как начнётся разбор -командной строки: выполнив команду и получив от неё какой-то текст, -shell примется разбирать его, как если бы этот текст пользователь -набрал вручную. Это очень удобное средство, если то, что выводит -команда, необходимо передать самому интерпретатору: - ---------------------------------------------------------- -[methody@localhost methody]$ A=8; B=6 [methody@localhost methody]$ -expr $A + $B 14 [methody@localhost methody]$ echo "$A + $B = `expr -$A + $B`" 8 + 6 = 14 [methody@localhost methody]$ A=3.1415; B=2.718 -[methody@localhost methody]$ echo "$A + $B = `expr $A + $B`" expr: -нечисловой аргумент 3.1415 + 2.718 = [methody@localhost methody]$ -echo "$A + $B" | bc 5.8595 [methody@localhost methody]$ C=`echo "$A -+ $B" | bc` [methody@localhost methody]$ echo "$A + $B = $C" 3.1415 -+ 2.718 = 5.8595 ---------------------------------------------------------- - -Сначала для арифметических вычислений Мефодий хотел воспользоваться -командой `expr`, которая работает с параметрами командной строки. С -целыми числами expr работает неплохо, и её результат можно подставить -прямо в аргумент команды `echo`. С действительными числами умеет -работать утилита-_фильтр_ `bc`; арифметическое выражение пришлось -сформировать с помощью `echo` и передать по конвейеру, а результат -- -поместить в переменную C. Во многих современных командных оболочках -есть встроенная целочисленная арифметика вида `$(( выражение ))`. - -==== Сценарии ==== - -В языке `sh` много внимания было уделено удобству написания -_сценариев_. В частности, параметры командой строки, переданные -сценарию, доступны в нём в виде переменных, имена которых совпадают с -порядковым номером параметра: - ---------------------------------------------------------- -[methody@localhost methody]$ cat > bin/two -#!/bin/sh -echo "Running $0: $*" -$1 $3 -$2 $3 -[methody@localhost methody]$ chmod +x bin/two -[methody@localhost methody]$ bin/two file "ls -ld" examples -Running bin/two: file ls -ld examples -examples: directory -drwxr-xr-x 2 methody methody 4096 Окт 31 15:26 examples -[methody@localhost methody]$ two "ls -s" wc "bin/two bin/loop" junk -Running /home/methody/bin/two: ls -s wc bin/two bin/loop junk -4 bin/loop 4 bin/two - 4 9 44 bin/two - 1 5 26 bin/loop - 5 14 70 итого ---------------------------------------------------------- - -Как видно из примера, форма `$номер_параметра` позволяет обратиться и -к нулевому параметру -- команде, а вся строка параметров хранится в -переменной *`. Кроме того, свойство подстановки выполняться до -разбора командной строки позволило Мефодию передать в качестве одного -параметра `ls -ld` или `bin/two bin/loop`, а интерпретатору -- -разбить эти параметры на имя команды и ключи и два имени файла -соответственно. - -В `sh` есть и _оператор цикла_ `while`, формат которого аналогичен -`if`, и более удобный именно в сценариях оператор обхода списка `for` -(список делится на слова так же, как и командная строка -- с помощью -_разделителей_): - ---------------------------------------------------------- -[methody@localhost methody]$ for Var in Wuff-Wuff Miaou-Miaou; do echo $Var; done -Wuff-Wuff -Miaou-Miaou -[methody@localhost methody]$ for F in `date`; do echo -n "<$F>"; done; echo -<Сбт><Ноя><6><12:08:38><2004> -[methody@localhost methody]$ cat > /tmp/setvar -QWERTY="$1" -[methody@localhost methody]$ sh /tmp/setvar 1 2 3; echo $QWERTY - -[methody@localhost methody]$ . /tmp/setvar 1 2 3; echo $QWERTY -1 ---------------------------------------------------------- - -Во втором `for` Мефодий воспользовался _подстановкой_ вывода команды -`date`, каждое слово которой вывел с помощью `echo -n` в одну строку, -а в конце команды пришлось вывести один перевод строки вручную. - -Вторая половина примера иллюстрирует ситуацию, с которой Мефодий -столкнулся во время своих экспериментов: все переменные, определяемые -в сценарии, куда-то пропадают после окончания его работы. Оно и -понятно: для обработки сценария всякий раз запускается новый -интерпретатор (_дочерний процесс!_), и все его переменные принадлежат -именно ему и с завершением процесса уничтожаются. Таким образом -достигается отсутствие побочных эффектов: запуская программу, -пользователь может быть уверен, что та не изменит окружения командной -оболочки. Однако в некоторых случаях требуется обратное: запустить -сценарий, который нужным образом настроит окружение. Единственный -выход -- отдавать такой сценарий на обработку текущему, а не новому, -интерпретатору (т. е. тому, что разбирает команды пользователя). Это -и делается с помощью специальной команды «.». Если вдруг в -передаваемом сценарии обнаружится команда `exit`, `exec` или какая-нибудь -другая, приводящая к завершению работы интерпретатора, завершится -именно текущая командная оболочка, чем сеанс работы пользователя в -системе может и закончиться. - -==== Настройка командного итерпретатора ==== - -Научившись (главным образом в результате чтения документации и -непрестанных экспериментов) создавать работающие сценарии, Мефодий -решил приступить к настройке командной оболочки, поскольку, как он -слышал, для этого используются именно сценарии. - -==== Привязка к клавишам ==== - -Оказалось, что настройка управляющих клавиш в `bash` не выглядит как -сценарий, и даже имеет отношение не только к `bash`, а ко всем -программам, использующим _библиотеку_ терминального ввода `readline`. -_Конфирурационный файл_ `readline` называется `.inputrc` и состоит, в -основном, из команд вида "управляющая_последовательность": функция, -где управляющая_последовательность -- это символы, при получении -которых `readline` выполнит функцию работы с вводимой строкой. Список -всех функций `readline` можно узнать у `bash` по команде `bind -l`, а -список всех привязок этих функций к клавиатурным последовательностям --- по команде `bind -p`. Мефодий вписал в `.inputrc` такие две строки: - ---------------------------------------------------------- -"\e[5~": backward-word -"\e[6~": forward-word ---------------------------------------------------------- - -Упомянутые в примере функции позволяют перемещать курсор в командной -строке по словам, а ESC-последовательности возвращаются, -соответственно, клавишами *Page Up* и *Page Down* виртуальной консоли -Linux (сочетание «e» означает в `.Inputrc` клавишу *ESC*, то есть `^[`, -символ с ASCII-кодом 27). - -К одной и той же функции `readline` можно привязать сколько угодно -управляющих последовательностей: например, клавиша *&home&* делает то -же, что и `^A`, *Стрелка вверх* -- то же, что и `^P`, а *Del* -- то же, -что и `^D` (только не в пустой строке!). Этим отчасти решается -проблема несовместимости управляющих последовательностей терминалов: -если в каком-нибудь терминале другого типа *Page Up* или *Page Down* будут -возвращать другие последовательности, Мефодий просто добавит в -`.inputrc` ещё одну пару команд. Правда, Гуревич советовал вовсе -отказаться от редактирования `.inputrc`, а воспользоваться утилитой -`tput`, которая обращается к переменной `TERM` и базе данных по -терминалам `terminfo` и готова выдать верную для любого данного -терминала информацию по `kpp` (key previous page) и `knp` (key next -page). Выдачу `tput` можно «скормить» той же `bind`, и получить команду, -которая работает на любом терминале: `bind ""tput kpp": -backward-word"` (кавычки, экранированные обратной косой чертой, `"`, -передадутся `bind` в неизменном виде). - -==== Стартовые сценарии ==== - -Настройка оболочки -- это в первую очередь настройка _окружения_. В -начале сеанса работы (при запуске _стартового командного -интерпретатора_) выполняется с помощью команды `.` сценарий из файла -со специальным именем -- `/etc/profile`. Это -- т. н. _общесистемный -профиль_, стартовый сценарий, выполняющийся при входе в систему -любого, кто использует командную оболочку, подобную `sh`. Следом -выполняется _персональный профиль_ (или просто _профиль_) пользователя, -сценарий, находящийся в домашнем каталоге, и называющийся `.profile`. -Этот сценарий пользователь может видоизменять, как ему -заблагорассудится. - -Что касается `bash`, то структура его стартовых файлов сложнее. Прежде -всего, `~/.profile` выполняется только если в домашнем каталоге нет -файла `.bash_profile` или `.bash_login`, иначе стартовый сценарий берётся -оттуда. В эти файлы можно помещать команды, несовместимые с другими -версиями shell, например, управление _сокращениями_ или привязку функций -к клавишам. Кроме того, каждый интерактивный (взаимодействующий с -пользователем), но не стартовый `bash` выполняет системный и персональный -конфигурационные сценарии `/etc/bashrc` и `~/.bashrc`. Чтобы стартовый -`bash` также выполнял `~/.bashrc`, соответствующую команду необходимо -вписать в `~/.bash_profile`. Далее, каждый не интерактивный (запущенный -для выполнения сценария) `bash` сверяется с переменной окружения -`BASH_ENV` и, если в этой переменной записано имя существующего файла, -выполняет команды оттуда. Наконец, при завершении стартового `bash` -выполняются команды из файла `~/.bash_logout`. - -==== Пример настроек ==== - -Ниже приведены примеры конфигурационных файлов, которые Мефодий, сам -или с помощью Гуревича, разместил в домашнем каталоге. - ---------------------------------------------------------- -PS1="\u@\h:\w \$ " -EDITOR="/usr/bin/vim" -export PS1 EDITOR - -# Get the aliases and functions -if [ -f ~/.bashrc ]; then - . ~/.bashrc -fi ---------------------------------------------------------- - -В этом файле вызывается `~/.bashrc` (если он существует). - ---------------------------------------------------------- -# User specific aliases and functions -if [ -r ~/.alias ]; then - . ~/.alias -fi - -# Source global definitions -if [ -r /etc/bashrc ]; then - . /etc/bashrc -fi ---------------------------------------------------------- - -Мефодий решил, что сокращения удобнее будет хранить в отдельном -файле -- `~/.alias`. Кроме того, вызывается сценарий `bashrc`, -который Мефодий обнаружил в каталоге `/etc`. Этот файл не входит в -число автоматически выполняемых `bash`, поэтому его выполнение надо -задавать явно. - ---------------------------------------------------------- -alias > ~/.alias ---------------------------------------------------------- - -Заметив, что команда `alias` выдаёт список сокращений в том же -формате, в котором они и задаются, Мефодий придумал, как обойтись без -редактирования файла `~/.alias`. Отныне все сокращения, определённые к -моменту завершения сеанса работы, будут записываться обратно в -`.alias`. Туда попадут и те сокращения, что прочлись во время -выполнения `.bashrc`, и те, что впоследствии были определены вручную. - ---------------------------------------------------------- -alias l='ls -FAC' -alias ls='ls --color=auto' -alias pd='pushd' -alias pp='popd' -alias v='ls -ali' -alias vi='/usr/bin/vim' ---------------------------------------------------------- - -Последняя запись в файле `.alias` относится к инструменту, которым -Мефодий создавал все эти файлы: текстовому редактору `vim`. О текстовых -редакторах речь пойдёт в следующей лекции. - -[[editors]] -== Текстовые редакторы == - -=== Задача текстовых редакторов === - -После основных утилит для работы с файлами и текстом первая -программа, которая понадобится любому пользователю Linux -- это -_текстовый редактор_ (для краткости -- просто _редактор_). Из предыдущих -лекций и собственных экспериментов Мефодию уже стало понятно, какое -значительное место занимают в системе Linux данные в _текстовом -формате_, т. е. состоящие из символов, которые могут быть отображены -на экране терминала и которые может прочесть человек. Однако пока -Мефодий мог работать с текстом только последовательно: строка за -строкой, даже если имел дело с файлом, он не мог вернуться и -отредактировать уже переданные системе строки. Именно для того, чтобы -работать с текстовым файлом как со страницей, по которой можно -перемещаться и редактировать текст в любой точке, и нужны текстовые -редакторы footnote:[Эта кажущаяся сегодня тривиальной возможность -сколько угодно редактировать текст, не оставляя при этом никаких -следов, была радикальнейшим достижением прогресса по сравнению с -пишущей машинкой.]. - -Текстовый редактор потребуется пользователю Linux в первую очередь -для того, чтобы изменить настройки системы или своего окружения, -например, shell -- при этом нужно будет редактировать _конфигурационные -файлы_, которые всегда представлены в текстовом формате (см. лекции -<> и -<>). Но и -собственные задачи пользователя могут потребовать редактирования -текстовых файлов: например, сценарии и программы, электронные письма, -а также заметки для себя, которые пишет Мефодий -- это всё данные в -текстовом формате. Текстовые данные, полученные при помощи -стандартных утилит, тоже бывает удобно сохранять в файлах и -редактировать. - -Не стоит путать текстовые редакторы и _текстовые процессоры_. Текстовые -процессоры, -- например, OpenOffice Writer или Microsoft Word -- -предназначены для создания документов, в которых, помимо собственно -текста, содержится и различная метаинформация (информация об -оформлении): размещение текста на странице, шрифт и т. п. Поскольку в -текстовом формате не предусмотрено средств для сохранения информации -об оформлении (там есть только символы и строки), текстовые -процессоры используют свои собственные форматы для хранения данных. -Текст, в котором нет никакой метаинформации об оформлении, называют -«plain text» (только текст, «плоский», простой текст). - -Однако при помощи текстовых редакторов можно работать не только с -форматом plain text. Различная метаинформация (об оформлении, способе -использования текста, например, в качестве ссылки и пр.) может быть -записана и в виде обычных символов (т. е. в текстовом формате), но со -специальным соглашением, что эти символы нужно интерпретировать -особым образом: как инструкции по обработке текста, а не как текст. -Такие инструкции называются _разметкой_. Таким образом устроен, -например, формат HTML. Для того чтобы обработать разметку HTML и в -соответствии с ней отобразить текст, нужна специальная программа -- -браузер, но редактировать файлы HTML и прочие форматы разметки можно -и при помощи текстового редактора. Кроме того, программы на любых -языках программирования и сценарии (программы на shell), тоже -представляют собой текстовые файлы. Многие текстовые редакторы -ориентированы на работу не только с плоским текстом, но и с текстом в -различных форматах. Для этого придумана масса усовершенствований, -уменьшающих количество символов, которые нужно вводить вручную: -специальные команды, клавиатурные сокращения и автодополнение -ключевых слов и конструкций. - -Важнейшее условие для текстового редактора в Linux -- возможность -работать в терминале, т. к. это основной способ управления системой. -Поэтому и ввод данных, и редактирование должны полностью -осуществляться средствами терминала, т. е. алфавитно-цифровыми и -некоторыми функциональными клавишами. Поскольку функциональных -клавиш, на которые можно рассчитывать на любом терминале, совсем -немного, а команд, которые нужно отдавать редактору, -- много очень, -требуется способ вводить любые команды ограниченными средствами -терминала. Это условие, равно как и требование удобной работы с -разнообразными структурированными текстами, выполнено в двух -«главных» текстовых редакторах Linux -- Vi и Emacs, о которых в -основном и будет идти речь в этой лекции. - -=== Vi и лучше, чем Vi === - -В любой системе Linux, даже самой минимальной, всегда присутствует -текстовый редактор, поскольку в любой -- даже самой катастрофической -- -ситуации у пользователя должна быть возможность отредактировать -конфигурационные файлы, чтобы привести систему в рабочее состояние. -По сложившейся традиции текстовым редактором, который обязательно -запустится из любой командной строки Linux, является Vim footnote:[Vi, -как и большинство основных утилит и принципов, унаследован Linux от -UNIX. Название Vim происходит от visual editor, «визуальный», экранный -редактор, поскольку Vim -- первый редактор для UNIX, использующий весь -экран для отображения текста и позволяющий работать с текстом не -построчно, а перемещаясь по нему в любых -направлениях, как по странице.]. Однако -верно и обратное: если Вы работаете в незнакомой системе Linux или -произошёл сбой, в результате которого доступна только очень небольшая -часть системы, нельзя быть уверенным, что найдётся хоть какой-нибудь -другой текстовый редактор кроме Vim. Поэтому каждому пользователю -Linux нужны хотя бы основные навыки работы в Vim. При первом -знакомстве c Vim работа обычно не ладится: очень уж он непривычен, -его нельзя с удобством использовать, запомнив только две-три -простейшие команды редактирования. Стоит понять основные принципы -работы в Vim и потратить некоторое время на его освоение, тогда в нём -откроется мощный инструмент, позволяющий очень эффективно работать с -текстом. - -Под именем Vim, на самом деле, могут скрываться несколько разных -программ: с момента появления Vim в операционной системе UNIX (а это -произошло около 30-ти лет назад), этот редактор стал чем-то вроде -стандарта. К настоящему времени существует ряд программ либо в -точности повторяющих вид и поведение «классического» Vim (например, -nvi), либо очень похожих на него, но со значительно расширенными -возможностями (Vi, elvis). Наибольшей популярностью пользуется Vi, -возможности которого огромны, для их описания потребовалось почти сто -тысяч строк документации. Когда пользователь Linux набирает в -командной строке Vim, скорее всего будет запущена «облегчённая» -версия Vi, которая настроена таким образом, чтобы максимально -воспроизводить поведение классического редактора Vim. Естественно, в -таком режиме часть возможностей Vi недоступна. Все свойства, -которыми Vi отличается от Vim, обязательно снабжены в руководстве по -Vi указанием «not in vi». В дальнейшем изложении под Vim мы будем -понимать именно Vi в режиме совместимости, все возможности, -недоступные в этом режиме, будут отдельно оговариваться. Чтобы -вызвать Vi в полнофункциональном режиме, достаточно набрать команду -`Vi`. - -Популярность Vi не случайна: этот текстовый редактор позволяет не -только производить простые операции редактирования текстовых файлов, -но и хорошо приспособлен для максимально быстрого и эффективного -решения ряда смежных с редактированием задач. Среди самых важных его -возможностей -- инструменты для работы с текстами на различных языках -программирования и в различных форматах разметки. Vim умеет -подсвечивать разными цветами синтаксические конструкции языка -программирования или разметки footnote:[Обычно современные терминалы и -программы-эмуляторы терминалов поддерживают вывод текста по крайней мере -несколькими разными цветами.], автоматически выставлять отступы, что -облегчает восприятие структуры документа. Кроме того, в Vi есть -специальные средства для организации цикла отладки программы: -компиляция–правка исходного текста–компиляция... Подробнее об этих и -прочих возможностях Vi можно узнать из руководств по Vi. Объём данной -лекции позволяет описать только самые начала работы с Vi, более -подробное введение в этот текстовый редактор можно найти в книге -[Курячий:2004]. - -==== Запуск vi ==== - -Чтобы начать сеанс редактирования в Vim, достаточно выполнить -команду `Vim` на любом терминале. Чтобы открыть для редактирования уже -существующий файл, путь к этому файлу нужно указать в качестве -параметра: `vi путь_к_файлу`. Как и всякая уважающая себя программа -UNIX, Vim может быть запущен с множеством модифицирующих его -поведение _ключей_, которые подробно описаны в руководстве. Вызванный -без параметра, редактор откроет пустой _буфер_ -- чистый лист для -создания нового текста. В центре экрана при этом может появиться -краткое приветственное сообщение, где указаны версия программы и -команды для получения помощи и выхода из редактора (что -нетривиально!). Однако такое сообщение может и не возникнуть -- это -зависит от версии Vim, установленной в системе. - -Для отображения текста и работы с ним Vim использует весь экран -терминала, только последняя строка предназначена для диалога с -пользователем: вывода информационных сообщений и ввода команд. Пока -буфер не заполнен текстом, в начале каждой строки экрана отображается -символ `~`, обозначающий, что в этом месте буфера нет ничего, даже -пустой строки. Общий вид экрана в начале работы будет примерно такой: - --------------------------------------------------- -# -~ -~ -~ -~ -~ --------------------------------------------------- - -Символ `#` обозначает курсор. На экране терминала умещается больше -строк, но в примерах мы будем для компактности изображать только -необходимый минимум. - -==== Режимы ==== - -В Vim проблема разделения команд редактору и вводимого текста решена -при помощи _режимов_: в командном режиме нажатие на любую клавишу -- это -команда редактору, в режиме вставки нажатие на клавишу приводит к -вставке соответствующего символа в редактируемый текст. Поэтому при -работе с Vim пользователю всегда нужно обращать внимание на то, в -каком режиме находится редактор. - -==================================================== -Режимы vi:: - состояния редактора Vim, в которых он по-разному обрабатывает - нажатия клавиш. Различают три режима Vim: командный (нажатие - любой клавиши считается командой и немедленно исполняется), - вставки (нажатие клавиши-печатного символа приводит к вставке - этого символа в текст) и командной строки (для ввода длинных - команд, отображаемых на экране; ввод завершается *Enter*. -==================================================== - -Vim всегда начинает работу в командном режиме. В этом режиме есть два -способа отдавать команды редактору. Во-первых, нажатие практически на -любую клавишу редактор воспринимает как команду. В Vi, даже в режиме -Vim-совместимости, командное значение определено для всех латинских -букв (в верхнем и нижнем регистрах), цифр, знаков препинания и -большинства других печатных символов. При нажатии на эти клавиши -вводимые команды нигде не отображаются, они просто исполняются. - -==================================================== -Не нужно пытаться вводить текст в командном режиме: поскольку у каждой -буквы есть командное значение, результат может быть самым неожиданным! -==================================================== - -Во-вторых, у Vim есть своя командная строка: чтобы её вызвать, нужно -ввести `:` в командном режиме. В результате в начале последней строки -экрана появится двоеточие -- это приглашение командной строки. Здесь -вводятся более сложные команды Vim, которые включают в себя целые -слова (например, имена файлов), причём текст набираемой команды, -конечно, отображается. Команды передаются Vim клавишей *Enter*. В -современных версиях Vim с командной строкой можно работать так же, -как и в shell: редактировать её, достраивать команды клавишей *Tab*, -пользоваться историей команд. - -Главная команда командной строки Vi -- вызов подсистемы помощи -`:helpEnter`. Двоеточие переводит Vi в режим командной строки, -«help» -- собственно команда, *Enter* передаёт команду. `help` -можно вызывать с аргументом: названием команды или настройки Vi. -Vim очень хорошо документирован, поэтому по команде `:help объект` -можно получить информацию о любом свойстве Vi, например, команда -`:help i` выведет сведения о значении клавиши `i` в командном режиме Vi. - -Команда «:set имя_настройки» позволяет настраивать Vim прямо в процессе -работы с ним. Например, отдав команду «:set wrap» пользователь тем -самым включает настройку «wrap», что заставляет редактор переносить -слишком длинные строки, не умещающиеся в ширину терминала. Выключить -эту настройку можно командой «:set nowrap», так что концы длинных -строк исчезнут за правым краем экрана. - -Наконец, чтобы ввести текст, нужно перейти из командного режима в -режим вставки, нажав клавишу `i` (от «insert» -- «вставка»). В этот -момент в последней строке появится информационное сообщение о том, -что редактор находится в режиме вставки: `--INSERT--` или -`--ВСТАВКА--` footnote:[Если используется не Vi, или настройка -`showmode` по умолчанию запрещена, сообщения может и не быть.], в -зависимости от установленного языка системных сообщений. - -В режиме вставки можно вводить текст, завершая строку нажатием на -*Enter*. Однако нужно помнить, что в некоторых (ортодоксальных) -версиях Vim в режиме ввода не работают никакие команды перемещения -по тексту, здесь можно только набирать. Если Вы заметили, что ошиблись -в наборе -- не нужно сразу пытаться переместить курсор и пытаться -исправлять ошибку: гораздо удобнее будет вносить все исправления -потом, в командном режиме, где доступно множество специальных команд -быстрого перемещения и замены текста. Чтобы перейти из режима вставки -обратно в командный режим, нужно нажать *ESC*. - -Если Vim пришёл в непонятное для Вас состояние, нажмите *ESC*, чтобы -вернуться в командный режим (иногда требуется нажать *ESC* дважды). - -Мефодий начал упражняться с Vim на файле примеров: - ------------------------------------------ -methody@oblomov:~ $ vi textfile -Это файл для примеров. -Пример 1. -~ -~ -~ -~ -~ -"textfile" 2L, 33C 1,1 Весь ------------------------------------------ - -Vim начал работу -- как и положено -- в командном режиме. В последней -строке возникли некоторые полезные сведения об открытом файле: его -имя, общее количество строк (`2L`), символов (`33С`), позиция курсора -(`1,1` -- номер_строки`, `номер_символа`). `Весь` обозначает, что всё -содержимое файла уместилось на экране терминала. Теперь Мефодий -нажмёт `i` и введёт немного текста: - ------------------------------------------ -Это файл для примеров. -Пример 1. -Моя первая строка в vi! -~ -~ -~ -~ --- ВСТАВКА -- 3,24 Весь ------------------------------------------ - -Теперь Vim в режиме вставки: в последней строке появилось информационное -сообщение об этом. Набрав текст, Мефодий может вернуться в командный -режим, нажав ESC (подсказка «--ВСТАВКА--» при этом исчезнет из -последней строки). - -На самом деле, из командного режима можно перейти в режим ввода -несколькими командами, разница между ними заключается в том, в -какой точке начнётся ввод символов. Например, по командам `O` -и `o` («open») можно вводить текст с новой строки (до или после -текущей), по команде `I` -- с начала строки, команды `a` и `A` -(«append») ведают добавлением символов (после курсора или в конец -строки) и т. п. - -==== Работа с файлами ==== - -Редактируя текст в Vim, пользователь работает не непосредственно с -файлом, а с _буфером_. Если открывается уже существующий файл, Vim -копирует его содержимое в буфер и отображает буфер на экране. Все -изменения, которые делает пользователь, происходят именно в -содержимом буфера -- открытый файл пока остаётся неизменным. Если -же Vim вызван без параметра, то создаётся пустой буфер, который -пока не связан ни с каким файлом footnote:[В действительности содержимое -буфера хранится в специальном временном файле (swap file). Если -сеанс работы в редакторе по какой-то причине прервался, то этот -временный файл не будет удалён, и при следующей попытке продолжить -незаконченную работу с файлом Vim предложит провести процедуру -восстановления -- на случай, если во временном файле остались -не сохранённые изменения.]. - -Чтобы записать сделанные изменения в файл, используется команда -`:wEnter` (чтобы её отдать, нужно сначала перейти в командный режим). -О том, что `w` -- это сокращение от англ. «write», «записать», можно -узнать, нажав *Tab* после `:w` -- и Vim дополнит эту команду до «write». -Подобным образом можно поступить с большинством команд в командной -строке Vim -- в этом редакторе очень последовательно соблюдается -принцип _аббревиативности_. Мефодий выполнил `write` и получил такое -информационное сообщение: - ---------------------------------------------- -Это файл для примеров. -Пример 1. -Моя первая сторка в vi! -~ -~ -~ -~ -"textfile" 3L, 57C записано 3,24 Весь ---------------------------------------------- - -Мефодий не указал, куда именно записать содержимое буфера, и по -умолчанию оно было записано в тот файл, который он и открывал для -редактирования: «textfile». Однако команде «write» можно указать -любое имя файла в качестве параметра -- и тогда содержимое буфера -будет записано в этот файл, а если такого файла нет, то он будет -создан. Параметр «write» обязательно потребуется, если текст в -буфере ещё не записан ни в каком файле. - -Наиболее важна для новичка команда выхода из Vim -- `:qEnter` -(сокращение от «quit»). Пользователь, запустивший редактор в первый -раз, нередко сталкивается с тем, что никак не может его закрыть: -не работает ни один из привычных способов завершения программы, -даже `^C` Vim обрабатывает по-своему footnote:[Управляющая -последовательность «^C» приводит к аварийному завершению текущей -команды vi, а не самого редактора.]. И `:w` и `:q` -- команды -режима командной строки, в этот режим Vim переводится из командного -режима с помощью `:` в мх начале. - -Однако если в буфере есть изменения, которые ещё не записаны ни в -каком файле, то Vim откажется выполнять команду «:q», предложив -сначала сохранить эти изменения. Если Вы не хотите сохранять изменения, -нужно настоять на своём желании выйти их Vim, добавив к команде выхода -восклицательный знак: `:q!`. В этом случае все не сохранённые изменения -будут выброшены. Восклицательный знак можно добавить в конце любой -файловой команды в командной строке Vim, в этом случае Vim будет -выполнять команды, не предъявляя пользователю никаких возражений. - -В Vim предпринято множество усилий для экономии сил и времени -пользователя, командующего редактором. Поэтому вполне можно одним -разом записать текст и выйти из редактора: командой `:wq` или -аналогичной командой `:x` или просто нажав `ZZ` в командном режиме. - -==== Перемещение по тексту ==== - -При редактировании в тексте всегда есть точка, в которой вы «находитесь» -в данный момент: вводимые с клавиатуры символы появятся именно здесь, -удаляться символы будут тоже отсюда, к этой точке будут применяться -команды редактора и т. п. Обычно эта точка обозначается курсором, а -в последней (информационной) строке экрана Vim указывает номера текущей -строки и колонки (номер символа в строке), в которых находится курсор. - -Для того чтобы выполнять редактирование текста, по нему необходимо -перемещаться, т. е. перемещать курсор. Самый очевидный способ это -делать -- воспользоваться клавишами со стрелками. Нажатие на одну из -этих клавиш обычно заставляет курсор переместиться на один символ -влево/вправо или на одну строку вверх/вниз. Трудно придумать более -неэффективный и медленный способ перемещения, если нужно попасть -на другой конец объёмистого текста, и даже простое перемещение к -началу или концу строки может занять несколько секунд. - -Заметим, что в процессе редактирования текста обычно возникает -необходимость перемещаться не в произвольную точку, а в некоторые -ключевые: начало и конец строки, слова, предложения, абзаца, -выражения, заключённого в скобки, целого текста. Особенно это заметно, -если требуется редактировать структурированный текст: программу -(например, сценарий), конфигурационный файл и т. п. В Vim для каждого -такого перемещения предусмотрены специальные команды, обычно состоящие -в нажатии одной клавиши в командном режиме. Используя их, можно не -только одной кнопкой переместиться на любое расстояние в тексте, но -и двигаться по структурным элементам, переходя к предыдущему/следующему -слову, предложению, абзацу, скобке и т. д. - -======================================================= -Прежде чем начинать экспериментировать с перемещением, нужно перейти -в командный режим. -======================================================= - -Итак, передвинуть курсор на начало текущей строки можно командой `0`, -на первый не пробельный символ в строке -- `^`, в конец строки -- `$` -footnote:[Символами `^` и `$` в Linux повсеместно обозначаются начало -и конец строки, в частности, в регулярных выражениях.]. -Абзацами Vim считает фрагменты текста, разделённые пустой строкой, -к началу предыдущего/следующего абзаца можно попасть командами -`{` и `}` соответственно. Очень распространённая необходимость -- -попасть в самый конец файла: для этого служит команда `G` («Go»), -в самое начало -- `gg` («go-go»?). - -Передвинуть курсор вперёд на начало следующего слова можно командой `w` -(от «word», слово), на начало предыдущего -- `b` (от «backward», назад). -К началу предыдущего/следующего предложений можно переместиться -командами `(` и `)` соответственно. Нужно учитывать, что границы слов -и предложений Vim находит по формальным признакам (руководствуясь -специально определёнными _регулярными выражениями_), поэтому решение -Vim может иногда не совпадать с представлениями пользователя о границах -слов и предложений. Однако пользователь всегда властен изменить -соответствующие регулярные выражения, подробности -- в документации -по Vi. - -В Vim никогда не следует вручную повторять по нескольку раз одну и ту -же команду: если нужно перейти на три слова вперёд, не следует трижды -нажимать `w`, для повторения команды используется _множитель_. -Множитель, это любое число, набранное перед командой Vim: -команда будет повторена такое число раз. Например, `3w` -- означает -«трижды переместить курсор на слово вперёд», иначе говоря, переместить -курсор на три слова вперёд. Обратите внимание, что множители могут -применяться не только с командами перемещения, а с любыми командами -Vim. Аналогично можно переместить курсор на 10 абзацев вперёд -командой `10}`. - -======================================================= -Множитель:: - число, предшествующее команде Vim, и означающее, что данную - команду следует выполнить указанное число раз. -======================================================= - -Не сразу очевидно, что поиск шаблона в тексте (строки или регулярного -выражения) -- это тоже команда перемещения. Как и любое перемещение, -поиск осуществляется в командном режиме: прежде всего нужно нажать `/`: -в последней строке возникнет символ `/`. Далее следует ввести шаблон -для поиска, он будет отображаться в этой строке, его можно -редактировать. Обычно Vim настроен таким образом, что шаблон для -поиска интерпретируется как регулярное выражение, где ряд символов -имеет специальное значение, эту настройку можно выключить -(`:set nomagic`). После того, как введён шаблон, следует нажать -*Enter* -- курсор переместится к ближайшему (далее по тексту) совпадению -с шаблоном. Поиск в обратном направлении (к предыдущему совпадению) -следует начинать с команды `?`. - -Совсем просто перейти к следующему употреблению в тексте того слова, -на котором стоит курсор: для этого нужно просто нажать `*` в командном -режиме. Аналогичная команда поиска слова в обратном направлении -- `#`. -Можно специально отметить в тексте точку и затем в любой момент -возвращаться к ней, как к закладке, одну закладку определяет сам -Vim -- ````, место в тексте, где было сделано последнее изменение. -Подробно об этих и других командах перемещения можно прочесть в -руководстве по Vi по команде `:help usr_03.txt`. - -==== Изменение текста ==== - -В командном режиме нельзя вводить символы в текст с клавиатуры, но -изменить текст при этом можно, например, удаляя символы. Чтобы удалить -отдельный символ (тот, на котором стоит курсор), достаточно нажать -`x` в командном режиме, а чтобы удалить сразу целую строку -(естественно, текущую, то есть ту, в которой находится курсор), -`dd`. `d` -- это сокращение от «delete», удалить, а `dd` -- характерный -приём Vim: удвоение команды означает, что её нужно применить к -текущей строке. - -Из командной строки Vim можно выполнить операцию поиска и замены: для -простой строки или для регулярного выражения. Причём синтаксис команды -поиска и замены полностью воспроизводит синтаксис потокового редактора -`sed`, о котором уже шла речь в лекции <>. - -------------------------------------------------------- -Это файл для примеров. -Пример 1. -Моя первая сторка в vi... -~ -~ -~ -:s/.$/.../ -------------------------------------------------------- - -Мефодий хотел заменить в своём файле точки в концах строки многоточием. -Для этого в командном режиме он нажал `:` (вызов командной строки Vim), -где набрал команду `s` (сокращение от «substitute», заменить), за -которой следует уже знакомое по `sed` выражение -`/что_заменить/на_что_заменить/`. Только результат получился совсем не -тот, какого ожидал Мефодий: заменился на многоточие восклицательный -знак последней строки. Не учёл он следующего: по умолчанию команды -шаблоны для поиска и замены -- это регулярные выражения, то есть `.` -означает вовсе не точку, а «любой символ», имея в виду точку, -следовало написать `\.` `$`, как и ожидал Мефодий, это конец строки. -В момент выполнения команды поиска курсор находился в последней строке, -в первом совпадении после курсора и была произведена замена. - -Форматирование текста -- это расставление символов конца строки, -пробелов и табуляций таким образом, чтобы текст хорошо смотрелся на -экране терминала. Делать форматирование вручную крайне неэффективно. -В Vi автоматическое форматирование текста (если редактируется программа -на каком-либо языке программирования, то с учётом правил этого языка) -может происходить прямо в режиме вставки, в режиме вставки же можно -изменять отступ текущей строки (по командам `^D` и `^T`). Для -выравнивания текста по центру, правому или левому краю есть команды -`:center`, `:left` и `:right` соответственно. Эти команды, как и -большинство команд командной строки, можно применять к _диапазону -строк_ способом, описанным ниже. - -Режим ввода не богат специальными командами изменения текста, что и -понятно: он предназначен именно для ввода, и больше ни для чего. -Однако в Vi (но не в Vim!) есть некоторые удобства, упрощающие и сам -процесс набора. Если слово, которое нужно ввести, уже встречалось в -тексте, можно набрать только первые буквы и нажать `^P` («previous») -- -Vi попробует сам завершить его. Если Vi не угадал и предложил не то -слово, можно продолжить перебирать варианты. Команда `^N` («next») -подставляет слова, которые встречаются ниже по тексту. Подробнее об -этой функции можно узнать из руководства по команде -`:help ins-completion`. - -Иногда, изменив текст, тут же хочется вернуть всё обратно, для этого в -Vim предусмотрена команда отмены последнего изменения: `u` в командном -режиме (от «undo», отменить). Сколь бы сложным, масштабным (и -разрушительным) ни было изменение, совершённое последней командой, -`u` вернёт текст в исходное состояние. Впрочем, саму отмену тоже можно -отменить. В классическом Vim доступна отмена только последней -выполненной команды, в Vi отменить можно сколько угодно последних -команд, а также повторить их командой `^R`. - -==== Работа с фрагментами текста ==== - -Любая команда перемещения определяет две точки в тексте: та, в -которой был курсор до перемещения, и та, в которую он переместился в -результате данной команды. Расположенный между этими двумя точками -отрезок текста однозначно задаётся командой перемещения. Например, -команда `)` захватывает текст от текущего положения курсора до начала -следующего предложения. Vim позволяет применить к этому фрагменту -любую команду -- так устроены _гнездовые команды_. Гнездовая команда -состоит из действия и следующего за ним перемещения. Перемещение -задаёт фрагмент текста, а действие определяет, что с этим фрагментом -сделать. Например, команда `d)` удалит весь текст от текущей позиции -курсора до начала следующего предложения. Наиболее полезные действия --- `d` («delete»), `c` («cchange»), `>` и `<` (сдвинуть), «y» -(запомнить) и `gq` (отформатировать). - -======================================================= -Гнездовая команда:: - команда редактора Vim, позволяющая применить указанное действие к - указанному отрезку текста. Отрезок задаётся стандартной командой - перемещения по тексту. -======================================================= - -Очень часто возникает необходимость заменить фрагмент в тексте: слово, -предложение, строку и т. д. Это можно сделать в два действия: сначала -удалить часть текста, затем перейти в режим вставки и вставить замену. -Vim предоставляет возможность упростить эту операцию, сведя два -действия к одному: заменить. Гнездовая команда `c` предназначена именно -для этого. Например, команда `cw` (буквально: «cange word») заменит -текст от курсора до начала следующего слова (так можно заменить одно -слово), `c)` заменит текст от курсора до начала следующего предложения. - -Мефодий не забыл, что команды перемещения можно использовать с -_множителями_, и попробовал заменить сразу три слова в своём файле -на другие: для этого он в командном режиме подогнал курсор в начало -слова «первая» и набрал `c3w` («заменить фрагмент отсюда до начала -третьего слова», буквально: «change 3 words»). Результат этой -команды выглядел так: - ---------------------------------------------------------------------- -Это файл для примеров. -Пример 1. -Моя #vi... -~ -~ -~ --- ВСТАВКА -- 3,5 Весь ---------------------------------------------------------------------- - -В примере знак `#` обозначает позицию курсора: как видно, Vim удалил -три слова, попавшие в зону действия команды и сразу перешёл в режим -вставки. Мефодию осталось только набрать что-то взамен. - -Перестановка частей -- типичная задача, возникающая в процессе -редактирования. Для перестановки требуется удалить фрагмент в одном -месте текста и вставить его же в другом. Для решения первой части -задачи в Vim не понадобится специальных средств, потому что любая -команда удаления (`d`, `c`, `x` и др.) сохраняет удалённый текст в -специальном _регистре_. Для вставки последнего удалённого фрагмента -служит команда `p` в командном режиме (от «put», положить). При -помощи этой команды Мефодий может вставить только что удалённые -им командой `c3w` три слова: - ---------------------------------------------------------------------- -Это файл для примеров. -Пример 1. -Моя новая строка для vi... -первая сторка в -~ -~ - 4,1 Весь ---------------------------------------------------------------------- - -Для того чтобы скопировать фрагмент текста, служит команда `y` (от -«yank», забрать, сдёрнуть): она не удаляет текст, а просто сохраняет -его в том же регистре, что и команды удаления. Команду `y` можно -использовать в гнездовых командах, например, `y5w` сохранит в регистре -фрагмент текста от курсора до начала пятого слова. Вставить -скопированный фрагмент можно всё той же командой `p`. Однако таким -способом можно вставлять только текст, удалённый или скопированный -последним, для хранения нескольких разных фрагментов текста следует -использовать именованные регистры, см. подробнее в руководстве по Vi. - -Для того чтобы применить команду к нескольким строкам текста, не -обязательно подгонять к ним курсор. В командной строке Vim любой -команде может предшествовать указание _диапазона_ в тексте, к которому -следует эту команду применить. Команды с указанием диапазона выглядят -так: `:начало,конецкоманда`, где начало и конец -- это адреса начальной -и конечной строк диапазона (т. е. фрагмента текста), а команда -- это -команда режима командной строки, такая как `:w` или `:r`. Многие -команды командного режима (в частности, `d` и `y`) доступны также -и в командной строке. В качестве адреса можно использовать номера -строк в файле (команда `:1,5y` будет означать «скопировать в регистр -строки с первой по пятую»), есть специальные обозначения для текущей -строки (`.`), последней строки (`$`) и всего файла (`%`). Указать -границу диапазона можно и при помощи шаблона: граничной будет -считаться та строка, в которой обнаружится шаблон. - -Последним свойством Мефодий воспользовался, чтобы удалить плоды своих -экспериментов: он выполнил команду `:/Пример 1/,$d` (от строки -`Пример 1` до конца файла -- удалить). - ---------------------------------------------------------------------- -Это файл для примеров. -~ -~ -~ -3 fewer lines ---------------------------------------------------------------------- - -=== Настройка Vi и Vim === - -Вид и поведение Vim и Vi можно довольно существенно изменить при помощи -настроек, приспособив редактор именно к своим вкусам и привычкам. Прямо -во время работы редактора можно менять настройки из командной строки -Vim при помощи команды `:set имя_настройки`. Кроме того, можно сделать -настройку постоянной, вписав все нужные значения в конфигурационный -файл `.vimrc` (или `.exrc` -- для Vim) в домашнем каталоге пользователя. -При каждом запуске Vim/Vi читает этот файл и исполняет все содержащиеся -в нём команды. Объём данной лекции не позволяет подробно остановиться -на настройке Vi, читатель может заняться изучением этого вопроса сам: -все необходимые сведения есть в руководствах. Чтобы оценить возможности -настройки, можно выполнить в Vi (но не в Vim!) команду `:options`, по -которой будет выведен список всех доступных опций с кратким описанием -их смысла. - -== Лучше, чем Emacs? == - -Заголовок этого раздела сформулирован таким провокационным образом не -случайно: любому пользователю похожей на UNIX операционной системы (к -таким системам относится и Linux), в любом случае необходим текстовый -редактор. Выбор очень многих пользователей падает на один из двух -наиболее популярных и, как следствие, наиболее универсальных -(реализованных и работающих везде) текстовых редактора: Vim (или одну -из его улучшенных версий, чаще всего Vi) и Emacs. Оба эти редактора -появились около тридцати лет назад, но их почтенный возраст только -пошёл им на пользу: огромное количество пользователей по всему миру -все эти годы занималось их отладкой, локализацией и расширением. - -Vim и Emacs образуют альтернативную пару не только по исторической -случайности: оба редактора претендуют на роль универсального средства -для работы с текстом на любых естественных и искусственных языках. И -действительно, трудно назвать сравнимый с ними по возможностям -текстовый редактор, да ещё и настолько нетребовательный к интерфейсу: -и Vi, и Emacs будут работать на любом терминале. Однако ограниченные -возможности интерфейса терминала требуют от программ надёжного -способа отделения команд редактору от вводимого текста. В Vi и Emacs -эта задача решена по-разному -- отсюда большая часть различий в стиле -работы с этими редакторами, отсюда и традиционный спор приверженцев -этих редакторов о том, который из них лучше. - -=== Тексты на разных языках === - -Главное свойство, которое сделало Emacs таким популярным и -многофункциональным редактором -- это заложенная в нём с самого -начала принципиальная расширяемость. Emacs почти полностью написан на -специально созданном для него языке программирования: Emacs Lisp, и у -любого пользователя есть возможность запрограммировать любые -необходимые именно ему функции и подключить их в качестве модуля к -Emacs. При этом сам Emacs никак изменять не требуется. Сообщество -программистов не замедлило воспользоваться расширяемостью Emacs, и к -настоящему времени важнейшее достоинство этого редактора состоит -именно в свободно распространяемых пакетах расширений, содержащих -инструменты для решения самых разнообразных задач, связанных с -редактированием текста. - -Современный Emacs -- это не просто текстовый редактор, а -интегрированная среда для работы в системе. Основная идея сообщества -разработчиков и пользователей Emacs состоит в том, что Emacs -позволяет работать с любыми данными, которые могут быть представлены -как текст (в лекции <> -обсуждалось, что таким образом можно представить очень многое в -системе). Естественно, список содержащихся в каталоге файлов, -программа на каком-либо языке программирования или электронное письмо --- это тексты, которые сильно различаются по структуре и по тому, что -от них нужно пользователю. В Emacs для работы с текстами разного типа -используются _режимы_. - -===================================================== -Режим emacs:: - комплекс команд и настроек Emacs, предназначенных для работы с - текстом определённой структуры, например, содержимым каталога, - программой на Си и. т. п. -===================================================== - -Каждый _буфер_ в Emacs находится в одном из _основных режимов_. Основной -режим -- это набор функций и настроек Emacs приспособленных для -редактирования текста определённого вида. Каждый основной режим -по-своему переопределяет некоторые управляющие символы, так что -наиболее доступными становятся команды, чаще всего нужные именно для -работы с текстом данного типа. Команды, специфичные для текущего -основного режима, обычно начинаются с управляющего символа C-c. -Некоторое представление о возможностях Emacs может дать весьма -неполный список тех текстов, для которых существуют основные режимы: - -* список файлов в каталоге; -* программы на самых разных языках программирования, от Си до -самых экзотических; -* тексты в различных форматах разметки: XML, HTML, TeX; -* словари; -* электронная почта (режим позволяет не только читать и писать письма, -но и отправлять и получать их); -* календарь; -* дневник и личное расписание; -* многое другое. - -Когда требуется много и быстро работать с текстом на каком-либо -искусственном языке (языке программирования, разметки и пр.), -возможно, Emacs -- это лучший выбор. - -Обратите внимание, что в Emacs понятие «режим» имеет совершенно иной -смысл, чем в Vim! - -Не менее хорошо в Emacs развиты средства работы с текстами на самых -разных естественных языках с самыми экзотическими письменностями. -Просто для оценки возможностей Emacs в этой области можно выполнить -команду `C-h h`, по которой будет выведен файл, изображающий -приветствие на разных языках. - -=== Команды Emacs === - -Если в вашей системе установлен Emacs, то вы можете запустить, -набрав emacs в командной строке любого терминала. Как и Vim, Emacs -использует весь экран терминала, хотя интерфейс у него более богатый: -вверху экрана находится строка с пунктами меню, под ней окно для -отображения и редактирования текста, которое заканчивается _строкой -режима_, в которой отображаются сведения о происходящем в окне. В -самом низу экрана -- строка _минибуфера_, используемая для диалога с -пользователем, в частности для отображения и редактирования вводимых -команд. - -Vi и вслед за ним Vi -- это многорежимные редакторы, когда команды -вводятся в одном режиме, а текст -- в другом, что позволяет -использовать в качестве командных любые клавиши. В Emacs нет -специального командного режима, но использован тот факт, что с -клавиатуры можно вводить не только печатные, но и некоторые -_управляющие символы_. Для этого используются несколько управляющих -клавиш терминала (прежде всего *Ctrl* и *Alt*), нажатые в сочетании с -различными текстовыми символами. Чтобы ввести такой символ, нужно -нажать управляющую клавишу (например, *Ctrl*) и, удерживая её, нажать -клавишу с одним из печатных символов (например, `x`). Кроме того, в -Emacs используется управляющая клавиша *Meta*, на тех терминалах, где -она отсутствует, её функции обычно передаются клавише *Alt*. На -«настоящих» терминалах обычно не бывает ни *Meta*, ни *Alt*; из -_клавиатурных модификаторов_ присутствуют только *Ctrl* и *Shift*. Тогда на -помощь приходит старая добрая *ESC*: нажатие *ESC*, а после неё -- -печатного символа (того же `x`) эквивалентно `Meta x`. - -Команд в редакторе Emacs чрезвычайно много, доступных управляющих -символов на всех не хватает, поэтому чтобы вызвать команду Emacs, -обычно требуется ввести _ключ_, начинающийся с управляющего символа, за -которым следует комбинация из управляющих или обычных символов, или -просто полное имя команды. Последовательность символов, достаточная -для вызова команды, называется _законченным ключом_, а если введённых -символов недостаточно для однозначного определения команды, это -- -_префиксный ключ_. - -Общее правило здесь таково: чем чаще нужна команда, тем короче -вызывающий её ключ, и наоборот. Для лаконичной записи длинных -клавиатурных комбинаций в сообществе пользователей Emacs сложилась -особая традиция сокращённых обозначений. Клавишу *Ctrl* обозначают -заглавной буквой «C», Meta -- `M` footnote:[За свои длинные команды -из разных комбинаций управляющих клавиш название Emacs получило -шуточную расшифровку: Escape-Meta-Alt-Control-Shift.]. -Сочетания с командной клавишей -обозначаются дефисом, например, запись `С-h` обозначает, что нужно, -удерживая *Ctrl*, нажать `h`. `C-h` -- это префиксный ключ для команд -справочной системы Emacs. Начинающему пользователю стоит выполнить -команды `C-h ?` (набрать `C-h` и затем нажать `?`) -- справка по -командам помощи, `C-h t` -- интерактивный учебник для начинающих -пользователей Emacs, и `C-h i` -- полное руководство по Emacs (в -формате info). С ключа `C-x` начинаются основные команды Emacs, в -частности, для работы с файлами буферами. Чтобы завершить работу -Emacs, нужно ввести `C-x C-c`. - -У любой команды Emacs есть собственное имя, по этому имени можно -вызвать команду даже если она не привязана ни к какому клавиатурному -ключу. Для вызова команд по имени используется префиксный ключ M-x. -Например, посмотреть справку о помощи в Emacs можно командой `M-x -help-for-help`. - -==== Работа с файлами ==== - -В Emacs, как и в Vim, пользователь редактирует текст не в самом файл, а -в _буфере_. Отличие Emacs в том, что нельзя написать «безымянный» текст -и затем сохранить его в файле. При запуске Emacs без параметров -открывается специальный буфер -- `*scratch*`, он предназначен для -временных заметок -- его содержимое будет выброшено при закрытии Emacs. -Если нужно создать новый файл -- его следует открыть командой `C-x C-f`, -точно так же открывается для редактирования уже существующий файл. - -После того, как Мефодий нажал `C-x C-f`, в _минибуфере_ возникло -приглашение: `Find file: ~/`. Теперь нужно ввести _путь_ к файлу, -начиная с текущего каталога (Emacs любезно подсказал его Мефодию). -С текстом в минибуфере можно обращаться почти так же, как с командной -строкой shell или Vi: редактировать, использовать автодополнение -(клавишей *Tab*), перемещаться по истории стрелочками вверх/вниз. -Мефодий не замедлил воспользоваться этой возможностью и, набрав `te`, -нажав *Tab* и *Enter*, приступил к редактированию того же `textfile`. -Сохранить сделанные изменения можно командой `C-x C-s`. - -Когда Мефодий захотел открыть ещё один буфер, чтобы отредактировать один -из своих сценариев, он запамятовал точное название нужного файла и, -набрав `C-x C-f bin/`, нажал *Enter*. При в окне возник список файлов в -подкаталоге `~/bin`, похожий на вывод `ls -l`: - ------------------------------------------------------- -File Edit Options Buffers Tools Operate Mark Regexp Immediate Subdir Help - /home/methody/bin: - итого 24 - drwxr-xr-x 2 methody methody 4096 Дек 2 15:21 . - drwx------ 10 methody methody 4096 Дек 2 15:21 .. - -rwxr-xr-x 1 methody methody 26 Ноя 9 21:34 loop - -rwxr-xr-x 1 methody methody 23 Ноя 9 21:34 script - -rwxr-xr-x 1 methody methody 32 Ноя 9 21:34 to.sort - -rwxr-xr-x 1 methody methody 44 Ноя 9 21:34 two - - --RRR:%%-F1 bin (Dired by name)--L5--C51--All--Reading directory /home/methody/bin/...done ------------------------------------------------------- - -Как указано в _строке режима_, это Dired, редактор каталогов, _режим -emacs_, предназначенный для просмотра и изменения каталогов прямо -из редактора. В Dired можно выбирать отдельные файлы, или группы -файлов и производить над ними различные действия: открыть для -редактирования, удалить, скопировать, переместить, переименовать -по определённой схеме -- словом, Dired, довольно мощное средство -для наглядной работы с файловой системой, особенно он удобен для -работы с группой файлов. Подробности о командах, доступных в этом -режиме, можно найти в руководстве по Emacs. - -==== Перемещение по тексту ==== - -В Emacs, как и в Vim есть понятие _точка_, это то место в буфере, где -будет происходить вставка или удаление данных. Перемещение по -тексту -- это перемещение точки. Команды перемещения по структурным -элементам текста развиты не менее, чем в Vim, помимо обычных стрелок, -действуют команды перемещения в начало и конец строки (`C-a` и `C-e`), -буфера (`M-<` и `M->`), предложения (`M-a` и `M-e`); к предыдущему и -следующему слову (`M-f` и `M-b`), абзацу (`M-{` и `M-}`). Различные -_основные режимы_ предоставляют специализированные команды для -перемещения по структурным элементам текстов на разных языка -программирования, разметки и пр. - -В Emacs несколько видов поиска: существуют отдельные команды для -поиска строки и поиска по регулярному выражению. Если требуется найти -ближайшее употребление конкретного слова, удобнее всего -воспользоваться _наращиваемым поиском_ по команде `C-s`. Наращиваемый -поиск уже встречался Мефодию: так был устроен поиск по истории команд -в `bash`. По мере набора первых символов искомой строки Emacs переносит -точку к ближайшему такому сочетанию символов после курсора. Поиск в -обратном направлении (к началу буфера) осуществляется командой `C-r`. -Наращиваемый поиск можно выполнять по регулярному выражению (`C-M-s`). -Все виды наращиваемого поиска в Emacs не различают прописные и -строчные буквы. - -==== Изменение текста ==== - -В Emacs доступно множество команд, экономящих усилия при -редактировании текста. Если пользователь осознаёт, что набрал что-то -неправильно, то можно удалить разом последнее слово (`M-Del`), -предложение (`C-x Del`). Можно уничтожать и вперёд: до конца слова -(`M-d`) и предложения (`M-k`). Emacs хранит не только последний удалённый -фрагмент, но и все предыдущие, формируя _список удалений_. Только что -уничтоженный текст можно вставить командой `C-y`. После этого его можно -заменить предыдущим уничтоженным фрагментом -- `M-y`. Можно двигаться и -далее назад по списку удалений, повторяя `M-y`. - -Хорошо продуманы команды для перестановки частей текста вокруг точки: -двух знаков (`C-t`), слов (`M-t`), строк (`C-x C-t`). Команда `M-t` не -перемещает знаки препинания между словами, поэтому «потеха, дело» -превратится в «дело, потеха». - -Прямо из Emacs можно вызвать программу проверки орфографии (`M-x -ispell-buffer`) или даже включить проверку «на лету», когда -неправильно написанные слова выделяются другим цветом (`M-x -flyspell-mode`). Можно проверить написание отдельного слова, в -котором находится точка (`M-x $`) или завершить недописанное слово, -основываясь на орфографическом словаре (`M-x Tab`). - -В Emacs так много специальных команд для изменения текста, что -команды поиска и замены бывают нужны не так часто. Произвести замену -строки всюду в буфере можно по команде `M-x replace-string что -заменить Enter на_что_заменить Enter`, для замены регулярного -выражения -- аналогичная команда `M-x replace-regexp`. - -Если нужно заменить строку только в некоторых случаях, пригодится -команда `M-%`, запрашивающая подтверждение о замене при каждой -найденной строке. Аналогичная команда для регулярных выражений -- -`C-M-%`. - -Любые изменения в тексте можно отменить командой `C-_` (нужно нажать -*Ctrl*, *Shift* и *-*). - -==== Работа с фрагментами текста ==== - -Многие команды Emacs работают с произвольным фрагментом текущего -буфера. Такие команды всегда применяются к текущей _области_. Область -- -это отрезок текста между _точкой_ (где находится курсор) и _меткой_. -Метка в любой момент присутствует в любом буфере, пользователь может -установить её в любом месте текста явно -- командой `M-Пробел`. Метка -может перемещаться и без вмешательства пользователя: команды -перемещения и редактирования могут изменять положение метки. Таким -образом, чтобы выделить в буфере фрагмент текста, можно произвести -следующие операции: - -* переместить точку (курсор) на один конец нужного фрагмента; -* нажать `M-Пробел` (установить метку); -* переместить точку к другому концу нужного фрагмента. - -Теперь можно выполнять команду редактирования -- она будет применена -именно к выделенной _области_. Например, `C-w` удалит текст области, а -`M-w` скопирует его. Вставить удалённый или скопированный фрагмент -можно командой `C-y`. - -Есть группа команд, позволяющих работать с меткой более эффективно: -установить метку после конца следующего слова (`M-@`), пометить текущий -абзац (`M-h`), весь буфер (`C-x h`). Различные основные режимы -предоставляют команды для пометки структурных элементов текста, -например, разделов документа, определения функции (в тексте -программы) и т. п. Все положения метки хранятся в _списке пометок_, -перенести точку в любое из предшествующих положений метки можно, -нужное количество раз повторив команду `C-u C-@`. - -============================================================= -Область:: - непрерывный отрезок текста, ограниченный точкой с одной - стороны и меткой с другой. -============================================================= - -Как и в Vim, в Emacs можно использовать для хранения информации -_регистры_. В регистре Emacs можно сохранить позицию в буфере и затем -перейти к этой позиции (`C-x r Пробел x` записывает позицию точки в -регистр «x», а `C-x r j x` переходит в эту позицию). В регистре можно -сохранить текст из области (`C-x r s x` сохраняет область в регистре -`x`, `C-x r i x` -- вставляет текст из этого регистра). В регистрах -также можно хранить числа, имена файлов, конфигурацию окон. -Подробности как всегда доступны в руководстве. - -==== Настройка Emacs ==== - -Коротко говоря, в Emacs можно настроить всё: связи между _ключами_ и -командами редактора, определить макрокоманды, написать собственные -расширения. Есть возможность изменять настройки Emacs как в процессе -работы, так и при помощи конфигурационного файла `.emacsrc`. - -== Просто текстовые редакторы == - -И в Vim, и в Emacs интегрировано множество средств для автоматизации -процесса редактирования. Эти редакторы становятся удобны в том -случае, если прежде, чем браться делать что-то вручную, пользователь -обращается к руководству и находит в нём способ выполнить свою задачу -максимально быстро и с минимальными затратами ручного труда. Однако -если пользователя не устраивает такой принцип работы (когда нужно -часто и подолгу читать документацию и думать, чтобы «ручную» работу -выполнял компьютер), Vim и Emacs будут не самым лучшим выбором. Для -обычного редактирования текста вручную лучше выбрать один из -текстовых редакторов с простым и привычным интерфейсом: в -дистрибутивах Linux можно найти огромное количество таких текстовых -редакторов с большими или меньшими возможностями: mcedit, joe, pico -(часть почтовой программы pine) -- всех не перечислить. Есть -редакторы, которые предназначены для работы не в терминале, а в -графической среде (например, nedit), у тех же Vi и Emacs есть -графические варианты (GVim и Emacs-X11 или XEmacs), в которых -доступны дополнительные возможности графического пользовательского -интерфейса: меню, иконки и пр. - -[[boot]] -== Этапы загрузки системы == - -=== Досистемная загрузка === - -Программа login, регистрирующая пользователей в системе, запускается -только тогда, когда сама система уже приведена в полную готовность и -работает в обычном режиме. Происходит это далеко не сразу после -включения компьютера: Linux -- довольно сложная система, объекты -которой попадают в оперативную память не сами собой, а в процессе -загрузки. Сама загрузка -- процесс ступенчатый: поведение компьютера -на различных этапах загрузки определяется совершенно разными людьми, -от разработчиков аппаратной составляющей до системного -администратора. Предъявляемые к системе требования гибкости, -возможности изменять её настройку в зависимости от аппаратной -составляющей, необходимость решать разные задачи с помощью одного и -того же компьютера тоже делают процесс загрузки ступенчатым: сначала -определяется профиль будущей системы, а затем этот профиль -реализуется. - -Начальный этап вообще не зависит от того, какая операционная система -установлена на компьютере, для некоторых этапов в каждой операционной -системе предлагаются свои решения -- по большей части, -взаимозаменяемые. Эту стадию (начальную) назовём _досистемной -загрузкой_. Начиная с определённого этапа загрузка компьютера уже -управляется самим Linux, используются утилиты, сценарии и т. п. Эту -стадию (завершающую) назовём _системной загрузкой_. - -=== Загрузчик в ПЗУ === - -Сразу после включения, оперативная память компьютера классической -архитектуры девственно чиста. Для того чтобы начать работать, -процессору необходима хоть какая-то программа. Эта программа -автоматически загружается в память из _постоянного запоминающего -устройства_, ПЗУ (или ROM, read-only memory), в которое она вписана -раз и навсегда в неизменном виде footnote:[Современные компьютеры -используют программируемые ПЗУ, содержимое которых можно изменять, -однако такое изменение всегда считается ситуацией нештатной: -например, запись новой версии содержимого ПЗУ, в которой исправлены -ошибки (upgrade).]. В специализированных компьютерах -- например, в -дешёвых игровых приставках -- всё, что нужно пользователю, -записывается именно на ПЗУ (часто сменное), и запуском программы -оттуда загрузка заканчивается. - -Обычно в компьютерах общего назначения программа из ПЗУ пользователю -ничем полезна не бывает: она невелика, да и делает всегда одно и то -же. Слегка изменить поведение программы из ПЗУ можно, оперируя -данными, записанными в _энерго-независимую память_ (иногда её называют -CMOS, иногда -- NVRAM). Объём энерго-независимой памяти очень -невелик, а данные из неё сохраняются после выключения компьютера за -счёт автономного электропитания (как правило, от батарейки вроде -часовой). - -Что должна уметь эта начальная программа? Распознавать основные -устройства, на которых может быть записана другая -- нужная -пользователю -- программа, уметь загружать эту программу в память и -передавать ей выполнение, а также поддерживать интерфейс, позволяющий -менять настройки в NVRAM. Собственно, это даже не одна программа, а -множество подпрограмм, занимающихся взаимодействием с разнообразными -устройствами ввода-вывода -- как с теми, на которых могут храниться -программы (жёсткие и гибкие диски, магнитные ленты и даже сетевые -карты), так и теми, посредством которых можно общаться с -пользователем (последовательные порты передачи данных -- если есть -возможность подключить консольный терминал, системная клавиатура и -видеокарта -- для простых персональных рабочих станций). Этот набор -подпрограмм в _ПЗУ_ обычно называется _BIOS_ (basic input-output system). - -========================================================= -BIOS:: - сокращение от «Basic Input-Ooutput System», набор подпрограмм в - ПЗУ, предназначенных для простейшего низкоуровневого доступа ко - внешним устройствам компьютера. В современных ОС используется - только в процессе начальной загрузки. -========================================================= - -Этот этап загрузки системы можно назвать нулевым, так как ни от какой -системы он не зависит. Его задача -- определить (возможно, с помощью -пользователя), с какого устройства будет идти загрузка, загрузить -оттуда специальную программу-_загрузчик_ и запустить его. Например, -выяснить, что устройство для загрузки -- жёсткий диск, считать самый -первый сектор этого диска и передать управление программе, которая -находится в считанной области. - -=== Загрузочный сектор и первичный загрузчик === - -Чаще всего размер _первичного дискового загрузчика_ -- программы, -которой передаётся управление после нулевого этапа, -- весьма -невелик. Это связано с требованиями универсальности подобного рода -программ. Считывать данные с диска можно секторами, размер которых -различается для разных типов дисковых устройств (от половины -килобайта до восьми или даже больше). Кроме того, если считать один, -первый, сектор диска можно всегда одним и тем же способом, то команды -чтения нескольких секторов на разных устройствах могут выглядеть -по-разному. Поэтому-то _первичный загрузчик_ занимает обычно не более -одного сектора в самом начале диска, в его _загрузочном секторе_. - -Если бы _первичный загрузчик_ был побольше, он, наверное, и сам мог бы -разобраться, где находится _ядро_ операционной системы и смог бы -самостоятельно считать его, разместить в памяти, настроить и передать -ему управление. Однако ядро операционной системы имеет довольно -сложную структуру -- а значит, и непростой способ загрузки; оно может -быть довольно большим, и, что неприятнее всего, может располагаться -неизвестно где на диске, подчиняясь законам _файловой системы_ -(например, состоять из нескольких частей, разбросанных по диску). -Учесть всё это первичный загрузчик не в силах. Его задача скромнее: -определить, где на диске находится «большой» _вторичный загрузчик_, -загрузить и запустить его. Вторичный загрузчик прост, и его можно -положить в заранее определённое место диска, или, на худой конец, -положить в заранее определённое место _карту размещения_, описывающую, -где именно искать его части (размер вторичного загрузчика ограничен, -поэтому и возможно построить такую карту). - -========================================================= -Карта размещения:: - представление области с необходимыми данными (например, вторичным - загрузчиком или ядром системы) в виде списка секторов диска, - которые она занимает. -========================================================= - -В случае IBM-совместимого компьютера размер загрузочного сектора -составляет всего 512 байтов, из которых далеко не все приходятся на -программную область. Загрузочный сектор IBM PC, называемый MBR -(master boot record), содержит также _таблицу разбиения диска_, -структура которой описана в лекции <>. Понятно, что программа такого размера не может -похвастаться разнообразием функций. Стандартный для многих систем -загрузочный сектор может только считать таблицу разбиения диска, -определить т. н. _загрузочный раздел_ (active partition), и загрузить -программу, расположенную в начале этого раздела. Для каждого типа -диска может быть своя программная часть _MBR_, что позволяет считывать -данные из любого места диска, сообразуясь с его типом и геометрией. -Однако считывать можно всё же не более одного сектора: неизвестно, -для чего используются установленной на этом разделе операционной -системой второй и последующие сектора. Выходит, что стандартная -программная часть _MBR_ -- это некий предзагрузчик, который считывает и -запускает настоящий _первичный загрузчик_ из первого сектора -_загрузочного раздела_. - -Существуют версии предзагрузчика, позволяющие пользователю -самостоятельно выбрать, с какого из разделов выполнять загрузку -footnote:[Например, BOOTACTV из пакета `pfdisk` или стандартный для -FreeBSD предзагрузчик `boot0`, которые, в силу их досистемности, можно -применять где угодно.]. Это позволяет для каждой из установленных -операционных систем хранить собственный первичный загрузчик в начале -раздела и свободно выбирать среди них. В стандартной схеме загрузки -Linux используется иной подход: простой первичный загрузчик -записывается прямо в _MBR_, а функция выбора передаётся вторичному -загрузчику. - -========================================================= -Первичный загрузчик:: - первая стадия загрузки компьютера: программа, размер и возможности - которой зависят от аппаратных требований и функций BIOS. Основная - задача -- загрузить _вторичный загрузчик_. -========================================================= - -=== Загрузчик ядра === - -В задачу _вторичного загрузчика_ входит загрузка и начальная настройка -_ядра_ операционной системы. Как правило, ядро системы записывается в -файл с определённым именем. Но как вторичному загрузчику прочитать -файл с ядром, если в Linux эта операция и есть функция ядра? Эта -задача может быть решена тремя способами. - -Во-первых, ядро может и не быть файлом на диске. Если загрузка -происходит по сети, достаточно попросить у сервера «файл с таким-то -именем», и в ответ придёт цельная последовательность данных, -содержащая запрошенное ядро. Все файловые операции выполнит сервер, -на котором система уже загружена и работает. В других случаях ядро -«загоняют» в специально выделенный под это раздел, где оно лежит уже -не в виде файла, а таким же непрерывным куском, размер и -местоположение которого известны. Однако в Linux так поступать не -принято, так как места для специального раздела на диске, скажем, -IBM-совместимого компьютера, может и не найтись. - -Во-вторых, можно воспользоваться описанной выше _картой размещения_: -представить ядро в виде набора секторов на диске, записать этот набор -в заранее определённое место, а загрузчик заставить собирать ядро из -кусков по карте. Использование карты размещения имеет два -существенных недостатка: её создание возможно только под управлением -уже загруженной системы, а изменение ядра должно обязательно -сопровождаться изменением карты. Если по какой-то причине система не -загружается ни в одной из заранее спланированных конфигураций, -единственная возможность поправить дело -- загрузиться с внешнего -носителя (например, с лазерного диска). А система может не -загружаться именно потому, что администратор забыл после изменения -ядра пересобрать карту: в карте указан список секторов, -соответствовавших старому файлу с ядром, и после удаления старого -файла в этих секторах может содержаться какой угодно мусор. - -В-третьих, можно научить вторичный загрузчик распознавать структуру -файловых систем, и находить там файлы по имени. Это заметно увеличит -его размер и потребует «удвоения функций», ведь точно такое же, даже -более мощное, распознавание будет и в самом ядре. Зато описанной выше -тупиковой ситуации можно избежать, если, скажем, не удалять старое -ядро при установке нового, а переименовывать его. Тогда, если -загрузка системы с новым ядром не удалась, можно загрузиться ещё раз, -вручную указав имя файла (или каталога) со старым ядром, под чьим -управлением всё работало исправно. - -Вторичный загрузчик может не только загружать ядро, но и настраивать -его. Чаще всего используется механизм настройки ядра, похожий на -командную строку shell: в роли команды выступает ядро, а в роли -параметров -- настройки ядра. Настройки ядра нужны для временного -изменения его функциональности: например, чтобы выбрать другой -графический режим виртуальных консолей, чтобы отключить поддержку -дополнительных возможностей внешних устройств (если аппаратура их не -поддерживает), чтобы передать самому ядру указания, как загружать -систему и т. п. - -Очень часто конфигурация вторичного загрузчика предусматривает -несколько вариантов загрузки, начиная от нескольких вариантов -загрузки одного и того же ядра с разными настройками (например, -стандартный профиль и профиль с отключёнными расширенными -возможностями), и заканчивая вариантами загрузки разных ядер и даже -разных операционных систем. Это требует от самого загрузчика -некоторого разнообразия интерфейсных средств. С одной стороны, он -должен уметь работать в непритязательном окружении, например, -обмениваться с пользователем данными через последовательный порт, к -которому подключена системная консоль. С другой стороны, если есть -стандартные графические устройства ввода/вывода, хотелось бы, чтобы -загрузчик использовал и их. Поэтому все загрузчики имеют -универсальный текстовый интерфейс (зачастую с довольно богатыми -возможностями) и разнообразный графический (чаще в виде меню). - -Особенная ситуация возникает в случае, когда на компьютере -установлено несколько операционных систем (например, если -персональный компьютер используется также и для компьютерных игр, -строго привязанных к определённой системе). В этом случае не стоит -надеяться на «универсальность» вторичного загрузчика: даже если он -способен различать множество файловых систем и несколько форматов -загрузки ядер, невозможно знать их все. Однако, если в загрузочном -секторе раздела операционной системы записан _первичный загрузчик_, -можно просто загрузить его, как если бы это произошло непосредственно -после работы _MBR_. Таким образом, вторичный загрузчик может выступать -в роли предзагрузчика, передавая управление «по цепочке» -(chainloading). К сожалению, чем длиннее цепочка, тем выше -вероятность её порвать: можно, например, загрузить по цепочке MS-DOS, -удалить с его помощью раздел Linux, содержавший вторичный загрузчик, -переразметить этот раздел, чем и привести компьютер в -неработоспособное состояние. - -========================================================= -вторичный загрузчик - Вторая стадия загрузки компьютера: программа, размер и возможности - которой практически не зависят от аппаратных требований. Основная - задача -- полностью подготовить и запустить загрузку _операционной - системы_. -========================================================= - -=== Досистемная загрузка Linux === - -Несмотря на то, что досистемная загрузка не зависит от типа -операционной системы, которая начинает работу после неё, большинство -систем предоставляют собственные средства по её организации. В Linux -наиболее популярны подсистемы загрузки LILO (LInux LOader) и GRUB -(GRand Unified Bootloader). Обе эти подсистемы имеют текстовый и -графический варианты интерфейса, предоставляющего пользователю -возможность выбрать определённый заранее настроенный тип загрузки. - -=== LILO === - -Подсистема загрузки LILO использует и для первичного, и для -вторичного загрузчика схему с _картой размещения_. Это делает работу с -LILO занятием, требующем повышенной аккуратности, так как изменение -процедуры загрузки не атомарно: сначала пользователь изменяет ядро -или его модули, потом -- редактирует файл `/etc/lilo.conf`, в котором -содержатся сведения обо всех вариантах загрузки компьютера, а затем --- запускает команду lilo, которая собирает таблицы размещения для -всех указанных ядер и вторичного загрузчика и записывает первичный и -вторичный загрузчик вместе с картами в указанное место диска. -Первичный загрузчик LILO (он называется LI) можно записывать и в MBR, -и в начало раздела Linux. - -Простейший файл `lilo.conf` может выглядеть так: - -------------------------------------------------------------- -boot=/dev/hda -map=/boot/map -image=/boot/vmlinuz-up - root=/dev/hda1 -------------------------------------------------------------- - -Такая настройка LILO определяет ровно один вариант загрузки: -_первичный загрузчик_ записывается в начало первого жёсткого диска -(строчка `boot=/dev/hda`), _карту размещения_ утилита lilo записывает в -файл `/boot/map`, _ядро_ добывается из файла `/boot/vmlinuz-up`, а запись -`root=/dev/hda1` указывает ядру, что _корневая файловая система_ -находится на первом разделе первого диска. - -Одна из машин, за которыми случалось работать Мефодию, использовалась -иногда для запуска единственной программы, написанной для MS-DOS. -Исходные тексты этой программы давно потерялись, автор -- тоже, -поэтому на машине пришлось устанавливать и MS-DOS и Linux. В -результате `lilo.conf` оказался таким: - -------------------------------------------------------------- -[root@localhost root]# cat /etc/lilo.conf - boot=/dev/hda - map=/boot/map - default=linux-up - prompt - timeout=50 - image=/boot/vmlinuz-up - label=linux-up - root=/dev/hda5 - initrd=/boot/initrd-up.img - read-only - image=/boot/vmlinuz-up - label=failsafe - root=/dev/hda5 - initrd=/boot/initrd-up.img - vga=normal - append=" failsafe noapic nolapic acpi=off" - read-only - other=/dev/hda1 - label=dos - other=/dev/fd0 - label=floppy - unsafe -------------------------------------------------------------- - -Здесь Linux был установлен на пятый раздел диска (о нумерации -разделов в IBM-совместимых компьютерах рассказано в лекции <>), а на первом находится MS-DOS. -Кроме загрузки MS-DOS предусмотрено два варианта загрузки Linux и ещё -один -- любой операционной системы с дискеты. Каждый вариант загрузки -помечен строкой `label=вариант`. При старте LILO выводит простейшее -footnote:[Если установлен графический вариант интерфейса, то -- сколь -угодно изукрашенное.] окошко, в котором перечислены все метки (в -данном случае -- `linux-up`, `failsafe`, `dos` и `floppy`). -Пользователь с помощью «стрелочек» выбирает нужный ему вариант и -нажимает *Enter*. При необходимости пользователь может вручную дописать -несколько параметров, они передадутся ядру системы. Если пользователь -ничего не трогает, по истечении тайм-аута выбирается метка, указанная -в поле `default`. - -Ещё несколько пояснений. Метки `linux-up` и `failsafe` в примере -используют одно и то же ядро (`vmlinuz-up`), но во втором случае -перенастраивается режим графической карты и добавляются параметры, -отключающие поддержку необязательных для загрузки аппаратных -расширений (многопроцессорность, автоматическое управление -электропитанием и т. п.). Строчку, стоящую после `append=` пользователь -мог бы ввести и самостоятельно, это и есть параметры ядра. Поле -`initrd=` указывает, в каком файле находится _стартовый виртуальный -диск_ (ему посвящён раздел <> этой лекции), а внушающая некоторые опасения -надпись `unsafe` (для метки floppy) означает всего лишь, что дискета --- съёмное устройство, поэтому бессмысленно во время запуска lilo -проверять правильность её загрузочного сектора и составлять карту. - -Наконец, записи вида` other=устройство` говорят о том, что LILO -неизвестен тип операционной системы, находящейся на этом устройстве, -а значит, загрузить ядро невозможно. Зато ожидается, что в первом -секторе устройства будет обнаружен ещё один первичный загрузчик, LILO -загрузит его и передаст управление по цепочке. Так и загружается -MS-DOS на этой машине: первичный загрузчик берётся (по метке `dos`) из -начала первого раздела первого диска. - -=== GRUB === - -Подсистема загрузки GRUB устроена более сложно. Она также имеет -_первичный загрузчик_, который записывается в первый сектор диска или -раздела, и _вторичный загрузчик_, располагаемый в файловой системе. -Однако _карта размещения_ в GRUB обычно используется только для т. н. -«полуторного» загрузчика («stage 1.5») -- по сути дела, драйвера -одной определённой файловой системы. Процедура загрузки при этом -выглядит так. Первичный загрузчик загружает полуторный по записанной -в него карте размещения. Эта карта может быть очень простой, так как -обычно полуторный загрузчик размещается непосредственно после -первичного подряд в нескольких секторах footnote:[Т. е. на нулевой -дорожке нулевого цилиндра, начиная с сектора `2`. Эта область диска -часто не используется под файловые системы (см. лекцию <>).], или в ином специально отведённом -месте вне файловой системы. Полуторный загрузчик умеет распознавать -одну файловую систему и находить там вторичный уже по имени (обычно -`/boot/grub/stage2`). Наконец, вторичный загрузчик, пользуясь -возможностями полуторного, читает из файла `/boot/grub/menu.lst` меню, -в котором пользователь может выбирать варианты загрузки так же, как и -в LILO. Таким образом, обновление и перенастройка установленного GRUB -не требует пересчёта карт размещения и изменения чего-то, кроме -файлов в каталоге `/boot/grub`. - -По требованию Мефодия, Гуревич установил на двухсистемную машину -GRUB. При этом файл `/boot/grub/menu.lst` получился таким: - -------------------------------------------------------------- -[root@localhost root]# cat /boot/grub/menu.lst - default 0 - timeout 50 - - title linux-up - kernel (hd0,4)/boot/vmlinuz-up root=/dev/hda5 - initrd (hd0,4)/boot/initrd-up.img - - title failsafe - kernel (hd0,4)/boot/vmlinuz-up root=/dev/hda5 failsafe noapic nolapic acpi=off - initrd (hd0,4)/boot/initrd-up.img - - title floppy - root (fd0) - chainloader +1 - - title dos - root (hd0,0) - chainloader +1 -------------------------------------------------------------- - -Разница между `lilo.conf` только в синтаксисе, да ещё в том, что -жёсткие диски и разделы на них GRUB именует по-своему, в виде -(hdномер_диска,номер_раздела), причём нумеровать начинает с нуля. -Метки (`title») тоже нумеруются с нуля, так что запись `default 0` -означает, что по истечении тайм-аута будет загружена самая первая -конфигурация (по имени `linux-up`). - -Изучая руководство по GRUB, Мефодий обнаружил гораздо более важное -отличие от LILO. Оказывается, в GRUB не только параметры, но и сами -файлы (ядро, стартовый виртуальный диск и т. п.) распознаются и -загружаются в процессе работы. Вместо пунктов меню можно выбрать -режим командной строки, подозрительно похожий на `bash`, в котором -заставить GRUB загрузить какое-нибудь другое, не предписанное -конфигурацией, ядро, посмотреть содержимое каталогов файловой -системы, распознаваемой полуторным загрузчиком, и даже содержимое -этих файлов, невзирая ни на какие права доступа: система-то ещё не -загружена. Мало того, можно по-своему перенастроить загрузчик и -записать результаты настройки. Так и не успев сполна насладиться -неожиданной свободой, Мефодий в один прекрасный день обнаружил, что -выход в командную строку защищён паролем. - -=== Действия ядра Linux в процессе начальной загрузки === - -Итак, _досистемная загрузка проходит_ в три этапа. - -. Загрузчик из ПЗУ определяет, с каких устройств можно грузиться и, -возможно, предлагает пользователю выбрать одно из них. Он загружает с -выбранного устройства первичный загрузчик и передаёт ему управление. -. _Первичный загрузчик_ определяет (а чаще всего -- знает), где находится -вторичный загрузчик -- большая и довольно умная программа. Ему это -сделать проще, чем программе из ПЗУ: во-первых, потому что для каждого -устройства первичный загрузчик свой, а во-вторых, потому что его можно -легко изменять при изменении настроек загружаемой системы. В схеме, -предлагаемой LILO и GRUB, первичный загрузчик не вступает в разговоры -с пользователем, а немедленно загружает вторичный и передаёт ему -управление. -. _Вторичный загрузчик_ достаточно умён, чтобы знать, где находится ядро -системы (возможно, не одно), предлагать пользователю несколько вариантов -загрузки на выбор, и даже, в случае GRUB, разрешает задавать собственные -варианты загрузки. Его задача -- загрузить в память ядро и всё -необходимое для старта системы (иногда -- модули, иногда -- стартовый -виртуальный диск), настроить всё это и передать управление ядру. - -_Ядро_ -- это и мозг, и сердце Linux. Все действия, которые нельзя -доверить отдельной подзадаче (процессу) системы, выполняются ядром. -Доступом к оперативной памяти, сети, дисковым и прочим внешним -устройствам заведует ядро. Ядро запускает и регистрирует процессы, -управляет разделением времени между ними. Ядро реализует -разграничение прав и вообще определяет политику безопасности, обойти -которую, не обращаясь к нему, нельзя просто потому, что в Linux -больше никто не предоставляет подобных услуг. - -Ядро работает в специальном режиме, т. н. «режиме супервизора», -позволяющем ему иметь доступ сразу ко всей оперативной памяти и -аппаратной таблице задач. Процессы запускаются в «режиме -пользователя»: каждый жёстко привязан ядром к одной записи таблицы -задач, в которой, в числе прочих данных, указано, к какой именно -части оперативной памяти этот процесс имеет доступ. Ядро постоянно -находится в памяти, выполняя _системные вызовы_ -- запросы от процессов -на выполнение этих подпрограмм. - -========================================================= -Ядро:: - набор подпрограмм, используемых для организации доступа к ресурсам - компьютера, для обеспечения запуска и взаимодействия процессов, для - проведения политики безопасности системы и для других действий, - которые могут выполняться только в режиме полного доступа (т. н. - «режиме супервизора»). -========================================================= - -Работа ядра после того, как ему передано управление, и до того, как -оно начнёт работать в штатном режиме, выполняя системные вызовы, -сводится к следующему. - -Сначала ядро определяет аппаратное окружение. Одно и то же ядро может -быть успешно загружено и работать на разных компьютерах одинаковой -архитектуры, но с разным набором внешних устройств. Задача ядра -- -определить список внешних устройств, составляющих компьютер, на -который оно угодило, классифицировать их (определить диски, -терминалы, сетевые устройства и т. п.) и, если надо, настроить. При -этом на _системную консоль_ (обычно первая виртуальная консоль Linux) -выводятся диагностические сообщения (впоследствии их можно -просмотреть утилитой `dmesg`). - -Затем ядро запускает несколько _процессов ядра_. _Процесс ядра_ -- это -часть ядра Linux, зарегистрированная в таблице процессов. Такому -процессу можно послать сигнал и вообще пользоваться средствами -межпроцессного взаимодействия, на него распространяется политика -планировщика задач, однако никакой задаче в режиме пользователя он не -соответствует, это просто ещё одна ипостась ядра. Команда ps -ef -показывает процессы ядра в квадратных скобках, кроме того, в Linux -принято (но не обязательно), чтобы имена таких процессов начинались -на «k»: `[kswapd]`, `[keventd]` и т. п. - -Далее ядро подключает (_монтирует_) корневую файловую систему в -соответствии с переданными параметрами (в наших примерах -- -`root=/dev/hda5`). Подключение это происходит в режиме «только для -чтения» (read-only): если целостность файловой системы нарушена, этот -режим позволит, не усугубляя положение, прочитать и запустить -утилиту `fsck` (file system check). Позже, в процессе загрузки, -корневая файловая система подключится на запись. - -Наконец, ядро запускает из файла `/sbin/init` первый настоящий процесс. -Идентификатор процесса (_PID_) у него равен единице, он -- первый в -таблице процессов, даже несмотря на то, что до него там были -зарегистрированы процессы ядра. Процесс `init` -- очень, очень старое -изобретение, он чуть ли не старше самой истории (истории UNIX, -конечно), и с давних пор его идентификатор равен `1`. - -=== Загрузка системы === - -С запуска `init` начинается загрузка самой системы. В давние времена, -во времена молодости Linux и ранее, в этом месте никаких подводных -камней не наблюдалось. Если ядро содержало подпрограммы для работы со -всеми необходимыми устройствами (т. н. «драйверы»), оно загружалось и -запускало `init`. Если ядру недоставало каких-то важных драйверов -(например, поддержки дискового массива, с которого и шла загрузка) -- -не загружалось и не запускало. Из положения выходили просто: в ядро -старались включить как можно больше драйверов. Такое ядро называлось -_базовым_ (generic), и имело довольно внушительный размер. Загрузивши -систему с базовым ядром, администратор обычно пересобирал его: -выбрасывал из специального файла-профиля драйверы всех отсутствующих -в системе устройств, быть может, добавлял новые (те, что не нужны для -загрузки, но нужны для работы, например, звуковые), и компилировал из -исходных текстов новое, _профильное ядро_. - -[[modules]] -==== Стартовый виртуальный диск и модули ядра ==== - -Пересборка ядра нынче требуется очень редко. Во-первых, в Linux -поддерживается несметное число различных внешних устройств, драйверы -которых (особенно похожих, но разных) вполне могут помешать друг -другу работать, если их использовать одновременно. Пришлось бы -собирать множество разных ядер, без возможности указать пользователю, -какое из них годится. Во-вторых, выяснением того, какой именно -драйвер необходим найденному устройству, занимаются сейчас -специальные программы, в распоряжении которых есть целые базы данных --- ядру такую работу делать неудобно, да и незачем. Это делает -процедуру пересборки ядра почти что обязательной (пока не загружено -базовое ядро, непонятно, какие драйверы добавлять в профильное). А -в-третьих, пресборка ядра требует весьма высокой квалификации того, -кто его пересобирает. Этот процесс нельзя ни автоматизировать, ни -упростить. Утилита `linuxconf`, устроенная именно для этого на основе -окон и меню, даёт на выходе работоспособное ядро в трёх случаях: - -. в руках профессионала; -. при чётком следовании полной инструкции; -. по случайности. - -Не надо вручную пересобирать ядро, даже если учебник по Linux это -советует! - -Совсем другие времена настали, когда изобрели и активно внедрили в -Linux _загружаемые модули ядра_. _Модуль ядра_ -- это часть ядра Linux, -которую можно добавлять и удалять во время работы системы. Модуль -ядра -- не процесс, он работает в режиме супервизора и в таблице -процессов не регистрируется: это набор подпрограмм для работы с -определённым устройством, которые добавляются к возможностям ядра -footnote:[Этим он скорее похож на динамическую библиотеку.]. При -загрузке в память модуль компонуется с ядром, образуя с ним одно -целое. Просмотреть список загруженных модулей можно командой `lsmod`, а -подгрузить модуль в память, добавив его к ядру, и удалить его оттуда --- командами `insmod` и `rmmod` соответственно. - -------------------------------------------------------------- -# lsmod -Module Size Used by Not tainted -usb-uhci 21676 0 (unused) -usbcore 58464 1 [usb-uhci] -af_packet 12392 1 (autoclean) -pcnet32 15140 1 (autoclean) -mii 2544 0 (autoclean) [pcnet32] -crc32 2880 0 (autoclean) [pcnet32] -floppy 48568 0 (autoclean) -subfs 4296 4 (autoclean) -ac 1792 0 -rtc 6236 0 (autoclean) -ext3 62288 2 -jbd 37852 2 [ext3] -------------------------------------------------------------- - -Изменилось и базовое ядро: теперь оно включает в себя только -устройства, необходимые для загрузки системы: главным образом диски и -графическую консоль. Остальные устройства определятся уже самой -системой, тогда можно будет и распознать экзотическую аппаратуру, и -модуль для неё подгрузить. Однако полностью перевести драйверы всех -внешних устройств в модули мешает вот какое соображение: что, если -загрузка системы происходит именно с того устройства, чей модуль ещё -не загружен в ядро, например, с дискового массива (RAID). Вторичный -загрузчик и ядро можно, недолго думая, разместить на другом носителе -(например, на лазерном диске) или добыть с дискового массива -средствами BIOS (карты размещения позволяют не обращать внимания на -логическую структуру RAID). Но как добыть модуль работы с RAID, тот -самый, что распознает эту логическую структуру? - -=========================================================== -Модуль ядра:: - необязательная часть ядра, расширяющая его функциональность. Модуль - можно загрузить в память или удалить оттуда в процессе работы - системы. -=========================================================== - -Подсистема загрузки GRUB умеет разбираться в файловых системах и даже -подключать модули к ядру, однако для того, чтобы сделать процесс -загрузки более или менее универсальным, пришлось бы обучить GRUB всем -видам логики RAID, и всем способам подключения модулей. И то, и -другое постоянно изменяется, и успевать за этими изменениями означает -поддерживать собственную, параллельную Linux, дисковую подсистему. - -Вдумаемся. Для того чтобы средствами Linux подключить модуль ядра, -работающий с дисковым устройством, необходимо загрузить Linux с этого -же устройства. Так ли это невозможно? Ведь если можно прочесть оттуда -«ядро», то, наверное, можно прочесть и «Linux»? Более точно, вдобавок -к одной области данных, соответствущей ядру, надо прочитать вторую, -соответствующую некоторой уменьшенной до предела установке Linux, в -которой содержатся только нужные программы и модули, загрузить оттуда -«маленький Linux», который настроит и подключит злополучный RAID и -запустит процесс загрузки полноценной системы оттуда. - -Предельно сжатый вариант Linux есть, это проект `busybox`, используемый -во встроенных системах, где дорог каждый байт. Разместить файловую -систему в памяти тоже легко, этим, например, занимается модуль `tmpfs`, -который можно включить в базовое ядро (подробнее о типах файловых -систем рассказано в лекции <>). Осталось только обучить подсистемы загрузки GRUB и -LILO считывать не одну, а две области данных -- ядро и образ файловой -системы. Ядру при этом передаётся параметр «пользуйся виртуальным -диском», чтобы оно подключило загруженный образ в качестве временной -корневой файловой системы. Можно также потребовать, чтобы память, -занимаемая временной файловой системой, освобождалась в процессе -дальнейшей загрузки. - -Такой механизм называется `initrd` (initial ram ddisk, где «ram» -- это -не «баран», а random access memory, то есть оперативная память) или -_стартовым виртуальным диском_. Стартовый виртуальный диск собирается -по команде `mkinitrd` в соответствии с профилем компьютера, и -записывается на диск по тем же правилам, что и ядро. В примере -двухсистемной машины, за которой работал Мефодий, также был стартовый -виртуальный диск, причём довольно маленький: - -------------------------------------------------------------- -[root@localhost root]# ls -lg /boot -drwxr-xr-x 2 root 4096 Nov 20 21:08 grub --rw------- 1 root 205374 Nov 9 01:33 initrd-2.4.26-std-up.img -lrwxrwxrwx 1 root 29 Nov 9 01:33 initrd-up.img -> initrd-2.4.26-std-up.img --rw------- 1 root 45056 Nov 20 19:07 map --rw-r--r-- 1 root 935892 Aug 3 21:59 vmlinuz-2.4.26-std-up -lrwxrwxrwx 1 root 26 Nov 9 01:33 vmlinuz-up -> vmlinuz-2.4.26-std-up -------------------------------------------------------------- - -Как видно из примера, ядро в четыре раза превосходит размером -стартовый виртуальный диск. Стоит заметить, что и ядро, и образ диска -упакованы с помощью утилиты `gzip` (причём ядро умеет распаковываться в -памяти самостоятельно), поэтому их действительный размер больше. В -файле `map` хранится карта размещения LILO, а упомянутые в `lilo.conf` и -`menu.lst` файлы `vmlinuz-up` и `initrd-up.img` оказались символьными -ссылками на файлы с более говорящими именами. Никаких требований к -названиям ядер в Linux нет, это дело авторов дистрибутива. В этом -случае в имени ядра и образа диска встречается версия ядра (`2.4.26`), -тип сборки `std` (по-видимому, «standard») и тип архитектуры `up` -(uniprocessor, т. е. однопроцессорная). - -=========================================================== -Стартовый виртуальный диск:: - минимальный набор программ и модулей Linux, необходимый для - обеспечения загрузки системы. Представляет собой _виртуальную - файловую систему_ в оперативной памяти. Загружается _вторичным - загрузчиком_ вместе с _ядром_. -=========================================================== - -=== Отец всех процессов === - -Если в параметрах не сказано иного, ядро считает, что `init` -называется `/sbin/init`. В стартовом виртуальном диске это обычно -некоторый простейший сценарий, а в полноценной системе у `init` другая -задача: он запускает все процессы. Если не он сам, то его потомки, -так что все процессы Linux, кроме ядерных, происходят от `init`, как -весь род людской -- от Адама. - -Первым делом `init` разбирает собственный конфигурационный файл -- -`/etc/inittab`. Файл этот имеет довольно простую структуру: каждая -строка (если она не комментарий) имеет вид `id: уровни: действие: -процесс`, где `id` -- это некоторая двух- или однобуквенная метка, -уровни -- это слово, каждая буква которого соответствует _уровню -выполнения_, (об уровнях выполнения будет рассказано далее), действие --- это способ запуска процесса. Например, запись -`4:2345:respawn:/sbin/mingetty tty4` означает, что меткой `4` помечен -запуск `/sbin/mingetty tty4` footnote:[mingetty -- упрощённый аналог -getty, работающий только на виртуальных консолях.] на уровнях -выполнения `2`, `3`, `4` и `5` по алгоритму `respawn` (запустить в фоне, а -когда процесс завершится, запустить заново). Помимо `respawn` -существуют методы `once` (запустить в фоне однократно), `wait` -(запустить интерактивно, при этом никаких других действий не -выполняется, пока процесс не завершится) и множество других, включая -даже `ctrlaltdel` -- процесс, запускаемый, когда пользователь -нажимает на консоли *Ctrl+Alt+Del* footnote:[Понятно, что *Ctrl+Alt+Del* --- это не *reset*, а обычное сочетание клавиш. Для удобства -пользователя его специально распознаёт клавиатурный драйвер, а ядро -сообщает об этом `init-у`.]. - -Наконец-то Мефодий до конца понял, отчего `getty` ведёт себя так -непохоже на остальные процессы: не просто запускает из-под себя -`login`, а дожидается окончания его работы, отсутствуя при этом в -таблице процессов. На самом деле дожидается не `getty`, а `init`, -используя метод «respawn»: порождается (в фоне) процесс `getty` с -определённым PID, а `init` бездействует до тех пор, пока существует -процесс с этим PID `getty`, `login`, _стартовый командный интерпретатор_ -или программа, запущенная из него с помощью `exec`); когда же процесс, -наконец, умирает, порождается новый `getty`. - -=== Запуск системных служб === - -Полноценно загруженная Linux-система -- не только `login` на -виртуальной консоли. Системе есть чем заняться и помимо идентификации -пользователей. Даже если компьютер не работает WWW-, FTP- или -почтовым сервером для «внешнего мира», себе самой и своим -пользователям система предоставляет множество услуг: отсылка заданий -на печать и обеспечения их очереди, запуск заданий по расписанию, -проверка целостности и т. п. Набор утилит и системных программ, -предназначенных для предоставления таких услуг, принято называть -подсистемами или _службами_. - -==== Чему служат системные службы? ==== - -Как правило, _системная служба_ организована так. Во время начальной -загрузки запускается в фоновом режиме программа, которая всё время -работы системы находится в таблице процессов, однако большей частью -бездействует, ожидая, когда её о чем-нибудь попросят. Для того чтобы -попросить эту программу об услуге, которую она предоставляет, -используются утилиты, взаимодействующие с ней по специальному -протоколу. По аналогии с сократовским «даймонионом», который незримо -присутствует, по своей инициативе не делает ничего, не даёт совершать -плохое и потворствует хорошему, такую программу стали называть -«daemon». Не знакомые с творчеством Платона программисты-любители -частенько переименовывали её в «demon» (_системная служба_); к -сожалению, именно в такой, слегка инфернальной форме, daemon и вошёл -в русскоязычную терминологию. Выходит, что в Linux услуги -пользователям предоставляют... системные службы! - -=========================================================== -Системная служба:: - запускаемая в фоне программа, длительное время пребывающая в - таблице процессов. Обычно служба активизируется по запросу - пользовательской программы, по сетевому запросу или по наступлению - какого-либо системного события. -=========================================================== - -В ранних версиях UNIX всё, что нужно было запускать при старте -системы, вписывалось в `inittab`. Было довольно удобно в одном файле -указывать, какие именно _системные службы_ должны работать в системе, и -в каком порядке их запускать. Само поведение службы при запуске явно -рассчитано на использование в `inittab` по методу `wait`: классическая -системная служба запускается интерактивно, проверяя правильность -конфигурационных файлов и прочие условия работы, а затем -самостоятельно уходит в фон (попросту делая `fork(`)` и завершая -родительский процесс). Таким образом, `init` ждёт, пока системная -служба работает интерактивно, а когда служба, возглавляемая этой -системной службой, готова к работе, переходит к следующей строке -`inittab`. Однако часто бывает так, что автор службы знать не знает, -какие именно условия разработчики той или иной версии Linux сочтут -пригодными для запуска. Для этого ими создаётся _стартовый сценарий_, в -котором запрограммирована логика запуска и останова службы. Кроме -того, если на каждом из уровней выполнения запускается много различных -служб, попытка записывать их запуск в `inittab` делает его громоздким и -совсем неочевидным. - -Гуревич посоветовал Мефодию отложить на время изучение загрузки -системы, а сначала посмотреть, как управлять стартовыми сценариями. - -==== Стартовый сценарий системной службы ==== - -_Стартовый сценарий_ -- программа (обычно написанная на shell), -управляющая включением или выключением какого-нибудь свойства -системы. Это может быть запуск и остановка HTTP-сервера, активизация -и деактивизация сетевых настроек, загрузки модулей и настройка -звуковой подсистемы и т. п. Простейший стартовый сценарий обязан -принимать один параметр, значение которого может быть словом `start` -для запуска (включения) и `stop` для остановки (выключения). Если в -определённом дистрибутиве Linux принято решение, что стартовые -сценарии должны понимать и другие параметры, например `restart` -(обычно `stop` + `start`, но не всегда) и `status` (для опроса -состояния), это требование распространяется на все стартовые -сценарии. Единообразие позволяет, например, легко запускать и -останавливать системные службы, не выясняя, каков PID -останавливаемого процесса и какой именно сигнал ему следует послать. -Достаточно запуск написать так, чтобы PID процесса откладывался в -специальный файл (обычно `/var/run/имя_службы`), а в остановку вписать -что-то вроде `kill -правильный_сигнал cat /var/run/имя_службы`. - -Все стартовые сценарии служб, которыми может воспользоваться система, -принято хранить в каталоге `/etc/rc.d/init.d` (в некоторых -дистрибутивах, для совместимости со старыми версиями UNIX, -используется `/etc/init.d`, иногда это -- просто символьная ссылка на -`/etc/rc.d/init.d`). Запустить или остановить службу можно, просто -вызвав соответствующий сценарий с параметром `start` или `stop`. -Часто ту же самую задачу выполняет и специальная команда `service` -- -которая проверяет, есть ли указанный стартовый сценарий, и запускает -его footnote:[В некоторых дистрибутивах Linux такая команда может -называться `invoke-rc.d`, а команда, аналогичная описанному ниже -chkconfig -- `update-rc.d`.]. - -------------------------------------------------------------- -[root@localhost root]# lsmod > old -[root@localhost root]# /etc/rc.d/init.d/sound stop - Saving OSS mixer settings: [ DONE ] - Unloading sound module (es1371): [ DONE ] -[root@localhost root]# lsmod > nosound -[root@localhost root]# service sound start - Loading sound module (es1371): [ DONE ] - Loading OSS mixer settings: [ DONE ] -[root@localhost root]# lsmod > new -[root@localhost root]# diff3 old new nosound - ====3 - 1:2,5c - 2:2,5c - es1371 25608 0 - ac97_codec 11880 0 [es1371] - soundcore 3652 4 [es1371] - gameport 1628 0 [es1371] - 3:1a -------------------------------------------------------------- - -Здесь Мефодий сначала остановил, а потом снова активизировал звуковую -подсистему. Остановка привела к выгрузке звуковых модулей, а -повторный запуск -- к загрузке, полностью аналогичной исходной. В -этом Мефодий убедился, сравнив с помощью утилиты `diff3` три списка -модулей: `old` (до остановки звуковой подсистемы), `new` (после -повторного запуска) и nosound (между остановкой и повторным -запуском). Файлы `old` и `new` полностью одинаковы, а от nosound оба -отличаются тем, что со второй строки по пятую содержат названия тех -самых модулей ядра (среди которых затесался `gameport`, отвечающий за -джойстик). - -==== Схема «. d» ==== - -Итак, имеется способ единообразно и гибко управлять запуском и -остановкой каждой системной службы в отдельности (или включением и -выключением одного свойства системы). Однако задача целиком -организовать загрузку системы, от запуска `init` до полноценной работы, -этим ещё не решается. Первая из возникающих задач такова: чаще всего -нужно загружать не все из размещённых в `/etc/rc.d/init.d` сценариев, -потому что некоторые из установленных в системе служб администратор -решил не использовать. Удалять оттуда не используемые при загрузке -сценарии -- значит, лишать администратора возможности запускать эти -сценарии вручную. - -Создателям ранних версий UNIX пришла в голову простая мысль: написать -один большой сценарий по имени /etc/rc, в который и заносить только -нужные для запуска команды вида /etc/init.d/сценарий start. Можно -даже занести туда все имеющиеся стартовые сценарии, но строки, -запускающие те, что не используются, закомментировать. Такая -(монолитная) схема имела существенный недостаток: добавление и -удаление службы в систему (например, добавление и удаление _пакета_, -содержащего исполняемые файлы службы) требовало редактирования этого -файла. Если учесть, что порядок запуска служб весьма важен (например, -бессмысленно запускать сетевые службы до активизации сетевых -настроек), становится ясно, что автоматическое изменение такого файла -не может гарантировать нормальную загрузку системы, а значит, -недопустимо. - -На помощь пришла тактика, известная под именем `схема. d`. Суть её в -следующем. Пусть некоторый процесс управляется конфигурационным -файлом, содержимое которого зависит от наличия и активации других -служб системы (таким процессом может быть служба централизованной -журнализации `syslogd`, ведущий журнал всех событий системы, или -сетевой метаслужба `inetd`, принимающий сетевые запросы и превращающий -сетевой поток данных в обыкновенный посимвольный ввод-вывод). Тогда, -чтобы избежать постоянного редактирования конфигурационного файла, -его превращают в каталог (например, вдобавок к файлу `/etc/syslog.conf` -заводится каталог `/etc/syslog.d`). Каждый файл в таком каталоге -соответствует настройке одной службы: при добавлении её в систему -файл появляется, при удалении -- исчезает. Остаётся только обучить -тот же `syslog` читать настройки не из одного `syslog.conf`, но и из всех -файлов в `syslog.d`, и задача решена. - -На случай запускаемых сценариев схема `. d` распространяется с двумя -дополнениями. Во-первых, как уже было сказано, стартовые сценарии -можно запускать, а можно и не запускать. Поэтому сам `init.d` не -годится на роль `. d-каталога`. Впрочем, достаточно организовать ещё -один каталог, скажем, `rc.d`, и создать там ссылки (для наглядности -лучше символьные) на те сценарии из `init.d`, которые планируется -запускать при старте системы. Общий стартовый сценарий `rc` как раз и -будет заниматься запуском стартовых сценариев из `rc.d`. - -Во-вторых, необходимо обеспечить строгий порядок запуска этих -сценариев. Теоретически это совсем просто: отсортировать их по -алфавиту, как это делает `ls` и запускать подряд. Практически же такое -требование накладывает ограничение на имя ссылки в `. d-каталоге`, -поэтому принято, чтобы в начале имени стояло двузначное число. Тогда, -запуская подряд все сценарии, отсортированные алфавитно, rc будет в -первую очередь руководствоваться этим номером, а уж потом -- -названием службы, которое после него стоит. - -==== Уровни выполнения ==== - -В Linux схема начальной загрузки слегка сложнее, чем обычная «. d». -Связано это с тем, что одну и ту же систему в разных случаях бывает -необходимо загружать с разным набором служб. Если, скажем, -использование сети нежелательно, удобнее сказать что-то вреде -«Система! Загружайся без сети!», чем вручную удалять стартовые -сценарии всех предположительно сетевых служб их `. d-каталога`. -Необходимость выбора возникает также, если компьютер используется в -качестве рабочей станции с запуском графической среды и всего с нею -связанного или в качестве стоечного сервера, управлять которым лучше -с системной консоли. - -Поэтому в Linux предусмотрено несколько вариантов начальной загрузки, -называемых _уровни выполнения_ (run levels). Уровни выполнения -нумеруются с `0` до `9`: - -* Уровень `1` соответствует _однопользовательскому режиму_ загрузки -системы. При загрузке на уровень `1` не запускается никаких служб, и -даже системная консоль, как правило, бывает доступна только одна, -так что в системе может работать не более одного пользователя. В -однопользовательском режиме изредка работает администратор -- -исправляет неполадки системы, изменяет ключевые настройки, обслуживает -файловые системы. -* Уровень `2` соответствует _многопользовательскому режиму_ загрузки -системы с отключённой сетью. В этом режиме не запускаются никакие -сетевые службы, что, с одной стороны, соответствует строгим -требованиям безопасности, а с другой стороны, позволяет запускать -службы и настраивать сеть вручную. -* Уровень `3` соответствует _многопользовательскому сетевому режиму_ -загрузки системы. Сеть при загрузке на этот уровень настроена, и -все необходимые сетевые службы запущены. На этом уровне обычно -работают компьютеры-серверы. -* Уровень `5` соответствует _многопользовательскому графическому -режиму_ загрузки системы. На этом уровне обычно работают рабочие -станции, предоставляя пользователям возможность работать с графической -подсистемой X11. Сеть на этом уровне настроена, а вот список запущенных -сетевых служб может быть меньше, так как рабочая станция не всегда -выполняет серверные функции (хотя, безусловно, может). -* Уровни `0` и `6` -- специальные. Они соответствуют _остановке_ и -_перезагрузке_ системы. В сущности, это удобные упрощения для действий, -обратных загрузке на уровень: все службы останавливаются, диски -размонтируются. В случае останова даже электропитание можно отключать -программно, если аппаратура позволяет, а в случае перезагрузки система -идёт на повторную загрузку. - -Остальные уровни никак специально в Linux не описаны, однако -администратор может использовать и их, определяя особый профиль -работы системы. Переход с уровня на уровень происходит очень просто: -по команде `init` номер_уровня. На какой уровень загружаться при старте -системы, написано в `inittab` (в поле действие должно быть написано -«initdefault», а в поле уровни -- только одна цифра). Узнать текущий -уровень выполнения можно с помощью команды `runlevel`: - -------------------------------------------------------------- -[root@localhost root]# grep initdefault /etc/inittab - id:3:initdefault: -[root@localhost root]# runlevel - N 3 -------------------------------------------------------------- - -============================================= -Уровень выполнения:: - сохранённый профиль загрузки системы. В Linux реализован выполнением - всех сценариев остановки и запуска служб из подкаталога `rc.уровеньd` - каталога `/etc` или `/etc/rc.d` -============================================= - -Схема `. d` легко учитывает уровни выполнения. В каталоге `/etc/rc.d` -footnote:[В некоторых дистрибутивах -- в каталоге `/etc/`] заводится -несколько `. d-подкаталогов`, соответствующих каждому уровню -выполнения: `/etc/rc.d/rcуровень.d`. Именно оттуда их запускает -стартовый сценарий `/etc/rc.d/rc`. - -------------------------------------------------------------- -[root@localhost root]# ls -F /etc/rc.d - init.d/ rc.powerfail* rc0.d/ rc2.d/ rc4.d/ rc6.d/ - rc* rc.sysinit* rc1.d/ rc3.d/ rc5.d/ scripts/ -[root@localhost root]# ls /etc/rc2.d - K10power K75netfs S15random S31klogd S37gpm S54sshd - K44rawdevices K95kudzu S30sound S32hotplug S40crond S98splash - K50xinetd S10network S30syslogd S35keytable S41anacron S99local -[root@localhost root]# ls -l /etc/rc2.d/ K75netfs - lrwxrwxrwx 1 root root 15 Nov 9 01:16 /etc/rc2.d/K75netfs -> ../init.d/netfs -------------------------------------------------------------- - -Переход с уровня на уровень должен сопровождаться не только запуском, -но и остановкой служб. Это касается не только уровней `0` и `6`, но и -любых других. Например, при переходе с уровня `3` на уровень `2` -необходимо остановить все сетевые службы. Поэтому схема `. d` была -расширена: сначала с параметром `stop` запускаются сценарии, имена -которых начинаются на `K` (`Kill`), а затем, с параметром `start` -- -те, имена которых начинаются на `S` (`Start`). В приведённом примере -при переходе на уровень `2` останавливаются несколько служб, в том -числе сетевой метаслужба (`K50xinetd`) и монтирование по сети удалённых -файловых систем (`K75netfs`). Если при переходе с уровня на уровень -некой службе не требуется менять своего состояния, сценарий не -запускается вовсе. Так, при переходе с уровня `3` на уровень `2` сетевые -настройки остаются активными, поэтому соответствующий сценарий -(`S10network`), скорее всего, запущен не будет. - -Долгое время считалось, что определение порядка загрузки -- дело -системного администратора, поэтому расставлять символьные ссылки в -каталоги `rc*.d` приходилось вручную. Однако одно из другого не -следует: можно предусмотреть и более лёгкий способ наполнения этих -каталогов ссылками. Один из способов такой: поставить в стартовый -сценарий комментарий особого вида, в котором и описать, на каких -уровнях служба должна быть активизирована, и какой по порядку должна -быть запущена и остановлена: - -------------------------------------------------------------- -[root@localhost root]# grep chkconfig /etc/init.d/netfs - # chkconfig: 345 25 75 -[root@localhost root]# chkconfig --list netfs - netfs 0:off 1:off 2:off 3:on 4:on 5:on 6:off -[root@localhost root]# ls /etc/rc.d/rc*.d/*netfs - /etc/rc.d/rc0.d/K75netfs /etc/rc.d/rc3.d/S25netfs /etc/rc.d/rc6.d/K75netfs - /etc/rc.d/rc1.d/K75netfs /etc/rc.d/rc4.d/S25netfs - /etc/rc.d/rc2.d/K75netfs /etc/rc.d/rc5.d/S25netfs -------------------------------------------------------------- - -Здесь Мефодий использовал утилиту `chkconfig`, которая ищет в стартовом -сценарии комментарий вида `chkconfig`: уровни вкл выкл, и -самостоятельно проставляет ссылки в соответствии с этими полями: во -всех каталогах, упомянутых в уровнях соответствующий `netfs` сценарий -имеет вид `Sвклnetfs`, а во всех остальных -- `Kвыклnetfs`. Эта же -утилита позволяет добавлять и удалять службу на каждом уровне в -отдельности или запрещать её вовсе. - -=== Загрузка типичной системы на уровень выполнения 5 === - -Итак, что же происходит после запуска `init`? - -------------------------------------------------------------- -[root@localhost root]# grep rc /etc/inittab - si::sysinit:/etc/rc.d/rc.sysinit - l0:0:wait:/etc/rc.d/rc 0 - l1:1:wait:/etc/rc.d/rc 1 - l2:2:wait:/etc/rc.d/rc 2 - l3:3:wait:/etc/rc.d/rc 3 - l4:4:wait:/etc/rc.d/rc 4 - l5:5:wait:/etc/rc.d/rc 5 - l6:6:wait:/etc/rc.d/rc 6 -[root@localhost root]# grep initdefault /etc/inittab - id:5:initdefault: -------------------------------------------------------------- - -Метод `sysinit` в `inittab` означает, что процесс запускается во время -начальной загрузки системы, до перехода на какой-нибудь уровень -выполнения. Следовательно, первым запускается сценарий -`/etc/rc.d/rc.sysinit`. Он настраивает аппаратуру дисковых массивов, -проверяет и монтирует дисковые файловые системы, инициализирует -область подкачки, межсетевой экран -- словом, делает всё, без чего -дальнейшая полноценная загрузка системы невозможна. Далее из строчки -с «initdefault» `init` узнаёт, что уровень выполнения по умолчанию -- -пятый (многопользовательский графический), и выполняет все строки из -`inittab`, в поле уровни которых есть `5`. В частности, запускается -сценарий `rc` с параметром `5` (`l5:5:wait:/etc/rc.d/rc 5`), который и -выполняет необходимые действия из `. d-каталога` `/etc/rc.d/rc5.d`. -Метод запуска `rc` -- «wait», так что `init` ждёт, пока не выполнятся все -стартовые сценарии, а потом продолжает разбор `inittab`. - -------------------------------------------------------------- -[root@localhost root]# ls /etc/rc.d/rc5.d/ - K10acpid S10network S30syslogd S37gpm S50xinetd - K20nfs S13portmap S31klogd S40crond S54sshd - K65apmd S15random S32hotplug S41anacron S56rawdevices - K86nfslock S25netfs S35keytable S44xfs S64power - S05kudzu S30sound S36update_wms S45dm S98splash -------------------------------------------------------------- - -Мефодий заметил, сценарий `K20nfs` (с параметром «stop») не выполнился: -соответствующего сообщения на системной консоли не появилось. Беглый -просмотр `/etc/rc.d/init.d/nfs` показал, что этот сценарий предназначен -для запуска и остановки сервера сетевой файловой системы (`NFS`). -Сервер используется на уровне `3`, а на уровне `5` -- нет, поэтому при -переходе с `3` на `5` его следует останавливать. Поскольку во время -начальной загрузки останавливать нечего, сценарий не выполнился. - -Из служб, запускаемых именно на пятом уровне, примечателен шрифтовый -сервер, под номером `44`, (`the X font server, xfs`) -- программа, у -которой графическая подсистема получает шрифты (нередко по сети, -тогда такой сервер может быть один на несколько рабочих станций), и -_экранный диспетчер_ footnote:[Не путать с диспетчером окон, описанным -в лекции <>], под номером `45`, -(`the X display manager, xdm`) -- программа, регистрирующая -пользователя на манер `login`, с той разницей, что регистрация и запуск -графических приложений могут происходить по сети с удалённого -компьютера. Тут разрешилась ещё одна загадка: вместо обычной -виртуальной консоли и login-а, Мефодий нередко наблюдал окно -графической подсистемы с надписью «Login:» и «Password:», а кое-где -даже «Логин:», «Пароль:» и портрет самого пользователя! Оказывается, -это были различные версии `xdm`. Дабы не забивать себе голову -разрозненными сведениями, Мефодий решил до поры (до лекции <>) не использовать графическую среду и -нажал *Ctrl+Alt+F1*, переключившись в текстовую консоль. - -Текстовая консоль на пятом уровне доступна: записи вида -`1:2345:respawn:/sbin/mingetty tty1` обычно включают `5` в поле уровни. - -=== Остановка системы === - -Как уже говорилось, операция, обратная загрузке ситемы -- _остановка_ --- устроена в Linux как специальный _уровень выполнения_: `0` -- если -требуется выключить систему, и `6` -- если требуется перезагрузка. -Соответствующие каталоги `rc0.d` и `rc6.d` будут состоять почти сплошь из -ссылок вида K*, но как минимум один сценарий, `killall`, будет запущен -с параметром `start`. Этот сценарий остановит все процессы, которые -не были остановлены K-сценариями: программы пользователей, системные -службы, запущенные администратором вручную, и т. п. - -Нечего и говорить, что отключение электропитания в разгар работы -системы -- операция очень рискованная. Даже в самом удачном случае -при повторной загрузке `rc.sysinit` увидит, что файловые системы не -были размонтированы и станет проверять их целостность. В не самом -удачном случае эта целостность будет нарушена: некоторые открытые на -запись и не закрытые файлы окажутся в странном, недописанном -состоянии, появятся индексные дескрипторы, не связанные ни с каким -каталогом и т. п. Как правило, такие ошибки исправляются программой -восстановления файловых систем `fsck`: с одной стороны, за счёт -дополнительных свойств файловой системы (журнализация, сводящая -вероятность порчи к минимуму, логически упорядоченная запись и т. -п.), с другой -- за счёт некоторых предположений, которые делает сама -утилита `fsck`. Однако надеяться на неё нельзя: очень редко, но бывают -неразрешимые противоречия в лишённой цельности файловой системе, и -тогда `fsck` обращается за помощью к администратору, требуя -подтверждения действий (например, для удаления испорченного файла, -который точно раньше был), или выполняя эти рискованные действия -автоматически. В первом случае всё время взаимодействия с -администратором система будет работать в _однопользовательском режиме_, -причём администратору предстоит разбираться с тем, что получилось, а -во втором есть нешуточная вероятность того, что система испортится, а -замечено это будет слишком поздно. - -Останов системы может занимать больше времени, чем загрузка: -например, процессы, выполняющие _системный вызов_ (скажем, чтения с -дискеты), не завершаются по сигналу `TERM` сразу, а получив его, могут -некоторое время заниматься обработкой (дописыванием в файл и т. п.). -Остановка службы, особенно сетевой, тоже может длиться долго: -например, когда требуется сообщить о закрытии сервиса каждому -клиенту. Однако только в этом случае можно быть уверенным, что все -процессы завершились нормально, и что после перезагрузки они -продолжат нормально работать. - -В экстренных случаях (например, когда при сбое электропитания служба, -обслуживающая устройство бесперебойного снабжения, сообщает, что -ресурсы на исходе), безопаснее всё-таки быстро поостанавливать -процессы, чем дожидаться отключения питания на работающей системе. -Для этого можно послать всем процессам сначала `TERM`, а короткое время -спустя -- `KILL`. Для обработки таких ситуаций в `inittab` есть методы, -начинающиеся со слова «power», а в `/etc/rc.d` -- специальный сценарий -`rc.powerfail`. На самый крайний случай существуют команды `halt` и -`reboot` с ключом `-f`, однако их почти мгновенное действие практически -эквивалентно внезапной потере питания, и использовать их не -рекомендуется. - -Для останова или перезагрузки системы можно выполнять команды `init 0` -и `init 6`. Они вполне справятся с оповещением и остановкой активных в -системе программ, что займёт минуту-две. А вот с пользователями, -работающими в системе, всё сложнее. Как правило, для завершения -работы требуется хотя бы минут пять, а лучше -- десять. Поэтому -вежливые администраторы пользуются утилитой `shutdwon`, которая -запускается за несколько минут до времени перезагрузки, каждую минуту -предупреждая пользователей о грядущем событии в работе системы, после -чего уже запускает `init`: - -------------------------------------------------------------- -[root@localhost root]# shutdown -r +3 "Sorry, we need to reboot" - Broadcast message from root (ttyS0) (Sun Nov 28 14:05:41 2004): - Sorry, we need to reboot - The system is going DOWN to maintenance mode in 3 minutes! - . . . - Broadcast message from root (ttyS0) (Sun Nov 28 14:06:41 2004): - Sorry, we need to reboot - The system is going DOWN to maintenance mode in 2 minutes! - . . . - Broadcast message from root (ttyS0) (Sun Nov 28 14:07:41 2004): - Sorry, we need to reboot - The system is going DOWN to maintenance mode in 1 minute! - . . . - Broadcast message from root (ttyS0) (Sun Nov 28 14:08:41 2004): - Sorry, we need to reboot - The system is going down to maintenance mode NOW! - INIT: Switching to runlevel: 6 - . . . -------------------------------------------------------------- - -Остаётся заметить, что у `shutdown` есть обязательный параметр -- время -начала останова, в примере он равен `+3`, то есть «через три минуты», -и необязательный -- `-r` (reboot, перезагрузка) или `-h` (halt, -останов). Без необязательных параметров выполняется переход на первый -уровень выполнения, причём запускается _стартовый командный -интерпретатор_ суперпользователя, а после его завершения система вновь -переходит на уровень выполнения по умолчанию (используется, например, -для профилактических действий в системе). Нажатие *Ctrl+Alt+Del* или -кнопки выключения питания (в системах, где эта кнопка ничего не -выключает, а лишь посылает соответствующий аппаратный сигнал) -приводит к запуску именно `shutdown -r` или `shutdown -h`. - -[[devices]] -== Работа с внешними устройствами == - -=== Представление устройства в системе === - -В лекции <> говорилось о том, что аппаратный -профиль компьютера определяется _ядром_ на ранних этапах загрузки системы или в -процессе подключения _модуля_. Это не означает, что устройство, не распознанное -ядром, задействовать невозможно. Если неизвестным ядру устройством можно -управлять по какому-нибудь стандартному протоколу, вполне возможно, что среди -пакетов Linux найдётся утилита или служба, способная с этим устройством -работать. Например, программа записи на лазерный диск `cdrecord` знает -великое множество разнообразных устройств, отвечающих стандарту SCSI, в то -время как ядро, как правило, только позволяет работать с таким устройством -как с обычным лазерным приводом (на чтение), и передавать ему различные -SCSI-команды. - -К сожалению, иногда и обратное неверно: если производитель создаёт новое -устройство, управлять которым нужно по-новому, а распознаётся оно как одно из -старых, ошибки неизбежны. Многие стандарты внешних устройств предусматривают -строгую идентификацию модели, однако хорошего мало и тут: незначительно изменив -схемотехнику, производитель меняет и идентификатор, и устройство перестаёт -распознаваться до тех пор, пока автор соответствующего модуля Linux не заметит -это и не добавит новый идентификатор в список поддерживаемых. - -Большинству распознанных устройств, если они должны поддерживать операции -чтения/записи или хотя бы управления (`ioctl()`, описанный ниже), -соответствует _файл-дырка_ в каталоге `/dev` или одном из его подкаталогов. В -зависимости от того, выбрана ли в системе статическая или динамическая схема -именования устройств, файлов-дырок в `/dev` может быть и очень много, и -относительно мало. При статической схеме именования то, что ядро распознало -внешнее устройство, никак не соотносится с тем, что в `/dev` имеется для -этого устройства файл-дырка: - ---------------------------------------------------------------- -[root@localhost root]# cat /dev/sdg14 -cat: /dev/sdg14: No such device or address ---------------------------------------------------------------- - -Здесь Мефодий попытался прочитать что-либо из устройства `/dev/sdg14`, что -соответствует четырнадцатому разделу SCSI-диска под номером семь. Такого диска -в этой машине, конечно, нет, а файл-дырка для него заведён на всякий случай: -вдруг появится? Поскольку появиться может любое из поддерживаемых Linux -устройств, таких файлов «на всякий случай» в системе бывает и десять тысяч, и -двадцать. Файл-дырка не занимает места на диске, однако использует _индексный -дескриптор_, поэтому в корневой файловой системе, независимо от её объёма, -индексных дескрипторов должен быть изрядный запас. - -При динамической схеме именования применяется специальная _виртуальная -файловая система_, которая либо полностью подменяет каталог `/dev`, либо -располагается в другом каталоге (например, `/sys`), имеющем непохожую на -`/dev` иерархизированную структуру; в этом случае файлы-дырки в `/dev` -заводит специальная служба. Этот способ гораздо удобнее и для человека, -который запустил команду `ls /dev`, и для компьютера (в случае подключения -внешних устройств, например, съёмных жёстких дисков, «на лету»). Однако он -требует соблюдать дополнительную логику «привязки» найденного устройства к -имени, иногда весьма запутанную из-за той же нечёткой идентификации. -Поскольку происходить это должно в самый ответственный момент, при загрузке -системы, динамическую схему именования используют с осторожностью. - -===================================================== -Виртуальная файловая система:: - механизм отображения в виде файловой системы любых иерархически - организованных данных. Существенно упрощает доступ к таким данным, - так как позволяет применять обычные операции ввода-вывода: - открытие и закрытие файла, чтение и запись и т. п. -===================================================== - -=== Файлы-дырки и другие типы файлов === - -Кое-какие идеи динамического именования устройств присутствуют и в -статической схеме. Так, файлы `/dev/mouse` или `/dev/cdrom`, на самом деле -- -символьные ссылки на соответствующие файлы-дырки. Если тип мыши или лазерного -привода изменится, достаточно изменить эти ссылки и перезапустить -соответствующие службы. - ---------------------------------------------------------------- -[root@localhost root]# ls -l /dev/cdrom /dev/mouse - lrwxrwxrwx 1 root root 8 Nov 20 23:23 /dev/cdrom -> /dev/hdc - lrwxrwxrwx 1 root root 5 Nov 9 01:16 /dev/mouse -> psaux -[root@localhost root]# ls -lL /dev/cdrom /dev/mouse /dev/hda1 /dev/ur* /dev/ze* - brw-r----- 1 root cdrom 22, 0 Jul 26 16:59 /dev/cdrom - brw-rw---- 1 root disk 3, 1 Jul 26 16:59 /dev/hda1 - crw------- 1 root root 10, 1 Dec 2 11:58 /dev/mouse - crw-r--r-- 1 root root 1, 9 Nov 28 14:10 /dev/urandom - crw-rw-rw- 1 root root 1, 5 Jul 26 16:59 /dev/zero ---------------------------------------------------------------- - -Файл-дырка, как и всякая дырка, не имеет никакого размера: сколько в неё не -записывай, в файл на диске ничего не попадёт. Вместо этого ядро передаёт всё -записанное драйверу, отвечающему за файл-дырку, а тот по-своему обрабатывает -эти данные. Точно так же работает и чтение из файла-дырки: все запрашиваемые -данные в неё подсовывает драйвер. Большинство драйверов -- дисковые, звуковые -последовательных и параллельных портов и т. п. -- обращаются за данными к -какому-нибудь внешнему устройству или передают их ему. Но есть и такие, кто -сам всё выдумывает: это и `/dev/null`, чёрная дыра, в которую что угодно -можно записать, и оно пропадёт безвозвратно, и `/dev/zero`, из которого можно -считать сколько угодно нулей (на запись оно ведёт себя как `/dev/null`), и -`/dev/urandom`, из которого можно считать сколько угодно относительно -случайных байтов. - -Изучив выдачу команды `ls -lL` (ключ `-L` заставляет `ls` выводить информацию -не про символьную ссылку, а про файл, на который она указывает), Мефодий -обнаружил, что та вместо размера файла-дырки (который равен нулю) выводит два -числа. Первое из этих чисел называется _старшим номером устройства_ (major -device number), оно, грубо говоря, соответствует драйверу, отвечающему за -устройство. Второе называется _младшим номером устройства_ (minor device -number), оно соответствует способу работы с устройством, а для дисковых -носителей -- _разделу_. В частности, из примера видно, что устройствами -/dev/random и /dev/urandom занимается один и тот же драйвер со старшим -номером 1. При этом часть устройств (по преимуществу -- дисковые) имеет тип -«b», а другая часть -- «c» (этот тип имеют, например, терминалы). Тип указан -в _атрибутах_ файла первым символом. Это блочные (block) устройства, обмен -данными с которыми возможен только порциями (блоками) определённого размера, -и символьные (character) устройства, запись и чтение с которых происходит -побайтно. Блочные устройства, вдобавок, могут поддерживать команды прямого -доступа вида «прочитать блок номер такой-то» или «записать данные на диск, -начиная с такого-то блока». - -Блочные и символьные устройства -- полноправные объекты файловой системы, -такие же, как файлы, каталоги и символьные ссылки. Есть ещё два типа -специальных файлов -- _каналы_ и _сокеты_. _Канал_-файл (или `fifo`) называют -ещё _именованным каналом_ (`named pipe`): это такой же объект системы, как и -тот, что используется командной оболочкой для организации _конвейера_ (его -называют _неименованным каналом_), разница между ними в том, что у `fifo` -есть имя, он зарегистрирован в файловой системе. Это -- типичный файл-дырка, -причём дырка двухсторонняя: любая программа может записать в канал (если -позволяют права доступа) и любая программа может оттуда прочитать. Создать -именованный канал можно с помощью команды `mkfifo`: - ---------------------------------------------------------------- -methody@localhost:~ $ mkfifo hole -methody@localhost:~ $ ( date >> hole & head -1 < hole ) 2> /dev/null - Птн Дек 3 15:11:05 MSK 2004 -methody@localhost:~ $ ( cal >> hole & head -1 < hole ) 2> /dev/null - Декабря 2004 -methody@localhost:~ $ rm hole ---------------------------------------------------------------- - -Здесь важно, что утилита `head` показывает начало не «файла» `hole`, а именно -последней записываемой порции данных, как и подобает трубе footnote:[Если -стандартный вывод ошибок всего конвейера перенаправлен в `/dev/null`, то -командный интерпретатор не выводит сообщений о запуске и остановке фонового -процесса.]. - -======================================================= -Канал:: - объект Linux, используемый в межпроцессном взаимодействии. Доступен - в виде двух _дескрипторов_: один открыт на запись, другой -- на чтение. - Все данные, записываемые в первый дескриптор, немедленно можно - прочитать из второго. Различают _неименованный канал_, уничтожаемый - с закрытием обоих дескрипторов, и _именованный канал_ (FIFO) -- - файл-дырку, создаваемый в файловой системе. -======================================================= - -Что же касается _сокетов_, то это -- более сложные объекты, предназначенные для -связи двух процессов и передачи информации в обе стороны. Сокет можно -представить в виде двух каналов (один «туда», другой «обратно»), однако -стандартные файловые операции `открытия/чтения/записи` на нём не работают. -Процесс, открывший сокет, считается сервером: он постоянно «слушает», нет ли в -нём новых данных, а когда те появляются, считывает их, обрабатывает, и, -возможно, записывает в сокет ответ. Процесс-клиент может подключиться к сокету, -обменяться информацией с процессом-сервером и отключиться. Точно так же можно -передавать данные и по сети, в этом случае указывается не _путь_ к сокету на -файловой системе (т. н. unix domain socket), а сетевой адрес и _порт_ удалённого -компьютера (например Internet socket, если подключаться с помощью сети -Internet). - -==== Драйверы устройств ==== - -Как уже говорилось в лекции <>, часть системы, -отвечающая за взаимодействие с каким-нибудь внешним устройством и называемая -«драйвер», в Linux либо входит в _ядро_, либо оформляется в виде _модуля -ядра_, и подгружается по необходимости. Следовательно, файл-дырка, обращение -к которому приводило к «no such device or address», вполне может и -заработать (в этом одна из причин огромного количества устройств в `/dev`). -Гуревич наотрез отказался объяснять Мефодию «как добавить новый драйвер» до -тех пор, пока тот не будет лучше разбираться в архитектуре компьютеров вообще -и в аппаратной части IBM-совместимых компьютеров в частности. Поэтому всё, -что смог понять Мефодий, не имея таких знаний, сводилось к следующему. -Во-первых, если существуют различия между тем, как по умолчанию загружает -модули система и тем, как на самом деле это необходимо делать, различия -должны быть описаны в файле `/etc/modules.conf`. Во-вторых, после изменения -этого файла, добавления нового устройства, обновления самих модулей и т. п. -следует запускать утилиту depmod, которая заново выстраивает непротиворечивую -последовательность загрузки модулей. В-третьих, интересно (но в отсутствие -знаний -- мало познавательно) запускать утилиту `lspci`, которая показывает -список устройств (распознаваемых по стандарту PCI), найденных на компьютере. - -==== Работа с устройствами ==== - -Все файлы-дырки подчиняются одним и тем же правилам работы с файлами: их можно -открывать для записи или чтения, записывать данные или считывать их -стандартными средствами, а по окончании работы -- закрывать. Открытие и закрытие -файла (_системные вызовы_ `open()` и `close()`) в командном интерпретаторе не -представлено отдельной операцией, оно выполняется автоматически при -перенаправлении ввода (открытие на чтение) или вывода (на запись). Это -позволяет работать и с устройствами, и с каналами, и с файлами совершенно -одинаково, что активно используется в Linux программами-_фильтрами_. Каждый тип -файлов имеет свою специфику, например, при записи на блочное устройство данные -накапливаются ядром в специальном буфере размером в один блок, и только после -заполнения буфера записываются. Если при закрытии файла буфер неполон, он всё -равно передаётся целиком: часть -- данные, записанные пользователем, часть -- -данные, оставшиеся от предыдущей операции записи). Это, конечно, не означает, -что из файла, находящегося на блочном устройстве, легко по ошибке прочитать -такой «мусор»: длина файла известна, и ядро само следит за тем, чтобы программа -не прочла лишнего. - -Даже такие (казалось бы) простые устройства, как жёсткие диски, поддерживают -гораздо больше различных операций, чем просто чтение или запись. Пользователю, -как минимум, может потребоваться узнать размер блока (для разных типов дисков -он разный) или объём всего диска в блоках. Для многих устройств собственно -передача данных -- лишь итог замысловатого общения с управляющей программой или -ядром. Скажем, для вывода оцифрованного звука на звуковую карту сначала -необходимо настроить параметры звукогенератора: частоту, размер шаблона, -количество каналов, формат передаваемых данных и многое другое. Для управления -устройствами существует _системный вызов_ `ioctl()` (iput-output control): -устройство надо открыть, как файл, а затем использовать эту функцию. У каждого -устройства -- свой набор команд управления, поэтому в виде отдельной утилиты -`ioctl()` не встречается, а используется неявно другими утилитами, -специализирующимися на определённом типе устройств. - -==== Права доступа к устройствам ==== - -Некоторые устройства просто обязаны быть доступны пользователю на запись и -чтение. Например, виртуальная консоль, за которой работает Мефодий, доступна -пользователю `methody` на запись и на чтение, именно поэтому командный -интерпретатор Мефодия может посылать туда символы и считывать их оттуда. В то -же время, терминал, за которым работает Гуревич, пользователю недоступен, а -терминалы, за которыми не работает никто, доступны только суперпользователю: - ---------------------------------------------------------------- -methody@localhost ~ $ who - methody tty1 Dec 3 16:02 (localhost) - shogun ttyS0 Dec 3 16:03 (localhost) -methody@localhost ~ $ ls -l /dev/tty1 /dev/tty2 /dev/ttyS0 - crw--w---- 1 methody tty 4, 1 Дек 3 16:02 /dev/tty1 - crw------- 1 root root 4, 2 Дек 3 15:51 /dev/tty2 - crw--w---- 1 shogun tty 4, 64 Дек 3 16:03 /dev/ttyS0 -methody@localhost:~ $ ls -l /usr/bin/write --rwx--s--x 1 root tty 8708 Июн 25 14:00 /usr/bin/write ---------------------------------------------------------------- - -Права на владение терминалом передаются с помощью `chown` пользователю -программой `login` после успешной регистрации в системе. Она же выставляет -право записи на терминал членам группы `tty`. «Настоящих» пользователей в -этой группе может и не быть, зато есть setGID-программы, например, `write`, -которая умеет выводить сообщения сразу на все активные терминалы. - -Множество устройств в системе, используемой как рабочая станция, также -отдаются во владение -- на этот раз, первому пользователю, -зарегистрировавшемуся в системе. Предполагается, что компьютер служит в -качестве рабочей станции именно этого пользователя, а все последующие доступа -к этим устройствам не получат footnote:[Что называется, «кто первым встал -- -того и тапки».]. Как правило, так поступают с устройствами, которые могут -понадобиться только одному человеку, сидящему за монитором: звуковыми и -видеокартами, лазерными приводами, дисководом и т. п.: - ---------------------------------------------------------------- -shogun@localhost ~ $ ls -l /dev | grep methody | wc - 665 6649 41459 -shogun@localhost ~ $ ls -lL /dev/{audio,cdrom,fd0,hda,kmem} - crw-rw---- 1 methody audio 14, 4 Июл 26 16:59 /dev/audio - brw-r----- 1 methody cdrom 22, 0 Июл 26 16:59 /dev/cdrom - brw-rw---- 1 methody floppy 2, 0 Июл 26 16:59 /dev/fd0 - brw-rw---- 1 root disk 3, 0 Июл 26 16:59 /dev/hda - crw-r----- 1 root kmem 1, 2 Июл 26 16:59 /dev/kmem ---------------------------------------------------------------- - -При этом для того, чтобы обеспечить и другим -- псевдо- или настоящим -- -пользователям, такие устройства также принадлежат определённым группам с -соответствующими правами. Практика «раздачи» устройств группам вообще очень -удобна: даже если доступ к устройству имеет только суперпользователь, -существует возможность написать setGID-программу, которая, не получая -суперпользовательских прав, сможет до этого устройства добраться (а можно и -просто включить опытного пользователя в такую группу). - -=== Разметка диска и именование устройств === - -В начале лекции говорилось о том, что _младший номер устройства_, -соответствующего жёсткому диску, обычно указывает на определённый раздел -этого диска. Поначалу Мефодию казалось, что смысла «пилить» диск на несколько -разделов нет никакого: известно, что один большой раздел файловой системы -Linux footnote:[Для некоторых других файловых систем, например, для `vfat`, это -неверно.] вмещает чуть больше данных, чем несколько маленьких того же объёма. -Кроме того, разбивая диск на разделы, можно не предугадать подходящие размеры -этих разделов, и тогда размещение на них файловой системы Linux окажется -делом нелёгким, если вообще возможным, так как структура дерева каталогов -Linux строго определена стандартом FHS (см. лекцию <>). - -============================================== -Раздел диска:: - часть жёсткого диска, используемая под определённые задачи: файловую - систему того или иного типа, область подкачки и т. п. Изменение - содержимого и типа одного раздела никак не сказывается на других. -============================================== - -Впрочем, в том же FHS весьма наглядно обоснована необходимость разнесения -всего дерева каталогов по разным разделам, каждый из которых будет иметь -собственную _файловую систему_. Каталоги сильно различаются по тому, как часто -приходится в них записывать, насколько надёжность хранения данных в них -важнее быстродействия и насколько ситуация _переполнения файловой системы_ -опасна и может помешать работе. Поэтому стоит каталог `/tmp`, требующий очень -частой записи, но не требующий надёжного хранения данных после перезагрузки, -держать не на том же разделе, что и корневую файловую систему, запись в -которую происходит редко (в каталог `/etc`), но требует повышенной -надёжности. В отдельный раздел можно поместить весь каталог `/usr`, так как -он вообще не требует операций записи. Наконец, такие каталоги, как `/var` -или `/home`, суммарный объём файлов в которых с трудом поддаётся контролю со -стороны системы, тоже не следует размещать на том же разделе, что и корневую -файловую систему, переполнение которой может быть болезненно воспринято Linux. - -К тому же на компьютере может быть установлено несколько операционных систем, и -каждой из них понадобится для корневой файловой системы отдельный раздел. В -этой и предыдущей лекции Мефодий работает именно за такой машиной: помимо -Linux, на ней установлен FreeDOS для запуска одной-единственной программы. - -==== Разметка диска IBM-совместимого компьютера ==== - -============================================== -Таблица разделов:: - небольшая часть жёсткого диска, описывающая геометрию и тип его - разделов. Стандартная таблица разделов диска IBM-совместимого - компьютера может содержать не более четырёх разделов. -============================================== - -Разбиение диска на разделы -- дело (теоретически) несложное: какая-то часть -диска должна быть отведена под _таблицу разделов_, в которой и будет написано, -как разбит диск. Стандартная таблица разделов для диска IBM-совместимого -компьютера -- HDPT (hard disk partition table) -- располагается в конце -самого первого сектора диска, после _предзагрузчика_ (master boot record, MBR) -и состоит из четырёх записей вида `тип начало конец`, описывающих очередной -раздел диска (если раздела нет, поле тип устанавливается в 0). Разделы, -упомянутые в HDPT диска, принято называть _основными_ (primary partition). -Устройство Linux, соответствующее первому диску компьютера, обычно -называется `/dev/hda` (hard disk «a»). Второй диск получает имя `hdb`, -третий -- `hdc` и так далее. На типичном IBM-совместимом компьютере такое же -имя получит и лазерный накопитель. Часто бывает, что жёсткий диск -- первый в -системе (`hda`), а лазерный накопитель -- третий (`hdc`), второго же вовсе -нет. Устройства, соответствующие основным разделам диска, называются -`/dev/hdбукваномер`, для первого диска -- от `hda1` до `hda4`. Просмотреть -список разделов можно с помощью команды `fdisk -l`. - -==== Совмещение нескольких схем разметки ==== - -На той самой -- двухсистемной -- машине `fdisk` обнаружила пятый, шестой и -седьмой разделы, однако не показала ни третий, ни четвёртый: - ---------------------------------------------------------------- -[root@localhost root]# fdisk -l - Disk /dev/hda: 2147 MB, 2147483648 bytes - 128 heads, 63 sectors/track, 520 cylinders - Units = cylinders of 8064 * 512 = 4128768 bytes - Device Boot Start End Blocks Id System - /dev/hda1 * 1 25 100768+ 6 FAT16 - /dev/hda2 26 520 1995840 5 Extended - /dev/hda5 26 282 1036192+ 83 Linux - /dev/hda6 283 334 209632+ 82 Linux swap - /dev/hda7 335 520 749920+ 83 Linux ---------------------------------------------------------------- - -Дело в том, что четырёх разделов редко когда бывает достаточно. Куда же -помещать дополнительные поля таблицы разбиения? Создатели IBM PC предложили -универсальный способ: один из четырёх основных разделов объявляется -_расширенным_ (extended partition); он, как правило, занимает всё оставшееся -пространство диска. Расширенный раздел разбивается на подразделы по тем же -правилам, что и весь диск: в самом его начале заводится HDPT с четырьмя -записями (соответствующие им разделы называются _дополнительными_, secondary -partition), которые снова можно использовать, причём один из подразделов -может быть, опять-таки, расширенным, со своими подразделами и т. д. - -========================================================= -Осторожнее с программой `fdisk`! Она предназначена для создания, изменения и -_удаления_ разделов диска. -========================================================= - -Чтобы не усложнять эту схему, при разметке диска соблюдают два правила: -во-первых, расширенных разделов в таблице разбиения диска может быть не более -одного, а во-вторых, таблица разбиения расширенного раздела может содержать -либо одну запись -- описание дополнительного раздела, либо две -- описание -дополнительного раздела и описание вложенного расширенного раздела. Соблюдение -этого правила позволяет в Linux нумеровать разделы линейно: после четырёх -основных, номер 5 получает дополнительный раздел в первом расширенном, 6 -- -раздел во втором расширенном, вложенным в первый, и т. п. Сами вложенные -расширенные разделы при этом не нумеруются и никакому устройству в `/dev/` не -соответствуют. В действительности разбиение диска двухсистемной машины Мефодия -выглядит так: - -image::images/FreeDOS-Linux.dia.png[Разбиение диска] - -И разделы, и таблицы разбиения принято размещать с начала цилиндра (термин, -имеющий отношение к внутреннему устройству жёсткого диска), так что при -заведении каждого расширенного раздела на этом компьютере тратилось впустую по -четыре мегабайта (таков, по словам fdisk, размер цилиндра). - -Той же тактикой -- разбиением не диска, а раздела -- пользуются, когда таблица -разбиения нестандартна для IBM PC. Например, UNIX-подобные системы семейства -BSD используют собственный универсальный формат разбиения (он старше, чем сама -идея об IBM PC!), для чего подобной системе выделяется один раздел, и она -творит с ним всё, что заблагорассудится. - -==== Область подкачки ==== - -Итак, Linux на компьютере из примера использует три раздела: `hda5`, `hda6` -и `hda7`. Тип раздела `hda6`, «Linux sawp», отличается от двух других, по -словам Гуревича, «это вообще не файловая система». Это -- т. н. _область -подкачки_ (swap space), пространство на диске, используемое системой для -организации _виртуальной памяти_. Оказывается, областям оперативной памяти, -которые процессы запрашивают у ядра, не всегда соответствуют части физической -оперативной памяти. Если процесс долгое время не использует заказанную -оперативную память, её содержимое записывается на диск, в область подкачки -- -тем самым освобождается место в физической памяти для других процессов. Когда -же он «вспомнит» об этой области памяти, ядро подкачает её с диска, разместит -в оперативной памяти (возможно, откачав другие области), и только тогда -позволит процессу продолжить работу. - -Вполне может сложиться ситуация, когда несколько процессов заказали -оперативной памяти больше, чем её есть в действительности, и преспокойно -работают, потому что не используют всё заказанное пространство сразу, -позволяя системе откачивать неиспользуемые области. К тому же многие -процессы (особенно системные службы) не работают постоянно, а ждут -наступления определённого события, и чем дольше они ждут, тем дольше не -используют оперативную память, и тем выше вероятность, что ядро откачает её. - -Стоит отдавать себе отчёт, что если эти самые процессы вдруг захотят работать -одновременно и со всеми областями памяти, ядру придётся туго. Большую часть -времени система будет проводить откачивая и подкачивая, потому что дисковые -операции чтения и записи работают в тысячи раз медленнее, чем запись и чтение -из оперативной памяти footnote:[Такая ситуация называется «дребезг» -(trashing) и свидетельствует о том, что для текущих задач компьютеру -требуется больше физической памяти.]. Чтобы хоть как-то облегчить ему жизнь, -область подкачки размещают на отдельном разделе, обмен данными с которым -работает быстрее, чем чтение и запись в файл, обслуживаемые файловой системой. - -=== Файловая система === - -Из лекции <> Мефодий узнал, как -пользоваться файловой системой и какую структуру она имеет с точки зрения -программы, работающей с файлами в ней. Про то, как организована файловая -система изнутри, что именно находится от начала устройства `hda5` до его конца, -существует немало больших статей, защищено немало кандидатских (и более одной -докторской) диссертаций. Разработка файловой системы -- сложный и интересный -процесс, требующий одновременно владения высшей математикой, статистикой, -умения безошибочно программировать и полного знания того, как работает то или -иное дисковое устройство. Поэтому файловых систем не так много, и каждая из -них устроена по-особому, в соответствии с тем, как решал тот или иной -творческий коллектив задачу быстрого и надёжного доступа к файлам. - -==== Принципы организации данных на диске ==== - -Во всех файловых системах есть и немало общего. Например, в каждой из них -решается вопрос метаданных, то есть информации, не имеющей прямого отношения к -содержимому, допустим, файла, но описывающей, как до этого содержимого -добраться. В файловой системе обычно различается _системная область_, в которой -записываются метаданные, и _область данных_, в где хранятся собственно файлы. -Системная область может составлять заметную долю общего дискового пространства, -и вот почему. - -Различают _устройство последовательного доступа_ (например, накопители на -магнитных лентах) и _устройства прямого доступа_ (например, жёсткие диски). -Чтение (и запись) данных на устройствах последовательного доступа идёт -последовательно: если сейчас записан первый блок носителя, то следующим будет -доступен второй, за ним -- третий и т. д. Если доступен пятый блок, а нужен -первый или тысячный, выполняется длительная операция позиционирования, причём -она тем длиннее, чем дальше отстоит нужный блок от текущего: лента -перематывается. Работа с устройствами прямого доступа легче: каков бы ни был -текущий прочитанный блок, время, за которое будет прочтён любой другой примерно -одинаково. - -Файлы на магнитной ленте удобнее хранить целиком, каждый файл -- одним длинным -куском. У такого способа есть один существенный недостаток: если на ленту -объёмом в гигабайт записать 1024 мегабайтных файла, а потом удалить каждый -второй, то образуется полгигабайта свободного места, но кусочками по мегабату -каждый. Тогда запись, скажем, двухмегабайтного файла потребует трёх операций: -сначала надо переписать какой-нибудь мегабайтный файл на свободное место, затем -удалить старую его копию, и только затем записать на образовавшееся место -большой файл. - -На устройстве прямого доступа можно избежать этой неприятной ситуации, если -постановить, что файл может размещаться на нём в области данных по частям, а -карта размещения этих частей будет записана в _системную область_. Если, не -мудрствуя особо, предположить, что в системную область записываются номера -полукилобайтных секторов, в которых лежит файл (по 32 бита каждый номер), то -выходит, что размер системной области, который может потребоваться, всего в 16 -раз меньше файловой. Но в Linux в системную область записываются _индексные -дескрипторы_, размер которых существенно больше. Количество индексных -дескрипторов может быть намного меньше количества блоков, но всё же системная -область занимает примерно такую же (от пяти до десяти процентов) долю общего -дискового пространства. - -=================================================== -Индексный дескриптор:: - внутренний объект файловой системы Linux, однозначно определяющий - принадлежащий ей файл. Индексный дескриптор содержит атрибуты файла, - размер, указывает расположение файла на диске и т. п. Каждому - индексному дескриптору соответствует единственный в данной файловой - системе идентификатор-целое число. -=================================================== - -На самом деле, даже на жёстком диске блоки, расположенные подряд, считываются -(и записываются) быстрее, чем блоки, расположенные как попало. Эффект связан с -механическим устройством жёстких дисков, пояснять которое Мефодию Гуревич не -стал, ссылаясь на общеизвестность. Суть его в том, что задержки при чтении -данных, находящихся на разных цилиндрах диска, растут линейно, как для ленты -(чем дальше, тем дольше). Один из остроумных способов оптимизировать работу с -диском состоит в том, чтобы разбить все цилиндры на группы, а внутри каждой -группы выделить свою системную область и область данных. Тогда сами файлы и их -индексные дескрипторы будут лежать, если это возможно, на соседних цилиндрах, и -доступ ускорится. - -Другое, более общее решение -- использование _кеширования_, при котором данные с -диска частично дублируются в памяти. Если какой-то процесс прочитал данные из -файла, эти данные некоторое время находятся в памяти, на случай, если они ему -(или кому-нибудь другому) опять понадобятся. Повторное обращение уже не дойдёт -до диска, система вернёт процессу данные из _кеша_, раз уж они ничем не -отличаются от тех, что на диске. Если процесс записал данные на диск, -содержимое кеша обновляется, оставаясь актуальным. - -Ещё эффективней кеш на запись: операции записи накапливаются в памяти, а до -диска добираются не сразу, и в том порядке, в каком быстрее пройдёт запись, а -не в том, в каком были выполнены. Если запись шла во временный файл, который, в -конце концов, удалили, обращений к диску может и вообще не случиться. Однако с -кешированием операций записи следует обращаться бережно: а вдруг сбой в -электроснабжении произойдёт именно тогда, когда часть данных уже записана, а -часть -- ещё нет? А если не полностью, кусочками, обновилась системная область, -состояние файловой системы после того, как питание опять включат, может -оказаться совсем плачевным -- настолько, что даже умная утилита восстановления -`fsck` может оказаться бессильной. Поэтому системные области либо вообще не -кешируются на запись, либо исключительно с помощью будущих кандидатов и -докторов наук, что рассчитывают безопасные алгоритмы обновления файловой -системы из кеша на запись... - -=== Работа с файловыми системами === - -Итак, Linux свободно работает (и даже предпочитает работать) с несколькими -разделами диска, содержащими, возможно, разные типы файловых систем. - -==== Монтирование и размонтирование ==== - -Из лекции <> Мефодий знает, что -файловые системы на различных разделах «прививаются» в виде ветвей общего -дерева каталогов, растущего из `/`. Делается это при помощи команды `mount -o` -настройки_монтирования устройство точка_монтирования, где устройство -- это -имя блочного файла-дырки, точка_монтирования (mountpoint) -- полный путь к -каталогу, а настройки_монтирования определяют особые параметры, разные для -разных файловых систем. После выполнения этой команды содержимое файловой -системы, размещённой на устройстве (как правило, дисковом разделе), -становится доступным в виде дерева подкаталогов точки_монтирования. -Посмотреть список всех смонтированных файловых систем можно с помощью команды -`mount` без параметров: - ---------------------------------------------------------------- -[root@localhost root]# mount - /dev/hda5 on / type ext3 (rw) - /dev/hda7 on /home type ext3 (rw) - /dev/fd0 on /mnt/floppy type subfs (rw,nosuid,nodev,sync) - /dev/hdc on /mnt/cdrom type subfs (ro,nosuid,nodev) - proc on /proc type proc (rw,gid=19) - devpts on /dev/pts type devpts (rw,gid=5,mode=0620) -[root@localhost root]# umount /home -[root@localhost root]# ls /home -[root@localhost root]# mount /dev/hda7 /home -[root@localhost root]# ls /home - methody shogun tmpuser ---------------------------------------------------------------- - -Оба Linux-раздела смонтированы при старте системы: `/dev/hda5` образует -_корневую файловую систему_, а `/dev/hda7` используется для хранения -пользовательских домашних каталогов footnote:[Мефодий заметил, что `/tmp` и -`/var` не смонтированы никуда, и, следовательно, корневая файловая система, -вопреки рекомендациям FHS, слишком часто используется на запись.]. -Суперпользователь может размонтировать файловую систему вручную с помощью -команды `umount точка_монтировани, если на ней не открыто никаких файлов и -никто не использует какой-либо её каталог в качестве текущего. - -Для того, чтобы файловые системы монтировались при загрузке системы, их -описывают в файле `/etc/fstab`: - ---------------------------------------------------------------- -/dev/hda5 / ext3 defaults 1 1 -devpts /dev/pts devpts gid=5,mode=0620 0 0 -/dev/hda7 /home ext3 defaults 1 2 -proc /proc proc gid=19 0 0 -/dev/hda6 swap swap defaults 0 0 -/dev/fd0 /mnt/floppy subfs fs=floppyfss,sync,nodev,nosuid -/dev/cdrom /mnt/cdrom subfs fs=cdfss,nodev,nosuid ---------------------------------------------------------------- - -Первое поле каждой строки этого файла -- устройство или название _виртуальной -файловой системы_, второе -- точка монтирования, третье -- тип файловой системы, -четвёртое -- настройки монтирования, а пятое и шестое относятся к организации -резервного копирования и процедуре проверки цельности. Содержимое `fstab` -практически повторяет выдачу `mount` (`dev/cdrom` на этой машине -- ссылка на -`/dev/hdc`). Здесь указывается и область подкачки, которую ядро не монтирует, а -использует напрямую. Утилита `mount` поддерживает усечённый вариант командной -строки `mount` точка_монтирования, при котором она самостоятельно ищет в -`/etc/fstab`, каким способом должна быть смонтирована точка_монтирования. Для -того, чтобы при загрузке системы какое-либо устройство не монтировалось, а -усечённым `mount` его можно было смонитровать вручную, в поле «настройки -монтирования» добавляется ключевое слово `noauto`. - -Две последних строки относятся к монтированию съёмных (removable) носителей: -лазерного и гибкого дисков. Съёмные носители приходится монтировать гораздо -чаще несъёмных, не во время загрузки системы, а всякий раз, когда носитель -сменился, и содержимое нового необходимо пользователю. Мало того, надо -разрешить выполнять операцию `mount` пользователю, который принёс дискету и -желает поработать с ней. С другой стороны, нельзя всем и каждому давать право -запускать `mount` и особенно `umount` с любыми параметрами! Есть четыре способа -разрешить возникающее противоречие: - -. Воспользоваться усечённым вариантом `mount` (запись с настройкой -`noauto` в `fstab`) и утилитой `sudo`, при помощи которой позволить -пользователю выполнять, скажем, только команды `mount /cdrom` и -`umount /cdrom`. -. Воспользоваться усечённым вариантом mount и настройкой owner в -`fstab`, которая позволяет выполнять операцию монтирования хозяину -устройства; при этом `/dev/hdc` отдаётся во владение первому -зарегистрированному пользователю так же, как `/dev/audio` и прочие -устройства персонального использования. Этот способ лучше предыдущего -тем, что исключает ситуацию, когда один пользователь монтирует -диск, а другой немедленно его размонтирует. -. Воспользоваться специальной службой из пакета `autofs`, который -отслеживает обращения пользователей к некоторому каталогу (например, -`/mnt/cdrom/auto`), и самостоятельно выполняет операцию `mount`, а если -к содержимому носителя долгое время никто не обращался -- `umount`. Этот -способ лучше предыдущего тем, что пользователю вообще никаких -дополнительных команд подавать не приходится. -. Воспользоваться специализированным модулем ядра (в примере -- `subfs`), -который всегда сообщает программе пользователя, что устройство -смонтировано и готово к работе, а с тем, поменялся ли носитель, -разбирается самостоятельно. Этот способ лучше предыдущего тем, -что пользователю не приходится ждать «долгое время», пока система -не соизволит размонтировать и «отдать» лазерный диск. Кроме того, -`subfs` может снабжать пользователя данными из кеша, даже если диск -давно уже вынут (речь идёт, разумеется, об операциях чтения). - -Во всех случаях, когда диск монтирует не системный администратор, стоит -предпринять некоторые дополнительные действия. Например, диск должен -монтироваться так, чтобы с него не работал запуск с _подменой -идентификатора_ (`setUID`), и чтобы на нём нельзя было создавать -_файлы-дырки_ (чтобы не потворствовать хулиганству, вроде запуска -setUID-оболочки или записи прямо в устройство, соответствующее `hda`). За это -отвечают настройки `nosuid` и `nodev`, упомянутые в `/etc/fstab`. - -Кроме того, лазерные приводы имеют «защёлку», не позволяющую извлечь диск, пока -он используется, а дисководы или устройства USB Flash -- нет (хотя, казалось бы, -она нужнее там, где происходит запись). Единственная надежда -- на то, что -пользователь не будет выдёргивать дискету из дисковода, пока он занимается -записью, и на нём горит зелёная лампочка. Чтобы каждая операция записи -немедленно приводила к передаче данных, необходимо полностью отключить кеш -записи, то есть использовать синхронный режим работы файловой системы. Это -делается при помощи настройки `sync`. - -==== Поддерживаемые Linux файловые системы ==== - -Если бы на компьютере из примера использовался способ монтирования лазерного -диска 1 или 2, то в поле «тип» `fstab` было бы написано `iso9660`. Так -называется тип файловой системы, обычно используемой на лазерных дисках. Что -же касается жёстких дисков, то на них может использоваться несколько типов -файловых систем, даже на одном Linux-компьютере. - -Основная файловая система в Linux называется `Ext2`. Имя происходит от слова -«extended» (расширенная) и появилось после того, как самая первая версия -файловой системы ранних Linux, повторяющая возможности одного из вариантов -файловой системы UNIX, окончательно устарела. Пришлось переписать -соответствующую часть ядра, расширив уже имеющиеся возможности. Так появилась -`ExtFS`. Когда и она устарела, возможности снова расширили, и к названию -добавилось число `2`. Повсеместно используемая в дистрибутивах Linux файловая -система `Ext3` -- «трижды расширенная»! -- отличается от `Ext2` поддержкой -_журнализации_. - -_Журналируемая файловая система_ ведёт постоянный учёт всех операций записи на -диск. Получающийся _журнал обращений_ сам, в свою очередь, записывается на диск. -Разница между записью журнала и записью самих данных в том, что данные следует -записывать в строго определённое место, а журнал устроен так, чтобы -записываться как можно быстрее. Выгода от такой двухступенчатой процедуры -особенно остро ощущается после сбоя электропитания: все операции, записи, -которые ещё не успели завершиться, записаны в журнале, так что стоит после -включения компьютера «проиграть» их ещё раз, и файловая система войдёт в норму! -Если часть данных уже была записана на диск, повторная (по требованию журнала) -запись тех же самых данных на то же самое место ничем повредить не может. -Наконец, если операция записи не попала даже в журнал (что бывает редко), то -файловая система всё равно останется в рабочем состоянии, каким оно было до -начала этой операции. - -Журналирование поддерживается и другими файловыми системами, используемыми в -Linux -- XFS и ReiserFS. ReiserFS вообще похожа скорее на базу данных: внутри -неё используется своя собственная система индексации и быстрого поиска данных, -а индексные дескрипторы и каталоги в стиле Linux выполнены в виде одной из -возможных надстроек над этой системой. Традиционно считается, что ReiserFS -отлично подходит для хранения огромного числа маленьких файлов (что было одной -из целей проекта), а XFS -- для хранения очень больших файлов, в которых -постоянно что-нибудь дописывается или изменяется. - -В Linux поддерживается, кроме собственных, немало форматов файловых систем, -используемых другими ОС. Если способ записи на эти файловые системы известен -и не слишком замысловат, то работает и запись, и чтение, в противном случае --- только чтение (чего нередко бывает достаточно). Полностью поддерживаются -файловые системы `FAT12/FAT16/FAT32` (тип `vfat`), используемые в MS-DOS и -Windows, ранние версии UFS, используемые в системах семейства BSD. Новые -версии UFS (например, UFS2 из FreeBSD5, обладающая свойствами, которые не -входят в стандарт Linux) поддерживаются только на чтение, как и созданная на -основе DEC VMS, но впоследствии многократно переработанная файловая система -NTFS из Windows. - -Для того, чтобы смонтировать файловую систему, имеющую заданный тип, команде -`mount` необходимо указать его с помощью ключа `-t`: - ---------------------------------------------------------------- -[root@localhost root]# fdisk -l - . . . - Device Boot Start End Blocks Id System - /dev/hda1 * 1 25 100768+ 6 FAT16 - /dev/hda2 26 520 1995840 5 Extended - /dev/hda5 26 282 1036192+ 83 Linux - /dev/hda6 283 334 209632+ 82 Linux swap - /dev/hda7 335 520 749920+ 83 Linux -[root@localhost root]# mount -t vfat /dev/hda1 /mnt/disk -[root@localhost root]# ls /mnt/disk - autoexec.bat config.sys fdconfig.sys freedos.bss - command.com fdconfig.old fdos kernel.sys ---------------------------------------------------------------- - -==== Виртуальные и сетевые файловые системы ==== - -В `/etc/fstab` Мефодий сразу заметил две строки, начинающиеся не с имени -устройства, а с названия _виртуальной файловой системы_, содержимое которой -доступно в соответствующей точке монтирования. Виртуальная файловая система -обычно не обращается ни к какому внешнему устройству, а «придумывает» всё -дерево каталогов и находящиеся в них файлы сама. Такова, например, файловая -система в памяти (ROMFS, или аналогичная ей TMPFS, поддерживающая операции -записи), используемая в _стартовом виртуальном диске_. Как правило, виртуальные -файловые системы используются для того, чтобы предоставить доступ по -чтению/записи к некоторой иерархической структуре данных. - -Во многих версиях UNIX программа ps работает непосредственно с устройством -`/dev/kmem` (памятью ядра), чтобы добыть оттуда информацию о таблицах процессов; -это -- сложная и даже опасная программа, имеющая доступ к святая святых системы. -В Linux ps может быть переписана чуть ли что не на shell, потому что таблица -процессов и масса другой информации о системе доступны в виде дерева -подкаталогов `/proc`: - ---------------------------------------------------------------- -[root@localhost root]# ls -F /proc - 1/ 585/ 793/ 882/ es1371 irq/ modules stat - 1041/ 598/ 794/ acpi/ execdomains kcore mounts@ swaps - 16/ 6/ 795/ bus/ fb kmsg mtrr sys/ - 2/ 681/ 796/ cmdline filesystems ksyms net/ sysrq-trigger - 3/ 697/ 797/ cpufreq fs/ loadavg partitions sysvipc/ - 4/ 7/ 798/ cpuinfo ide/ locks pci tty/ - 492/ 725/ 8/ devices interrupts mdstat scsi/ uptime - 5/ 751/ 840/ dma iomem meminfo self@ version - 572/ 784/ 844/ driver/ ioports misc slabinfo -[root@localhost root]# ls -l /proc/1 - total 0 - -r--r--r-- 1 root proc 0 Dec 4 16:15 cmdline - lrwxrwxrwx 1 root proc 0 Dec 4 16:15 cwd -> / - -r-------- 1 root proc 0 Dec 4 16:15 environ - lrwxrwxrwx 1 root proc 0 Dec 4 16:15 exe -> /sbin/init - dr-x------ 2 root proc 0 Dec 4 16:15 fd - -r--r--r-- 1 root proc 0 Dec 4 16:15 maps - -rw------- 1 root proc 0 Dec 4 16:15 mem - -r--r--r-- 1 root proc 0 Dec 4 16:15 mounts - lrwxrwxrwx 1 root proc 0 Dec 4 16:15 root -> / - -r--r--r-- 1 root proc 0 Dec 4 16:15 stat - -r--r--r-- 1 root proc 0 Dec 4 16:15 statm - -r--r--r-- 1 root proc 0 Dec 4 16:15 status -[root@localhost root]# cat /proc/1/environ ; echo - OME=/TERM=linux ---------------------------------------------------------------- - -В частности, подкаталоги `/proc` с числовыми именами содержат информацию о -процессах с соответствующими PID. Файл `exe` такого подкаталога -- символьная -ссылка на запущенную программу, файл `cmdline` содержит командную строку, а -`environ` -- _окружение процесса_. Мефодий углубился в чтение `man proc`что -есть в `/proc`, ему пока не хватает знаний. - -Файловая система `devpts` -- шаг навстречу динамическому именованию -устройств. Она предназначена для _эмуляторов терминала_, таких как `sshd`, -`xterm` или `screen`. Задача эмулятора терминала -- предоставить пользователю -полноценный интерфейс командной строки (с запуском командного интерпретатора, -с распознаванием и передачей сигналов и т. п.) в отсутствие терминального -оборудования -- по сети или из графической подсистемы, или при необходимости -сымитировать несколько терминалов. Раньше для этого использовались пары -устройств `/dev/pty##` -- `/dev/tty##`, где `##` -- двух символьный -идентификатор. Программа-эмулятор начинала обмениваться данными (от -пользователя или из сети) с первым свободным устройством (скажем, `ptya2`, -которое, в свою очередь, было привязано к соответствующему терминальному -устройству (`ttya2`). Именно с этим устройством и взаимодействовал командный -интерпретатор и прочие процессы Linux, находясь в полной уверенности, что -это -- полноценный терминал. - -Выходило, что пар `tty##-pty##` при статическом именовании устройств могло не -хватить, даже если создать их очень много (достаточно запустить ещё больше -эмуляторов терминала). Поэтому придумали завести одно устройство типа pty -- -`/dev/ptmx` и виртуальную файловую систему `/dev/pts` для терминальных -файл-дырок. Каждая программа, открывающая ptmx, получает свой _дескриптор_), а -в `pts/` заводится очередное терминальное устройство, имя которого совпадает -с порядковым номером. Когда дескриптор закрывается, терминальное устройство -исчезает. - -Среди файловых систем есть и такие, что не выдумывают содержимое сами, а -обращаются за ним ещё куда-нибудь, например, в сеть. Так работают _удалённые -файловые системы_, например, NFS (network file system), стандартная для всех -UNIX-подобных ОС. Вместо поля «устройство» обычно указывается сетевой адрес -компьютера-сервера и имя ресурса (название каталога), который необходимо -смонтировать по сети. Поддерживается и работа с удалёнными файловыми системами -Windows, причём как на уровне модулей ядра, с помощью `mount -t smbfs`), так и -без монтирования, с помощью утилиты `smbclient`. Linux и сам может служить -сервером, предоставляющим удалённый доступ к файлам, причём служба `samba`, -занимающаяся файловыми системами для Windows под управлением Linux, работает -зачастую быстрее, чем Windows, запущенный на том же компьютере для тех же -целей. - -Возможности файловых систем этим не исчерпываются! Например, можно -смонтировать _образ устройства_ из файла, если вызвать команду `mount` с -ключом `-o loop`. Образ устройства -- это файл, содержимое которого в -точности повторяет содержимое устройства; его можно, например, получить с -помощью команды `cat` устройство образ. Именно образами устройств манипулируют -программы записи на лазерные носители. Смонтировать образ бывает нужно для -проверки или изменения содержимого перед записью, или для хранения -содержимого нескольких дисков в исходном виде: - ---------------------------------------------------------------- -[root@localhost root]# ls -l floppy.flp - -rw-r--r-- 1 root root 1474560 Dec 4 16:53 floppy.flp -[root@localhost root]# mount -t vfat -o loop floppy.flp /mnt/disk/ -[root@localhost root]# ls /mnt/disk/ - command.com kernel.sys -[root@localhost root]# mount | grep disk - /root/floppy.flp on /mnt/disk type vfat (rw,loop=/dev/loop0) ---------------------------------------------------------------- - -Как заметил Мефодий, `mount` создаёт для такого способа монтирования специальное -устройство -- `/dev/loop0`, и уже с его помощью работает с файлом. - -Обширное поле для экспериментов -- т. н. пользовательская файловая система -(linux userland file system, LUFS). Это -- модуль ядра и набор библиотек, -позволяющий организовать файловую систему, обращающуюся за информацией к -обычному процессу Linux. Так организованы разнообразные сетевые «эмуляторы» -файловых систем с использованием протокола FTP или Secure Shell. Так работает и -доступ на запись к файловой системе NTFS: некоторая программа обращается к -устройству, содержащему файловую систему, задействует драйвер NTFS, взятый из -лицензионной копии самой Windows (это можно сделать с помощью библиотек wine, -подситемы, распознающей исполняемые форматы Windows), и обменивается данными с -модулем LUFS, который и предоставляет обычный файловый доступ процессам. - -==== Проверка файловой системы ==== - -Если доступная на запись файловая система не была размонтирована перед -выключением компьютера, после включения она окажется в нештатном состоянии, -независимо от того, испортилось на ней что-либо или нет. Проверкой цельности -файловой системы занимается утилита `fsck` (file system check). На самом деле -таких утилит несколько -- по одной для каждого из основных типов файловых -систем (есть `fsck` даже для `VFAT`). Как уже говорилось в лекции <>, `fsck` запускается при старте Linux, если файловая -система находится в нештатном состоянии, или для профилактики, если файловую -систему просто давно не проверяли. - -В самом лучшем случае `fsck` не находит ничего подозрительного, и система -продолжает загрузку. Чаще всего, даже если в файловой системе не всё в -порядке, её _журнал_ не испорчен, и `fsck` «проигрывает» его, после чего всё -опять приходит в норму. Запустить `fsck` можно и вручную, в виде `fsck` -устройство или `fsck` точка_монтирования, однако прежде следует -размонтировать файловую систему: - ---------------------------------------------------------------- -[root@localhost root]# fsck -fy /home - fsck 1.35 (28-Feb-2004) - /dev/hda7 is mounted. - - WARNING!!! Running e2fsck on a mounted filesystem may cause - SEVERE filesystem damage. - - Do you really want to continue (y/n)? no - - check aborted. -[root@localhost root]# umount /home -[root@localhost root]# `fsck` /home - fsck 1.35 (28-Feb-2004) - e2fsck 1.35 (28-Feb-2004) - /dev/hda7: clean, 168/93888 files, 7269/187480 blocks -[root@localhost root]# fsck -f /home - fsck 1.35 (28-Feb-2004) - Pass 1: Checking inodes, blocks, and sizes - Pass 2: Checking directory structure - Pass 3: Checking directory connectivity - Pass 4: Checking reference counts - Pass 5: Checking group summary information - /dev/hda7: 168/93888 files (0.6% non-contiguous), 7269/187480 blocks ---------------------------------------------------------------- - -Со второго раза `fsck` footnote:[Мефодий заметил, что для файловой системы -`Ext3` запустилась специализированная версия `e2fsck`, подходящая также и для -`Ext2`.] работать тоже не захотела, ссылаясь на то, что файловая система и так -находится в штатном состоянии (её аккуратно размонтировали). Пришлось -применить ключ `-f` (force), который заставляет `fsck` работать -- конечно -же, никаких ошибок найдено не было. Сама процедура проверки довольно сложна, -она состоит из пяти этапов, каждый из которых отнюдь не тривиален, и в этой -лекции не описывается. Кстати сказать, для того, чтобы проверить _корневую -файловую систему_, её приходится сначала монтировать только на чтение, -находить там `/sbin/fsck`, проверять, и только после этого монтировать на -чтение-запись. Если корневая файловая система испорчена настолько, что -`/sbin/fsck` в ней найти невозможно, остаётся пробовать загрузку с других -носителей (например, с установочного CD), и разбираться. - -Если какая-то порча файловой системы всё-таки обнаружилась, `fsck` может -поступить двояко. Во-первых, все ошибки, которые не приводят к изменению данных -на диске, можно попробовать исправить автоматически. Например, индексные -дескрипторы, на которые не ссылается ни одно имя (т. н. потерянные файлы, unref -files), помещаются в специальный каталог `/lost+found` под именами, -соответствующими номерам этих индексных дескрипторов. Впоследствии -администратор может посмотреть в эти файлы и решить, нужны они или нет. -Во-вторых, когда `fsck` встречается с ошибкой, исправление которой приведёт к -изменению данных на диске, загрузка Linux останавливается, и система переходит -в _однопользовательский режим_. Предполагается, что администратор сам запустит -`fsck`: либо интерактивно, тогда каждому изменению в файловой системе будет -требоваться подтверждение с клавиатуры, либо пакетно, с ключом `-y`, тогда -считается, что на все такие запросы администратор заранее ответил «yes». - -Когда-то такие вот запуски `fsck -y` производили катастрофические разрушения по -вине неумелых администраторов, а нынче Мефодий, как ни нажимал *Reset* на -многострадальной двухсистемной машине, не смог добиться ничего, кроме двух-трёх -мгновенных воспроизведений журнала и жестокого нагоняя от Гуревича. - -[[config]] -== Конфигурационные файлы == - -=== Проектирование свойств системы === - -Операционная система, позволяющая задействовать все возможности компьютера, -резко отличается от специализированного программного обеспечения огромным -числом т. н. «вариантов использования» (use cases) и обширнейшими -возможностями тонкой настройки для решения задач конкретного пользователя -наилучшим способом. Достаточно сравнить какую-нибудь игровую приставку -(например, PlayStation2) под управлением собственной операционной системы и -её же под управлением Linux. Вычислительная и мультимедийная мощность такого -компьютера весьма высока (известно, что именно компьютерные игры определяют -сейчас ресурсопотребление персонального компьютера). Однако способы -управления одной и другой системами настолько различны, что неподготовленный -человек просто теряется при виде возможностей Linux: где? на какие кнопки -нажимать? А кнопок-то и нет... - -Можно попытаться описать операционную систему как большой и сложный -универсальный инструмент решения любых задач. Предполагается, что -пользователь, прочтя документацию, в которой описывается как работает система -и как применять её в различных ситуациях, сможет решать и свои задачи. -Правда, для этого ему придётся прочесть большую часть документации по -системе (в том числе и технической) и перепрограммировать некоторые части -системы сообразно своим нуждам. На такой подвиг способны немногие, времени -это займёт немало, да и вероятность ошибки (которая тем выше, чем сложнее -средства управления системой) при таком подходе недопустимо велика. Сами -утилиты или службы Linux, каждую из которых можно «окинуть взором» и понять, -что и как она умеет, и чего в ней не хватает, разрабатываются именно теми из -пользователей, у которых хватает времени, знаний и навыков на такое полное -освоение (см. лекцию <>). Вывод: пользователь -- не -разработчик, ему всё-таки важнее быстро и качественно решить задачу, чем -долго и качественно улучшать инструмент решения. - -Можно пойти обратным путём: попытаться предусмотреть все основные способы -использования операционной системы на всех основных пользовательских задачах, -и на каждый такой способ создать (запрограммировать) отдельную часть, -управляемую «кнопкой» или утилитой. Эту часть обычно называют «решением» -(solution), и в документации обычно пишут, что должно быть «на входе» -системы, и что получается «на выходе» после применения решения. Если -пользователь не умеет сам поставить задачу, или делает это в неопределённой -форме («хочу, чтобы был текст», «хочу, чтобы играла музыка»), этот способ -работает на ура: та же игровая приставка -- это отличное решение крайне -неопределённой задачи «хочу без толку потратить время». Однако, стоит -пользователю захотеть чего-то конкретного, начинаются трудности. Трудности -могут быстро стать непреодолимыми, как только для этого «конкретного» не -окажется готового решения: внутренняя структура систем, ориентированных на -«решения», столь сложна и столь плохо документирована, что сделать что-либо -вручную, скорее всего, не удастся. Вывод: пользователь, понимающий суть -собственных задач, -- не «клиент», он должен иметь возможность быстро и -качественно решать задачи самостоятельно, а не выбирать то из готовых -«решений», которое нанесёт меньше вреда. - -Что же нужно идеальному -- достаточно подготовленному, чтобы действовать -самостоятельно, и достаточно занятому, чтобы не переделывать системы -- -пользователю? По-видимому, механизм, с помощью которого можно сформулировать -и придать операционной системе все требуемые свойства, имея возможность -описывать решение задачи по крайней мере на том же уровне конкретности, на -котором было поставлено её условие. Большая часть других, не нужных для -решения собственных задач пользователя, свойств должны быть «стандартными» и -не требовать его вмешательства. - -==== Профиль системы ==== - -Так возникает идея разделить систему на два подмножества: _профиль_ и -_реализацию_. Всё, что не потребует вмешательства пользователя, необходимо -запрограммировать и использовать в готовом виде в качестве составных частей -реализации. В Linux этому соответствуют программы и подпрограммы: ядро, -модули, системные службы, утилиты; используемые ими библиотеки и прочие -разделяемые файлы и т. п. Реализация -- это монолитная, неизменяемая часть -системы, устроенная по типу «решений» основных задач, только задачи эти, как -правило, не совпадают с задачами пользователей, а только помогают решать их, -являясь как бы строительным материалом, деталями и инструментами сборки -«больших» решений. - -Всё, чего может коснуться рука человека, из реализации переносится в _профиль_ -системы. Профиль задаёт поведение реализации на данных пользователя, и должен -быть устроен так, чтобы пользователь мог его беспрепятственно изменять, если -понадобится. С одной стороны, это может быть вариант «высокоуровневого -программирования», когда пользователь описывает алгоритм решения и структуру -используемых данных на некотором высокоуровневом языке (специализированном -или общем, например, на shell). С другой стороны задание свойств может -превращаться в указание модификаторов поведения, когда пользователь просто -перечисляет необходимые параметры работы программы, которые изменяют её -заранее известную, но достаточно общую функциональность. - -Таким образом система полностью описывается в виде набора необходимых -компонентов реализации, активизированных (запущенных) с определёнными -профилями, вкупе с текущим состоянием каждого компонента. Поскольку компонент -реализации не может изменяться, а его текущее состояние, наоборот, меняется -постоянно и не управляется пользователем, можно считать, что систему задаёт -её профиль. Это означает, что для того, чтобы продублировать работу ситемы на -другом компьютере, достаточно установить там стандартную _реализацию_ и -перенести _профиль_ (обычно занимающий несравненно меньше места) и -_пользовательское наполнение_. Наполнение (файлы пользователей, содержимое -www-страниц и т. п.) может занимать много места, но оно входит в понятие -«задача пользователя», поэтому забывать о нём нельзя. - -================================================================== -Профиль:: - изменяемая часть системы, задающая её поведение во время работы. -================================================================== - -Как проще всего создать профиль, если не всей системы, то хотя бы её -компонента (программы)? Один из вариантов такой: снабдить программу функцией -«сохранить настройки», тогда можно будет эту программу запустить, любым -способом добиться её работоспособности, а после зафиксировать достигнутое -состояние с помощью этой функции. При этом по началу совершенно неважно, как -выглядят эти настройки: программа-то заработала, значит, цель достигнута -(проницательный Мефодий немедленно заметил, что название функции «сохранить -настройки» как-то подозрительно похоже на название кнопки). - -Зачастую для того, чтобы собрать более или менее отвечающий требованиям -пользователя профиль, задействуется больше ресурсов, чем для работы самой -программы. Утилита автоматической настройки выглядит эдаким шаманом, или -кудесником, который, задав всего несколько вопросов человеку, невесть как -приводит систему в работоспособное состояние. Такая подсистема и -называется-то «wizard», причём в русском переводе её отчего-то стесняются -называть «шаманом», а величают уважительно «мастером». - -Вот пример поведения обычного шамана-настройщика (пакет `wvdial`, заведующий -модемным подключением к Internet): - --------------------------------------------------------------------- -[root@localhost root]# wvdialconf - Usage: wvdialconf - (create/update a wvdial.conf file automatically) -[root@localhost root]# wvdialconf .wvdialrc - Scanning your serial ports for a modem. - Port Scan<*1>: Scanning ttyS4 first, /dev/modem is a link to it. - . . . - ttyS4<*1>: Modem Identifier: ATI -- Xircom CardBus 10/100+Modem 56 (Revision 2.40) - . . . - ttyS4<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK - ircomm0<*1>: ATQ0 V1 E1 -- failed at 9600 and 19200 baud. - . . . - ircomm9<*1>: ATQ0 V1 E1 -- failed at 9600 and 19200 baud. - Port Scan<*1>: LT0 - . . . - ttyS0<*1>: ATQ0 V1 E1 -- and failed too at 115200, giving up. - . . . - ttyS1<*1>: ATQ0 V1 E1 -- and failed too at 115200, giving up. - Port Scan<*1>: S2 S3 S5 S6 S7 S8 S10 - . . . - Port Scan<*1>: USB11 USB12 USB13 USB14 USB15 - Found a modem on /dev/ttyS4, using link /dev/modem in config. - Modem configuration written to .wvdialrc. - ttyS4: Speed 115200; init "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0" --------------------------------------------------------------------- - -Даже ни о каких наводящих вопросах речи не зашло! Программа проверила более -полусотни устройств, не модемы ли они, но нашла всего одно -- `/dev/ttyS4`. Его -настройки определились автоматически (и хорошо, потому что Мефодий не знает, -что такое `ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0`). Профиль (а `wvdialrc` создаёт -именно профиль) лежит теперь в файле `.wvdialrc`, так что программа `wvdial` -начнёт работать с модемом, нуждаясь только в пользовательских настройках -(входное имя, пароль и т. п.). - -Яркий пример того, как элементы реализации связываются профилем в единую -подсистему для решения определённой задачи -- командная строка и сценарии -командного интерпретатора. Здесь утилиты играют роль элементов реализации, их -параметры -- роль «настроечной» части профиля, а способ их объединения в -сценарий -- «программируемой» части профиля. Скажем, команда `find /etc -type -f 2> /dev/null | xargs -n1 file | cut -d: -f2 | sort | uniq -c` задействует -шесть утилит системы: командную оболочку, `find`, `xargs`, `cut`, `sort` и `uniq`, -причём четыре из них запускаются с изменённым профилем footnote:[Эта команда -определяет, файлы какого типа и в каком количестве содержатся в каталоге -`/etc`.]. Командная оболочка дополнительно программируется для создания -конвейера между командами. - -==== Конфигурационный файл ==== - -Задание профиля с помощью командной строки -- метод далеко не всегда удобный. -Даже при работе с самой командной строкой используется _окружение_ для -сохранения настроек, чтобы не задавать их всякий раз и для всякой команды. -Что уж говорить о сложных системных службах, свойства которых должны -сохраняться не от сеанса к сеансу, а постоянно (в том числе при перезагрузке -системы). Вывод прост: профиль необходимо держать в _файле_, вроде того, что -создаётся по команде «сохранить настройки». - -Однако сам подход к хранению профиля в файле, при котором пользователь не -может изменять этот файл напрямую, а пользуется «умными» конфигураторами, -удобен только в случаях, когда настроек много, а цена ошибки невелика -(например, при настройке внешнего вида рабочего стола). В общем случае -довольно сложно задать поведение системы на основании описания (часто -неявного) свойств того, что эта система должна получать в результате. Иными -словами, из описания того, что должно получиться, далеко не всегда можно -автоматически сделать вывод, как оно должно получаться. - -=================================================================== -Конфигурационный файл:: - текстовый файл, содержащий настройки какой-нибудь части системы (утилиты, - системной службы и т. п.). Как правило, считывается ею при запуске. - Типичный для Linux способ организации _профиля_. -=================================================================== - -Одним словом, если есть конфигурационный файл, то должны быть и средства -редактирования этого файла. Учитывая то, что в Linux есть высокоразвитая -система хранения и переработки (как ручной, так и автоматической) данных в -текстовом виде, изобретать какой-то новый формат не лучше, чем изобретать -новый велосипед. Тем более, что именно текст, разделённый на строки и слова, -лучше всего подходит тогда, когда есть чёткое деление профиля на объекты -управления и их свойства (например, настройки какой-нибудь системной службы и -значения этих настроек). Вдобавок именно со структурированными текстами -отменно управляются текстовые редакторы Linux: Vi, Emacs и др. - --------------------------------------------------------------------- -methody@localhost:~ $ cat .vimrc - so $VIMRUNTIME/vimrc_example.vim - " Some mappings - map :wall!^M - map! ^O:wall!^M - " Tune up - set shiftwidth=2 tabstop=8 history=200 viminfo='50 - set showmode showmatch showcmd ruler modeline - set autoindent ignorecase smartcase - set nohlsearch noincsearch - set dir=/var/tmp - set wildmode=list:longest,full - set wildmenu - " Colouring - syntax on - colorscheme desert --------------------------------------------------------------------- - -Вот как выглядит конфигурационный файл для Vi, написанный Мефодием на основе -взятого у Гуревича. Легко заметить, что файл состоит из команд _режима -командной строки_ Vi с комментариями (в отличие от большинства утилит Linux, -в Vi комментарии начинаются на «"»). Символы `^O` и `^M` -- это именно -соответствующие управляющие символы (вставленные в текстовый файл с помощью -`^V`, см. лекцию <>). Такой конфигурационный -файл легко понимать и изменять. - -Как уже было замечено, набор переменных окружения составляет особенный -профиль, к которому чувствительны все запускаемые программы -- в этом его -достоинство. Задаются переменные окружения обычно в командном сценарии, -который тоже можно рассматривать как конфигурационный файл). Например, во -многих дистрибутивах используется конфигурационный файл `.i18n` для настройки -языковых особенностей клавиатуры, языка вывода сообщений и т. п. -footnote:[Обозначение «i18n» происходит от слова «internationalization», в -котором 20 букв, т. е. «i», «n» и 18 букв между ними.] - --------------------------------------------------------------------- -methody@localhost:~ $ cat .i18n - LANG=ru_RU.KOI8-R - LANGUAGE=ru_RU.KOI8-R - SYSFONTACM=koi8-r - SYSFONT=UniCyr_8x16 - DICTIONARY=russian - MPAGE="-CKOI8-R" - export DICTIONARY MPAGE --------------------------------------------------------------------- - -Однако хранить настройки специфической программы (не нужные всем остальным) в -окружении -- не самое удачное решение: синтаксис, задающий переменную -окружения, слишком прост (имя_переменной = значение), а самих переменных -становится слишком много, поэтому при просмотре трудно выделить, какая из них -к какой группе настроек относится. Если пытаться упаковать все настройки в -значение одной переменной, это значение окажется трудночитаемым, и всё -преимущество текстового формата сойдёт на нет. Например, стандартный -конфигурационный файл утилиты `ls` (точнее, только её цветовых предпочтений) -- -`/etc/DIR_COLORS` (его можно подменить личным файлом `~/.dir_colors`) занимает -около ста строк вместе с комментариями. Команда `ls` использует не этот файл, а -создаваемую утилитой `dircolors` переменную `LS_COLORS`, значене которой -- -600-символьная строка безо всяких комментариев. - -Если профиль слишком велик, держать его в одном конфигурационном файле -- -значит, доставлять пользователю сомнительное удовольствие разбирать этот файл -целиком даже при необходимости внести минимальное изменение. Методов борьбы с -неудобочитаемостью несколько. Во-первых, уже известный по лекции <> механизм. `d`: файл разделяется на несколько независимых -друг от друга так, что редактировать приходится только один из файлов, а -программа во время самонастройки считывает все. - -Другой способ опирается на то, что изменения, которые пользователь вносит в -профиль, как правило существенно меньше объёма всего профиля. Поэтому может -быть выгодно хранить все настройки по умолчанию в каком-нибудь файле, менять -который вообще не надо, а файл пользовательских настроек использовать как бы -«поверх», изменяя профиль в соответствии с ними после того, как выставлен -профиль по умолчанию. Дополнительная выгода такого способа -- в том, что -пользователь всегда может подглядеть в «большой» файл, чтобы узнать как -оформляется та или иная настройка. Например, утилита `updfstab`, которая -изменяет содержимое `/etc/fstab` при появлении или удалении съёмного -дискового носителя (например, лазерного диска), считывает данные из -конфигурационного файла `/etc/updfstab.conf`. Сам этот файл состоит из -единственной строки: `include /etc/updfstab.conf.default`, что приводит к -чтению файла с настройками по умолчанию, где задан способ работы со многими -съёмными устройствами системы. Если администратору нужно как-то изменить -поведение `updfstab` в отношении определённого устройства, он копирует -соответствующую группу настроек из `updfstab.conf.default` в `updfstab.conf` -после строчки `include...` и исправляет их. То, что эти группы настроек -читаются дважды, не играет особой роли: чтение коротких файлов выполняется -быстро. - -Наконец, третий способ сделать конфигурационный файл удобочитаемым -- это -секционирование профиля, когда все настройки разбиваются на группы, каждой -группе даётся собственное имя, и синтаксис конфигурационного файла -проектируется так, чтобы границы групп хорошо различались при просмотре. В -сущности, этот способ -- предок схемы `. d`, где группе соответствует -отдельный файл, однако нередки ситуации, когда разбиение на файлы неудобно -(например, если группы не полностью независимы, поэтому может понадобиться -редактировать их сразу и несколько). Конфигурационный файл утилиты дозвона -`wvdial`, например, секционируется по адресату (провайдеру) плюс отдельная -секция «по умолчанию». Сами секции отделяются друг от друга заголовками, -заключёнными в квадратные скобки: - --------------------------------------------------------------------- -root@localhost:~> cat .wvdialrc - [Dialer Defaults] - Modem = /dev/modem - Baud = 115200 - Init1 = ATZ - Init2 = ATQ0 L0 M4 V1 E1 S0=0 &C1 &D2 +FCLASS=0 - Auto DNS = on - Modem Type = Analog Modem - - [Dialer hotspace] - Phone = 0123456 - Username = fireman - Password = Fire!Fire! - TOnline = true - - [Dialer warlock] - Phone = 0246813 - Username = cop-120 - Password = gimmethegun - Force Address=10.0.0.120 --------------------------------------------------------------------- - -Утилита `wvdial` обладает высокоразвитым искусственным интеллектом: она -самостоятельно догадывается, какой именно тип идентификации используется на -сервере. Например, «с той стороны» может оказаться _терминал_ Linux, которому -требуется сначала ввести обыкновенное входное имя и пароль, затем надо -получить командную строку, затем запустить на сервере сетевая служба `pppd`, и -только затем запустить `pppd` на собственной машине. Другой вариант: `pppd` на -сервере уже запущен, а настройки `Username` и `Password` означают -идентификационную информацию протокола CHAP, используемого `pppd`. Обо всём -этом и о многом другом `wvdial` умеет догадываться, как `wvdialconf` умел -определять, какое же из устройств -- модем. - -Однако на любой искусственный интеллект найдётся непостижимая ему жизненная -ситуация. На одном из серверов (секция «Dialer hotspace») тоже стоит -программа с зачатками искусственного интеллекта, которая тоже пытается -определить, каким способом хочет идентифицироваться позвонивший. Оттого эти -два кудесника, созвонившись, всё ждут, пока кто-нибудь не проявит себя... -Помогает настройка `TOnline`, которая заставляет `wvdial` немедленно использовать -протокол `ppp`, на что сервер, подумавши «ах, ppp!», с облегчением запускает -`pppd`. Остаётся вопросом: почему эта полезная настройка никак не отражена в -документации (её нашёл в исходных текстах программы Гуревич)? Не потому ли, -что пара `wvdialconf-wvdial` не по Linux-овски стремится всё делать за -пользователя, а стало быть, пользовательская документация для разработчиков -этой программы -- не главное?.. - -Идею чтения настроек по умолчанию можно развить чуть дальше. Оказывается, -бывает удобно, когда описание настройки помещено не в руководство, а -непосредственно в конфигурационный файл в виде комментариев. Тогда при -изменении этой настройки пользователь сразу видит, что она из себя -представляет, при этом отпадает необходимость сначала находить строчку в -файле, а потом искать её же в руководстве. Такой способ оформления называется -_самодокументированием_ профиля и часто используется. Например, файл -`/etc/man.conf`, управляющий работой команды `man`, оформлен в -самодокументированном стиле: - --------------------------------------------------------------------- -methody@localhost:~ $ cat /etc/man.conf - . . . - # NOCACHE keeps man from creating cache pages ("cat pages") - # (generally one enables/disable cat page creation by creating/deleting - # the directory they would live in - man never does mkdir) - # - # NOCACHE - # The command "man -a xyzzy" will show all man pages for xyzzy. - # When CMP is defined man will try to avoid showing the same - # text twice. (But compressed pages compare unequal.) - # - CMP /usr/bin/cmp -s - . . . --------------------------------------------------------------------- - -Мефодий, может быть, и не понял бы сразу, зачем команде man использовать -утилиту `cmp`, однако в поясняющем комментарии написано: когда нужно показать -несколько руководств разом, предварительно они сравниваются, и показываются -только не совпадающие. - -Если пойти ещё дальше, то можно создать несколько различных файлов с -примерами настроек, чтобы пользователь мог взять один из них и довести до -нужного ему состояния. Именно такую -- демонстрационную -- настройку Мефодий и -включил в качестве настройки по умолчанию в свой `.vimrc` (в первой строке). -Кстати, на самом деле профиль Vi весьма сложен, но большинство его настроек -по умолчанию находятся в различных файлах дерева каталогов `/usr/share/vim` -- -эдакая `схема. d/. d`, где файлы профиля, соответствующие подгруппам -настроек, лежат в подкаталогах, соответствующих группам. Включение -определённого настроечного файла может происходить неявно: например, строчка -`colorscheme desert` из `.vimrc` приводит к чтению -`/usr/share/vim/colors/desert.vim`. - -Конфигурационные файлы могут иметь довольно замысловатый синтаксис, если -соответствуют сложным структурам данных (таковы, например, настройка -irc-клиента `irssi`) или содержать в себе дополнительные средства -самодокументирования (например, файл настройки текстового www-браузера lynx не -просто хорошо документирован, но и размечен теми же средствами, какие -используются в самом браузере для представления HTML). - -==== Изменение конфигурационных файлов ==== - -Как правило, конфигурационный файл считывается программой при запуске, -отражая, таким образом, её состояние на момент старта. Изменения настроек -работающей программы в конфигурационном файле, как правило, не отражаются. -Тому есть несколько причин: не стоит превращать файл, изредка редактируемый -пользователем, в файл, изменение которого происходит постоянно; не стоит -держать конфигурационный файл всегда открытым; тяжело, изменяя файл -автоматически, не испортить структуру комментариев (интерпретируемых не -машиной, а пользователем) и т. д. Впрочем, многие утилиты, особенно -использующие графическую среду, могут записывать настройки в файл по -окончании работы. Большинство конфигурационных файлов весьма удобно -редактировать вручную, с помощью Vi или Emacs (для файлов более или менее -похожих используется общая подсветка синтаксиса, а для наиболее популярных -есть и собственные варианты подсветки). - -В `/etc` хранятся настройки системных служб, в том числе настройки по -умолчанию, настройки по умолчанию пользовательских утилит, профили командных -интерпретаторов, а также настройки, используемые в процессе загрузки системы -(например, `modules.conf`). Там же располагаются и _стартовые сценарии_, о -которых рассказано в лекции <>. Чего не стоит -искать в `/etc`, так это разнообразных примеров настройки той или иной службы. -Считается, что пример -- это часть документации, и их стоит помещать, -например, в `/usr/share/doc/название_службы/examples`. - -Файлы, имеющие отношение к процессу _досистемной загрузки_, обычно лежат не -там, а в `/boot`, это стоит иметь в виду, так как `/boot/grub/menu.lst` -- тоже -часть профиля системы, хотя и довольно специфическая. В профиль системы -входит содержимое каталогов `etc` из т. н. «песочниц», расположенных обычно в -`/var/lib`. - -Смысл термина «песочница» вот в чём. В Linux есть замечательный системный -вызов `chroot()` и использующая его утилита `chroot`, формат командной строки -которой `chroot` каталог команда. Эта утилита запускает команду, изменив -окружение таким образом, что та считает каталог -- корневым. Соответственно, -все подкаталоги каталога кажутся команде каталогами первого уровня -вложенности, и т. д. Если необходимо во что бы то ни стало ограничить область -действия некоторой утилиты (например, по причине её небезопасности), можно -запускать её с помощью `chroot`. Тогда, даже имея права суперпользователя, эта -утилита получит доступ только к каталогу и его подкаталогам, а `/etc` и прочие -важные части системы окажутся в неприкосновенности. Сам каталог как раз и -играет роль «песочницы», в которую утилиту «пустили поиграть», позволяя -вытворять что угодно. Часто бывает, что в песочнице есть и свой каталог `etc`, -содержащий необходимые для запуска утилиты (или системной службы) настройки. -Вот этот-то `etc` из «песочницы» также входит в список каталогов, хранящих -профиль системы. - -В `/etc` могут находиться не только файлы, но и подкаталоги (особенно в стиле -`. d`) и целые под-деревья каталогов. Например, в некоторых дистрибутивах -Linux используется подкаталог `/etc/sysconfig`. Этот каталог создаётся и -заполняется файлами при установке системы или при запуске специального -«конфигуратора» -- программы-кудесника, задающей наводящие вопросы. Некоторые -стартовые сценарии, использующие полученные настройки, также лежат в этом -каталоге или его подкаталогах. Если в системе есть каталог `/etc/sysconfig`, -там должны оказаться настройки, относящиеся не к самим службам или утилитам, -а к способу их запуска при загрузке, а также языковые и сетевые настройки, -тип мыши и т. д. - -=== Системные конфигурационные файлы === - -==== Подсистема учётных записей ==== - -Несколько конфигурационных файлов и способы работы с ними заслуживают -отдельного рассмотрения. В первую очередь Мефодий заинтересовался системой -учётных записей, о которой упоминалось сразу в нескольких предыдущих лекциях. -Итак, существует два файла, доступных для чтения всем пользователям: -`/etc/passwd`, хранящий учётные данные пользователей, и `/etc/group`, -определяющий членство пользователей в группах (во всех, кроме _группы по -умолчанию_): - --------------------------------------------------------------------- -methody@localhost:~ $ cat /etc/passwd - root:x:0:0:System Administrator:/root:/bin/bash - bin:x:1:1:bin:/:/dev/null - daemon:x:2:2:daemon:/:/dev/null - adm:x:3:4:adm:/var/adm:/dev/null - lp:x:4:7:lp:/var/spool/lpd:/dev/null - . . . - nobody:x:99:99:Nobody:/var/nobody:/dev/null - shogun:x:400:400:Лев Гуревич:/home/shogun:/bin/zsh - methody:x:503:503:Мефодий Кашин:/home/methody:/bin/bash -methody@localhost:~ $ cat /etc/group - root:x:0:root - bin:x:1:root,bin,daemon - daemon:x:2:root,bin,daemon - sys:x:3:root,bin,adm - adm:x:4:root,adm,daemon,shogun - wheel:x:10:root,shogun - . . . - proc:x:19:root,shogun - shogun:x:400: - methody:x:503: --------------------------------------------------------------------- - -Оба файла состоят из сторк, поля которых разделяются двоеточиями. В файле -`passwd` -- семь полей. Первое из них определяет _входное имя_ пользователя --- то самое, что вводится в ответ на `login:`. Второе поле раньше, в ранних -версиях UNIX, использовалось для хранения _ключа пароля_. В Linux -пользовательские пароли не хранятся нигде, ни в явном виде, ни в -зашифрованном. Вместо этого хранится ключ (hash) пароля -- комбинация -символов, однозначно соответствующая паролю, из которой, однако, сам пароль -получить нельзя. Иными словами, существует алгоритм превращения пароля в -ключ, а алгоритма превращения ключа в пароль нет. Когда пользователь -регистрируется в системе, из введённого им пароля изготавливается ещё один -ключ. Если он совпадает с тем, что хранится в учётной записи, значит, пароль -правильный. - -Авторы UNIX предполагали, что, раз пароль из ключа получить нельзя, ключ -можно выставлять на всеобщее обозрение, однако выяснилось, что, узнав ключ, -пароль можно попросту подобрать на очень мощной машине или в предположении, -что пароль -- это английское слово, год рождения, имя любимой кошки и т. п. -Если подбор пароля сопровождается неудачными попытками входа в систему, это -отражается в системных журналах и может быть легко замечено. А завладев -ключом, злоумышленник сможет заняться подбором втихомолку на каком-нибудь -суперкомпьютере. В конце концов, ключ не нужен никому, кроме подсистемы -идентификации, поэтому его, вместе с другими полями учётной записи, о которых -знать всем не обязательно, из `/etc/passwd` перенесли в «теневой» файл учётных -записей `/etc/shadow`. На месте ключа в Linux должна быть буква `x`; если там -стоит что-то другое, идентификация пользователя не сработает, и он не сможет -войти в систему. - -Третье и четвёртое поля `passwd` -- _идентификатор пользователя_ и -_идентификатор группы по умолчанию_. Как уже говорилось в лекции <> именно идентификатор пользователя, а не его входное имя, -однозначно определяет пользователя в системе и его права. Вполне возможно -создать несколько учётных записей с одинаковыми UID, которые различаются -другими полями. Тогда при регистрации в системе под именами из этих записей, -пользователи могут получать разные домашние каталоги и командные оболочки, -разное членство в группах, но иметь одинаковый UID. Пятое поле отводится под -«полное имя» пользователя; это единственное поле `passwd`, содержимое которого -ни на что не влияет. Наконец, шестое и седьмое поля содержат _домашний каталог_ -и _стартовый командный интерпретатор_ пользователя. Если седьмое поле пусто, -подразумевается `/bin/sh`, а если его содержимое не встречается в файле -`/etc/shells`, содержащего допустимые командные интерпретаторы, неизбежны -трудности при идентификации пользователя. - -Строки файла `/etc/group` состоят из четырёх полей, причём второе -- ключ -группового пароля -- обычно не используется. Первое поле -- это имя группы, -третье -- это _идентификатор группы_, а четвёртое -- это список _входных имён_ -пользователей, которые в эту группу входят (более точно -- для которых эта -группа является дополнительной, так как группа по умолчанию указывается в -`/etc/passwd`, хотя никто не мешает продублировать группу по умолчанию и в -`/etc/group`). Таким образом, определение членства пользователя в группах -зависит не от его UID, а от входного имени. - -Упомянутый выше файл `/etc/shadow`, доступ к которому имеет только -суперпользователь, также состоит из полей, разделяемых двоеточиями. Помимо -`_входного имени_ и _ключа пароля_` там указываются различные временные -характеристики учётной записи: нижняя и верхняя граница времени жизни пароля, -самой учётной записи, дата последнего изменения и т. п. Ключ пароля (второе -поле) указывается в одном из поддерживаемых форматов, а если формат не -опознан, вся учётная запись считается недействительной. Поэтому один из -способов запретить регистрацию пользователя в системе -- добавить один символ -(например, `!`) прямо в поле ключа, отчего всё поле становится синтаксически -неправильным. Вновь разрешить пользователю входить в систему можно, удалив -из поля лишний символ. Именно так работает (с ключами `-L`, lock, и `-U`, -unlock) утилита `usermod`, изменяющая учётную запись. С помощью этой утилиты -можно отредактировать и все остальные поля как `passwd`, так и `shadow`. - -Добавить и удалить пользователя или группу можно с помощью утилит `useradd`, -`userdel`, `groupadd` и `groupdel` соответственно. Не стоит пользоваться -текстовым редактором, так как он не гарантирует _атомарности_ операции -добавления/удаления, хотя бы потому, что изменению подлежат сразу два файла --- `passwd` и `shadow`. Даже если необходимо отредактировать `/etc/passwd` -или `/etc/group` (например, для добавления пользователя в группу или удаления -его оттуда), стоит запускать не просто редактор, а `vipw` или `vigr` (именно -их поведение, позволяющее соблюсти атомарность, копирует утилита `visudo`, -описанная ранее). - --------------------------------------------------------------------- -[root@localhost root]# useradd -g users -G proc,cdrom -c "Incognito" incognito -[root@localhost root]# id incognito - uid=504(incognito) gid=100(users) groups=100(users),19(proc),22(cdrom) -[root@localhost root]# userdel -r incognito -[root@localhost root]# id incognito - id: incognito: No such user --------------------------------------------------------------------- - -Здесь был добавлен пользователь `incognito`, группа по умолчанию -- `users`, -член групп `proc` и `cdrom`, полное имя -- «Incognito». Стоит заметить, что -пароль для этой учётной записи установлен не был (чтобы создать пароль, -стоило запустить команду `passwd incognito`), и, даже если бы пользователя -тут же не удалили (`userdel -r` удаляет также и домашний каталог, и почтовый -ящик), зарегистрироваться в системе под имененем `incognito` было бы всё -равно невозможно. - -==== Подсистема идентификации ==== - -Подсистемой учётных записей пользуется подсистема _идентификации_, которая в -Linux имеет модульную структуру и называется PAM (Pluggable Authentication -Modules, т. е. Подключаемые Модули Идентификации). Идея PAM -- в том, чтобы -унифицировать и, вместе с тем, сделать более гибкой любые процедуры -идентификации в системе -- начиная от команды `login` и заканчивая доступом к -файлам по протоколу, скажем, FTP. Для этого недостаточно просто написать -«библиотеку идентификации» и заставить все программы её использовать. В -зависимости от того, для чего производится идентификация, условия, при -которых она будет успешной, могут быть более или менее строгими, а если она -прошла успешно, бывает нужно выполнить действия, связанные не с определением -пользователя, а с настройкой системы. - -В большинстве дистрибутивов PAM обучен схеме `. d`, и настройки каждой -службы, которая использует идентификацию, лежат в отдельном файле: - --------------------------------------------------------------------- -[root@localhost root]# ls /etc/pam.d - chpasswd groupdel other system-auth userdel - chpasswd-newusers groupmod passwd system-auth-use_first_pass usermod - crond login sshd user-group-mod - groupadd newusers su useradd --------------------------------------------------------------------- - -В PAM определено четыре случая, требующие идентификации: `auth` -- собственно -идентификация, определение, тот ли пользователь, за кого он себя выдаёт, -`account` -- определение, всё ли хорошо с учётной записью пользователя, -`password` -- изменение пароля в учётной записи, и `session` -- -дополнительные действия непосредственно перед или непосредственно после того, -как пользователь получит доступ к затребованной услуге. Эти значения -принимает первое поле любого файла настройки из `pam.d`, а в третьем поле -записывается модуль, который проверяет какой-нибудь из аспектов -идентификации. Второе поле определяет, как успех или неуспех проверки одного -модуля влияет на общий успех или неуспех идентификации данного типа -(например, `required` означает, что в случае неуспеха модуля проверка -пройдена не будет). Четвёртое и последующие поля отведены под параметры -модуля. - --------------------------------------------------------------------- -[root@localhost root]# cat /etc/pam.d/login - auth include system-auth - auth required pam_nologin.so - account include system-auth - password include system-auth - session include system-auth - session optional pam_console.so -[root@localhost root]# cat /etc/pam.d/system-auth - auth required pam_tcb.so shadow count=8 nullok - account required pam_tcb.so shadow - password required pam_tcb.so use_authtok shadow count=8 write_to=tcb - session required pam_tcb.so --------------------------------------------------------------------- - -Такие настройки `login` обнаружил Мефодий на своём компьютере. Во всех четырёх -случаях используется включаемый файл `system-auth` (к нему обращаются и другие -службы), с некоторыми дополнениями: во время идентификации `pam_nologin.so` -дополнительно проверяет, не запрещено ли пользователям регистрироваться -вообще (как это бывает за несколько минут до перезагрузки системы), а перед -входом в систему и после выхода из неё `pam_console.so` выполняет описанную в -лекции <> «передачу прав на владение устройствами» (и, -соответственно, лишение пользователя этих прав). - -Каталог `/etc/pam.d` -- замечательный пример того, как профиль определяет -поведение системы. В частности, четыре первых строки из `system-auth` -показывают, что в этом дистрибутиве используется не просто «теневой» файл -паролей, а схема TCB, описанная в лекции <>. (Как уже -известно Мефодию, в этой схеме вместо общего для всех `/etc/shadow` -задействованы файлы вида `/etc/tcb/входное_имя/shadow`, причём права доступа к -ним устроены таким образом, чтобы при выполнении команды `passwd` можно было -обойтись без подмены пользовательского идентификатора на -суперпользовательский). - -==== Подсистема системных журналов ==== - -Проста и остроумна в Linux подсистема ведения _системных журналов_ -- системная -служба `syslogd`, управляемый конфигурационным файлом `/etc/syslog.con`f и `. -d`-каталогом `/etc/syslog.d`. Если какая-нибудь системная служба желает -сообщить системе о том, что наступило событие, которое стоит запомнить, у неё -есть два пути. Во-первых, можно просто добавлять очередную запись в файл, -который сама эта служба и открыла; этот файл будет журналом его сообщений. -Во-вторых, можно воспользоваться _системным вызовом_ `syslog()`, который -переадресует текстовое сообщение специальной службе -- `syslogd` -- а уж та -разберётся, что с этим сообщением делать: записать в файл, вывести на 12-ю -консоль или забыть о нём. Второй путь (централизованная журнализация) -предпочтительнее почти всегда; исключение -- случай, когда сообщения по -какой-то причине не могут быть текстовыми или этих сообщений предполагается -посылать так много, что `syslogd` просто не справится. - -Все события, сообщаемые `syslogd`, подразделяются горизонтально -- по типу -службы (`facility`), с которой это событие произошло события, и вертикально --- по степени его важности (`priority`). Типов событий насчитывается около -двадцати (среди них `auth`, `daemon`, `kern`, `mail` и т. п., а также восемь -не именованных, от `local0` до `local7`). Степеней важности всего восемь, по -возрастанию важности: `debug`, `info`, `notice`, `warning`, `err`, `crit`, -`alert` и `emerg`. Таким образом, каждое событие определяется парой значений, -например, mail.err означает для `syslogd` событие, связанное с почтой, притом -важности не меньшей err. Из таких пар (с возможной заменой типа или важности -на `*`, что означает «любые», или none, что означает «никакие») составляется -конфигурационный файл `/etc/syslog.conf`: - --------------------------------------------------------------------- -[root@localhost root]# cat /etc/syslog.conf - *.notice;mail.err;authpriv.err /var/log/messages - authpriv.*;auth.* /var/log/security.log - *.emerg * - *.* /dev/tty12 - mail.info /var/log/maillog --------------------------------------------------------------------- - -В первом поле строки указываются профили сообщений, разделённые символом `;`, -а во втором -- хранилище сообщений (файл, терминал, есть способы отдавать их -на обработку программе и пересылать по сети). В примере в файл -`/var/log/messages` попадают все сообщения важности не меньшей, чем `notice`, за -исключением сообщений типа `mail` и `authpriv`, которые попадают туда, только -если имеют важность не ниже `err`. Сообщения типа `authpriv` и `auth` любой -важности попадают в файл `/var/log/security.log`, а типа `mail` и важности не -ниже `info` -- в файл `/var/log/maillog`. Сообщения типа `emerg` (наивысшей -важности) выводятся на все терминалы системы, и, наконец, все сообщения -выводятся на 12-ю виртуальную консоль. - -Во многих системах используется основательно доработанный `syslogd`, -позволяющий фильтровать сообщения не только по типу/важности, но и, например, -по отправителю, задавать точные (а не «не меньшие») значения `priority` и т. -п., однако такие доработки нужны для того, чтобы либо вести практически -не фильтрованную журнализацию (получаются системные журналы совершенно -не читаемого объёма), либо отводить поток сообщений определённой службы в -отдельный журнал, опять-таки, не для чтения, а для последующей обработки. - -Стоит заметить, что каталог `/etc/syslog.d` в новых версиях `syslogd` -предназначен для хранения не профильных конфигурационных файлов в стиле `.d`, -а _сокетов_, из которых системная служба может получать сообщения так же, как -и из сети или в результате системного вызова `syslog()`. - -==== Выполнение действий по расписанию ==== - -Другой пример типичной для Linux службы, управляемой конфигурационным -файлом, -- служба `cron` footnote:[Программисты имели в виду Хроноса, стихийное -божество времени у древних греков. Уже сами греки часто называли так «владыку -неба» титана Крона (отца богов-кронидов и, среди прочих, Зевса, который -впоследствии папу и других титанов заключил в Тартар, и стал владыкой неба -сам). У древних римлян и Крон и Хронос почитались под именем Сатурна, -божества неумолимого времени.], регулярно выполняющая в заданное время -заданные действия. Время от времени в системе необходимо обновлять -разнообразные файлы, например, базы данных антивирусов (вирусов в Linux нет, -а антивирусы есть!), базу данных `whatis` или список всех доступных на чтение -файлов системы, `locatedb` (поискать по этому списку можно командой `locate`); -нужно собирать статистику по работе системы, анализировать цельность системы -(этим занимаются службы OSec, TripWire или AIDE) и производить множество -других регулярных действий. Всем этим и занимается служба `cron`. - -Конфигурационный файл службы `cron` называется `/etc/crontab`. - --------------------------------------------------------------------- -[root@localhost root]# cat /etc/crontab - #minute (0-59), - #| hour (0-23), - #| | day of the month (1-31), - #| | | month of the year (1-12), - #| | | | day of the week (0-6 with 0=Sunday). - #| | | | | user - #| | | | | | commands - 01 * * * * root run-parts /etc/cron.hourly - 02 4 * * * root run-parts /etc/cron.daily - 22 4 * * 0 root run-parts /etc/cron.weekly - 42 4 1 * * root run-parts /etc/cron.monthly --------------------------------------------------------------------- - -Первые пять полей этого файла определяют время запуска команды: минуту, час, -число месяца, месяц и день недели. Символ `*` означает, что соответствующая -часть даты не учитывается. Шестое поле -- имя пользователя, от лица которого -запускаются команда, указанная в остальных полях строки. Так, в примере -команда `run-parts /etc/cron.weekly` будет запускаться в 4 часа 22 минуты -каждое воскресенье (нулевой день) любого числа любого месяца. - -Как видно из примера, обычно `/etc/crontab` невелик: чаще всего он состоит из -почасового, подённого, понедельного и помесячного запуска специального -сценария (в примере -- `run-parts`). Этот сценарии реализует упрощённую схему -`. d`, он попросту запускает отсортированные в лексикографическом порядке -footnote:[То есть в таком порядке, в котором они были бы расставлены в -словаре. Причём цифры предшествуют алфавитным знакам, а между собой -сортируются по возрастанию, от 0 до 9. Отсюда `000anacron` -- такое имя -обеспечит, чтобы этот сценарий был выполнен самым первым.] сценарии из -соответствующего каталога (например, из `/etc/cron.daily`): - --------------------------------------------------------------------- -[root@localhost root]# ls /etc/cron.daily - 000anacron logrotate makewhatis osec stmpclean updatedb --------------------------------------------------------------------- - -Вот что происходит каждый день на машине Мефодия: запуск anacron и -«прокручивание» системных журналов (об этом речь пойдёт далее), обновление -базы `whatis`, проверка цельности системы с помощью `osec`, прореживание -старых и неиспользуемых файлов в `/tmp` (утилита `stmpclean`) и, наконец, -обновление базы `locatedb`. - -Пользователям системы можно разрешить иметь собственные расписания, также -обрабатываемые системной службой `cron`. Эти расписания имеют тот же -синтаксис, что и `crontab`, только шестое поле (`user`) в них отсутствует. -Редактировать пользовательские таблицы рекомендуется с помощью команды -`crontab -e` (чтобы не подсунуть системной службе синтаксически неверный -файл). Сами таблицы могут храниться, в зависимости от версии и настроек -`cron`, в `/var/spool/cron/crontabs`, `/var/spool/cron`, `/var/cron/tabs` или -ещё где-нибудь. - -Служба anacron появилась в Linux-системах в то время, когда их начали активно -использовать на персональных рабочих станциях. Такие станции, в отличие от -серверов, не обязаны работать круглосуточно. Скорее всего, на ночь, на -праздники и на время отпуска их выключают. Это значит, что все настройки cron -надо менять в соответствии с графиком включений/выключений (иначе `cron.daily` -никогда не выполнится в четыре часа ночи) -- или запускать отдельную службу, -которая будет выполнять некоторые задачи не по расписанию, а потому что их -давно уже пора запустить footnote:[Название этой службы пародирует `cron` с -намёком на анахронизм, то есть несвоевременность выполнения заданий.]. -Дополнительно anacron рассчитывает запуск задач так, чтобы не перегрузить -компьютер работой, если их накопилось слишком много. Конфигурационный файл -anacron называется `/etc/anacrontab`. - -==== «Прокручивание» системных журналов ==== - -Ещё изучая работу `syslog`, Мефодий не расставался с мыслью, что файл, в -котором записывается системный журнал, постоянно растёт. Это значит, что -каков бы ни был размер файловой системы `/var`, она в конце концов заполнится -журналами под завязку -- если как-то их не укорачивать. К сожалению, в Linux -укоротить файл от начала, отрезав самые старые записи, нельзя, как нельзя и -добавлять новые записи в начало файла. Эти операции легко реализовать с -помощью копирования нужной области в новый файл и последующего -переименования, но, во-первых, соблюсти _атомарность_ таких составных операций -нелегко, а во-вторых, они требуют удвоенного места в файловой системе на -время работы (и, стало быть, каких-то аварийных процедур на случай нехватки -места). - -Поэтому в Linux принят другой, существенно менее ресурсоёмкий алгоритм, -позволяющий избежать переполнения `/var`: т. н. «прокручивание» системных -журналов. Суть алгоритма в следующем: когда настаёт пора укоротить журнал -(например, раз в неделю или если файл журнала достиг определённого размера), -этот файл переименовывают, и открывают новый пустой файл с тем же именем. -Если хранить несколько (скажем, семь) переименованных старых файлов, с ними -уже можно производить операцию «отбрасывания старого»: самый старый -- седьмой -- -файл удаляется, шестой переименовывается в седьмой, пятый -- в шестой, и т. д. -до первого (моложе которого только текущий журнал), который переименовывается -во второй. Только тогда можно переименовать текущий журнал в «первый старый», -и открыть новый. Получается очередь устаревающих файлов, пополняемая с одной -стороны и усекаемая с другой. - -Как правило имя «первого старого» журнала получается добавлением к имени -журнала суффикса `.1`, второго -- `.2` и т. д.: - --------------------------------------------------------------------- -[root@localhost root]# ls -l /var/log/syslog/messages* --rw-r----- 1 root adm 292654 Dec 15 14:01 /var/log/syslog/messages --rw-r----- 1 root adm 34452 Dec 13 01:09 /var/log/syslog/messages.1.bz2 --rw-r----- 1 root adm 35892 Dec 6 09:38 /var/log/syslog/messages.2.bz2 --rw-r----- 1 root adm 60806 Nov 28 10:59 /var/log/syslog/messages.3.bz2 --rw-r----- 1 root adm 61063 Nov 21 10:47 /var/log/syslog/messages.4.bz2 --rw-r----- 1 root adm 60079 Nov 14 21:18 /var/log/syslog/messages.5.bz2 --------------------------------------------------------------------- - -Прокручиванием системных журналов занимается утилита `logrotate`, которая тоже -управляется и конфигурационным файлом `/etc/logrotate.conf` и `. d`-каталогом -`/etc/logrotate.d/`. Согласно настройкам, старые файлы можно сжимать -упаковщиками `bzip2` (как в примере) или `gzip`, можно задавать им определённые -права доступа, можно посылать сигнал некоторой службе (чтобы она заметила -подмену журнала, если она сама, а не `syslogd` занимается его пополнением) и т. -п. - -=== Конфигурационные файлы в домашнем каталоге === - -Немало конфигурационных файлов находится в домашнем каталоге пользователя. -Этими файлами практически любая утилита может быть перенастроена по сравнению -с обычным поведением, или поведением, задаваемым конфигурационным файлом из -`/etc`. В Linux принято предоставлять пользователю возможность задавать профиль -любого используемого им инструмента, начиная от простой утилиты и заканчивая -графической подсистемой управления «рабочим столом» (см. об этом лекцию -<>). Как правило, имена таких файлов -или каталогов начинаются на `.`, т. е. считаются скрытыми -- для того, чтобы -не засорять выдачу `ls`. Если пользователю нужно работать не со своими файлами, -а именно с настройками, он всегда может использовать ключ `-a` или `-A`: - --------------------------------------------------------------------- -methody@localhost:~ $ ls - bin cat.info cat.stderr Documents examples grep.info textfile tmp -methody@localhost:~ $ ls -AF - .alias .bashrc .emacs .inputrc~ textfile .Xauthority - .bash_history bin/ examples/ .lpoptions tmp/ .xsession.d/ - .bash_logout cat.info grep.info .pinerc .viminfo - .bash_profile cat.stderr .i18n .pyhistory .vimrc - .bash_profile~ Documents/ .inputrc .pythonstartup .vimrc~ -methody@localhost:~ $ rm .*~ --------------------------------------------------------------------- - -Многие утилиты создают конфигурационный файл при запуске, если его в домашнем -каталоге пользователя нет, поэтому со временем объём `ls -A` становится всё -больше. Файл `.lpoptions` задаёт параметры подсистемы печати, `.pinerc` -- это -настройки почтового клиента `pine`, `.viminfo` -- файл истории команд редактора -Vi, а файл `.Xauthority` и каталог `.xsession.d` управляют запуском графической -подсистемы `X```, описанной в лекции <>. -Из файлов в примере некоторые вообще не являются «стандартными»: так, -`.aliases` и `.i18n` просто «втягиваются» стартовым командным сценарием `bash`, -потому что упомянуты в нём явно; строго говоря, они могли бы называться и -по-другому. Все конфигурационные, стартовые и прочие вспомогательные файлы -принято делать скрытыми даже если никаких требований к их названиям нет. - -Файл `.pythonstartup` (настройки интерпретатора языка программирования Python) -выполняется потому, что имя этого файла задано в переменной окружения -`PYTHONSTARTUP`. Мефодию пришлось дописать строку -`PYTHONSTARTUP="/home/methody/.pythonstartup"; export PYTHONSTARTUP` в -`~/.bash_profile и "C-i": complete` в `~/.inputrc`, чтобы достраивание заработало -и в этом интерпретаторе. Ещё один файл, `.pyhistory`, используется в самом -`.pythonstartup`: - --------------------------------------------------------------------- -methody@localhost:~ $ cat .pythonstartup - import atexit, os, readline, rlcompleter - - historyPath = os.path.expanduser("~/.pyhistory") - - def save_history(historyPath=historyPath): - import readline - readline.write_history_file(historyPath) - - if os.path.exists(historyPath): - readline.read_history_file(historyPath) - - atexit.register(save_history) - del os, atexit, readline, rlcompleter, save_history, historyPath --------------------------------------------------------------------- - -Подавляющее большинство конфигурационных файлов предназначено для того, чтобы -их мог редактировать пользователь. Эти файлы часто имеют -самодокументированный формат и/или сопровождаются руководством, нередко -выделенным а отдельный от руководства по самой утилите документ. - -[[package]] -== Управление пакетами == - -=== Пакеты === - -Пригодная для работы пользователя система состоит из множества (сотен и -тысяч) программ и утилит. В Linux каждый компонент системы представлен в виде -_пакета_. Все операции, связанные с изменением состава системы: установка, -удаление, проверка, обновление компонентов, -- производятся над пакетами. В -целом, _пакет_ -- это средство сделать так, чтобы пользователь-администратор, -изменяя или обновляя программное наполнение системы, работал не с файлами -(имена которых ему подчас неизвестны), а с определёнными функциональностями -самой системы: например, добавлял в неё не «500 файлов», а «WWW-сервер -apache». - -[[filearchive]] -=== Архив файлов === - -На первый взгляд, программа состоит из одного -- исполняемого -- файла: -запускаем файл, получаем работающую программу. Однако во время работы даже -самая простая программа использует другие файлы, содержащие различные -ресурсы: _библиотеки_, конфигурационные файлы, файлы-дырки и даже запускает -другие программы. Чтобы программа действительно заработала, необходимо помимо -главного исполняемого файла обеспечить наличие в системе всех нужных файлов с -ресурсами. - -Понятно, что при установке или удалении программы нужно позаботиться и обо -всех используемых ею файлах (которых может быть даже очень много). Это -- -первая задача пакетирования: все файлы, используемые программой, объединяются -в один файл -- _архив_. Это позволяет не копировать при установке программы все -файлы по-отдельности, а потом не удалять их таким же способом, а работать со -всеми данными программы как с одним целым -- устанавливать и удалять один -пакет. - -============================================ -Файловый архив:: - дерево каталогов, представленное в виде единого файла, состоящего из - содержимого всех файлов в этом дереве и информации об имени и атрибутах - каждого файла. -============================================ - -Нет жёсткого требования, чтобы один пакет содержал только одну программу. В -пакет естественно объединять такие ресурсы, с которыми удобно работать как с -одним целым. Это может быть отдельная программа или набор утилит (например, -coreutils, основные утилиты, унаследованные Linux от UNIX) или модуль с -дополнительными возможностями программы, или общие для нескольких программ -ресурсы. В процессе развития и/или устаревания программного обеспечения -выделение некоторых задач в отдельный пакет может приобретать или терять -смысл, поэтому способ объединения ресурсов в пакеты -- это не что-то раз и -навсегда выбранное: пакеты могут разделяться и сливаться. - -Самый простой и традиционный для Linux способ объединить несколько файлов в -один -- использовать утилиту `tar` footnote:[`Tar` появился намного раньше Linux -и изначально служил для создания файловых архивов на магнитной ленте. Отсюда -и его название -- tape archiver, «архиватор для (магнитных) лент». В -настоящее время `tar` присутствует в любой UNIX-подобной системе и позволяет -работать с файловыми архивами на любых носителях.]. Мефодий, написав -несколько программ и сценариев, решил собрать их в одном файловом архиве, -чтобы их удобнее было переносить на все системы, в которых ему случается -работать. Для этого Мефодий создал архив со всем содержимым своего -подкаталога `bin/`. - --------------------------------------------------- -methody@localhost:~ $ tar -cf methody.progs.tar bin/ -methody@localhost:~ $ tar -tf methody.progs.tar - bin/ - bin/loop - bin/script - bin/to.sort - bin/two --------------------------------------------------- - -Первый параметр `tar` состоит из двух частей: операция, которую следует -произвести над архивом, в данном случае `c` (create, создать), и ключ `f`, -который указывает, что архив следует создать в файле, имя файла архива -- -следующий параметр. Имя архива может быть любым, но Гуревич посоветовал -снабдить его расширением `.tar`, чтобы потом не путаться. После имени архива -следуют имена файлов и каталогов, которые следует запаковать. - -========================================================= -С каждым указанным каталогом `tar` работает рекурсивно, т. е. запаковывает все -содержащиеся в нём файлы и подкаталоги. -========================================================= - -Чтобы проверить, какие файлы попали в архив, Мефодий просмотрел содержимое -получившегося архива командой `tar -tf имя_архива` (`t` -- просмотреть, `f` -- -использовать файл, указанный следующим параметром). Тут Мефодий обратил тут -внимание на два обстоятельства. Во-первых, в архиве имена файлов сохранились -вместе с путём. Во-вторых, все пути, сохранённые в архиве -- относительные. - -При распаковке архива `tar` файлы извлекаются вместе с путём, недостающие -подкаталоги создаются по мере необходимости. Все пути `tar` считает -относительными от своего рабочего каталога. Если теперь Мефодий распакует -свой архив (командой `tar xf имя_архива`), то в рабочем каталоге будет создан -подкаталог `bin/` и в него будут записаны все файлы из архива. - --------------------------------------------------- -methody@localhost:~ $ tar -xvf methody.progs.tar - bin/ - bin/loop - bin/script - bin/to.sort - bin/two --------------------------------------------------- - -Ключ `v` велит `tar` быть «разговорчивым» (verbose), т. е. выводить больше -диагностических сообщений, благодаря этому `tar` при распаковке выводит имена (с -путём) всех записываемых файлов. Если в рабочем каталоге уже есть файл, -который `tar` собирается создать при распаковке, то этот файл будет попросту -заменён файлом из архива. Так, когда Мефодий распаковал свой архив, -подкаталог `bin/` со всем его содержимым заменился на подкаталог из архива. В -данной ситуации это не страшно, поскольку в архиве файлы такие же, но вот -если бы Мефодий перед распаковкой изменил какие-то из своих файлов в `bin/`, -он лишился бы всех изменений. - -==== Формат пакета ==== - -Помимо хранения архива файлов у пакета есть и другие задачи (они обсуждаются -в двух следующих разделах), поэтому для пакета в Linux не очень подходит -обычный файловый архив, наподобие `.tar`, а нужен специальный формат. Таких -форматов в Linux бывает несколько (краткое перечисление и характеристика -- в -разделе <>), в системе Мефодия используется -один из наиболее распространённых -- `rpm`, поэтому все примеры в данной -лекции будут с его участием. Для работы с пакетами в специальном формате -нужна специальная программа-установщик, которая так же и называется -- `rpm`: -она занимается установкой, удалением, обновлением и проверкой пакетов. - -Пакет в формате `rpm` -- это единый файл со всеми необходимыми данными. -Существуют определённые (хотя и не очень жёсткие и последовательные) -соглашения относительно названий файлов-пакетов. Например, rpm-файл, -содержащий комплект стандартных утилит `coreutils`, в системе Мефодия -называется `coreutils-5.2.1-some5.rpm`: сначала -- _имя пакета_, затем через -дефис -- служебная информация о номерах версий программного обеспечения и -самого пакета. - -==== Регистрация в системе ==== - -Итак, пакет с компонентом системы -- это в первую очередь _файловый архив_, в -котором хранятся все необходимые файлы вместе с путями к ним (т. е. -каталогами). Когда компонентов много, нужно обеспечить, чтобы в разных -пакетах не оказалось файлов с одинаковым именем и путём, чтобы файл, -принадлежащий одному пакету, не мог быть заменён файлом другого пакета при -установке. Отслеживать такого рода _конфликты_ пакетов -- вторая задача -пакетирования. - -Чтобы предупреждать конфликты, в системе должна храниться информация обо всех -уже установленных пакетах и принадлежащих им файлах. Когда точно известно, -какие файлы принадлежат пакету, можно полностью удалить пакет, не оставив и -не удалив при этом ничего лишнего. Такой подход препятствует образованию в -системе «мусора» -- бесполезных файлов, оставшихся от удалённых программ -- и -делает операцию установки/удаления пакета полностью обратимой. - -Rpm хранит информацию обо всех установленных в системе пакетах и -принадлежащих им файлах и может выдать эту информацию по запросу -пользователя. Почитав руководство по `rpm`, Мефодий выяснил, что список всех -установленных в системе пакетов (скорее всего, очень длинный, в несколько -тысяч строк) можно получить командой `rpm -qa`, список всех файлов, -принадлежащих пакету, командой `rpm -ql имя_пакета`. Он решил проверить, есть -ли в его системе уже известный ему по предыдущим лекциям пакет `coreutils` и -узнать, какие утилиты ему принадлежат: - --------------------------------------------------- -methody@localhost:~ $ rpm -qa | grep coreutils - coreutils-5.2.1-some5 -methody@localhost:~ $ rpm -ql coreutils | grep bin - /bin/basename - /bin/cat - /bin/chgrp - /bin/chmod - . . . --------------------------------------------------- - -Мефодий получил довольно длинный список имён файлов, среди которых встретил -многие из уже знакомых ему утилит и кое-какие незнакомые. Причём запрашивая -список файлов, Мефодий использовал только имя пакета, без _версии_ -- `rpm` -позволяет обращаться так любому из установленных пакетов footnote:[Что логично, -поскольку в системе может быть установлена только одна версия данного пакета. -См. подробнее раздел <>.]. - -Можно выполнить и обратную процедуру -- выяснить про любой файл, какому пакету -он принадлежит: - --------------------------------------------------- -methody@localhost:~ $ rpm -qf /etc/passwd - setup-2.2.5-some1 --------------------------------------------------- - -Файлы, принадлежащие пакету, могут быть не только удалены, но и изменены. Это -может быть сделано сознательно (например, отредактирован конфигурационный -файл), в таком случае при обновлении или удалении пакета изменённый файл -нужно сохранить, потому что в нём содержится результат работы, проделанной -администратором. Для этого система должна уметь определять, что принадлежащий -пакету файл изменился. Для этого в пакете должна храниться информация обо -всех файлах архива: размер, атрибуты, _контрольная сумма_ -- в этом случае -процедура проверки сможет проверить соответствие атрибутов файла в пакете -атрибутам установленного в системе файла. Мефодий может проверить, что -изменилось в пакете командой `rpm -V имя_пакета`. - --------------------------------------------------- -methody@localhost:~ $ rpm -V setup - S.5....T c /etc/X11/fs/config - S.5....T c /etc/exports - S.5....T c /etc/fstab - S.5....T c /etc/printcap - ..?..... c /etc/securetty --------------------------------------------------- - -Мефодий получил список изменившихся с момента установки пакета файлов. -Видимо, всё это -- конфигурационные файлы, отредактированные администратором -системы. Мефодий догадался, что комбинация цифр, букв и точек -- это список -атрибутов, по которым rpm сравнивал установленные файлы с данными пакета, -однако чтобы разобраться, что именно означает каждая буква, ему придётся -внимательнее читать руководство. - -Система Linux раскладывается на компоненты без остатка: каждый файл в Linux -принадлежит какому-нибудь (и только одному!) пакету footnote:[Естественно, -кроме тех файлов, которые созданы пользователями.]. Это позволяет свести -любые изменения в составе системы к операциям над пакетами -- от начальной -установки до сложных комплексных обновлений. В этом случае для всех изменений -будет использоваться одна и та же программа-установщик, например, `rpm`. - -==== Изменение настроек системы ==== - -Для полноценной регистрации пакета в системе обычно недостаточно, чтобы -система хранила список файлов, принадлежащих пакету. При установке, удалении -или обновлении пакета часто требуется выполнить ряд операций, чтобы обновить -сведения о пакете, адаптировать настройки -- как самого пакета к уже -имеющимися в системе, так и наоборот. К тому же, некоторые изменения в -системе, например, добавление и удаление псевдопользователя, не сводятся к -добавлению и удалению файлов, и вдобавок зависят от текущего состояния -системы. Получается, что регистрация в системе -- дело не только системы, но и -самого пакета. Поэтому в каждом пакете должны храниться сведения о том, какие -действия следует выполнить в момент различных операций с ним -- в этом состоит -третья задача пакетирования. - -Списки необходимых действий представлены в пакете в виде _сценариев_. Эти -сценарии привязаны к процедурам установки и удаления пакета, причём могут -быть вызваны по необходимости как до, так и после соответствующей процедуры. -В результате процедуры установки и удаления пакета выглядят так: - -* выполнение предшествующих установке/удалению сценариев; -* копирование файлов из архива в систему или удаление файлов из системы; -* выполнение следующих за установкой/удалением сценариев. - --------------------------------------------------- -methody@localhost:~ $ rpm -q --scripts coreutils - preinstall scriptlet (through /bin/sh): - # Remove info pages from fileutils, textutils and sh-utils. - for f in /usr/share/info/{fileutils,textutils,sh-utils}.info*; do - [ -f "$f" ] || continue - RPM_INSTALL_ARG1=0 /usr/sbin/uninstall_info "$f" ||: - done - postinstall scriptlet (through /bin/sh): - /usr/sbin/install_info coreutils.info - preuninstall scriptlet (through /bin/sh): - /usr/sbin/uninstall_info coreutils.info --------------------------------------------------- - -Мефодий выяснил, что сценарии в пакете coreutils запускаются перед началом -установки (preinstall), после установки (postinstall) и перед удалением -(preuninstall), они выполняются стандартным командным интерпретатором -(`/bin/sh`). Все эти сценарии нужны для того, чтобы зарегистрировать в системе -`info` установленную пакетом документацию или удалить эту документацию из -системы (командами `/usr/sbin/install_info` и `/usr/sbin/uninstall_info` -соответственно). Поскольку `info` строит общее оглавление всей имеющейся в -системе документации, простого копирования файлов было бы недостаточно. - -В результате подобных операций по интеграции пакета в систему могут быть -изменены или удалены файлы, не принадлежащие данному пакету, созданы новые -файлы. Если программа, содержащаяся в пакете, пользуется услугами -какой-нибудь уже установленной службы (например, `syslogd`), может понадобиться -регистрация этой программы в конфигурационных файлах службы. Конечно, -изменение «чужих» файлов в процессе установки пакета нежелательно: -впоследствии, удаляя пакет, потребуется вернуть файл в исходное состояние, -что не всегда возможно (например, после вдумчивого редактирования -администратором). Избежать редактирования конфигурационных файлов позволяет -схема `. d`, описанная в лекции <>. - -==== Цена удобства ==== - -Удобство, которое получает пользователь при работе с пакетами достигается не -само собой, а человеческим трудом: пакеты должен создавать человек, его -работа называется «сопровождающий» («package maintainer» или «packager»). В -обязанности сопровождающего пакет входит подготовка файлового архива, -необходимых для установки и удаления сценариев и прочей информации о пакете и -его содержимом, и объединение их в одном файле-пакете footnote:[Функции по -созданию пакета в формате `rpm` также выполняет программа `rpm`.]. Узнать, кто и -когда создал пакет, получить краткую справку о программном обеспечении, -которое в нём содержится, можно командой `rpm -qi имя_пакета`. - --------------------------------------------------- -methody@localhost:~ $ rpm -qi setup - Name : setup Relocations: (not relocateable) - Version : 2.2.5 Vendor: Some Linux Team - Release : some1 Build Date: Чтв 29 Янв 2004 18:08:05 - Install date: Пнд 23 Авг 2004 15:08:45 Build Host: shogun.somelinux.org - Group : Система/Настройка/Прочее Source RPM: setup-2.2.5-some1.src.rpm - Size : 39969 License: GPL - Packager : Leon B. Gourievitch - Summary : Initial set of configuration files - Description : - Initial set of configuration files to be placed into /etc. --------------------------------------------------- - -Нужно принимать во внимание, что любой пакет, содержащий программное -обеспечение для Linux, не является универсальным. Если у вас есть такой -пакет, это ещё не означает, что его можно установить в вашей системе. Дело в -том, что разные дистрибутивы Linux различаются именно тем, каким образом -программное обеспечение организовано в систему (о дистрибутивах речь пойдёт в -лекции Политика свободного лицензирования. История Linux: от ядра к -дистрибутивам). Дистрибутивы могут различаться размещением файлов и -процедурами, предусмотренными для интеграции в систему программного -обеспечения, не говоря уже о том, что в разных дистрибутивах используется -разный формат пакетов. Это значит, что пакет, подготовленный с ориентацией на -один дистрибутив, может оказаться несовместимым с другим. Чтобы в вашем -дистрибутиве появилась некоторая программа, кто-то должен подготовить и -сделать доступным соответствующий пакет. - -============================================================ -Пакет:: - ресурсы, необходимые для установки и интеграции в систему некоторого - компонента (архив файлов, до- и после-установочные сценарии, информация - о пакете и его сопровождающем), объединённые в одном файле. -============================================================ - -Несмотря на частные различия, дистрибутивы Linux представляют собой варианты -одной и той же системы, поэтому в конечном итоге любую программу, работающую -в одном дистрибутиве, можно «приспособить» к любому другому. Только для этого -нужно располагать исходными текстами соответствующей программы. До сих пор -речь шла только о так называемых двоичных пакетах, в которых программы -содержатся в виде уже скомпилированных двоичных (исполняемых) файлов, в таком -виде программа может зависеть от некоторых свойств системы и работать не -везде. Чтобы получить работающую программу в системе, нужно установить именно -двоичный пакет. Однако пакет может содержать и исходные тексты программ, -такие пакеты называются _исходными_. Доступность исходных кодов -- обязательное -условие распространения большей части программного обеспечения для Linux, см. -лекцию <>. Если получилось так, что никто не подготовил пакет с -нужной вам программой для вашего дистрибутива, у вас есть возможность -установить исходный пакет и скомпилировать программу самостоятельно -footnote:[Слухи о том, что для сборки программы из исходных текстов не -обязательно даже знать, что такое «компилятор», далеки от действительности.]. -При успешной компиляции из исходного пакета получается соответствующий -двоичный, который уже можно установить в системе. - -=== Зависимости === - -Мефодий нашёл в Internetе пакет с заинтересовавшей его программой в -подходящем формате `rpm` и решил попробовать его установить footnote:[Для -установки и удаления пакетов нужны права администратора -- это серьёзные -изменения в системе.]. - --------------------------------------------------- -[root@localhost RPMS.local]# rpm -i xsltproc-1.0.32-some1.i586.rpm - ошибка: неудовлетворенные зависимости: - libxslt = 1.0.32-some1 нужен для xsltproc-1.0.32-some1 -[root@localhost RPMS.local]# --------------------------------------------------- - -Однако `rpm` отказался выполнять установку, ссылаясь на _зависимость_ от другого -пакета. Здесь Мефодий впервые столкнулся с тем, что пакеты -- не всегда -(точнее, почти никогда) бывают независимы от имеющейся системы. В разделе -<> уже говорилось о том, что для работы программы -нужны различные ресурсы, причём несколько программ могут нуждаться в одном и -том же ресурсе. В последнем случае общий ресурс может оказаться в отдельном -собственном пакете (чтобы не включать его сразу в несколько), и этот пакет -должен быть установлен в системе, чтобы заработали нуждающиеся в нём -программы. Потребность пакета в ресурсах, находящихся в другом пакете, -называют _зависимостью_ этого пакета от другого. В процедуре установки rpm -проверяет, все ли зависимости устанавливаемого пакета удовлетворены (т. е. -все ли необходимые пакеты уже установлены в системе), и если чего-то не -хватает -- прекращает установку. Именно с такой ситуацией и столкнулся -Мефодий. - -============================================================ -Зависимость пакетов:: - ситуация, при которой _пакет_ не может быть установлен в систему, если в ней - не установлен хотя бы один из некоторого множества пакетов. Аналогично, - пакет не может быть удалён из системы до тех пор, пока в ней установлен - хотя бы один зависящий от него пакет. -============================================================ - -==== Библиотеки ==== - -Мефодию помешала установить пакет самая типичная зависимость -- на _библиотеку_. -Библиотеки возникают оттого, что все программы, сколько бы они не отличались -друг от друга, нуждаются в выполнении одних и тех же операций: вводе и -выводе, получении доступа к ресурсам системы (памяти, процессорному времени, -файлам), вычислениях, работе с сетью, рисовании окошек, кнопок, меню и т. п. -Для выполнения таких операций используются небольшие подпрограммы -- _функции_. -Любые функции, необходимые более чем одной программе, есть смысл не включать -в текст каждой программы, а собирать в отдельных библиотеках. Тогда программа -сможет использовать не собственную подпрограмму, а готовую функцию из -библиотеки. Поскольку библиотеки нужны нескольким программам, они обычно -оформляются в виде отдельного пакета. Если библиотека не будет установлена, -использующая её программа просто не будет работать. - -Библиотеки подвержены тем же изменениям с течением времени, что и все прочие -программы: исправлению обнаруженных ошибок, модернизации, оптимизации и пр. -Поэтому версии библиотек должны быть согласованы с версией программного -обеспечения. Например, программа может отказаться работать даже при наличии -библиотеки, если эта библиотека слишком старая либо слишком новая по -сравнению с самой программой. - -==== Цепочки зависимостей ==== - -Однако понятие зависимости включает не только зависимость программы от -библиотек. Вообще говоря, зависимость возникает там, где программное -обеспечение использует любой не поставляемый непосредственно с ним ресурс -footnote:[Имеет смысл исключать из понятия зависимости использование наиболее -стандартных ресурсов, без которых немыслима система Linux как таковая. К -таким ресурсам можно отнести _системные вызовы_ и некоторые стандартные файлы, -вроде `/dev/null`.]. Это могут быть и утилиты, которые запускаются при работе -самой программы или во включённых в пакет сценариях, программа-интерпретатор -для исполнения этих сценариев, и даже определённые файлы, которые должны -присутствовать для правильной работы программы (например, утилита `passwd` -предполагает, что существует файл `/etc/passwd`). - -Зависимость может быть и не безусловной. Например, в некоторых случаях нужно -обеспечить наличие ресурса не к моменту запуска программы, а прямо к моменту -установки пакета, так, для выполнения доустановочного сценария нужна -программа-интерпретатор. В некоторых случаях требуется ресурс строго -определённой версии, ни больше, ни меньше. Бывают случаи, когда зависимость -имеет обобщённую форму, например, почтовому клиенту (программе для чтения и -написания электронной почты) может требоваться служба доставки электронной -почты. В Linux такую услугу предоставляют несколько разных программ, и любая -из них удовлетворит зависимость. - -Разобравшись с понятием зависимости, Мефодий набрался твёрдой решимости -установить-таки нужный ему пакет, установив всё, что он потребует. Но не -тут-то было: взявшись устанавливать библиотеки, Мефодий выяснил, что каждой -из них требуются какие-то ещё пакеты, отсутствующие в системе, у каждого из -них тоже есть зависимости и т. п. -- один единственный пакет повлёк за собой -снежный ком других, вытягивая их по цепочкам зависимостей. - -[[packageconflicts]] -==== Конфликты и альтернативы ==== - -В противоположность зависимости, когда пакет не может быть установлен при -отсутствии некоторого другого, _конфликт пакетов_ -- это ситуация, когда пакет -не может быть установлен при наличии некоторого другого, т. е. они -несовместимы в рамках одной системы. Одна из причин возникновения конфликтов -уже упоминалась выше -- в пакетах есть файлы с совпадающими именами. Самый -распространённый источник конфликтов -- программы, которые предоставляют разные -реализации одной и той же функциональности системы (например, службы доставки -электронной почты или печати, программы проверки орфографии, компиляторы и т. -п.). Можно было бы, конечно, просто назвать конфликтующие файлы по-разному, -но и тогда путаница неизбежна: если, допустим, старый компилятор Си -называется `gcc2.96`, а новый -- `gcc3.3`, то что запускается по стандартной -команде `gcc`? В каждом пакете должна содержаться информация о том, с какими -пакетами он конфликтует. Конфликт пакетов может быть разрешён очень просто: -следует удалить один из конфликтных пакетов, после чего свободно -устанавливать другой. - -Каждый пакет помимо имени обозначен и номером версии, указывающим степень -обновлённости содержащегося в пакете программного обеспечения и самого -пакета. В системе одновременно может быть установлена только одна версия -любого пакета, со всеми остальными версиями она конфликтует. Такой подход -вполне понятен, поскольку файлы в пакете имеют строго определённый путь, по -которому они должны быть размещены в файловой системе. Поэтому при -использовании пакетов не должно (и не может) возникнуть ситуации, когда одна -и та же программа установлена в разных местах файловой системы. - -Однако не все функции в системе должны эксклюзивно выполняться одной -программой. Например, в системе может быть установлено сколько угодно -текстовых редакторов, и даже несколько разных реализаций одного редактора, -например, Vim (`Vi` и `nvi`). Пакеты `Vi` и `nvi` не конфликтуют друг с другом, -однако оба могут с равным правом быть вызваны по команде `vi`. Чтобы -определить, какой именно из них запускать как `vi`, во многих дистрибутивах -Linux (в частности, в том, который использует Мефодий) используется механизм -_альтернатив_. Альтернативы -- это система символьных ссылок на принадлежащие -пакетам файлы. Однотипные файлы из пакетов называются по-разному, а -символьная ссылка, к которой обращается пользователь, указывает на один из -них. Например, файл `/usr/bin/vi` может быть символьной ссылкой либо на -`/usr/bin/vim`, либо на `/usr/bin/nvi` (то же самое относится и к -руководствам по этим редакторам). При установке и удалении любого из пакетов -с одной из альтернативных программ символьная ссылка автоматически -обновляется. На какую из них будет указывать ссылка решается на основании -_веса_ каждого пакета. Вес -- это условное число, выбирается та альтернатива -из установленных, у которой наибольший вес. Пользователь может вмешаться в -выбор альтернатив и вручную. Все необходимые утилиты для работы с -альтернативами предоставляет пакет `alternatives`. - -[[installer]] -=== Установщики пакетов === - -Для выполнения всех операций над пакетами требуется специальная программа -- -_установщик пакетов_. В её задачи входит весь цикл работ с пакетом: от создания -пакета (компиляции _исходного пакета_ в _двоичный_), до его установки, удаления, -обновления, а также хранение и вывод по запросу пользователя или системы -информации об установленных и неустановленных пакетах, принадлежащих им -файлах и т. п. - -В системах Linux формат пакетов не унифицирован, распространено несколько -различных форматов, и для каждого из них требуется собственный установщик -пакетов. Наиболее известны уже описанный `rpm`, `dpkg`, используемый в Debian -(см. подробнее лекцию <>), а также пакеты в формате `tgz` (он же -`tar.gz` -- файловый архив `tar`, сжатый упаковщиком `gzip`, GNU Zip), то есть -обычные файловые архивы, где вся необходимая в пакете метаинформация -упакована в виде файлов наряду с файлами программного обеспечения. -Установщики пакетов различаются не только форматом пакетов, с которыми они -работают, но и кругом возможностей, внутренним форматом хранения информации и -т. д. - -============================================================ -Установщик пакетов:: - программа, выполняющая основные операции с пакетами: установку, удаление, - проверку, вывод информации о пакетах. -============================================================ - -В рамках этой лекции мы ограничимся обсуждением только одного из установщиков -пакетов -- `rpm` (Red Hat Package Manager). Он первоначально возник в -дистрибутиве RedHat, но в настоящее время используется и во многих других -дистрибутивах. Пожалуй, сейчас его можно назвать самым распространённым -форматом: авторы программ для Linux обычно выкладывают свои программы в -Internet в виде файловых архивов `tgz` и пакетов `rpm`. - -Обратной стороной популярности rpm является его нестандартность. Под -расширением `.rpm` довольно редко оказывается канонический формат, -разрабатываемый RedHat. В формате rpm смогли усмотреть много недостатков и -недоделок, поэтому распространено множество улучшенных и дополненных версий -`rpm`, и, соответственно, пакетов, ориентированных на какую-то из этих версий, -но носящих всё то же расширение. На практике это означает, что разные версии -`rpm` не полностью совместимы между собой, поэтому даже если в вашей системе -используется `rpm`, это совершенно не означает, что вы сможете установить любой -найденный в Internetе пакет в этом формате. - -Случай `rpm` -- только самая яркая демонстрация более общей проблемы: в общем -случае ни в одном дистрибутиве нельзя без потерь, помех или ручного -вмешательства установить пакет, не разработанный специально для данного -дистрибутива. В следующем разделе <> -изложены некоторые соображения, почему это нежелательно, и почему следует по -возможности пользоваться именно «родными» пакетами, а если их нет -- делать -их самостоятельно. - -Другая проблема установщиков пактов в том, что они годятся только для -установки/удаления отдельных пакетов, но не предназначены для доставки -пакетов в системы (пользователь сам должен найти и скачать нужный пакет, и -указать местоположение файла пакета установщику в командной строке). Кроме -того, установщик работает с каждым пакетом по отдельности: он может указать, -что не удовлетворены некоторые зависимости, или имеют место конфликты, но не -может в ходе процедуры установки ни установить все необходимые пакеты по -цепочке зависимостей, ни удалить конфликтующие -- пользователь должен делать -это вручную. Установщики пакетов не предоставляют также никаких средств по -автоматизации обновления системы. - -[[packagemanagers]] -=== Менеджеры пакетов === - -_Установщики пакетов_ делают атомарными (одно-шаговыми) операции с отдельными -пакетами: вместо копирования множества файлов и запуска нескольких сценариев -пользователь вводит одну команду `установить/удалить пакет`. Однако атомарная -с точки зрения пользователя операция -- добавление в систему одного нового -компонента может состоять из нескольких (и даже многих) операций над -пакетами. Мефодий уже столкнулся с подобным случаем, изучая на собственном -опыте понятие «цепочка зависимостей». Здесь установщики пакетов никак не -могут облегчить работу пользователя. Чтобы сделать процедуру установки, -удаления и обновления компонента системы атомарной, были разработаны -_менеджеры пакетов_. Менеджер пакетов -- это программа, которая вычисляет весь -комплекс операций над отдельными пакетами, который нужно произвести для -установки/удаления нового компонента (пакета), и сама запускает _установщик -пакетов_ сколько нужно раз с нужными параметрами. Кроме того, менеджер пакетов -хранит информацию не только о пакетах, уже установленных в системе, но и обо -всех, которые доступны для установки с какого-либо носителя или по Сети -(подробнее об этом в разделе <>). - -============================================================ -Менеджер пакетов:: - программа, выполняющая установку, удаление или обновление любого пакета - или группы пакетов, и автоматически выполняющая все необходимые для - этого процедуры (доставку пакетов из удалённых репозиториев, вычисление - зависимостей и установку требуемых по ним пакетов, удаление замещаемых - пакетов и т. п.). -============================================================ - -Наиболее известный и популярный менеджер пакетов называется APT (Advanced -Package Tool). Первоначально он был разработан в рамках дистрибутива Debian и -работал только с установщиком пакетов `dpkg`, впоследствии для других -дистрибутивов была разработана версия, работающая с `rpm`. В дистрибутиве -Мефодия также используется APT. - -Чтобы установить пакет, прежде всего нужно узнать о его существовании. -Пакетов для каждого дистрибутива Linux доступны тысячи и даже десятки тысяч, -ориентироваться в них непросто. APT предоставляет возможность поиска нужного -среди доступных пакетов, для этого используется утилита `apt-cache`. В каждом -пакете обязательно содержится краткая аннотация (в одну строку) и небольшое -описание содержащихся в пакете ресурсов (не длиннее нескольких абзацев). По -команде `apt-cache search подстрока` APT найдёт и выведет список из имён и -аннотаций пакетов, где в имени, аннотации или описании нашлась указанная -подстрока. - --------------------------------------------------- -[root@localhost shogun]# apt-cache search python | wc - 146 1158 8994 -[root@localhost shogun]# apt-cache search python | grep "programming" - python - An interpreted, interactive object-oriented programming language --------------------------------------------------- - -Для установки и удаления пакетов предназначена утилита `apt-get`, а команда -установки выглядит совсем просто: `apt-get install имя_пакета`, причём не -нужно указывать никаких сведений о версии и местонахождении пакета: APT сам -найдёт и установит самую последнюю из доступных версий. - --------------------------------------------------- -[root@localhost shogun]# apt-get install python - Чтение списков пакетов... Завершено - Построение дерева зависимостей... Завершено - Следующие дополнительные пакеты будут установлены: - libpython libgdbm libgmp python-base python-modules python-modules-bsddb - python-modules-compiler python-modules-curses python-modules-email - python-modules-encodings python-modules-hotshot python-modules-logging - python-modules-xml python-strict - Следующие НОВЫЕ пакеты будут установлены: - libpython libgdbm libgmp python python-base python-modules - python-modules-bsddb python-modules-compiler python-modules-curses - python-modules-email python-modules-encodings python-modules-hotshot - python-modules-logging python-modules-xml python-strict - 0 будет обновлено, 15 новых установлено, 0 пакетов будет удалено и 0 не будет обновлено. - Необходимо получить 0B/4466kB архивов. - После распаковки потребуется дополнительно 16,9MB дискового пространства. - Продолжить? [Y/n] y - Получено: 1 cdrom://SomeLinux CD RPM/main libpython 2.3.3-some2 [17,4kB] - Получено: 2 cdrom://SomeLinux CD RPM/main libgdbm 1.8.3-some3 [25,6kB] - Получено: 3 cdrom://SomeLinux CD RPM/main libgmp 4.1.2-some3 [153kB] - . . . - Получено: 14 cdrom://SomeLinux CD RPM/main python-base 2.3.3-some12 [782kB] - Получено: 15 cdrom://SomeLinux CD RPM/main python 2.3.3-some12 [11,5kB] - Получено 4466kB за 0s (19,5MB/s). - Совершаем изменения... - Preparing... ######################################### [100%] - 1: libpython ######################################### [ 6%] - 2: libgdbm ######################################### [ 13%] - 3: libgmp ######################################### [ 20%] - 4: python-base ######################################### [ 26%] - . . . - 13: python-modules-logging ######################################### [ 86%] - Завершено. --------------------------------------------------- - -Процедуру установки APT выполняет в несколько этапов: сначала он ищет -запрошенный пакет в списках доступных, найдя, рассчитывает, какие пакеты -следует установить, чтобы удовлетворить его зависимости, после чего получает -файлы всех нужных пакетов (в данном случае APT нашёл нужные пакеты на диске -CD-ROM), и запускает установщик пакетов последовательно для установки всего -необходимого. Аналогично, чтобы удалить пакет, достаточно выполнить команду -`apt-get remove имя_пакета`. - -Кроме APT, есть ещё несколько менеджеров пакетов. Большинство из них -специфичны для определённого дистрибутива, как, например, `emerge` для Gentoo -или `yast` для SUSE. Их задачи и возможности примерно совпадают с APT. - -==== Контроль целостности ==== - -Поскольку менеджер пакетов умеет строить цепочки зависимостей пакетов друг от -друга, с его помощью всегда можно определить, все ли зависимости -удовлетворены у пакетов, установленных в системе. Система, в которой нет -пакетов с неудовлетворёнными зависимостями, называется _целостной_. Если -целостность нарушена, это означает, что часть установленного в системе -программного обеспечения попросту неработоспособна или работает некорректно. - -Целостность системы может нарушиться в момент каких-то изменений в её -составе: при установке, удалении или обновлении части пакетов или всей -системы. Если для всех этих операций использовать менеджер пакетов, то -целостность системы не должна нарушиться. Хотя иногда даже менеджеру пакетов -бывает сложно найти правильное решение, чтобы удовлетворить все зависимости и -устранить конфликты. - -При наличии менеджера пакетов механизм зависимостей можно обернуть и на -пользу человеку. Так, можно создать пакет, в котором есть только зависимости -и нет никаких ресурсов -- такой пакет называется _виртуальным_. Это бывает -полезно в том случае, когда нужно упростить пользователю установку полной -среды для выполнения какой-либо задачи. Необходимые для этого пакеты могут -напрямую не зависеть друг от друга, но чтобы установить их все за один шаг, -пользователю будет достаточно установить один -- виртуальный -- пакет. Таким -виртуальным пакетом оказался сам пакет `python` в примере, и ещё один -- -`python-strict`: - --------------------------------------------------- -[root@localhost shogun]# rpm -ql python - (не содержит файлов) -[root@localhost shogun]# rpm -ql python-strict - (не содержит файлов) --------------------------------------------------- - -Именно поэтому `apt` «получил» 15 пакетов (включая два виртуальных), а -«совершил изменения» только для 13-ти. - -[[delivery]] -==== Доставка ==== - -Важная задача, которую не решает установщик пакетов -- доставка файла пакета в -систему для последующей установки. Архивы пакетов обычно не хранятся в самой -системе: они слишком велики (тысячи пакетов) и должны регулярно обновляться -(выход обновлений программ, т. е. новых версий пакетов). Поэтому для -установки обычно требуется сначала скопировать необходимые файлы с того -носителя, где они хранятся (это либо установочные диски дистрибутива, либо -хранилища в сети Internet). - -Чтобы APT мог работать с пакетами, они должны содержаться в организованном по -специальным правилам хранилище -- _репозитории_. Список доступных APT -репозиториев хранится в файле `/etc/apt/sources.list`, для каждого репозитория -указан способ доступа (например, `cdrom:`, `ftp:`, `file:` и др.) и адрес. - --------------------------------------------------- -rpm cdrom:[SomeLinux CD]/ RPM contrib main -rpm [sme] ftp://updates.somelinux.com 2.4/i586 updates --------------------------------------------------- - -После каждого изменения файла `/etc/apt/sources.list` нужно обновлять кеш APT, -в котором хранятся сведения о доступных пакетах, командой `apt-get update`. Для -того, чтобы добавить в кеш информацию о пакетах, доступных на CD, следует -использовать команду `apt-cdrom add`, а не редактировать `sources.list` вручную. - -APT позволяет и просто доставить пакет в систему, не устанавливая его. Так, -например, всегда происходит с _исходными пакетами_, которые просто копируются -из репозитория в определённый каталог системы по команде `apt-get source -имя_пакета`. - -==== Обновление ==== - -Программное обеспечение в мире Linux (и не только) постоянно обновляется: -исправляются ошибки, расширяются возможности. Разработчики каждого -дистрибутива по мере выхода новых версий программ готовят новые версии -соответствующих пакетов и делают их доступными в своём _репозитории_ -(репозитории, отражающие наиболее современное состояние программного -обеспечения, доступны через Internet). Пользователю имеет смысл не отставать -от обновлений программного обеспечения, потому что новые версии программ -- -это и большая надёжность работы системы, и новые возможности. - -Менеджеры пакетов позволяют делать _комплексные обновления_ всей системы. В APT -эту процедуру можно выполнить одной командой: `apt-get dist-upgrade`. Эта -процедура сначала исследует содержимое всех доступных репозиториев и находит -там все пакеты более поздних версий, чем соответствующие пакеты, -установленные в системе. После этого вычисляется объём обновления: должна -быть удалена связанная область зависящих друг от друга устаревших пакетов и -заменена соответствующей областью более новых версий. Сложные ситуации могут -возникать в том случае, если изменилось распределение ресурсов по пакетам: -пакеты были разделены или объединены -- здесь может потребоваться ручное -вмешательство пользователя. Тот род обновлений системы, который нужно делать -регулярно и обязательно -- это обновления, связанные с безопасностью (security -updates). Когда в программе обнаруживают и исправляют серьёзные ошибки, -угрожающие безопасности всей системы, разработчики дистрибутивов обычно -заботятся о том, чтобы соответствующие обновления достигли пользователя. -Обычно присутствует отдельный репозиторий с обновлениями, существенными для -безопасности. - -==== Цена удобства ==== - -Удобство менеджеров пакетов оплачивается тем, что они могут успешно работать -только со специальными целостными областями источников (_репозиториями -пактов_). Хотя для большинства пользователей это ограничение не так -существенно: те дистрибутивы, в которых используются менеджеры пакетов, -обычно имеют огромные репозитории пакетов, где можно найти любое мыслимое и -немыслимое программное обеспечение. Если же нужной программы всё-таки нет в -официальном репозитории дистрибутива, обычно находятся «частные» репозитории, -доступные по сети Internet, включающие не вошедшие в официальный репозиторий -пакеты. - -Если всё-таки нужный вам пакет нигде не найти собранным именно для вашего -дистрибутива, можно установить и сторонний пакет, но это может быть выполнено -только при помощи установщика пакетов, менеджер пакетов в этой ситуации будет -бесполезен. Можно установить программу и самостоятельно скомпилировав её из -исходных кодов, однако здесь стоит иметь в виду следующее. - -Автор программы совершенно не обязан учитывать в ней все тонкости всех -дистрибутивов, поэтому возможны, с одной стороны, прямые конфликты с файлами -в системе (которые никто уже не отследит), а с другой стороны -- конфликты и -противоречия скрытые (например, программа устанавливается в подкаталог -каталога `/usr/local`, и ожидает, что все остальные программы тоже находятся в -этом каталоге). Это значит, что придётся самостоятельно разобраться и с тем, -как и с какими параметрами компилировать программу, как устанавливать её в -систему, и как избежать при этом конфликтов. А если так, если вы и в самом -деле в состоянии правильно собрать и установить в систему нужную вам, а -значит и ещё кому-нибудь, программу, которой пока нет в дистрибутиве, то -самое правильное -- сделать из неё пакет, по крайней мере _исходный пакет_, а -если получится, то и _двоичный_. Это здорово облегчит жизнь и вам, когда вы -будете компилировать и устанавливать эту программу ещё раз (на другом -компьютере или обновляя версию самой программы), и, главное, всему сообществу -пользователей вашего дистрибутива! - -Наконец, во многие современные дистрибутивы включаются средства, помогающие -сборке двоичных пакетов. Такие средства (например, пакет `hasher` из ALT Linux) -позволяют не только скомпилировать программу в «универсальной среде», -содержащей лишь заданный набор пакетов, но и автоматически выстраивают -зависимости, проверяют правильность установки, отслеживают конфликты. Короче -говоря, собрав пакет с помощью такого средства, вы можете серьёзно -претендовать на роль сопровождающего этот пакет в дистрибутиве. Напротив, -скомпилировав программу втихомолку, с помощью шаманства и ручной работы, вы -проявите себя как лентяй и эгоист, которому нет дела до роста и улучшения -собственной операционной системы. - -[[network]] -== Сеть TCP/IP в Linux == - -=== Сетевые протоколы. Семейство протоколов TCP/IP === - -Так случилось, что Мефодий мало что знал о компьютерных сетях до знакомства -с Linux. Если пользоваться только www-браузером и почтовой программой, -сведений, вроде «у каждого компьютера Internet есть имя, на компьютерах -бывает почта и WWW», бывает вполне достаточно. Строго говоря, если сеть -настроена, почтовые клиенты или браузеры Linux не требуют большего объёма -знаний. Однако Linux хорош именно тем, что позволяет проследить работу сети -от процедур самого низкого уровня, вроде поведения сетевых карт, до -приложений высокого уровня и их протоколов. - -В разговоре о сетях передачи данных понятие «уровень» возникает неспроста. -Дело в том, что передача данных между компьютерами -- сложный процесс, в -котором решается сразу несколько разноплановых задач. Если представить себе -весь процесс организации сети «на пустом месте», как если бы никаких сетевых -разработок доныне не было, все эти задачи встают одна за другой, по мере -решения предыдущей. - -Итак, если бы Мефодий получил задание «придумать Internet» на пару с -Гуревичем, какие бы вопросы перед ними встали? - -. Среда передачи данных. Посредством чего передавать данные? Как именно -представляется передаваемая информация? -. Устройство передачи данных. (Раз уж известно, как передаются данные). -Как подключаться к среде? Как отличить данные от не-данных (т. е. определить -идёт ли передача)? Как определить очерёдность работы нескольких устройств, -подключённых к одной среде передачи данных? Как определить, кому -предназначаются данные, передаваемые в общей среде? -. Топология неоднородной сети. (Раз уж известно, как подключить компьютер к -одной или нескольким средам передачи данных). Если в сеть объединены несколько -сред передачи данных, как определить адресата (и отправителя тоже)? Как -обеспечить пересылку данных из одной среды в другую? Как выстроить непрерывный -маршрут пересылок от отправителя к адресату. -. Доставка данных. (Раз уж есть механизм передачи данных от любого абонента -сети к любому). Как обеспечить целостность и надёжность передачи данных (и -нужно ли)? Как управлять самим каналом передачи данных (например, чтобы не -отправлять данных больше, чем принимающая сторона в состоянии принять)? Как -разделять несколько каналов передачи данных (например, когда от одного -компьютера к другому одновременно передаются два файла)? -. Интерпретация данных. (Раз уж возможна надёжная и без искажений доставка). -Что делать с полученными данными? Какие части операционной системы отвечают -за их обработку, и откуда про это знает абонент с другой стороны соединения? - -Ответы на эти вопросы в формализованном виде носят название _протоколов_: в них -пунктуально описывается, как именно предлагается решать ту или иную задачу, -какая для этого потребна дополнительная информация, какова должна быть логика -поведения передающей и принимающей стороны и т. п. - -В приведённом делении на этапы (уровни) примечательна их относительная -независимость: если группа задач, связанная с некоторым уровнем, решена, на -следующем уровне можно забыть, как именно решались эти задачи. Так, -устройство передачи данных типа «Internet» с точки зрения компьютера всегда -одно и то же, какой бы носитель при этом не использовался: коаксиальный -кабель или кабель типа «витая пара», хотя с физической и даже топологической -точки зрения эти среды сильно различаются footnote:[Ethernet с коаксиальным -кабелем имеет топологию «общая шина»: все абоненты подключаются к единому -кабелю, «врезая» в него Т-образный отводок; ethernet с витой парой имеет -топологию «звезда»: от каждого абонента идёт _собственный кабель_ к -центральному устройству-концентратору.]. Точно так же обстоят дела при -переходе со второго уровня на третий: во время получения данных уже -совершенно неважно, какие среды передачи были при этом задействованы -(Internet, три провода, голубиная почта footnote:[Организация TCP/IP с -помощью почтовых голубей описана в RFC1149.]...). Переход с третьего уровня -на четвёртый и с четвёртого на пятый тоже обладает этим свойством. - -По всей видимости, именно с этими задачами сталкивались и разработчики из -института ARPA (Advanced Research Projects Agency, «Агенство Перспективных -Исследовательских Проектов»; в процессе работы оно было переименовано в -DARPA, где «D» означало Defence). По крайней мере, предложенное ими в -середине семидесятых _семейство протоколов_ TCP/IP также подразделялось на -пять уровней: аппаратный, интерфейсный, сетевой, транспортный и прикладной. -Впоследствии аппаратный уровень стали смешивать с интерфейсным, так как с -точки зрения операционной системы они неразличимы footnote:[Поэтому, если в -книге написано, что TPC/IP имеет четыре уровня, это тоже будет правдой -- с -учётом двойственности самого нижнего.]. Именно разделение на независимые друг -от друга уровни позволило со временем объединить большинство разнородных -локальных сетей в единое сетевое пространство -- глобальную сеть Internet. - -В TCP/IP вопрос о том, как обеспечить нескольким абонентам сети возможность -передавать данные, не мешая друг другу, решён с помощью _разделения пакетов_ -данных. Разделение пакетов предполагает, что данные передаются не единым -блоком, а по частям, _пакетами_. Алгоритмы, определяющие, когда абоненту -разрешено посылать следующий пакет, могут быть разными, но результат всегда -один: в сети передаются попеременно фрагменты всех сеансов передачи данных. В -сильно загруженном состоянии такая сеть может просто не принять очередной -пакет от абонента-отправителя, и тому придётся ждать удобного случая, чтобы -всё-таки «пропихнуть» его в переполненную другими пакетами среду. Таким -образом, обеспечить гарантированное время передачи одного пакета в сетях с -разделением пакетов бывает довольно сложно, хотя есть алгоритмы, позволяющие -это сделать. - -Противоположность метода разделения пакетов -- метод _разделения каналов_, -который предполагает, что в сети имеется определённое число каналов передачи -данных, которые абоненты сети арендуют на всё время передачи. По такому -принципу построены, например, телефонные линии: дозвонившись, мы арендуем -канал связи между двумя телефонными аппаратами, и до тех пор, пока этот канал -занят, невозможно ни воспользоваться им кому-то другому, ни организовать -параллельно передачу данных откуда-нибудь ещё. Главное достоинство сетей с -разделением каналов -- постоянная (за вычетом помех на линии) скорость -передачи данных. Главный недостаток -- ограниченное количество каналов -передачи. Проектировать среду передачи так, чтобы каждый абонент был связан с -каждым отдельным каналом, имеет смысл только когда абонентов очень мало: -количество каналов будет пропорционально квадрату количества абонентов. -Количество каналов в большой сети будет существенно меньшим, и ровно столько -сеансов передачи данных можно будет в этой сети установить. Попытка -соединиться с абонентом, когда все каналы уже заняты, окончится неудачей. -Мефодий припомнил своего знакомого, дозвониться которому тяжело, хотя телефон -тот занимает нечасто и не подолгу. По всей видимости, каналов между какими-то -двумя АТС, через которые Мефодий связывается с приятелем, хронически -недостаёт (так бывает, когда отдалённый район быстро застраивается и -наполняется телефонами). - -Если вернуться к сети с разделением пакетов, то можно заметить, что на каждом -уровне, под _пакетом_ понимается разное. С точки зрения интерфейсного уровня -пакет -- это ограниченный возможностями среды передачи данных фрагмент, в -котором необходимо дополнительно указать, какое устройство из числа -подключённых к среде передачи данных его отправило, и какому устройству он -предназначен. С точки зрения сетевого уровня размер пакета определяется -удобством его обработки, а дополнительно в нём надо указать уникальные для -всей сети адреса отправителя и получателя (а также тип протокола и многое -другое). С точки зрения уровня транспортного размер пакета определяется -качеством связи (чем меньше пакет, тем ниже вероятность порчи, но тем больше -теряется на дополнительной информации: идентификатор сеанса, тип, специальные -поля, описывающие логику связи и т.п.). Наконец, если на прикладном уровне -определено понятие «пакет», то размер его и содержимое определяются -протоколом прикладного уровня. - -Таким образом, процесс передачи данных выглядит так: порция данных -прикладного уровня нарезается на части, соответствующие размеру пакета -транспортного уровня (фрагментируется), к каждому фрагменту приписывается -транспортная служебная информация, получаются пакеты транспортного уровня. -Каждый пакет транспортного уровня может быть опять-таки фрагментирован для -передачи по сети, к каждому получившемуся фрагменту добавляется служебная -информация сетевого уровня, что даёт последовательность сетевых пакетов. -Каждый сетевой пакет тоже может быть фрагментирован до размера, -«пролезающего» через конкретное сетевое устройство, из него формируются -пакеты интерфейсного уровня (фреймы). Наконец, к каждому фрейму само -устройство (по крайне мере, так это сделано в Internet) приписывает некоторый -ключ, по которому принимающее устройство распознаёт начало фрейма. В таком -виде данные передадутся по проводам. Процесс «заворачивания» пакетов более -высокого уровня в пакеты более низкого уровня называется _инкапсуляцией_. - -Компьютер, получивший фрейм, выполняет процедуры, обратные инкапсуляции и -фрагментации: пакеты низкого уровня освобождаются от служебной информации и -накапливаются до тех пор, пока не сформируется пакет более высокого уровня. -Затем этот пакет отсылается на уровень выше и всё повторяется до тех пор, -пока освобождённые от всей дополнительной информации и заново собранные -воедино данные не попадут к пользователю (или к программе, которая их -обрабатывает). - -============================================================= -Сетевой пакет:: - единица передачи информации в компьютерной сети. Помимо передаваемых - данных содержит служебную информацию, в частности, идентификаторы - отправителя и адресата, контрольную сумму, поля используемого протокола. - Наибольший размер пакета определяется чаще всего не объёмом передаваемых - данных, а требованиями протокола и необходимостью разделять сеть передачи - данных между несколькими абонентами. -============================================================= - -=== Аппаратный и интерфейсный уровни === - -Итак, на аппаратном уровне возможна какая угодно среда передачи данных, с -точки зрения Linux сеть начинается в месте подключения к этой среде, то есть -на _сетевом интерфейсе_. Список сетевых интерфейсов и их настроек в системе -можно посмотреть с помощью команды `ifconfig` (от interface configuration): - ---------------------------------------------------------- -methody@localhost:~ $ ifconfig - -bash: ifconfig: command not found -methody@localhost:~ $ /sbin/ifconfig - Warning: cannot open /proc/net/dev (Permission denied). Limited output. - Warning: cannot open /proc/net/dev (Permission denied). Limited output. - eth0 Link encap:Internet HWaddr 00:0C:29:56:C1:36 - inet addr:192.168.102.125 Bcast:192.168.102.255 Mask:255.255.255.0 - UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1 - - Warning: cannot open /proc/net/dev (Permission denied). Limited output. - lo Link encap:Local Loopback - inet addr:127.0.0.1 Mask:255.0.0.0 - UP LOOPBACK RUNNING MTU:16436 Metric:1 ---------------------------------------------------------- - -Утилитой `ifconfig` пользуется, в основном, сама система или администратор; -некоторые данные `ifconfig` получает, обращаясь с системным вызовом `ioctl()` к -открытому сетевому сокету, а некоторые считывает из `/proc`. Название сетевого -интерфейса состоит из его типа и порядкового номера (каким по счёту его -распознало ядро). Все сетевые интерфейсы Internet в Linux называются -ethномер, начиная с `eth0`. Параметр `MTU` (Maximum Transfer Unit) определяет -наибольший размер фрейма. Большинство других параметров относятся к сетевому -уровню, но как минимум ещё один -- `HWaddr` -- относится к уровню интерфейсному. - -============================================================ -Сетевой интерфейс:: - точка взаимодействия утилит Linux с реализацией TCP/IP в ядре системы. - Как правило, имеет уникальный сетевой адрес. Интерфейсу может - соответствовать некоторое сетевое оборудование (например, карта Internet), - в этом случае определён также и интерфейсный его адрес. -============================================================ - -`HWaddr` (от HardWare address, аппаратный адрес) -- это уникальный внутри среды -передачи данных идентификатор сетевого устройства. В Internet аппаратный -адрес называется MAC-address (от Media Access Control, управление доступом к -среде), и состоит из шести байтов, которые принято записывать в -шестнадцатеричной системе счисления и разделять двоеточиями. Каждая -Internet-карта имеет собственный уникальный MAC-address (в примере -- -`00:0C:29:56:C1:36`), поэтому его легко использовать для определения -отправителя и получателя в рамках одной Internet-среды. Если идентификатор -получателя неизвестен, используется аппаратный _широковещательный адрес_, -`FF:FF:FF:FF:FF:FF`. Сетевая карта, получив широковещательный фрейм или фрейм, -MAC-адрес получателя в котором совпадает с её MAC-адресом, обязана отправить -его на обработку системе. - -Термин «Media Access Control» имеет отношение к алгоритму, с помощью которого -решается задача очерёдности передачи. Алгоритм базируется на трёх принципах: - -. Прослушивание среды. Каждое устройство умеет определять, идёт ли в данное -время передача данных по среде. Если среда свободна, значит устройство имеет -право само передавать данные. . Обнаружение коллизий. Если решение о начале -передаче данных одновременно приняли несколько устройств, в среде возникнет -_коллизия_, и распознать, где чьи были данные, становится невозможно. Зато -устройства всегда замечают произошедшую коллизию, и передают данные -повторно. . Случайное время ожидания перед повтором. Если бы после коллизии -все устройства начали одновременно повторять передачу данных, случилась бы -новая коллизия. Поэтому каждое устройство выжидает некоторое случайное время, -и только после этого повторяет передачу. Если повторная коллизия всё-таки -возникает, устройство ждёт вдвое дольше footnote:[Время ожидания не -удваивается а выбирается, опять-таки случайно, но из другого временного -диапазона.], и т. д. до тех пор, пока не превысится допустимое время -ожидания, после чего системе сообщается об ошибке. - -Приведённый алгоритм обладает двумя недостатками. Во-первых, уже на -интерфейсном уровне время передачи одного пакета может быть любым, так как -неопределённое промедление с передачей предусмотрено протоколом. Во-вторых, -сеть Internet считается хорошо загруженной, если на протяжении некоторого -промежутка времени в среднем треть этого времени была потрачена на передачу -данных, а две трети времени среда была свободна. Сеть Internet, нагруженная -наполовину, работает очень медленно и с большим числом коллизий, а сеть, -нагруженная на две трети, считается неработающей. Это -- плата за отсутствие -синхронизации работы всех устройств в сети. - -=== Сетевой уровень === - -Создатели первых сетей, объединяющих несколько сред передачи данных, для -идентификации абонента таких сетей пытались использовать те же аппаратные -адреса. Это оказалось делом неблагодарным: если в Internet аппаратный адрес -уникален всегда, то в других сетях аппаратные адреса могут быть уникальны -только в рамках одной среды (например, все устройства нумеруются, начиная с -0) или даже выдаваться динамически, да и форматы аппаратных адресов в разных -средах различны. Возникла необходимость присвоить каждому сетевому интерфейсу -некоторый единственный на всю глобальную сеть адрес, который бы не зависел от -среды передачи данных и всегда имел один и тот же формат. - -==== Адресация ==== - -Адрес, определяемый протоколом IP (Internetwork Protocol), состоит из четырёх -байтов, записываемых традиционно в десятичной системе счисления и разделяемых -точкой. Адрес сетевого интерфейса `eth0` из примера -- `192.168.102.125`. Второй -сетевой интерфейс из примера, `lo`, -- так называемая _заглушка_ (loopback), -которая используется для организации сетевых взаимодействий компьютера с -самим собой: любой посланный в заглушку пакет немедленно обрабатывается как -принятый оттуда. Заглушка обычно имеет адрес `127.0.0.1`. - -Отдельная среда передачи данных (локальная сеть) также имеет собственный -адрес. Если представить IP-адрес в виде линейки из 32 битов, она строго -разделяется на две части: столько-то битов слева отводится под _адрес сети_, -а оставшиеся -- под _адрес абонента_ в этой сети. Для того, чтобы определить -размер адреса сети, используется _сетевая маска_ -- линейка из 32 битов, в -которой на месте адреса сети стоят единицы, а на месте адреса компьютера -- -нули. При наложении маски на IP-адрес все единицы в нём, которым -соответствуют нули в маске, превращаются в нули footnote:[Применяется -побитовая операция «И»]. Таким образом вычисляется IP-адрес сети. В примере -сетевая маска интерфейса `eth0` равна `255.255.255.0`, т. е. 24 единицы и 8 -нулей. Тогда IP-адрес сети будет равен `192.168.102.0`. Мефодий заметил, что -если сетевая маска выровнена по границе байта, производить двоичные операции -вообще не надо: так, в примере можно было просто сказать, что адрес сети -занимает три байта, а адрес абонента -- оставшийся один. - -Заметим, что адрес сети может содержать значащие нули: например, в адресе -`10.0.0.1` при сетевой маске `255.255.0.0` адрес сети занимает два байта. из -которых второй -- полностью нулевой. Для того, чтобы не гадать, какие нули -- -значащие, а какие -- отрезаны маской, к адресу сети принято приписывать -уточнение вида /количество_единиц_в_маске. В приведённом случае адрес сети -выглядел бы так: `10.0.0.0/16`, а в предыдущем -- `192.168.102.0/24`. - -IP-адрес, составленный из адреса сети, за которым следуют все единицы (в -примере -- `192.168.102.255`), называется _широковещательным адресом_: любой -принадлежащий сети `192.168.102.0` компьютер, получивший IP-пакет с адресом -получателя `192.168.102.255`, должен обработать его, как если бы в поле -«получатель» стоял его собственный IP-адрес. - -Когда компьютер с некоторым IP-адресом решает отправить пакет другому -компьютеру, он выясняет, принадлежит ли адресат той же локальной сети, что и -отправитель (т. е. подключены ли они к одной среде передачи данных). Делается -это так: на IP-адрес получателя накладывается сетевая маска, и таким образом -вычисляется адрес сети, которой принадлежит получатель. Если этот адрес -совпадает с адресом сети отправителя, значит, оба находятся в одной локальной -сети. Это, в свою очередь, означает, что аппаратный адрес (MAC) получателя -должен быть отправителю известен. - -MAC-адреса компьютеров локальной сети хранятся в специальной таблице ядра, -называемой «таблица ARP». Просмотреть содержимое этой таблицы можно с помощью -команды `arp -a`: - ---------------------------------------------------------- -[root@localhost root]# arp -a - fuji.nipponman.ru (192.168.102.1) at 00:50:56:C0:00:01 [ether] on eth0 - edoh.nipponman.ru (192.168.102.7) at 00:50:56:C3:11:a2 [ether] on eth0 -[root@localhost root]# sleep 60 -[root@localhost root]# arp -a -[root@localhost root]# ping -c1 192.168.102.1 - PING 192.168.102.1 (192.168.102.1) 56(84) bytes of data. - 64 bytes from 192.168.102.1: icmp_seq=1 ttl=64 time=0.217 ms - - --- 192.168.102.1 ping statistics --- - 1 packets transmitted, 1 received, 0% packet loss, time 0ms - rtt min/avg/max/mdev = 0.217/0.217/0.217/0.000 ms -[root@localhost root]# arp -a - fuji.nipponman.ru (192.168.102.1) at 00:50:56:C0:00:01 [ether] on eth0 ---------------------------------------------------------- - -Более точно, ARP-таблица отражает соответствие между IP- и MAC-адресами. -Таблица эта динамическая: устаревшие соответствия из неё удаляются, так как -компьютеру может быть назначен другой IP-адрес, интерфейс можно отключить от -сети, заменить и т. д. Если вновь понадобится связаться с компьютером, чей -MAC-адрес устрел, соответствие IP и MAC придётся устанавливать по новой. В -примере была использована команда ping, посылающая на указанный IP-адрес -пакеты служебного протокола ICMP, на который адресат обязан ответить. Если -ответа нет, значит, связь по каким-то причинам невозможна. - -Устанавливать соответствие между адресами сетевого и интерфейсного уровня -- -дело протокола ARP (Address Resolution Protocol, «протокол преобразования -адресов»). В случае преобразования IP в MAC он работает так: отправляется -широковещательный Internet-фрейм типа «ARP-запрос», внутри которого -- -IP-адрес, что означает «Эй! У кого такой IP?». Каждый работающий компьютер -обрабатывает этот фрейм и тот, чей IP-адрес совпадает с запрошенным, -возвращает отправителю пустой фрейм типа «ARP-ответ», в поле «отправитель» -которого указан искомый MAC-адрес. Это означает «У меня. А что?». Тут -ARP-таблица заполняется и первый компьютер готов к инкапсуляции IP-пакета. - -==== Маршрутизация ==== - -Более сложный вопрос встаёт, если IP-адрес компьютера-адресата не входит в -локальную сеть компьютера-отправителя. Ведь и в этом случае пакет необходимо -отослать какому-то абоненту локальной сети, с тем, чтобы тот перенаправил его -дальше. Этот абонент, _маршрутизатор_, подключён к нескольким сетям, и ему -вменяется в обязанность пересылать пакеты между ними по определённым -правилам. В самом простом случае таких сетей две: «внутренняя», к которой -подключены компьютеры, и «внешняя», соединяющая маршрутизатор со всей -глобальной сетью. Таблицу, управляющую маршрутизацией пакетов, можно -просмотреть с помощью команды `netstat -r` или `route` (обе команды имеют ключ -`-n`, заставляющий их использовать в выдаче IP-адреса, а не имена -компьютеров): - ---------------------------------------------------------- -[root@localhost root]# route -n - Kernel IP routing table - Destination Gateway Genmask Flags Metric Ref Use Iface - 192.168.102.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 - 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo - 0.0.0.0 192.168.102.1 0.0.0.0 UG 0 0 0 eth0 ---------------------------------------------------------- - -На машине Мефодия в таблице маршрутизации всего три записи: одна -- про сеть -`192.168.102.0/24`, доступную по интерфейсу eth0, другая -- про сеть -`127.0.0.0/8`, доступную через заглушку, и последняя -- про сеть `0.0.0.0/0`, -доступную через маршрутизатор (gateway) с адресом `192.168.102.1`. Сеть -`0.0.0.0/0` -- это и есть «весь Internet», потому что ей принадлежат любые -IP-адреса (ни одного бита на сетевую маску), такая запись в таблице называется -_маршрут по умолчанию_. Если маршрут по умолчанию не задан, попытка связаться с -удалённым компьютером может окончиться ошибкой `No route to host`: система не -сможет определить, кому пересылать пакет. - -На _маршрутизаторе_ таблица выглядит посложнее: - ---------------------------------------------------------- -[root@fuji root]# route -n - Kernel IP routing table - Destination Gateway Genmask Flags Metric Ref Use Iface - 83.237.29.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0 - 192.168.102.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 - 10.13.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 - 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo - 0.0.0.0 83.237.29.1 0.0.0.0 UG 0 0 0 ppp0 -[root@fuji root]# ifconfig ppp0 - ppp0 Link encap:Point-to-Point Protocol - inet addr:83.237.29.51 P-t-P:83.237.29.1 Mask:255.255.255.255 - UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1492 Metric:1 - RX packets:17104 errors:0 dropped:0 overruns:0 frame:0 - TX packets:23839 errors:0 dropped:0 overruns:0 carrier:0 - collisions:0 txqueuelen:3 - RX bytes:5879278 (5.6 Mb) TX bytes:1750644 (1.6 Mb) ---------------------------------------------------------- - -Начать с того, что вдобавок к сетевым интерфейсам `eth0` и `eth1` тут -наличествует интерфейс типа «точка-точка», `ppp0`. Это виртуальный интерфейс: -он не соответствует никакому сетевому устройству, а организуется по -инициативе службы `pppd`, работающего в соответствии с протоколом PPP (Point -to Point Protocol). PPP-соединение позволяет организовать «сеть», состоящую -всего из двух абонентов, связанных любой средой передачи данных: двумя -модемами и телефоном, тремя проводами, Internet и т. п footnote:[Значение -«MTU: 1492» наводит на мысль о том, что в качестве среды передачи данных был -использован именно ethernet (с MTU 1500), так как ещё восемь байтов отводится -для служебной информации самого PPP.]. - -Получив IP-пакет, система начинает «примерять» его поочерёдно ко всем записям -таблицы маршрутизации, отсортированным в порядке убывания размера сетевой -маски (в том же порядке выдаёт их команда `route`). Если сеть адресата -совпадает с сетью из таблицы, пакет нужно пересылать по адресу, указанному в -поле `Gateway`. Этот адрес используется вместо поля адресата и поиск -возобновляется с начала таблицы. Если поле `Gateway` -- нулевое, значит, речь -идёт об абоненте локальной сети, и пакет надо передать на уровень ниже (`eth` -при этом может обновить ARP-таблицу, `ppp` -- действовать как-то ещё). Если ни -одна сеть не подходит, выдаётся сообщение об ошибке. В примере все пакеты, не -предназначенные сетям `192.168.102.0/24`, `10.13.0.0/15` и `127.0.0.0/8`, -отправляются на _маршрутизатор по умолчанию_ с адресом `83.237.29.1`. Первая же -запись рассказывает, как добраться до этого маршрутизатора (точнее, до сети -`83.237.29.1/32`, что эквивалентно единственному абоненту 83.237.29.1). - -Относительно IP-адресов на маршрутизаторе Гуревич как-то заметил, что только -один из них -- `83.237.29.1` -- «настоящий». Он имел в виду стандарт `RFC1918`, -описывающий, какие диапазоны IP-адресов можно использовать в любой внутренней -сети. Задача системного администратора -- сделать так, чтобы при работе с -сетью Internet ни в одном пакете не стояло такого внутреннего адреса -отправителя: например, подменять внутренние адреса на единственный внешний -(«настоящий»). Задача эта решается с помощью межсетевого экрана (firewall), -который в Linux называется `iptables`, но когда Мефодий попросил Гуревича -рассказать поподробнее, тот только рукой махнул: надо хорошо знать TCP/IP. - -==== Служебный протокол ICMP ==== - -Есть такие протоколы уровня IP, действие которых этим уровнем и -ограничиваются. Например, служебный протокол ICMP (Internet Control Message -Protocol), предназначенный для передачи служебных сообщений. С одним примером -применения ICMP Мефодий уже знаком: это утилита `ping`. Другое применение ICMP --- сообщать отправителю, почему его пакет невозможно доставить адресату, или -передавать информацию об изменении маршрута, о возможности фрагментации и т. -п. Протоколом ICMP пользуется утилита `traceroute`, позволяющая приблизительно -определять маршрут следования пакета (ключ `-n`, как и в команде `route`, -означает, что преобразовывать IP-адреса в доменные имена не надо): - ---------------------------------------------------------- -[root@localhost root]# traceroute www.ru -n - traceroute to www.ru (194.87.0.50), 30 hops max, 38 byte packets - 1 192.168.102.1 0.223 ms 0.089 ms 0.105 ms - 2 83.237.29.1 25.599 ms 21.390 ms 21.812 ms - 3 195.34.53.53 24.111 ms 21.213 ms 25.778 ms - 4 195.34.53.53 23.614 ms 33.172 ms 22.238 ms - 5 195.34.53.10 43.552 ms 48.731 ms 44.402 ms - 6 195.34.53.81 26.805 ms 21.307 ms 22.138 ms - 7 213.248.67.93 41.737 ms 41.565 ms 42.265 ms - 8 213.248.66.9 50.239 ms 47.081 ms 64.781 ms - 9 213.248.65.42 99.002 ms 81.968 ms 62.771 ms - 10 213.248.78.170 62.768 ms 63.751 ms 78.959 ms - 11 194.87.0.66 101.865 ms 88.289 ms 66.340 ms - 12 194.87.0.50 70.881 ms 67.340 ms 63.791 ms ---------------------------------------------------------- - -Утилита `traceroute` показывает список абонентов, через которых проходит пакет -по пути к адресату, и потраченное на это время. Однако список этот -приблизительный. Дело в том, что первому пакету (точнее, первым трём, так как -по умолчанию `traceroute` шлёт пакеты по три) в специальное поле TTL (Time To -Live, время жизни) выставляется значение «1». Каждый маршрутизатор должен -уменьшать это значение на 1, и если оно обнулилось, передавать отправителю -ICMP-пакет о том, что время жизни закончилось, а адресат так и не найден. Так -что на первую серию пакетов отреагирует первый же маршрутизатор, и `traceroute` -выдаст первую строку маршрута. Второй пакет посылается с TTL=2, и, если за -две пересылки адресат не достигнут, об этом рапортует второй маршрутизатор. -Процесс продолжается до тех пор, пока очередной пакет не «доживёт» до места -назначения. Строго говоря, неизвестно, каким маршрутом шла очередная группа -пакетов, потому что с тех пор, как посылалась предыдущая группа, какой-нибудь -из промежуточных маршрутизаторов мог передумать и послать новые пакеты другим -путём. - -=== Транспортный уровень === - -Транспортных протоколов в TCP/IP два -- это TCP (Transmission Control -Protocol, протокол управления соединением) и UDP (User Datagram Protocol). -UDP устроен просто. Пользовательские данные помещаются в единственный -транспортный пакет-датаграмму, которой приписываются обычные для -транспортного уровня данные: адреса и _порты_ отправителя и получателя, после -чего пакет уходит в сеть искать адресата. Проверять, был ли адресат способен -этот пакет принять, дошёл ли пакет до него и не испортился ли по дороге, -предоставляется следующему -- прикладному -- уровню. - -Иное дело -- TCP. Этот протокол очень заботится о том, чтобы передаваемые -данные дошли до адресата в целости и сохранности. Для этого предпринимаются -следующие действия: - -Устанавливается соединение:: - Перед тем, как начать передавать данные, TCP проверяет, способен ли адресат - их принимать. Если адресат отвечает согласием на открытие соединения, - устанавливается двусторонняя связь между ним и отправителем. Помимо - адресов отправителя и адресата и номеров _порта_ на отправителе и адресате, - в TCP-соединении участвуют два _номера последовательности_ (SEQuential - Number, SEQN), с помощью которых каждая сторона проверяет, не потерялись - ли пакеты по пути, не перепутались ли. -Обрабатываются подтверждения:: - Двусторонняя связь нужна ещё и потому, что на каждый TCP-пакет с любой - стороны требуется подтверждение того, что этот пакет принят. Упрощённо - можно представить дело так, что отправитель и адресат по очереди - обмениваются пакетами, каждый из которых содержит подтверждение только - что принятого, и, возможно, полезные данные. Если происходит какая-то - ошибка, она возвращается вместо подтверждения и отправитель обрабатывает - её (например, посылает пакет ещё раз). -Отслеживаются состояния абонентов:: - С первым же подтверждением каждый из абонентов передаёт размер т. н. - _скользящего окна_ (sliding window). Этот размер показывает, сколько ещё - данных готов принять адресат. Отправитель посылает сразу несколько - пакетов суммарным размером с это окно, а после ждёт подтверждения об - их принятии. Когда приходит подтверждение первого из пакетов в окне, - окно «скользит» вперёд: теперь оно начинается со второго пакета, и в - него попадает один или несколько ещё не посланных пакетов. Если адресат - может принять больше данных, он сообщает о большем размере окна, а если - данные перерабатываться не успевают -- о меньшем. - -Кажется, что TCP -- протокол по всем статьям удобнее UDP. Однако в случаях, -когда пользовательские данные всегда помещаются в один пакет, зато самих -пакетов идёт очень много, посылать всего одну датаграмму намного выгоднее, -чем всякий раз устанавливать соединение, пересылать данные и закрывать -соединение (что как минимум требует по три пакета в каждую сторону). Очень -трудно использовать TCP для широковещательных передач, когда число -абонентов-адресатов весьма велико или вовсе неизвестно. Посмотреть параметры -всех передаваемых через сетевой интерфейс пакетов можно с помощью команды -tcpdump -pi интерфейс, хотя Мефодию не хватило поверхностного знания TCP/IP -для того, чтобы понять выдачу этой команды. - -=== Прикладной уровень === - -Как бы не был надёжен протокол TCP, он не имеет никакого понятия о том, что -же, собственно, за данные с его помощью передаются. Да и не должен: принцип -разделения уровней не позволяет заглядывать «внутрь» передаваемого пакета, и -способов наверняка распознать используемый в нём прикладной протокол нет. -Прикладной уровень, в отличие от транспортного, предусматривает сколько -угодно протоколов передачи данных. Интерпретация данных, в конце концов, дело -уже не ядра, а какой-нибудь программы («приложения», как правило, системной -службы). Для того, чтобы можно было предположить, какой протокол используется -при передаче данных и чтобы система могла передать эти данные соответствующей -программе, ещё на транспортном уровне было введено понятие _порт_. - -==== Клиент-серверная модель ==== - -С точки зрения прикладного уровня, _порт_ -- это идентификатор сервиса, -предоставляемого системой. В самом деле, практически любой акт передачи -данных выглядит, как если бы некий _клиент_, которому эти данные нужны, -запрашивал их у _сервера_, который может их предоставить footnote:[Обратная -ситуация, когда клиент хочет передать что-то серверу, сути дела не меняет: -сервер предоставляет услугу клиенту, на этот раз -- по приёму данных.]. -Отношения между программами, которые связываются по сети друг с другом, почти -всегда ассимметричны: одной что-то надо, у другой это что-то есть. При -установлении соединения и приложение (программа-клиент), и служба -(программа-сервер) используют механизм _сокетов_, описанный в лекции -<>, однако ведут себя по-разному. - -Служба, запускаясь на сервере, создаёт сетевой сокет и прикрепляет его к -определённому порту сервера с помощью системного вызова `bind()`. Затем она -регистрируется в качестве обработчика запросов (listener), приходящих на этот -порт. Служба ждёт запросов, и когда они поступают, предпринимает какие-нибудь -действия, например, считывает пришедшие данные и анализирует их в -соответствии со своим протоколом, отсылает какие-то данные абоненту, -пославшему запрос и т. п. - -Приложение, запускаясь на клиенте, также создаёт сокет и присоединяется с его -помощью к тому же порту на сервере, где запущена служба, используя системный -вызов `connect()`. Затем оно, как и служба, посылает и получает данные. Разницы -между обменом данными по сетевому сокету и по сокету в файловой системе нет. -Очерёдность обмена данными определяется прикладным протоколом. - -Как приложение узнаёт, к какому именно порту необходимо подключиться? За -большинством прикладных протоколов закреплён постоянный номер порта. -Постоянные номера портов и названия соответствующих протоколов хранятся в -файле `/etc/services`: - -------------------------------------------------------- -[root@localhost root]# wc /etc/services - 553 2794 19869 /etc/services -[root@localhost root]# egrep "^(ftp|http|smtp|ssh).*tcp" /etc/services - ftp 21/tcp # File Transfer [Control] - ssh 22/tcp # SSH Remote Login Protocol - smtp 25/tcp mail # Simple Mail Transfer Protocol - http 80/tcp www www-http # World Wide Web HTTP -------------------------------------------------------- - -Этот файл -- не догма, а руководство к действию: каждый может организовать, -допустим, сервис HTTP по 25-му порту. Только как об этом узнают другие -клиенты, и что подумают почтовые программы, ожидая по этому порту встретить -сервис SMTP (пересылка почты)? Вывести список установленных соединений, а -также служб-обработчиков можно командой `netstat`: - -------------------------------------------------------- -[root@localhost root]# netstat -anA inet - Active Internet connections (servers and established) - Proto Recv-Q Send-Q Local Address Foreign Address State - tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN - tcp 0 0 192.168.102.125:22 192.168.102.1:33208 ESTABLISHED - udp 0 0 0.0.0.0:111 0.0.0.0:* -------------------------------------------------------- - -Здесь видно, что на компьютере зарегистрировано два TCP-обработчика (на -портах 111 и 22), один UDP-обработчик по 11-му порту (понятие Listener, то -есть обработчик соединения для UDP не имеет смысла), а также установлено одно -соединение с компьютера `192.168.102.1`, исходящий порт 33208, к 22-му порту -(это порт службы Secure Shell, предоставляющей удалённый терминальный -доступ... видимо, Гуревич работает?). В более сложных случаях, когда номер -порта заранее неизвестен, а известно только название и версия сервиса, -используется служба `portmap`, которая раздаёт незанятые порты службам и -сообщает приложениям, к какому из них надо обратиться. Порт 111 соответствует -именно этой службе. - -==== Обслуживание прикладного уровня в Linux ==== - -Самый простой способ проверить, предоставляет ли некий сервер услуги по -некоему TCP-порту -- это подключиться к нему. Если под рукой нет приложения, -работающего по требуемому протоколу, не беда: подойдёт утилита `telnet`. В -качестве первого параметра следует указать адрес компьютера, к которому нужно -подключиться, а в качестве второго (необязательного) -- номер порта. Когда-то -эта утилита использовалась в качестве клиента к терминальной службе, однако -от неё пришлось отказаться: пароль пользователя передавался по сети -не шифрованным. Но в качестве клиента других служб, многие из которых -используют текстовые протоколы, `telnet` используется и поныне. Если даже -протокол и не текстовый -- не беда: можно выйти в командный режим `telnet`, -нажав `^[`, и подать команду `close`, которая закроет соединение: - -------------------------------------------------------- -[root@localhost root]# telnet 192.168.102.1 112 - Trying 192.168.102.1... - telnet: connect to address 192.168.102.1: Connection refused -[root@localhost root]# telnet 192.168.102.1 111 - Trying 192.168.102.1... - Connected to 192.168.102.1. - Escape character is '^]'. - ^] - telnet> close - Connection closed. -------------------------------------------------------- - -В сценариях вместо интерактивной утилиты `telnet` стоит использовать `netcat`, -которая работает как `cat` в указанный сокет или из него. - -Как уже говорилось, интерпретацией прикладных протоколов занимаются -разнообразные программы. Прикладной протокол можно представить как обмен -сообщениями, часто текстовыми, между клиентом и сервером. Было бы естественно -оформлять такие программы в виде _фильтров_, чтобы пользоваться простейшими -функциями ввода-вывода. Однако механизм сокетов предусматривает асинхронную -передачу данных, для чего используются другие функции. Программа, желающая -обслуживать сетевые соединения по определённому порту, должна удовлетворять -четырём требованиям: - -. Быть _системной службой_, то есть постоянно находиться в памяти; -. Создавать сокет, прикреплять его к порту; -. Регистрироваться как обработчик по этому сокету и принимать соединения -(возможно, придётся обрабатывать несколько соединений одновременно); -. Анализировать прикладной протокол и действовать по результатам анализа. - -Нетрудно заметить, что первые три свойства -- общие для большинства сервисов. -В Linux есть метаслужба `inetd`, которая берёт на себя всю общую сетевую -часть работы, а программам предоставляет разбираться в прикладном протоколе. -Сделать свой сетевой сервис с помощью `inetd` становится очень просто: -пользователь программирует _фильтр_, задача которого -- обмениваться командами -прикладного протокола с помощью стандартного ввода и стандартного вывода. Этот -фильтр регистрируется в настройках `inetd` с указанием порта, с которого -будут приниматься запросы. После чего сам `inted` становится обработчиком -запросов по всем указанным портам, сам открывает соединение, запуская -соответствующий фильтр, а данные из сокета пересылает туда и обратно по двум -_каналам_. При этом фильтр-обработчик даже не должен быть системной службой: -это обычная программа, которая завершается, когда это предусмотрено -прикладным протоколом, или когда закрывается входной поток. - -Мефодий минут за пять написал службу, которая в ответ на подключение передаёт -календарь на текущий месяц. В его системе используется модернизированная -версия `inetd` -- `xinted`, обученная чтению конфигурационных файлов по -схеме `.d`: - -------------------------------------------------------- -[root@localhost root]# grep quake /etc/services - quake 26000/tcp - quake 26000/udp -[root@localhost root]# cat /etc/xinetd.d/calendar - service quake - { - socket_type = stream - protocol = tcp - wait = no - user = nobody - server = /usr/bin/cal - disable = no - } -------------------------------------------------------- - -Вместо номера порта можно использовать название протокола из `/etc/services`. -Мефодий воспользовался портом 26000 (чем мог создать некоторые трудности -поклонникам одной компьютерной игры). Осталось только перезагрузить `xinetd`, -чтобы он нашёл новый конфигурационный файл, и подключиться к 26000 порту: - -------------------------------------------------------- -[root@localhost root]# service xinetd restart - Stopping xinetd service: [ DONE ] - Starting xinetd service: [ DONE ] -[root@localhost root]# telnet localhost quake - Trying 127.0.0.1... - Connected to localhost. - Escape character is '^]'. - December 2004 - Su Mo Tu We Th Fr Sa - 1 2 3 4 - 5 6 7 8 9 10 11 - 12 13 14 15 16 17 18 - 19 20 21 22 23 24 25 - 26 27 28 29 30 31 -------------------------------------------------------- - -=== Служба доменных имён === - -В предыдущих примерах Мефодий использовал ключ «-n» многих сетевых утилит, -чтобы избежать путаницы между IP-адресами и _доменными именами_ компьютеров. С -другой стороны, доменные имена -- несколько слов (часто -осмысленных) -- запоминать гораздо удобнее, чем адреса (четыре каких-то числа). - -Когда-то имена всех компьютеров в сети, соответствующие IP-адресам, хранились -в файле `/etc/hosts`. Пока абоненты Internet были наперечёт, поддерживать -правильность его содержимого не составляло труда. Как только сеть начала -расширяться, неувязок стало больше. Трудность была не только в том, что -содержимое `hosts` быстро менялось, но и в том, что за соответствие имён -адресам в различных сетях отвечали разные люди и разные организации. -появилась необходимость структурировать глобальную сеть не только -топологически (с помощью IP и сетевых масок), но и административно, с -указанием, за какие группы адресов кто отвечает. - -Проще всего было структурировать сами имена компьютеров. Вся сеть была -поделена на _домены_ -- зоны ответственности отдельных государств (`us`, `uk`, -`ru`, `it` и т. п.) или независимые зоны ответственности (`com`, `org`, -`net`, `edu` и т. п.). Для каждого из таких _доменов первого уровня_ должно -присутствовать подразделение, выдающее всем желающим абонентам имена, -заканчивающиеся на `.домен`. Подразделение обязано организовать и -поддерживать службу, заменяющую файл `hosts`: любой желающий имеет право -узнать, какой IP-адрес соответствует имени компьютера в этом домене или -какому доменному имени соответствует определённый IP-адрес. - -Такая служба называется DNS (Domain Name Service, служба доменных имён). Она -имеет иерархическую структуру. Если за какую-то группу абонентов домена -отвечают не хозяева домена, а кто-то другой, ему выделяется _поддомен_ (или -домен второго уровня), и он сам распоряжается именами вида -`имя_компьютера.поддомен.домен`. Например, за компьютеры в домене `. ru`, -принадлежащие корпорации «Dry Bugs» отвечают сотрудники соответствующего -подразделения этой корпорации. Корпорация владеет поддоменом `dbugs.ru`. В -домене `ru` не обязаны знать, какие именно адреса есть в поддомене, но обязаны -предоставить информацию о том, как обратиться к серверу имён поддомена -`dbugs.ru`. Сами сотрудники «Dry Bugs» тоже отвечают только за несколько -собственных компьютеров, а всю ответственность за компьютеры в подразделениях -перекладывают на сетевых администраторов этих подразделений, выделив им -поддомены третьего уровня `pr.dbugs.ru`, `cook.dbugs.ru` и `warehouse.dbugs.ru`. -Таким образом получается нечто вроде распределённой сетевой базы данных, -хранящей короткие записи о соответствии доменных имён IP-адресам. - -============================================================ -Доменное имя:: - имя абонента Internet, имеющее текстовый формат и используемое вместо - IP-адреса. Состоит из собственного имени абонента в домене и имени домена, - определяющего административную принадлежность абонента. В отличие от - IP-адреса, доменное имя не задаётся самим абонентом сети, а - устанавливается службой доменных имён. -============================================================ - -Все программы, работающие с доменными именами, оказываются клиентами -какого-нибудь сервера доменных имён (DNS-сервера). Для этого они обращаются к -функциям из библиотеки `libresolv` (или им подобным), а те уже определяют, как -превратить доменное имя в адрес. Функции используют файл `/etc/host.conf`, -описывающий, какими способами они должны выполнять преобразование доменных -имён в адреса и обратно, а также формат выдачи данных в различных случаях. -Обычно сначала проверяется файл `/etc/hosts`, а если там соответствий не -найдено -- `/etc/resosv.conf`. В `resolv.conf` указан домен по умолчанию (он -приписывается в конец имени, если другим способом имя никак не удаётся -преобразовать в адрес) и один-два адреса DNS-серверов, к которым и обращаются -функции. Такими клиентами выступили утилиты `ping` и `traceroute` в предыдущих -примерах, преобразуя имя `www.ru` в адрес `194.87.0.50`. Если утилите `traceroute` -не указывать ключ `-n`, она подаст несколько DNS-запросов, по одному на -каждый маршрутизатор, на обратное преобразование -- из IP-адреса в доменное -имя. - --------------------------------------------------------------------- -[root@localhost root]# cat /etc/host.conf - order hosts,bind - multi on -[root@localhost root]# cat /etc/resolv.conf - domain nipponman.ru - nameserver 192.168.102.1 -[root@localhost root]# traceroute -q1 www.ru - traceroute to www.ru (194.87.0.50), 30 hops max, 38 byte packets - 1 fuji.nipponman.ru (192.168.102.1) 1.378 ms - 2 ppp83-237-29-1.pppoe.mtu-net.ru (83.237.29.1) 41.155 ms - 3 195.34.53.53 (195.34.53.53) 48.503 ms - 4 195.34.53.53 (195.34.53.53) 24.033 ms - 5 M9-cr01-A197-cr01.core.mtu.ru (195.34.53.10) 33.414 ms - 6 M9-gw2-M9-cr01.core.mtu.ru (195.34.53.81) 26.259 ms - 7 s-b3-pos0-0.telia.net (213.248.67.93) 59.791 ms - 8 s-bb1-pos5-0-0.telia.net (213.248.66.1) 67.011 ms - 9 mow-b1-pos1-0.telia.net (213.248.101.10) 76.138 ms - 10 demos-101566-mow-okt-i1.c.telia.net (213.248.78.170) 78.591 ms - 11 m9-3-GE4-0-0-vl10.Demos.net (194.87.0.66) 69.813 ms - 12 www.ru (194.87.0.50) 70.583 ms --------------------------------------------------------------------- - -Как видно из примера, обратное преобразование в современной сети работает не -всегда. Отсутствие обратной зоны не поощряется сообществом, но и не считается -преступлением. Мефодий заметил, что компьютер, не имеющий обратного -преобразования адреса, вообще какой-то странный: один раз он передал пакет -сам себе (здесь Мефодий не совсем прав: на самом деле этот маршрутизатор -отчего-то уменьшает TTL пакета на 2, поэтому-то и на третьем, и на четвёртом -шаге именно он возвращает ICMP-сообщение). Кстати сказать, именно по причине -того, что DNS-запрос невелик, зато даже один абонент сети может выдать их -множество, основным транспортным протоколом для DNS выбран UDP, а не TCP (это -не касается протоколов обмена целыми зонами между DNS-серверами, там, -коначно, господствует TCP). - -Если вся задача пользователя -- это послать DNS-запрос, то лучше -воспользоваться утилитой `host`, специально для этого предназначенной: - --------------------------------------------------------------------- -methody@localhost:~ $ host www.ru - www.ru has address 194.87.0.50 -methody@localhost:~ $ host 194.87.0.51 - 51.0.87.194.in-addr.arpa domain name pointer www.demos-Internet.ru. -methody@localhost:~ $ host -t ns www.ru - www.ru name server ns.demos.su. - www.ru name server ns1.demos.net. -methody@localhost:~ $ host -t mx www.ru - www.ru mail is handled by 5 hq.demos.ru. --------------------------------------------------------------------- - -Довольно необычен формат, в котором хранятся таблицы обратного преобразования -адресов. Оказывается, IP-адрес представлен в такой таблице как имя в домене -`in-addr.arpa`, причём это имя совпадает с адресом, записанным задом наперёд. -Такой формат идёт от иерархической структуры DNS. Если некоторая организация -получает во владение сеть, допустим, `194.0.0.0/8`, она должна обслуживать -DNS-запросы к домену `194.in-addr.arpa`. Если при этом сеть `194.87.0.0/16` -передана другой организации, ей же передаётся обязанность обслуживать -DNS-запросы к поддомену этого домена -- `87.194.in-addr.arpa`, и так вплоть до -собственно IP-адресов. Вместо host можно использовать утилиту `dig`, которая -выводит больше информации о том, как проходил сам запрос. - -Помимо записей типа `адрес` (A, прямое преобразование) и `указатель ни имя` -(PTR, обратное преобразование) в системе DNS может храниться и другая -информация. Таблица (зона) некоторого домена должна содержать адреса доменных -серверов всех его поддоменов (записи типа NS). Кроме того в домене должно -быть определено имя _почтового пересыльщика_ (запись типа MX). Если почтовый -пересыльщик домена не указан, электронная почта направляется почтовому -пересыльщику родительского домена. - -В зоне DNS есть даже запись типа «просто текст», TXT: при желании можно -самому определить интерпретацию полей этой записи и организовать поверх DNS -предназначенную для каких угодно целей базу данных по IP-адресам или доменным -именам footnote:[Так поступают, например, при создании «чёрных списков» -абонентов сети, от которых почтовый сервер не принимает писем.]. В отличие -от `dig`, которой для запроса к обратной зоне требуется ключ `-x`, утилита -`host` различает запросы к прямой и обратной зонам по тому, задан ли в -качестве параметра адрес или доменное имя. Для указания конкретного типа -искомой записи обеим утилитам требуется этот тип передать явно. Тип any -означает поиск всех записей с указанным именем: - --------------------------------------------------------------------- -methody@localhost:~ $ dig www.us any - - ; <<>> DiG 9.2.4rc5 <<>> www.us any - ;; global options: printcmd - ;; Got answer: - ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 6451 - ;; flags: qr rd ra; QUERY: 1, ANSWER: 10, AUTHORITY: 0, ADDITIONAL: 4 - - ;; QUESTION SECTION: - ;www.us. IN ANY - - ;; ANSWER SECTION: - www.us. 1766 IN A 209.173.57.26 - www.us. 1766 IN A 209.173.53.26 - www.us. 1767 IN NS pine.neustar.com. - www.us. 1767 IN NS willow.neustar.com. - www.us. 1767 IN NS cypress.neustar.com. - www.us. 1767 IN NS oak.neustar.com. - www.us. 1771 IN MX 20 pine.neustar.com. - www.us. 1771 IN MX 5 oak.neustar.com. - www.us. 1771 IN MX 5 willow.neustar.com. - www.us. 1771 IN MX 10 cypress.neustar.com. - - ;; ADDITIONAL SECTION: - pine.neustar.com. 135024 IN A 209.173.57.70 - willow.neustar.com. 135024 IN A 209.173.53.84 - cypress.neustar.com. 135024 IN A 209.173.57.84 - oak.neustar.com. 135024 IN A 209.173.53.70 - - ;; Query time: 932 msec - ;; SERVER: 192.168.102.1#53(192.168.102.1) - ;; WHEN: Wed Dec 22 22:01:24 2004 - ;; MSG SIZE rcvd: 281 --------------------------------------------------------------------- - -[[server]] -== Сетевые и серверные возможности == - -=== Настройка сети === - -Итак, с работой сети в Linux Мефодий немного познакомился, однако то, как эту -сеть использовать для личных нужд, понятнее не стало. Прежде всего: как -приучить имеющийся компьютер пользоваться имеющейся локальной сетью? - -==== Настройка вручную ==== - -Первая мысль -- настроить сетевые интерфейсы вручную. Это довольно просто, -если знать полагающиеся при настройке данные: IP-адрес самого компьютера, -IP-адрес маршрутизатора по умолчанию и адрес сервера доменных имён. - -Задать IP-адреса интерфейсам `eth0` и `lo` можно уже известной командой -`ifconfig`: - -------------------------------------------------------------- -[root@sakura root]# ifconfig -[root@sakura root]# ifconfig eth0 inet 192.168.102.125 netmask 255.255.255.0\ - broadcast 192.168.102.255 -[root@sakura root]# ifconfig lo inet 127.0.0.1 netmask 255.0.0.0\ - broadcast 127.255.255.255 -[root@sakura root]# ifconfig - eth0 Link encap:Ethernet HWaddr 00:0C:29:56:C1:36 - inet addr:192.168.102.125 Bcast:192.168.102.255 Mask:255.255.255.0 - UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 - RX packets:34 errors:0 dropped:0 overruns:0 frame:0 - TX packets:32 errors:0 dropped:0 overruns:0 carrier:0 - collisions:0 txqueuelen:1000 - RX bytes:6765 (6.6 Kb) TX bytes:8753 (8.5 Kb) - Interrupt:17 Base address:0x1080 - - lo Link encap:Local Loopback - inet addr:127.0.0.1 Mask:255.0.0.0 - UP LOOPBACK RUNNING MTU:16436 Metric:1 - RX packets:0 errors:0 dropped:0 overruns:0 frame:0 - TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 - collisions:0 txqueuelen:0 - RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) -[root@sakura root]# ping -c1 192.168.102.1 - PING 192.168.102.1 (192.168.102.1) 56(84) bytes of data. - 64 bytes from 192.168.102.1: icmp_seq=1 ttl=64 time=0.613 ms - - --- 192.168.102.1 ping statistics --- - 1 packets transmitted, 1 received, 0% packet loss, time 0ms - rtt min/avg/max/mdev = 0.613/0.613/0.613/0.000 ms -------------------------------------------------------------- - -Заметим, что вместе с IP-адресом необходимо указывать и сетевую маску, и -широковещательный адрес сети. Теперь пакеты доходят до любого абонента -локальной сети, но не дальше, поскольку не задан ни один маршрутизатор. -Добавить маршрутизатор можно командой `route add`: - -------------------------------------------------------------- -[root@sakura root]# route - Kernel IP routing table - Destination Gateway Genmask Flags Metric Ref Use Iface - 192.168.102.0 * 255.255.255.0 U 0 0 0 eth0 - 127.0.0.0 * 255.0.0.0 U 0 0 0 lo -[root@sakura root]# ping 209.173.53.26 - connect: Network is unreachable -[root@sakura root]# route add default gw 192.168.102.1 -[root@sakura root]# route - Kernel IP routing table - Destination Gateway Genmask Flags Metric Ref Use Iface - 192.168.102.0 * 255.255.255.0 U 0 0 0 eth0 - 127.0.0.0 * 255.0.0.0 U 0 0 0 lo - default 192.168.102.1 0.0.0.0 UG 0 0 0 eth0 -[root@sakura root]# ping 209.173.53.26 - 64 bytes from 209.173.53.26: icmp_seq=1 ttl=114 time=166 ms - . . . -------------------------------------------------------------- - -Мефодий заметил, что две записи в таблице маршрутизации уже были до -выполнения команды `route add`: относительно локальных сетей `192.168.102.0/24` -и `127.0.0.0/8`. Эти записи появилась там в результате настройки сетевых -интерфейсов: для пополнения таблицы достаточно было адреса и сетевой маски. -Не хватало только явного указания маршрутизатора. Ключевое слово `default` -заменило параметр `-net 0.0.0.0` (из предыдущей лекции известно, что сети -`0.0.0.0/0` в таблице маршрутизации принадлежит любой адрес), а параметр `gw` -означает «gateway», т. е. _маршрутизатор_. - -Тем не менее служба доменных имён пока не работает: необходимо заполнить -файл `/etc/resolv.conf`: - -------------------------------------------------------------- -[root@sakura root]# ping www.ru - ping: unknown host www.ru -[root@sakura root]# cat /etc/resolv.conf -[root@sakura root]# cat > /etc/resolv.conf - domain nipponman.ru - nameserver 192.168.102.1 -[root@sakura root]# ping www.ru - PING www.ru (194.87.0.50) 56(84) bytes of data. - 64 bytes from www.ru (194.87.0.50): icmp_seq=1 ttl=55 time=84.3 ms - . . . -[root@sakura root]# update_chrooted conf -------------------------------------------------------------- - -Последнюю команду присоветовал Гуревич. Дело в том, что подсистему, -работающую с DNS, нередко «сажают в песочницу», то есть переносят в отдельный -каталог, в котором выполняется `chroot`. Как сказано в лекции <>, в такой «песочнице» должны быть все нужные для -работы файлы -- и уж конечно процедурам DNS нужен свой файл-копия -`/etc/resolv.conf`. Информация о том, кому что нужно копировать при изменении -профиля системы, обычно хранится централизованно и управляется несложными -сценариями. В данном дистрибутиве команда `update_chrooted conf` как раз и -копирует все изменившиеся конфигурационные файлы по песочницам. - -==== Настройка при установке или загрузке системы ==== - -Мефодий очень обрадовался заработавшей сети и немедленно принялся сочинять -простейший стартовый сценарий, который выполнял бы все нужные команды -автоматически. Выяснилось, что такой сценарий уже есть в любом дистрибутиве -Linux, хотя называться он может по-разному, как правило, `/etc/init.d/network` -или `networking`. Как и полагается стартовому сценарию, с параметром `start` он -настраивает сеть, а с параметром `stop` -- «выключает» сетевые настройки. - -Безусловно, ни список сетевых интерфейсов, ни параметры их настройки не -указаны в самом стартовом сценарии, как то хотел сделать Мефодий. -Всевозможные сетевые настройки хранятся в `/etc` отдельно, как правило, в -специальном подкаталоге. В разных дистрибутивах Linux применяются различные -схемы размещения настроек. Система, установленная на компьютере Мефодия, -использует общий подкаталог `/etc/sysconfig` для хранения большинства настроек, -используемых не службами, а самими стартовыми сценариями, в том числе и -`network`: - -------------------------------------------------------------- -[root@sakura root]# ls -F /etc/sysconfig/ - acpi framebuffer init network-scripts/ vlan - apmd harddisk/ keyboard* nfs xfs - autologin* harddisks keyboard.rpmnew pcmcia* xinetd - bootsplash hotplug klogd rawdevices xinitrc - clock* hwconf kudzu syslogd - console/ i18n* mouse* system* - consolefont* i18n.rpmnew network* usb -------------------------------------------------------------- - -Как видно из примера, в этом каталоге содержатся и конфигурационные файлы, и -дополнительные сценарии, и вложенные подкаталоги для отдельных видов настроек. - -За сеть непосредственно отвечают файл `/etc/sysconfig/network` и содержимое -подкаталога `/etc/sysconfig/network-scripts`: - -------------------------------------------------------------- -[root@sakura root]# cat /etc/sysconfig/network - NETWORKING=yes - HOSTNAME=sakura.nipponman.ru - DOMAINNAME=nipponman.ru - GATEWAY=192.168.102.1 -------------------------------------------------------------- - -Файл `network` оказался очень простым: в нём в формате shell определяются -основные настройки сети: имя компьютера и домена, а также маршрутизатор по -умолчанию. По-видимому, этот файл «втягивается» командой `.` из самого -сценария `network`. - -------------------------------------------------------------- -[root@sakura root]# ls -F /etc/sysconfig/network-scripts/ - README@ ifdown-ppp* ifup-ipv6* ifup-sl* - ifcfg-eth0* ifdown-pre* ifup-ipx* net_cnx_pg* - ifcfg-lo* ifdown-sit* ifup-plip* net_prog.default* - ifdown@ ifdown-sl* ifup-plusb* net_resolv.default - ifdown-aliases* ifup@ ifup-post* network-functions* - ifdown-iptun* ifup-aliases* ifup-ppp* network-functions-ipv6* - ifdown-ipv6* ifup-ctc* ifup-routes* - ifdown-post* ifup-iptun* ifup-sit* -------------------------------------------------------------- - -Каталог `network-scripts` содержит множество сценариев на все случаи сетевой -жизни. В файле `README` описано, для чего какой сценарий нужен и что означают -поля в каждом из них (часто этот файл хранится в `/usr/share/doc/net-scripts`, -а не в `/etc`). - -------------------------------------------------------------- -[root@sakura root]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 - DEVICE=eth0 - BOOTPROTO=static - IPADDR=192.168.102.125 - NETMASK=255.255.255.0 - NETWORK=192.168.102.0 - BROADCAST=192.168.102.255 - ONBOOT=yes -------------------------------------------------------------- - -А вот и настройки интерфейса `eth0`, которые Мефодию приходилось применять -вручную. Таким образом, стоит только подать команду `service network stop`, как -все сетевые интерфейсы «пропадут» (деактивизируются), а после `service -network start` -- снова появятся. - -Как правило, пользователю вообще не обязательно редактировать эти файлы. С -каждым дистрибутивом поставляется программа-конфигуратор, которая позволяет -«настроить сеть», не вспоминая, какие данные, в каком формате и куда нужно -записывать. Обычно такая программа оформляется в стиле _мастера_, «кудесника», -задающего только вопросы по существу, с её помощью и формируются более или -менее подходящие конфигурационные файлы. Результатов работы мастера в -большинстве случаев бывает достаточно, а в тех случаях, когда его -искусственный интеллект пасует, администратор применяет свой естественный -интеллект и редактор Vim. С другой стороны, изменить несколько значений в -трёх конфигурационных файлах не так уж сложно. Когда настройщик действительно -необходим -- это во время установки системы на компьютер или непосредственно -после неё. Настраивать приходится сразу всё в системе, так что любая экономия -времени при этом существенна. - -В некоторых дистрибутивах используется схема `ifupdown`, основанная на -технологии `. d`: - -------------------------------------------------------------- -debian!shogun$ ls -F /etc/network - if-down.d/ if-pre-up.d/ ifstate.hotplug interfaces - if-post-down.d/ ifstate if-up.d/ options -------------------------------------------------------------- - -Настройка сетевых интерфейсов и маршрутизатора по умолчанию хранится одном -файле (считается, что редактировать его автоматически -- просто). Тонкая -настройка сети -- в файле `options`. Каталоги `if-pre-up.d`, `if-up.d`, -`if-down.d` и `if-post-down.d` предназначены для служб, которые хотят -производить какие-то действия, соответственно, перед тем, как сетевой -интерфейс будет активизирован («поднят»), после успешной активизации -интерфейса, перед тем как сетевой интерфейс будет деактивизирован («опущен») -и после этого. - -==== Автоматическая настройка ==== - -Программа-настройщик регулярно предлагала Мефодию «настроить сеть -автоматически». В режиме автоматической настройки практически не -запрашивается данных у пользователя. Это значит, что данные система должна -брать откуда-то ещё, видимо, со специального сервера в локальной сети. - -Запрашивать сетевые настройки с сервера вместо того, чтобы хранить их на -каждом компьютере, довольно удобно. В самом деле: один сервер, один -администратор, один файл с общими настройками. Более того, можно вообще не -хранить персональных настроек для каждого компьютера в сети, а ограничиться -настройками групповыми, лишь бы IP-адреса внутри группы различались. Одним из -первых был разработан протокол RARP (reverse ARP), который, как следует из -названия, занимается преобразованием, обратным ARP: по интерфейсному адресу -компьютер узнаёт у сервера сетевой. В ethernet-сетях для этого посылается -широковещательный ethernet-фрейм типа «RARP-запрос», который означает «Вот -мой MAC-адрес. Кто-нибудь, дайте мне IP!». На что специальная -программа-сервер отвечает RARP-ответом «Вот тебе IP!» -- фреймом, содержащим -IP-адрес, который сервер нашёл в своей таблице. Если в сети нет ни одного -RARP-сервера или ни в одном из них не зарегистрирован интерфейсный адрес -компьютера-клиента, тот останется без IP. Похожую схему использует и -протокол BOOTP, применяющийся для сетевой загрузки компьютеров. -Предполагается, что, получив IP-адрес, клиент заберёт с сервера (по -протоколу TFTP, trivial FTP) некий файл, загрузит его в память и передаст -управление. Поэтому в BOOTP передаётся не только IP-адрес клиента, но и -IP-адреса TFTP-сервера и маршрутизатора по умолчанию и имя файла-загрузчика. - -В современных сетях чаще всего используется протокол DHCP (Dynamic Host -Configure Protocol, протокол динамической настройки сетевых абонентов). Он -имеет очень широкие возможности: с сервера можно получить IP-адрес, сетевую -маску и широковещательный адрес, имя домена, адреса маршрутизатора и серверов -доменных имён, а также великое множество других параметров, вплоть до не -предусмотренных в DHCP явно, так что их тип задаётся обычным числом, а -интерпретация значения целиком определяется клиентом. Урезанную часть DHCP -поддерживают «умные» сетевые устройства (те, что снабжены BootROM, т. е. ПЗУ -с загрузочной программой). Но полностью обрабатывать все поля DHCP умеет -специальная служба-клиент. В Linux эта служба называется `dhcpcd` (DHCP client -daemon). В его ведение, как минимум, входит настройка сетевого интерфейса, -маршрута по умолчанию и `resolv.conf`. - -Так что всё, что Мефодий делал вручную или вписывал в настроечный файл, можно -получить «за просто так», если в сети работает DHCP-сервер: - -------------------------------------------------------------- -[root@sakura root]# ifconfig - lo Link encap:Local Loopback - inet addr:127.0.0.1 Mask:255.0.0.0 - . . . -[root@sakura root]# cat /etc/resolv.conf -[root@sakura root]# /sbin/dhcpcd -h sakura -N eth0 - dhcpcd.exe: interface eth0 has been configured with new IP=192.168.102.124 -[root@sakura root]# ps gax | grep "dhcpcd" - 1011 ? S 0:00 /sbin/dhcpcd -h sakura -N eth0 -[root@sakura root]# cat /etc/resolv.conf - nameserver 192.168.102.1 - search nipponman.ru -[root@sakura root]# ifconfig - eth0 Link encap:Ethernet HWaddr 00:0C:29:56:C1:36 - inet addr:192.168.102.124 Bcast:192.168.102.255 Mask:255.255.255.0 - . . . -------------------------------------------------------------- - -Протокол DHCP даже позволяет передавать серверу желаемое имя и адрес -компьютера. Впрочем, выдача IP-адреса привязана, как правило, к MAC-адресу. -Здесь есть особая хитрость. DHCP может неплохо работать, когда IP-адресов не -хватает на всех: компьютеров с разными NAC-адресами в сети больше, чем -выделенных IP, но эти компьютеры никогда не включаются все одновременно. -Компьютер, определяемый в DHCP по MAC-адресу, не «присваивает» выданный IP -навсегда: адрес сдаётся в «аренду» (lease) на некоторое время. Если до -истечения срока аренды бывший владелец не подтвердил желание пользоваться -адресом и дальше (не послал повторный DHCP-запрос), адрес считается -незанятым. Но когда компьютер подключается к сети после долгого перерыва, -сервер DHCP сначала просматривает «арендную историю» на предмет того, какой -IP этому абоненту уже выдавался. Если этот IP не занят, то будет выдан именно -он. И только когда к сети подключится совсем новый абонент, а все адреса уже -когда-нибудь кому-то выдавались, среди них будет выбран и отдан в аренду -новичку тот, что дольше всех оставался невостребованным. - -Наконец, чтобы избавиться и от этой ручной работы, можно перенастроить -`ifcfg-eth0` на использование DHCPD: - -------------------------------------------------------------- -[root@sakura root]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 - DEVICE=eth0 - BOOTPROTO=dhcp - NETMASK=255.255.255.0 - ONBOOT=yes -------------------------------------------------------------- - -==== Настройка соединений «точка–точка» ==== - -Если компьютер стоит дома, далеко не всегда есть возможность подключиться к -локальной сети, непосредственно граничащей с Internet. Для передачи небольших -сообщений чаще всего используется временное подключение посредством -телефонной линии. На обеих сторонах линии устанавливается _модем_ -- -устройство, преобразующее один формат сигнала в другой. На российских -телефонных линиях обычно используйся аналоговые модемы, способные -обмениваться данными по довольно низкокачественным линиям с большой долей -помех и относительно неискажённой передачей сигнала только в диапазоне -слышимых звуковых частот. За низкое качество канала приходится расплачиваться -низкой скоростью передачи данных: на таких модемах она до сих пор не -превышает (после отбрасывания служебной информации, ошибок и прочего) -трёх-четырёх килобайтов в секунду, а в действительности бывает раза в два -меньше. - -Соединение между двумя устройствами, вообще говоря, не сетевыми, а только -способными передавать данные, описывается несколькими протоколами. Самый -распространённый из них -- PPP (Point-to-Point Protocol, протокол -«точка–точка») -- решает задачи, возникающие в силу особенностей соединений -«точка–точка». - -Во-первых, само участвующее в соединении устройство почти никогда не -представлено в виде сетевого интерфейса, потому что не обладает нужными для -организации сети свойствами. Это значит, что какая-то часть системы (скорее -всего, системная служба) будет разговаривать с устройством на понятном ему -языке, а с пользовательскими утилитами взаимодействовать посредством -специально организованного виртуального сетевого интерфейса. - -Во-вторых, нет необходимости поддерживать часть интерфейсного протокола: -абонента на среде передачи данных два, никакой идентификации не требуется, -потому что каждый может отличить себя от не-себя. Так, виртуальный сетевой -интерфейс `ppp0`, соответствующий устройству, обменивающемуся данными по -протоколу PPP, не обладает MAC-адресом. - -В-третьих, оттого, что соединение не постоянное, а среда за время, пока -абоненты не были связаны, могла измениться до неузнаваемости, обеим сторонам -приходится при каждом дозвоне идентифицировать себя. Обычно идентифицируется -только сторона, которой предоставляется доступ в сеть, но проверять, до -правильного ли места мы дозвонились, тоже не мешает. При установлении -соединения «точка–точка» процедуры идентификации проходят после того, как -появляется возможность передавать данные, но до всякой сетевой настройки. -Мало того, данные по настройке сети (аналогичные тем, что используются в -DHCP) также передаются на этом этапе взаимодействия по протоколу PPP. - -В силу того, что дозвон нужен пользователям самого разного уровня знаний, -для PPP написано множество программ-«звонилок», использующих графическую -подсистему, со звуками и прочими не относящимися к делу украшениями. Пример -такой программы -- `kppp`, утилита модемного доступа для рабочего стола KDE. -Всё, что требуется от пользователя -- это указать модем, список телефонов, -куда звонить и тип идентификации. Впрочем, и здесь пользователь не -освобождается от «тяжёлой» мыслительной работы: некоторые провайдеры -(организации, предоставляющие выход в Internet) после дозвона требуют -идентификацию не по протоколу PPP, а открытым текстом, на манер -`login–password` в Linux. Иногда это и есть самый настоящий `login`: -пользователю предоставляется терминальный доступ, а дальше пускай делает, что -хочет. В этом случае приходится писать _сценарий-диалог_ (chat script) в стиле -«Дождаться строки `login:` -- ввести входное имя. Дождаться строки -`Password:` -- ввести пароль. Дождаться подсказки командного интерпретатора --- ввести `pppd с параметрами`. - -Что совсем уже просто для пользователя, так это утилита `wvdial`, описанная в -лекции <>. Она и модем сама определяет, и тип -идентификации, и pppd настраивает и запускает тоже сама. В действительности -же сетью занимается системная служба `pppd`, чьи конфигурационные файлы -находятся в каталоге `/etc/ppp`: - -------------------------------------------------------------- -[root@sakura root]# ls /etc/ppp - callback-client chap-secrets ip-up options.dialin peers - callback-server ip-down ip-up.d options.dialout - callback-users ip-down.d options pap-secrets -[root@sakura root]# ls -l /etc/ppp/*secrets - -rw------- 1 root root 78 Jun 23 1995 /etc/ppp/chap-secrets - -rw------- 1 root root 77 Jun 23 1995 /etc/ppp/pap-secrets -------------------------------------------------------------- - -Большинство из этих файлов по умолчанию не используются. Следует помнить, что -идентификационная информация, используемая в PPP (в зависимости от -особенностей соединения и пристрастий провайдера могут применяться протоколы -идентификации PAP или CHAP), хранится в файлах `pap-secrets` и `chap-secrets` -в текстовом виде. Хранить не пароль, а ключ, как это сделано в `/etc/shadow` -нельзя, так что остаётся либо надеяться на права доступа к этим файлам, либо -запускать `pppd` вручную (или с помощью тех же `wvdial` и `kppp`) и каждый -раз этот пароль вводить. - -Установить PPP-соединение можно поверх любой среды передачи данных, в том -числе и поверх локальной сети. В этом случае `pppd` обменивается данными -(посредством псевдотерминальной пары `pty -- tty` или `ptmx -- pts/`, -описанной в лекции <>) с системной -службой `pppoe`, выполняющим роль «модема». При этом передаваемые данные -можно сжимать или шифровать, а главное, связь «точка–точка» устанавливается с -конкретным пользователем, который ввёл одному ему известный пароль, поэтому -часто выход в Internet, требующий строгого учёта трафика, делают именно с -помощью пары `pppd/pppoe`. Наконец, в сети может быть настоящий модем, -преобразующий эти данные в формат, пригодный для передачи по цифровым -телефонным линиям (DSL). Кстати сказать, такой модем легко собирается из -маленького компьютера с низким энергопотреблением, ядра Linux и доработанного -_стартового виртуального диска_. Некоторые современные DSL-модемы устроены -именно так, причём ядро и `initrd` записываются в перепрограммируемое ПЗУ. - -==== Межсетевой экран ==== - -В Linux существует мощный механизм анализа сетевых и транспортных пакетов, -позволяющий избавляться от нежелательной сетевой активности, манипулировать -потоками данных и даже преобразовывать служебную информацию в них. Обычно -такие средства носят название «firewall» («fire wall» -- противопожарная -стена, брандмауэр), общепринятый русский термин -- _межсетевой экран_. В более -старых версиях межсетевого экрана Linux использовался вариант межсетевого -экрана `ipchains`, который впоследствии был заменён на более мощный, `iptables`. - -Суть `iptables` в следующем. Обработка сетевого пакета системой представляется -как его _конвейерная_ обработка. Пакет нужно получить из сетевого интерфейса -или от системного процесса, затем следует выяснить предполагаемый маршрут -этого пакета, затем отослать через сетевой интерфейс либо отдать -какому-нибудь процессу, если пакет предназначался нашему компьютеру. Налицо -три конвейера обработки пакетов: «получить -- маршрутизировать -- отослать» -(действие маршрутизатора), «получить -- маршрутизировать -- отдать» (действие -при получении пакета процессом) и «взять -- маршрутизировать -- отослать» -(действие при отсылке пакета процессом). - -Между каждыми из этих действий системы помещается модуль межсетевого экрана, -именуемый _цепочкой_. Цепочка обрабатывает пакет, исследуя, изменяя и даже, -возможно, уничтожая его. Если пакет уцелел, она передаёт его дальше по -конвейеру. В этой стройной схеме есть два исключения. Во-первых, ядро Linux -даёт доступ к исходящему пакету только после принятия решения о его -маршрутизации, поэтому связка «взять -- маршрутизировать» остаётся -необработанной, а цепочка, обрабатывающая исходящие пакеты (она называется -`OUTPUT`) вставляется после маршрутизации. Во-вторых, ограничения на «чужие» -пакеты, исходящие не от нас и не нам предназначенные, существенно отличаются -от ограничений на пакеты «свои», поэтому после маршрутизации транзитные -пакеты обрабатываются ещё одной цепочкой (она называется `FORWARD`). Цепочка, -обслуживающая связку «получить -- маршрутизировать», называется `PREROUTING`, -цепочка, обслуживающая связку «маршрутизировать -- отдать» -- `INPUT`, а -цепочка, стоящая непосредственно перед отсылкой пакета -- `POPSTROUTING`: - -image::images/IPTables.dia.png[Обработка пакетов цепочками iptables] - -В варианте `ipchains` каждая цепочка представляла собой таблицу _правил_. В -правиле задаются свойства пакета и действие, которое нужно выполнять со всеми -пакетами, обладающими указанными свойствами. Когда пакет попадает в таблицу, -к нему начинают последовательно применяться правила. Если пакет не имеет -свойств, требуемых первым правилом, к нему применяется второе, если второе -также не подходит -- третье, и так вплоть до последнего, правила по -умолчанию, которое применяется к любому пакету. Если свойства пакета -удовлетворяют правилу, над ним совершается действие. Действие `DROP` уничтожает -пакет, а действие `ACCEPT` немедленно выпускает его из таблицы, после чего -пакет движется дальше по конвейеру. Некоторые действия, например `LOG`, никак -не влияют на судьбу пакета, после их выполнения он остаётся в таблице: к нему -применяется следующее правило, и т. д. до `ACCEPT` или `DROP`. - -Из сказанного выше следует, что действия `ACCEPT` или `DROP` в каждой таблице -могут примениться к пакету лишь однократно. Для большей гибкости цепочки -`iptables` состоят из нескольких (двух-трёх) таблиц. Выходя живым из одной -таблицы, пакет попадает в следующую, а уж последняя передаёт его, если -завершается действием `ACCEPT`, на конвейер. Хотя таблицы функционально -одинаковы, принято использовать их по разному назначению. Таблицу `mangle` -используют для внесения исправлений в служебную информацию пакета, таблицу -`filter` -- для определения того, не стоит ли пакет уничтожить, а таблицу `nat` -- -для подмены сетевых адресов. В приведённой выше диаграмме буквами `M`, `N` и `F` -отмечено, какие именно таблицы есть в цепочках и в каком порядке их проходит -пакет. - -Для просмотра правил во всех таблицах всех цепочек `iptables` можно -воспользоваться командой `iptables-save`: - -------------------------------------------------------------- -[root@sakura root]# iptables-save - # Generated by iptables-save v1.2.11 on Fri Dec 24 21:06:12 2004 - *nat - :PREROUTING ACCEPT [1:261] - :POSTROUTING ACCEPT [3:220] - :OUTPUT ACCEPT [3:220] - COMMIT - # Completed on Fri Dec 24 21:06:12 2004 - # Generated by iptables-save v1.2.11 on Fri Dec 24 21:06:12 2004 - *filter - :INPUT ACCEPT [7:1077] - :FORWARD ACCEPT [0:0] - :OUTPUT ACCEPT [5:355] - COMMIT - # Completed on Fri Dec 24 21:06:12 2004 - # Generated by iptables-save v1.2.11 on Fri Dec 24 21:06:12 2004 - *mangle - :PREROUTING ACCEPT [7:1077] - :INPUT ACCEPT [7:1077] - :FORWARD ACCEPT [0:0] - :OUTPUT ACCEPT [5:355] - :POSTROUTING ACCEPT [5:355] - COMMIT - # Completed on Fri Dec 24 21:06:12 2004 -------------------------------------------------------------- - -Команда группирует одинаковые таблицы каждой цепочки. В пустой таблице -присутствует только правило по умолчанию (policy), в этом примере все -умолчания равны `ACCEPT` (пропускать пакет). - -==== Фильтрация ==== - -Мефодий озаботился судьбой «календарного сервера», изобретённого им на -прошлой лекции. Как уже было замечено, он запустил этот сервис на порту -26000, используемом популярной сетевой компьютерной игрой, что может помешать -игрокам. Поэтому Мефодий решил запретить обращение к 26000-му порту отовсюду, -кроме самой машины, то есть со всех интерфейсов, кроме `lo`. С этой задачей -справлялась настройка `only_from = 127.0.0.1` метаслужбы, но её пришлось -выключить, так как она автоматически запрещала доступ из сети ко всем -сервисам компьютера: - -------------------------------------------------------------- -[root@sakura root]# iptables --append INPUT --in-interface lo --protocol tcp --destination-port quake --jump ACCEPT -[root@sakura root]# iptables --append INPUT --protocol tcp --destination-port quake --jump REJECT -[root@sakura root]# iptables-save - . . . - *filter - :INPUT ACCEPT [1030:72984] - :FORWARD ACCEPT [0:0] - :OUTPUT ACCEPT [730:69581] - -A INPUT -i lo -p tcp -m tcp --dport 26000 -j ACCEPT - -A INPUT -p tcp -m tcp --dport 26000 -j REJECT --reject-with icmp-port-unreachable - COMMIT - . . . -[root@sakura root]# service iptables save - saving current rules to /etc/sysconfig/iptables: [ DONE ] -------------------------------------------------------------- - -Команды `iptables` получаются довольно длинными: нужно аккуратно описать -свойства каждого фильтруемого пакета. В примере Мефодий добавил два правила в -таблицу `filter` цепочки INPUT (таблица `filter` выбирается по умолчанию, если не -оказан ключ «-t таблица»). Первое правило разрешает принимать TCP-пакеты, -адресуемые на порт 26000, если они пришли из интерфейса `lo`. Проверка таких -пакетов не дойдёт до второго правила: по действию `ACCEPT` они немедленно -отправятся дольше по конвейеру. Второе правило не просто уничтожает пакет, -пришедший на 26000 порт, но и, как то предписывает действие `REJECT`, посылает -отправителю ICMP-пакет, сообщающий о том, что такие запросы не обслуживаются -(при обычном действии `DROP` клиент некоторое время дожидается подтверждения). -Из примера видно, что полнословные ключи `iptables` можно заменять на -однобуквенные. Кроме того, пример показывает, что стартовый сценарий -`iptables` (в этом дистрибутиве) обрабатывает параметр save, который делает -изменения, внесённые вручную, постоянными (`service iptables start`, -выполняемый при загрузке системы, использует `/etc/sysconfig/iptables`). - -==== Подмена адресов ==== - -Если в некоторой сети используются адреса из описанного стандартом `RFC1918` -внутреннего диапазона (например, из сети `10.0.0.0/8`), без дополнительных -действий абоненты этой сети доступа к Internet иметь не будут. Пакеты с -такими адресами запрещено передавать в Internet, а даже если они туда -просочатся через маршрутизатор, соединяющий «внутреннюю» и «внешнюю» сети, -следующий же маршрутизатор откажется их пересылать. Простая, казалось бы, -мысль научить межсетевой экран, установленный на маршрутизаторе, подменять -IP-адреса в пакетах, приходящих из внутренней сети, своим внешним IP-адресом -наталкивается на серьёзное препятствие. - -Допустим, абоненты с адресом `10.0.0.3` и `10.0.0.7` устанавливают -TCP-соединение с адресом в Internet (скажем, `209.173.53.26`). Специально -обученный маршрутизатор подменяет `10.0.0.3` и `10.0.0.7` на адрес своего -сетевого интерфейса, подключённого к внешней сети (допустим, `194.87.0.50`). -Пакеты уходят адресату, как если бы и тот, и другой были отправлены самим -маршрутизатором. `209.173.53.26` отвечает на два запроса двумя пакетами, оба --- на адрес `194.87.0.50`. Что делать дальше? Как отличить пакет, -предназначены для `10.0.0.3` от такового же для `10.0.0.7`? - -На помощь приходит знание TCP! Как известно, TCP-соединение идентифицируется -шестью параметрами: IP-адресами отправителя и получателя, портами на -отправителе и получателе и _номерами последовательности_ (SEQN) входящего и -исходящего потока данных. В нашей схеме межсетевой экран обязательно -заменяет IP-адреса одним, поэтому у двух принятых пакетов они совпадают. А -вот с четырьмя оставшимися параметрами он волен поступать, как -заблагорассудится: в любом случае каждому из сеансов должны соответствовать -разные `SEQN` и разные номера исходящих портов. Осталось только держать в -памяти таблицу соответствия TCP-соединений из внутренней сети TCP-соединениям -во внешнюю сеть. - -Этот механизм носит название «преобразование сетевых адресов» (Network -Adress Translation, NAT). Следует помнить, что чем больше транспортных -соединений отслеживается межсетевым экраном, тем больше требуется оперативной -памяти ядру Linux и тем медленнее работает процедура сопоставления проходящих -пакетов таблице. Впрочем, мощности современных компьютеров позволяют без -каких-либо затруднений обслуживать преобразование адресов для сети с -пропускной способностью 100Мбит/с и даже выше. В `iptables` есть специальный -модуль для `NAT` и соответствующие действия в правиле. Такие правила принято -помещать в таблицы типа nat: - -------------------------------------------------------------- -[root@fuji root]# route -n - Kernel IP routing table - Destination Gateway Genmask Flags Metric Ref Use Iface - 83.237.29.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0 - 192.168.102.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 - 10.13.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 - 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo - 0.0.0.0 83.237.29.1 0.0.0.0 UG 0 0 0 ppp0 -[root@fuji root]# iptables-save - # Generated by iptables-save v1.2.11 on Sat Dec 25 14:02:44 2004 - *nat - :PREROUTING ACCEPT [216:12356] - :POSTROUTING ACCEPT [242:27148] - :OUTPUT ACCEPT [1428:91596] - -A POSTROUTING -o ppp+ -j MASQUERADE - COMMIT - . . . -------------------------------------------------------------- - -На том самом маршрутизаторе, где, по словам Гуревича, «всего один настоящий -адрес, да и тот -- PPP», как раз и настроено преобразование адресов. Делается -это всего одним правилом, добавленным в таблицу `nat` цепочки `POSTROUTING`. -Действие `MASQUERADE` отличается от действия `SNAT` (Source NAT) только тем, что -может быть использовано на интерфейсах с изменяемым IP-адресом, таких как `ppp` -или настраиваемый по `DHCP eth`. Если в процессе работы IP-адрес интерфейса -поменяется, правило SNAT продолжит подменять адреса на старый, заданный во -время настройки `iptables`. Зато `MASQUERADE` вынуждено спрашивать у системы -IP-адрес указанного интерфейса для каждого преобразуемого пакета, что может -быть неудобно на очень медленных или очень загруженных разнообразными -службами компьютерах. - -Преобразование адресов работает не только для TCP-соединений, но и для многих -других протоколов, где возможно отследить либо настоящего адресата на -внутренней сети, либо идентификатор сеанса связи. Например, ICMP-пакет -команды `ping` содержат уникальный идентификатор, который используется в ответе -на него, поэтому не составляет труда отследить, на чей именно `ping` пришёл -ICMP-ответ. Таблица отслеживаемых соединений отражается в файле -`net/ip_conntrack` виртуальной файловой системы `/proc`: - -------------------------------------------------------------- -[root@fuji root]# cat /proc/net/ip_conntrack - . . . - icmp 1 30 src=192.168.102.125 dst=209.173.53.26 type=8 code=0 id=50179 [UNREPLIED] src=209.173.53.26 dst=83.237.29.65 type=0 code=0 id=50179 use=1 - tcp 6 431981 ESTABLISHED src=192.168.102.125 dst=194.87.0.50 sport=1027 dport=80 src=194.87.0.50 dst=83.237.29.65 sport=80 dport=1027 [ASSURED] use=1 -------------------------------------------------------------- - -Так и есть: во-первых, Мефодий (скорее всего) что-то рассматривает на сайте -www.ru (он же `194.87.0.50`), а во-вторых, он зачем-то запустил `ping www.us`: -команда `cat` подана как раз между ICMP-запросом по адресу `209.173.53.26 и` -ответом на него. Левая часть таблицы описывает соединение до подмены адресов, -а правая -- после. Точно так же можно «ловить» и UDP-запросы к службе -доменных имён, и многое другое. - -Конечно, фильтрацией и маскарадом функции `iptables` не исчерпываются. Можно, -например, задать статическую таблицу подмены адресов, тогда появится -возможность принимать из Internet соединения, предназначенные для внутренних -серверов. Того же можно добиться, используя подмену адреса только для -соединений по определённым портам и т. д. - -=== Сетевые службы === - -Эта часть лекции -- обзорная. Поскольку, с одной стороны, толковое и -последовательное объяснение устройства многочисленных сетевых служб Linux -требует, по крайней мере, отдельного курса лекций, а с другой стороны -- -хорошей теоретической и практической подготовки слушателя. Так что придётся -ограничиться поверхностным описанием наиболее востребованных для личного или -домашнего пользования сервисов. Стоит заранее отметить, что описываемые -задачи, как правило, могут решаться несколькими путями с помощью различных -системный служб или утилит, по-разному выполняющих одну и ту же работу. У -администратора Linux всегда есть свобода выбора! - -=== HTTP === - -Мефодий, конечно, знает, что Internet, как глобальная сеть компьютеров служит -хранилищем глобальной сети документов под общим название WWW (World Wide Web, -«Всемирная Паутина»). Связь между документами в Паутине обеспечивается за -счёт особого -- гипертекстового -- формата этих документов. Большинство из -них написаны на специальном языке гипертекстовой разметки, HTML (HyperText -Markup Language) или его диалектах и расширениях. Гипертекст может содержать -ссылки на любые другие документы в Паутине. Формат такой ссылки описывается -стандартом URL (Universal Resource Locator, всеобщий указатель ресурсов). -Всемирность сети HTML-документов образовалась за счёт удобства доступа к ним: -огромное число абонентов Internet предоставляют возможность просмотра этих -документов по специальному протоколу HTTP (HyperText Transfer Protocol), и -ещё большее число (фактически, каждый компьютер) запускают клиентские -программы-навигаторы (или «браузеры», от англ. «browse», «просматривать»), -позволяющие легко «переходить по ссылке», т. е. начинать просмотр документа, -на который в выбранном месте ссылался исходный. Сами документы при этом -принято называть WWW-страницами, или просто страницами. - -Apache -- HTTP-сервер, обладающий самым большим набором возможностей. -Учитывая организованный в нём механизм _подключаемых модулей_ (plug-ins), -создавать которые может любой грамотный программист, описать умения Apache -полностью, видимо, невозможно. Документация по одним только стандартным его -возможностям занимает более 50 тысяч строк. Конфигурационные файлы Apache -хранятся в `/etc/httpd/conf` (или, в зависимости от дистрибутива, `/etc/apache`). -Главный конфигурационный файл -- `httpd.conf`. Этот файл неплохо -самодокументирован: вместе с комментариями в нём много больше тысячи строк, -что позволяет не изучать руководство, если администратор запамятовал -синтаксис той или иной настройки, но, конечно, не позволяет вовсе не изучать -руководства. - -------------------------------------------------------------- -DirectoryIndex index.html index.htm index.shtml index.cgi - -AccessFileName .htaccess - -DocumentRoot "/var/www/html" - - - Options Indexes Includes FollowSymLinks MultiViews - AllowOverride None - Order allow,deny - Allow from all - - -ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" - - AllowOverride None - Options ExecCGI - Order deny,allow - Deny from all - Allow from 127.0.0.1 localhost - -------------------------------------------------------------- - -Пользователь, набравший в браузере `^http://доменное_имя_сервера`, увидит -содержимое каталога, указанного настройкой `DocumentRoot` (в примере -- -`/var/www/html`). Каждый каталог, содержащий WWW-страницы, должен быть описан -группой настроек , включающей права доступа к страницам этого каталога, -настройки особенностей просмотра этих страниц и т. п. В частности, настройка -`DirectoryIndex` описывает, какие файлы в каталоге считаются индексными -- -если такой файл есть в каталоге, он будет показан вместо содержимого этого -каталога. Если в настройке каталога `Options` не указано значение `Indexes`, -просмотр каталога будет вообще невозможен. Значение `Includes` этой настройки -позволяет WWW-страницам включать в себя текст из других файлов, -`FollowSymLinks` позволяет серверу работать с каталогами и файлами, на -которые указывают символьные ссылки (это может вывести точку доступа за -пределы `DocumentRoot`!), а `MultiViews` позволяеет серверу для разных -запросов на одну и ту же страницу выдавать содержимое различных файлов -- -сообразно языку, указанному в запросе. - -Если настройку каталога `AllowOverride` установить в `All`, в любом его -подкаталоге можно создать дополнительный конфигурационный файл, изменяющий -общие свойства каталога. Имя этого файла задаёт настройка `AccessFileName` (в -примере -- `.htaccess`). Доступом к страницам в каталоге управляют настройки -`Order`, `Deny` и `Allow`. Так, доступ к каталогу `/var/www/html` разрешён -отовсюду, а к каталогу `/var/www/cgi-bin` -- только с самого сервера. - -Важное свойство WWW-серверов -- поддержка т. н. динамических WWW-страниц. -Динамическая WWW-страница не хранится на диске в том виде, в котором её -получает пользователь. Она создаётся -- возможно, на основании какого-то -шаблона -- непосредственно после запроса со стороны браузера. Никаких -особенных расширений протокола HTTP при этом можно не вводить, просто сервер -получает запрос на WWW-страницу, которой не соответствует ни один файл. Зато -HTTP-адрес (точнее говоря, URL) этой страницы распознаётся сервером как -динамический и передаётся на обработку выделенной для этого программе. -Программа генерирует текст в формате HTML, который и передаётся пользователю -в качестве запрошенной страницы. В примере для этого используется каталог -`/var/www/cgi-bin`, группа настроек которого имеет единственный параметр -`Options` -- `ExecCGI`. Для того, чтобы этот каталог, в действительности не -входящий в `/var/www/html`, был доступен браузеру как подкаталог `/cgi-bin` -всего дерева, необходимо прикрепить его к `DocumentRoot` с помощью -`ScriptAlias`; эта настройка говорит также и о том, что файлы в этом -каталоге -- сценарии, и их надо запускать, а не показывать footnote:[Конечно, -сами файлы при этом должны быть исполняемыми.]. - -Как и многие другие прикладные протоколы, HTTP был и остаётся текстовым. При -желании можно выучить команды HTTP и получать странички с серверов с помощью -`telnet` вручную. Это означает, что любая система _идентификации_, основанная на -одном только HTTP, будет небезопасна: если передавать учётные данные по HTTP -непосредственно, любой абонент сети на протяжении всего маршрута пакета от -браузера к серверу сможет подглядеть внутрь этого пакета и увидеть там -пароль. Более или менее безопасно можно чувствовать себя, только зашифровав -весь канал передачи данных. Для этого неплохо подходит алгоритм шифрования с -открытым ключом, описанный в разделе <>. -Универсальный способ шифрования большинства текстовых прикладных протоколов -называется SSL, Secure Socket Layer (уровень надёжных сокетов). Идея этого -способа -- в том, что шифрованием данных занимается не само приложение, а -специальная библиотека работы с сокетами, то есть шифорвание происходит на -стыке прикладного и транспортного уровня. Конечно, и клиент, и сервер должны -включать в себя поддержку SSL, поэтому для служб, защищённых таким способом, -обычно отводятся другие номера портов (например, 80 -- для HTTP, и 443 -- для -HTTPS). В Apache этим занимается специальный модуль -- `mod_ssl`, его настройки -и способ организации защищённой службы можно найти в документации. - -Несмотря на то, что Apache решает практически любые задачи, связанные с -организацией WWW-страниц, есть, конечно, и области, где его применение -нежелательно или невозможно. Если, например, задача WWW-сервера -- отдавать -десяток-другой статически оформленных страниц небольшому числу клиентов, -запускать для этого Apache -- как стрелять из пушки по воробьям. Лучше -воспользоваться сервером `thttpd`, специально для таких задач предназначенным: -он займёт намного меньше ресурсов системы. Особая ситуация возникает, когда -самый важный параметр сервера -- его быстродействие. Например сервер, -раздающий т. н. «баннеры» (banners, небольшие картинки рекламного характера), -приносит тем больше дохода, чем быстрее работает, что означает: может -обслуживать больше клиентов. Способ радикально уменьшить время отклика такого -сервера на HTTP-запрос -- оформить его не в виде системной службы, а в виде -модуля ядра. Такой сервер существует в виде дополнений к ядру Linux под общим -названием `tux`. - -=== FTP === - -В Linux существует несколько вариантов службы, предоставляющей доступ к -файлам по протоколу FTP (File Transfer Protocol). Как правило, они отличаются -друг от друга сложностью настроек, ориентированных на разные категории -абонентов, подключающихся к серверу. Если выбор предоставляемых в открытый -доступ данных велик, будет велик и наплыв желающих эти данные получить -(«скачать»), так что возникает естественное желание этот наплыв ограничить. -При этом, допустим, компьютеры из локальной сети могут неограниченно -пользоваться файловыми ресурсами сервера, соединений из того же города или в -пределах страны должно быть не более двух десятков одновременно, а соединений -из-за границы -- не более пяти. Такие ухищрения бывают нужны нечасто, но и -они поддерживаются большинством FTP-служб, вроде `vsftpd`, `proftpd`, -`pure-ftpd` или `wu-ftpd`. - -FTP -- по-своему очень удобный протокол: он разделяет поток команд и поток -собственно данных. Дело в том, что команды FTP обычно очень короткие, и -серверу выгоднее обрабатывать их как можно быстрее, чтобы подолгу не держать -ради них (часто -- ради одной команды) открытое TCP-соединение. А вот файлы, -передаваемые с помощью FTP обычно большие, поэтому задержка при передаче в -несколько долей секунды, и даже в пару секунд, не так существенна, зато -играет роль пропускная способность канала. Было бы удобно, если бы для -передачи команд использовался «быстрый, но тонкий» канал (т. е. среда -передачи данных с малым временем отклика и небольшой пропускной способностью, -например, наземное оптоволокно), а для передачи данных -- «медленный, но -толстый» (например, спутниковая магистраль). - -Для того, чтобы эти каналы было проще различить, данные в FTP пересылаются по -инициативе сервера, что означает, что именно сервер подключается к клиенту, а -не наоборот. Делается это так: клиент подключается к 20-му порту сервера -(управляющий порт FTP) и передаёт ему команду: «Хочу такой-то файл. Буду -ждать твоего ответа на таком-то (временно выделенном) порту». Сервер -подключается со своего 21-го порта (порт данных FTP) к порту на клиенте, -указанном в команде, и пересылает содержимое запрошенного файла, после чего -связь по данным разрывается и клиент перестаёт обрабатывать подключения к -порту. - -Трудности начинаются, когда FTP-клиент находится за _межсетевым экраном_. -Далеко не каждый администратор согласится открывать доступ из любого места -Internet к любому абоненту внутренней сети по любому порту (пускай даже и с -порта 21)! Да это и не всегда просто, учитывая подмену адресов. Для того, -чтобы FTP работал через межсетевой экран, придумали протокол `Passive FTP`. В -нём оба сеанса связи -- и по командам, и по данным -- устанавливает клиент. -При этом происходит такой диалог. Клиент: «Хочу такой-то файл. Но пассивно». -Сервер: «А. Тогда забирай его у меня с такого-то порта». Клиент подключается -к порту сервера и получает оттуда содержимое файла. Если со стороны сервера -тоже находится бдительный администратор, он может не разрешить подключаться -любому абоненту Internet к любому порту сервера. Тогда не будет работать как -раз `Passive FTP`. Если и со стороны клиента, и со стороны сервера есть по -бдительному системному администратору, никакой вариант FTP не поможет. - -Ещё один недостаток протокола FTP: в силу двухканальной природы его трудно -«затолкать» в SSL-соединение. Поэтому идентификация пользователя, если -таковой имеется, в большинстве случаев идёт открытым текстом. Мефодий тут же -вспомнил про своего приятеля, который сначала завёл себе где-то в Сети -бесплатную WWW-страницу, файлы на которую надо было передавать по FTP, а -потом отказался от этой затеи: с утомительным постоянством кто-то под завязку -набивал эту страничку сомнительного вида архивами и программами. Несмотря на -то, что для FTP подходит другой механизм шифрования, называемый TLS, далеко -не все FTP-клиенты его поддерживают, и он оказывается не востребован на -серверах. Поэтому рекомендуется использовать службу FTP только для -организации архивов публичного доступа. - -[[terminalaccess]] -==== Терминальный доступ ==== - -Текстовый интерфейс позволяет пользователю Linux работать на компьютере -удалённо с помощью терминального клиента. Весьма удобно, находясь далеко от -компьютера, управлять им самым естественным способом, с помощью командной -строки. Препятствий этому немного: объём передаваемых по сети данных крайне -невелик, ко времени отклика в полсекунды вполне можно привыкнуть, а если оно -меньше десятой доли секунды, то задержка и вовсе не мешает. Что необходимо -соблюдать строго, так это шифрование учётных записей при подключении к -удалённому компьютеру, а на самом деле, и самого сеанса терминальной связи, -так как в ним вполне может «засветиться» пароль: например, пользователь -заходит на удалённый компьютер и выполняет команду `passwd`. - -Как уже говорилось в этих лекциях, сначала для терминального доступа -использовался протокол `TELNET` и соответствующая пара клиент-сервер -`telnet-telnetd`. От них пришлось отказаться в силу их вопиющей небезопасности. -На смену `TELNET` пришла служба Secure Shell («Надёжная Оболочка»), также -состоящая из пары клиент-сервер -- `ssh` и `sshd`. Шифрование данных в Secure -Shell организовано по принципу «асимметричных ключей», который позволяет -более гибко шифровать или идентифицировать данные, чем более распространённый -и привычный принцип «симметричных ключей». Симметричный ключ -- это пароль, -которым данные можно зашифровать, и им же потом расшифровать. - -Упрощённо метод «асимметричных ключей» можно описать так. Используется -алгоритм, при котором специальным образом выбранный пароль для шифрования -данных не совпадает с соответствующим ему паролем для их расшифровки. Более -того, зная любой один из этих паролей, никак нельзя предугадать другой. -Некто, желая, чтобы передаваемые ему данные нельзя было подсмотреть, раздаёт -всем желающим шифрующий пароль со словами: «будете писать мне -- шифруйте -этим», т. е. делает этот пароль _открытым_. Дешифрующий пароль он хранит в -строгой тайне, никому не открывая. В результате зашифровать данные его -паролем может любой, а расшифровать (что и значит -- подглядеть) -- может -только он. Цель достигнута. - -Тот же принцип используется для создания т. н. _электронной подписи_, -помогающей идентифицировать данные, то есть определить их автора. На этот раз -открытым делается дешифрующий ключ (конечно, не тот, о котором только что шла -речь, а ещё один). Тогда любой, получив письмо и расшифровав его, может быть -уверен, что это письмо написал этот автор -- потому что шифрующим ключом не -владеет больше никто. - -Здесь уместно сделать два замечания. Во-первых, алгоритмы шифрования с -асимметричными ключами весьма ресурсоёмки, поэтому в Secure Shell (и -упомянутом ранее SSL) они используются только на начальном этапе установления -соединения. Обмен данными шифруется симметричным ключом, но, поскольку сам -этот ключ был защищён асимметричным, соединение считается надёжным. Во-вторых -этот кажущийся надёжным алгоритм имеет серьёзный изъян, с которым, впрочем, -нетрудно справиться. Опасность таится в самом начале: как, получив от -`товарища` _открытый ключ_, удостовериться, что этот ключ действительно ему -принадлежит? А вдруг на пути от `товарища` ключ был перехвачен -`злоумышленником`, и до нас дошёл уже его, `злоумышленника`, открытый ключ? -Мы легкомысленно шифруем наши данные этим ключом, `злоумышленник` -перехватывает их на обратном пути, просматривает их (только он и может это -сделать, так как подсунул нам свой шифрующий пароль), и обманывает таким же -манером `товарища`, притворяясь на этот раз нами. - -Такая уязвимость называется `man-in-the-middle` (дословно -«человек-посередине»), своего рода «испорченный телефон». Есть два способа -борьбы с ней. Первый: не доверять никаким открытым ключам, кроме тех, которые -получил лично от `товарища`. Если с `товарищем` вы незнакомы, можете попросить у -него удостоверение личности: а вдруг он всё-таки `злоумышленник`? Второй -способ: получить от `товарища` открытый ключ несколькими независимыми путями. В -этом случае подойдёт т. н. «отпечаток пальца» (fingerprint) -- получаемая из -ключа контрольная сумма такого размера, что подделать её ещё невозможно, но -уже нетрудно сравнить с этой же контрольной суммой, размещённой на -WWW-странице или присланной по электронной почте. - -==== Пересылка почты ==== - -Ещё один немаловажный сервис, отлично поддерживаемый в Linux, -- пересылка -электронной почты. Протокол `SMTP` (Simple Mail Transfer Protocol), задающий -порядок пересылки почты, впервые был описан и помещён в _RFC_ в самом начале -80-х годов. С тех пор он неоднократно модифицировался, однако в основе своей -остался прежним: `SMTP` -- это протокол передачи текстовых сообщений, -снабжённых вспомогательными _заголовками_, часть из которых предназначена для -почтового сервера, передающего сообщения, а часть -- для почтового клиента, с -помощью которого пользователь просматривает эти сообщения. - -=============================================================== -RCF - постоянно пополняемое собрание рабочих материалов (технических отчётов, - проектов и описаний стандартов протоколов), используемых разработчиками - и пользователями Internet. -=============================================================== - -В качестве адреса в электронном письме обычно используется сочетание -пользователь@доменное_имя. Изначально поле пользователь совпадало с _входным -именем_ пользователя в UNIX-системе, а доменное_имя -- с именем компьютера. -Пользователь -- удалённо или через «настоящий» терминал -- подключался к -системе и просматривал почту, скажем, утилитой `mail`. Когда компьютеров в сети -стало больше, выяснилось, что, имея учётные записи на многих машинах, почту -всё-таки удобнее хранить и читать на одной, только для почты предназначенной, -а значит, `доменное_имя` в почтовом адресе может не совпадать с доменным именем -персонального компьютера адресата. Для удобства решили ввести один уровень -косвенности: прежде, чем соединяться с компьютером «доменное_имя», почтовый -сервер проверяет, нет ли в DNS записи вида `доменное_имя ... MX ... сервер`. -Эта запись означает, что почту, адресованную на пользователь@доменное_имя -необходимо посылать компьютеру «сервер», а уж тот разберётся, что делать -дальше. - -Иногда необходимо, чтобы сервер принимал письма, не предназначенные для -зарегистрированных на нём пользователей. Эти письма немедленно помещаются в -очередь на отправку, и пересылаются дальше. Такой режим работы сервера -называется «relay» (пересыльщик). Когда-то все почтовые сервера работали в -режиме «open relay», т. е. соглашались пересылать почту откуда угодно куда -угодно. К сожалению, этим немедленно стали пользоваться желающие -подзаработать массовой рассылкой рекламы (т. е. «спамом»). Поэтому открытые -пересыльшики сегодня запрещены _RFC_. Однако как минимум в трёх случаях сервер -имеет право работать пересыльщиком: если он пересылает почту от абонента -обслуживаемой сети, если письмо адресовано в обслуживаемый домен или его -поддомен, и если письмо исходит непосредственно от почтового клиента -пользователя, который предварительно каким-нибудь способом идентифицировался -в системе (например, с помощью разработанного для этого расширения `SMTPAUTH`). -Во всех трёх случаях ответственность за возможные злоупотребления почтовым -сервисом возлагается на администратора сервера, так как он имеет возможность -отыскать провинившегося пользователя. - -В Linux существует несколько различных почтовых серверов. Во-первых, -`Sendmail`, корифей почтового дела, возникший вместе с `SMTP`. Возможности этого -сервера весьма велики, однако воспользоваться ими в полной мере можно только -после того, как научишься понимать и исправлять содержимое конфигурационного -файла `sendmail.cf`, который уж более двадцати лет служит примером самого -непонятного и заумного способа настройки. Впрочем, на сегодняшний день -вокруг `sendmail.cf` на языке препроцессора `m4` написано несметное, на все -случаи жизни, число макросов, так что `sendmail.cf` редактировать не -приходится. Вместо него из этих макросов составляется файл `sendmail.mc`, -небольшой и вполне читаемый, а он, с помощью утилиты `m4`, транслируется в -`sendmail.cf`, который не читает никто, кроме самого `Sendmail`. К сожалению, -упростить исходный текст этой программы невозможно, поэтому специалисты по -компьютерной безопасности не любят давать относительно неё гарантии: редко, -но находится в `sendmail` какая-нибудь замысловатая уязвимость. - -Другой вариант почтового сервера, `Postfix`, весьма гибок в настройке, -прекрасно подходит для почтовых серверов размера предприятия, и, в отличие -от `Sendmail`, более прозрачно спроектирован и написан. Он поддерживает все -хитрости, необходимые современной почтовой службе: виртуальных пользователей, -виртуальные домены, подключаемые антивирусы, средства борьбы со спамом и т. -п. Настройка его хорошо документирована, в том числе и с помощью комментариев -в конфигурационном файле (как правило, `/etc/postfix/main.cf`, и с помощью -файлов-примеров. - -Стоит упомянуть ещё как минимум три почтовых службы: QMail -- по мнению -многих, эта системная служба наиболее защищена и от атак со стороны, и от -возможных и несуществующих ошибок в собственных исходных текстах; Exim -- как -наиболее гибкий в настройках (в том числе и пока не реализованных); и -ZMailer, предназначенный для работы на больших и очень больших серверах, -выполняющих, в-основном, работу по пересылке. - -==== Доступ к почтовым ящикам ==== - -Электронная почта нужна далеко не только тем, кто имеет терминальный доступ -Linux-машине. Доступ к _почтовому ящику_ на сервере не должен зависеть от того, -есть ли у данного пользователя право запускать на этом сервере какие-то -программы. Для этого необходимо организовать специальную службу, -предоставляющую пользователю только возможность манипулировать сообщениями в -своём ящике с помощью программы-клиента. Самые популярные протоколы доступа к -ящикам -- POP3 (Post Office Protocol версии 3) и IMAP4 (Internet Message -Access Protocol версии 4). - -POP3 -- довольно простой протокол, в нём определён единственный почтовый ящик -пользователя, где тот может посмотреть список заголовков сообщений, -прочитать (скачать) некоторые из них и удалить некоторые из них. Такой -протокол удобен, когда пользователь хранит всю переписку на своём компьютере, -а удалённый почтовый ящик служит исключительно для приёма входящей почты. -Протокол IMAP4 гораздо сложнее: в нём разрешено заводить несколько ящиков на -сервере, в том числе и вложенных подобно каталогам. Каждый их этих ящиков -может обладать особыми свойствами: может быть входящим (тогда пользователь -уведомляется о новых поступлениях в этот ящик), мусорной корзиной (сообщения -из которой удаляются после того, как устареют), и даже быть исходящим (в -такой ящик пользователь складывает новые письма, а сервер их через некоторое -время отсылает, удаляя оттуда). IMAP4 подходит для ситуации, когда -пользователь не имеет возможности хранить свою переписку и/или обрабатывать -её с одного и того же компьютера, поэтому хранит её в ящиках на сервере. -IMAP4 используют и в качестве «движка» т. н. WEB-почты, этого заменителя -почтовых клиентов для торопливых. - -В большинстве случаев с помощью одного и того же почтового клиента можно и -просматривать электронные письма в ящиках, и создавать новые письма, и -отсылать их. Это сделано для удобства пользователя, однако стоит понимать, -что общее у этих трёх действий -- только формат сообщения. Строго говоря, при -доступе к почтовому ящику совершенно неважно, каким путём там оказалось -письмо, а при пересылке почты никак не определяет, каким способом -пользователь будет её читать. Что касается написания письма -- чьё же это -дело, как не текстового редактора? - -Как водится, в Linux есть несколько IMAP/POP-серверов. Наиболее мощный из -них -- Cyrus (его авторы участвовали в разработке протокола IMAP4), в нём -поддерживается больше всего дополнений и расширений IMAP, которые бывает -удобно использовать, наиболее простой -- UW-IMAP, разрабатываемый в -университете штата Вашингтон. UW-IMAP вообще не имеет конфигурационного -файла: пользователи, пароли, входящие почтовые ящики и домашние каталоги для -личных почтовых ящиков берутся системные (при этом вместо командного -интерпретатора почтовому пользователю можно выдать `/sbin/nologin` или -`/usr/bin/passwd`). Сервер Binc можно рекомендовать на системах, использующих -QMail, интеграция с которым других IMAP-серверов имеет некоторые -шероховатости, а сервер Dovecot -- тем, кто, как и его авторы, в первую -очередь озабочен надёжностью работы сервиса footnote:[Точнее, потенциальной -ненадёжностью, так как все перечисленные службы, конечно, тоже работают -исправно.]. - -Протоколы POP3 и IMAP4, как и многие другие, -- текстовые. Как и в -большинстве других протоколов, это порождает проблему передачи пароля в -открытом виде. Решается она так же, как и для других протоколов -- -«заворачиванием» всего сеанса в SSL (порту 110–POP3 соответствует порт -995–POP3S, а порту 143–IMAP4 -- 993–IMAPS), либо использование -внутрисеансового шифрования с помощью TLS. Кроме того, в протоколе POP3 есть -и собственное расширение, APOP, решающее ту же задачу. Здесь Мефодий опять -вспомнил своего незадачливого приятеля: чтобы не сильно задумываться, тот -всегда использовал один и тот же пароль, в том числе и для доступа к почте по -протоколу POP3 безо всяких `SSL/TLS/APOP`... Увы, и эта беззаботность ему даром -не прошла: однажды его учётной записью кто-то воспользовался для отсылки -почты с помощью `SMTPAUTH`. Конечно же, это оказался спам, и приятель ещё долго -расхлёбывал неприятности. - -[[desktop]] -== Графический интерфейс в Linux == - -На протяжении предыдущих лекций Мефодию ни разу не потребовалось для -выполнения своих задач покидать пределы текстового терминала. Что и понятно, -в основном он занимался освоением самой системы Linux, а главные средства -управления ею -- командная строка и текстовый редактор. Тем не менее, для -современного пользователя персональный (да и вообще любой) компьютер -- это -не в последнюю очередь устройство с широкими графическими возможностями, и -часть задач, которые должен выполнять компьютер для пользователя, -- -непосредственно графической природы, например, показ фильмов или создание -изображений. Но такими специфическими задачами использование графического -интерфейса не ограничивается. - -Графические средства ввода-вывода позволяют организовать интерфейс, -принципиально отличающийся от терминала -- _оконный_. На сегодняшний день любому -пользователю компьютера знакома такая модель организации графического -интерфейса: окна, меню, кнопки. Оконный интерфейс позволяет использовать -пространство экрана гораздо более эффективно, чем обыкновенный текстовый -терминал на виртуальной консоли: здесь одновременно можно открыть несколько -окон, относящихся к разным задачам, и наблюдать за их работой одновременно. -Собственно, в рамках окна может выполняться любая задача, в частности -- -текстовый терминал! При помощи оконного интерфейса пользователь Linux может -следить за несколькими задачами на разных терминалах одновременно, а не по -очереди. - -===================================================== -Оконный интерфейс:: - модель интерфейса, в которой пространством ресурсов является экран -- - прямоугольная область, в которой организуется ввод и вывод. Субъектами - в оконном интерфейсе выступают задачи, вводящие и выводящие данные в - рамках окна -- области в рамках экрана. -===================================================== - -Однако все задачи управления системой в Linux решаются посредством текстового -терминала, да и очень многие задачи пользователя -- как заметил Мефодий даже -по своему небольшому опыту -- тоже, поэтому никакой системной необходимости в -графических средствах ввода-вывода в Linux нет. Графический интерфейс в -Linux -- это отдельная задача, наподобие _системной службы_, поэтому в -некоторых системах может даже вовсе отсутствовать программное обеспечение для -организации графического интерфейса footnote:[Такие системы -- не -теоретическая выдумка, они вполне реальны и многочисленны. Например, -графический интерфейс совершенно ни к чему на сервере, который занимается -только маршрутизацией пакетов в сети.]. Такая задача получает единоличный -доступ к устройству графического вывода (видеокарта), а программам, -использующим графические ресурсы, она предоставляет объектную модель -графических примитивов (функции рисования линий, прямоугольников, отображения -цвета и т. п.), наподобие того, как ядро предоставляет доступ к ресурсам -жёсткого диска в терминах объектной модели файловой системы. Поэтому весь -комплекс программ для работы с графическими устройствами принято называть -_графической подсистемой_. - -Пользователю домашнего настольного компьютера графический интерфейс почти -наверняка понадобится при каждом сеансе работы. Можно настроить систему таким -образом, чтобы процесс начальной загрузки завершался запуском графической -подсистемы, так что даже регистрация пользователей будет происходить уже в -графическом режиме при помощи специальной программы -- _экранного диспетчера_ -(см. лекцию <>). Экранный диспетчер опознать -очень просто: он всегда отображает окно с приглашением к регистрации `login`: -и `password`:, которое может быть оформлено и минималистично, и с барочной -пышностью. После регистрации в экранном диспетчере пользователю -предоставляется сразу и доступ к системе, и доступ к графической подсистеме. - -Однако ни в одной из систем, в которых работает Мефодий, ему не случалось -встречаться с экранным диспетчером, и всюду он регистрировался в системе и -работал только в текстовом режиме на виртуальной консоли. Поскольку -графическая подсистема -- отдельная задача, авторизованный пользователь может -запустить ей из командной строки в любой момент footnote:[Каким пользователям -разрешено запускать и останавливать графическую систему -- зависит от профиля -системы.], для этого используется команда `startx`, которую Мефодий и исполнил. - -image::images/startx.ppm.bz2.png[Запуск графической подсистемы из командной строки] - -В некоторое недоумение поставил Мефодия предложенный ему выбор из нескольких -кнопок. Проконсультировавшись у Гуревича, он выяснил, что каждая из кнопок -соответствует программе, по-своему организующей графический интерфейс, и что -он может попробовать все по очереди и выбрать ту, которая будет наиболее -подходящей для его стиля работы. Не мудрствуя лукаво, Мефодий нажал на первую -же кнопку, обозначенную «KDE». - -image::images/kde-start.ppm.bz2.png[Запуск KDE] - -После некоторого ожидания на мониторе возникло всё то, что Мефодий ожидал -увидеть в графическом интерфейсе: иконки, панель с кнопками внизу экрана, -меню. Однако если бы после запуска startx Мефодий выбрал другую кнопку вместо -«KDE», графический интерфейс предстал бы перед ним совсем в другом виде и -предоставлял бы несколько другие возможности и приёмы работы. Далее в лекции -объясняется устройство графической подсистемы в Linux. Станет понятно, почему -процесс запуска графического интерфейса оказался таким двухступенчатым и -почему работа с графическим интерфейсом в Linux может быть организована -по-разному. - -=== X Window System === - -======================================== -Обратите внимание на то, что все заглавные буквы «X» в этой лекции -- латинские. -======================================== - -На свете существует множество графических устройств, управление которыми на -низком уровне (вывод изображений и ввод данных, например, о перемещении -мыши) -- задача совсем не для пользователя, тем более, что каждый вид -устройства управляется по-своему. Заботы о вводе и выводе на низком уровне -берёт на себя _графическая подсистема_ Linux -- _X Window System_, предоставляя -пользовательским программам возможность работать в терминах оконного -интерфейса. - -_X Window System_ появилась всё в той же UNIX, проект этот был настолько -наукоёмок и настолько полно охватывал тогдашнюю область задач, связанную с -графикой, что ему так и не возникло никаких серьёзных альтернатив. - -==== X-сервер и X-клиенты. Протокол X11 ==== - -X Window System использует традиционную оконную модель, в которой -пространством ресурсов является _экран_. Экран -- это прямоугольник, на котором -отображаются команды графического вывода и организуется обратная связь с -устройствами графического ввода. Пример обратной связи -- указатель мыши. -Сама мышь -- довольно простое устройство ввода, способное передавать -информацию о его перемещении и состоянии кнопок. Указатель же отображает -мнение подсистемы об абсолютных координатах гипотетической «точки ввода». - -image::images/focus.ppm.bz2.png[Расположение точки ввода (фокус)] - -В примере указатель мыши показывает расположение точки ввода (на кнопке -«WindowMaker»). Если сейчас Мефодий нажмёт на левую клавишу мыши, графическая -подсистема зафиксирует это событие ввода и передаст его той задаче, которой -принадлежит соответствующая кнопка. Именно задачи (а не сидящий за монитором -пользователь) и являются субъектами для _X Window System_, между ними -разделяются графические ресурсы. Каждой задаче принадлежит одно или несколько -_окон_, представленных некоторой (как правило, прямоугольной) частью экрана. -Внутри окна выполняются графические операции (вывод) и именно окнам -передаётся поток данных от устройств ввода. Какое окно получит события ввода --- определяется с помощью синтетического понятия _фокус_: вводимые данные -передаются от графической подсистемы только тому окну, которое «получило -фокус», по умолчанию это происходит, когда указатель мыши попадает в часть -экрана, занимаемую этим окном. - -В более сложном случае окна могут перекрываться, частично занимая один и тот -же участок экрана. Если дополнительно постановить, что каждое из них лежит на -своей глубине, то самое «верхнее» будет отображаться полностью, и ему будет -доступен для вывода и получения фокуса весь заказанный прямоугольник. -Следующее за верхним окно может быть им «загорожено», тогда отображается -только часть этого окна, которую «видно из-под» верхнего. Заметим, что -выводить это окно может в пределах всего заказанного прямоугольника, просто -видно может быть не всё, и управление фокусом будет происходить на основании -видимой части окна. - -Программа, которая отвечает за работу с устройствами графического ввода и -вывода и обеспечивает при этом логику оконной системы, называется _X-сервером _ -(X Server, то есть сервер системы «Икс»). В рамках _X Window System_, X-сервер --- это ядро. Подобно ядру, он выполняет низкоуровневые операции и -взаимодействует с аппаратурой, ничего самостоятельно не предпринимая. Подобно -ядру, он предоставляет задачам унифицированный интерфейс к этим -низкоуровневым функциям, а также занимается разделением доступа (окно и -фокус) к графическим ресурсам. X-сервер не волнует, отчего эти задачи вообще -появляются и чем живут. Он только принимает _запросы_ на выполнение графических -действий и передаёт по назначению вводимые данные. Жизнеобеспечение процессов -и даже способ передачи X-запросов -- дело исключительно операционной системы, -по отношению к которой и сам X-сервер -- задача. - -Задачи, которые обращаются к X-серверу с запросами, называются _X-клиентами_. -Обычно X-клиент сначала регистрирует окно (можно несколько), которое и будет -ему полем ввода-вывода. Потом он сможет рисовать в этом окне и обрабатывать -происходящие с окном _события_: активность устройств ввода и изменение свойств -самого окна (размер, перемещение, превращение в иконку, закрытие и т. п.). -X-клиент в Linux -- это процесс, запускаемый обычно в фоне (не связанный по -вводу с терминальной линией). В самом деле, зачем процессу читать с -терминала, когда для ввода он может использовать X-сервер? Если с X-сервером -связаться не удастся, на стандартном выводе ошибок может появиться -какое-нибудь сообщение -- его легко перенаправить в файл. - -======================================== -X-сервер:: - программа, принимающая и обрабатывающая X-запросы. -======================================== - -Клиент передаёт серверу X-запросы любым доступным ему способом. В разных -версиях Linux, например, могут использоваться различные объекты файловой -системы (чаще всего -- т. н. _сокеты_, сходные по функциональности с -двунаправленными каналами). Во многих случаях запросы передаются по сети, при -этом неважно, какой именно транспортный уровень будет использован для -соединения клиента с сервером (в современных системах это, чаще всего, сеть -TCP/IP и протокол TCP). Главное, чтобы клиент посылал стандартные запросы, -соответствующие определённому _протоколу_ обмена данными. Кстати сказать, -другое имя _X Window System_ -- X11 (или X11R6) -- это просто номер версии -X-протокола, стандартизирующего X-запросы, при этом «R6» обозначает номер -подверсии (revision) и вполне может увеличиться, если X11R6 устареет -настолько, что потребует нового пересмотра (revision). - -«Голый» X-сервер, к которому ни присоединён ни один X-клиент, можно запустить -из командной строки, для этого достаточно выполнить команду «X» (одна -заглавная латинская буква X). Именно так и поступил Мефодий, текстовая -консоль сменилась чёрным экраном без всяких окон footnote:[В некоторых -вариантах X Window System экран по умолчанию раскрашивается в чёрно-белую -крапинку.]. - -На экране есть только крест, который перемещается при перемещении мыши -- -курсор. Эта картина означает, что X-сервер запущен корректно, установил -необходимую связь с устройствами графического ввода и вывода, и ожидает, -когда к нему с _X-запросами_ обратится какой-нибудь X-клиент. Однако для -пользователя, пока не запущено ни одного X-клиента, X-сервер совершенно -бесполезен: кроме перемещения курсора ничего и невозможно сделать. Мефодий -мог бы растеряться, оказавшись перед чёрным экраном X-сервера, если бы не -знал о том, что может переключиться обратно на любую виртуальную консоль, -нажав сочетание клавиш *Ctrl + Alt + F N*, где *N* -- номер консоли от 1 до 12 -footnote:[Эта функция не будет работать, если в конфигурационном файле -X-сервера включён параметр «DontVTSwitch».]. Переключиться обратно на экран, -управляемый X-сервером, он сможет комбинацией клавиш *Ctrl + Alt + F7*. - -==== DISPLAY ==== - -Чтобы начать работу с графической средой, _X-клиенты_ должны каким-то образом -доставить свой запрос X-серверу, для этого у X-сервера должен быть какой-то -точный адрес. Адрес X-сервера, к которому должны обращаться с запросом -X-клиенты, хранится в _переменной окружения_ `DISPLAY`. Формат `DISPLAY` прост: -`способ_доступа:номер_сервера.номер_экрана`. Под способом доступа может -подразумеваться сеть (тогда используется сетевой адрес машины с X-сервером) -или какой-нибудь ещё механизм, принятый в конкретной системе. Если не -написать ничего, будет выбран способ по умолчанию. Номер сервера нужен для -различения разных X-серверов, запущенных на одном компьютере. В Linux можно -запустить несколько X-серверов и переключаться между ними как между -виртуальными консолями -- с помощью *Ctrl + Alt + F7*, *Ctrl + Alt + F8* и т. д. -В системе может быть несколько виртуальных серверов (см. раздел -<>). Все они должны иметь разные номера. -Наконец, один сервер может работать с несколькими экранами -- и физически -(есть видеокарты с выходами на несколько мониторов), и виртуально (вот тут уж -никаких ограничений нет). Правда, это бывает нечасто, и номер экрана тоже -можно не указывать. - -Адрес X-сервера, запущенного Мефодием, будет выглядеть так: `:0` -- поскольку -сервер запущен на той же машине, на которой работает Мефодий, можно -использовать способ доступа по умолчанию (поэтому адрес начинается с -двоеточия), поскольку сервер единственный, он получил номер `0`, а экран -можно не указывать. Теперь Мефодий может в любой командной оболочке (shell) -указать адрес X-сервера в переменной `DISPLAY`, так что любой запущенный из -этой shell X-клиент унаследует это значение и будет отправлять X-запросы тому -серверу, который запустил Мефодий. - ------------------------------------------------------------ -methody@susanin:~ $ export DISPLAY=:0 -methody@susanin:~ $ echo $DISPLAY -:0 -methody@susanin:~ $ xcalc & ------------------------------------------------------------ - -В результате этих действий изменился экран X-сервера: в левом верхнем углу -открылось окно калькулятора -- xcalc. Произошло следующее: при запуске `xcalc` -проверил значение переменной `DISPLAY` и направил _X-запрос_ по указанному там -адресу; по запросу от X-клиента (xcalc) X-сервер выделил ему окно и выполнил -необходимые операции графического вывода, чтобы отрисовать содержимое окна -(опять же, по запросам `xcalc`). Теперь при помощи мыши и клавиатуры, -переместив точку ввода на это окно, вполне можно что-нибудь вычислить, однако -ни переместить окно, ни изменить его размер, ни свернуть -- те операции, к -которым так привыкли пользователи оконного интерфейса -- сам X-сервер не -выполняет, для этих операций требуется специальная программа -- _диспетчер -окон_, о которой речь пойдёт ниже. - -image::images/xcalc.ppm.bz2.png[Запуск X-клиента] - -С помощью специальных X-запросов можно изменить вид и поведение самого -X-сервера из той же командной оболочки, в которой установлена переменная -окружения `DISPLAY`. Например, команда `xsetroot -solid green &` изменит цвет -фона на экране сервера на зелёный. - -Итак, X-сервер запускается на одном компьютере, а X-клиенты вполне могут -работать на других (причём на нескольких!), посылая ему запросы. С точки -зрения человека, сидящего за (обратите внимание!) X-сервером, каждый такой -клиент представлен в виде окна. Требования к аппаратуре на машинах, -запускающих X- клиенты, будут изрядно отличаться от требований к аппаратуре -машины для X- сервера. Типичная машина с X-сервером -- это рабочее место -(workstation). Она должна быть оборудована качественными устройствами -ввода-вывода -- монитором, видеокартой, клавиатурой и мышью. Что же касается -её вычислительных способностей, то их должно быть достаточно для выполнения -X-запросов, и только. Такой компьютер не обязан работать под управлением -Linux, на нём даже может вообще не быть операционной системы! В восьмидесятые -годы выпускались подобные устройства, называемые «X-терминал» (X terminal). - -======================================== -X-клиент:: - программа, осуществляющая ввод и вывод графических данных при помощи - X-запросов, обрабатываемых X-сервером. -======================================== - -В отличие от машины с X-сервером, компьютер для запуска X-клиентов может -совсем не иметь устройств графического ввода-вывода. Его задача в том, чтобы -все X-программы и запустившие их пользователи не мешали друг другу работать. -На такой машине нужна хорошо настроенная операционная среда, с достаточным для -запуска многих процессов быстродействием и объёмом оперативной памяти. Пара -X11R6–Linux весьма неплохо работает на т. н. бездисковых комплексах. Рабочие -станции в таких комплексах -- самые настоящие X-терминалы, они не имеют -жёстких дисков. Вся работа происходит на центральном компьютере, с которого -на рабочую станцию загружается по сети урезанный вариант системы, достаточный -для запуска X-сервера, и сам X-сервер. В таких комплексах администрировать -нужно одну только центральную машину, они надёжнее компьютерных залов и, что -немаловажно, стоят дешевле, причём в качестве X-терминалов можно использовать -и довольно маломощные, пожилые компьютеры. - -[[virtualserver]] -==== Виртуальный сервер ==== - -Одно из многих достоинств X-протокола -- в том, что X-сервером может служить -любая программа, исполняющая X-запросы, а работает ли она на самом деле с -каким-нибудь графическим устройством или только притворяется -- неважно. -Протоколом `X11R6` пользуется сервер печати `Xprt`, который выводит на принтер -все X-запросы или `Xvnc` -- X-сервер, управлять которым по специальному -протоколу можно с нескольких машин. С помощью `Xvnc` можно устраивать показ -работы какого-нибудь X-клиента по сети, при этом все пользователи -одновременно смогут гонять по экрану один и тот же указатель мыши (что, -конечно, можно и запретить). - -Виртуальный X-сервер может вообще никаких действий не выполнять, а только -передавать X-запросы куда-нибудь дальше, например, «настоящему» X-серверу. -Так поступает системная служба Secure Shell, `sshd` (программа терминального -доступа, о которой шла речь в лекции <>), переправляя X-запросы X-серверу в зашифрованном виде. Этим -свойством `sshd` можно воспользоваться, если сообщение по X-протоколу между -двумя компьютерами невозможно (запрещено межсетевым экраном), или вы считаете -такое соединение небезопасным. - ------------------------------------------------------------ -methody@sakura:~ ssh methody@fuji - methody@fuji's password: - Last login: Sat Dec 25 13:26:40 2004 from localhost -methody@fuji:~ $ xcalc - Error: Can't open display: -methody@fuji:~ $ export DISPLAY=sakura:0 -methody@fuji:~ $ xcalc - Error: Can't open display: sakura:0 -methody@fuji:~ $ logout - Connection to fuji closed. -methody@sakura:~ ssh -X methody@fuji - methody@fuji's password: - Last login: Sun Dec 26 11:13:08 2004 from sakura.nipponman.ru -methody@fuji:~ $ echo $DISPLAY - localhost:10.0 -methody@fuji:~ $ xcalc - # работает :) ! ------------------------------------------------------------ - -Допустим, Мефодий хочет запустить X-клиент (например, `xcalc`) на другой машине -в локальной сети -- `fuji`, где у него есть учётная запись (тоже `methody`). -После всех операций, проделанных в примере, на экране X-сервера на локальной -машине Мефодия (за которой он сидит), появится ещё одно окно `xcalc`, при этом -этот `xcalc` в действительности запущен на машине `fuji` и все вычислительные -операции выполняются именно там. - -Системная служба SSH заводит виртуальный X-сервер на удалённой машине, причём -`номер_сервера` обычно заводится таким, чтобы не пересекаться с X-серверами, -которые могут быть запущены на этой машине (в примере номер_сервера равен -10). Виртуальный `sshd-X` сервер принимает все X-запросы с того же компьютера и -передаёт их -- в зашифрованном виде -- на компьютер, где запущен `ssh` и -не виртуальный X-сервер. Здесь все X-запросы вынимаются из SSH-«водопровода» и -передаются местному серверу, как если бы они исходили от местного X-клиента -(так оно и сеть: этот клиент -- `ssh`). - -==== XFree86 и XOrg ==== - -Наиболее распространённая версия реализации X11R6 называется XFree86. Эта -графическая подсистема изначально проектировалась как реализация X11R5 для -машин архитектуры i386 -- самых распространённых на сегодня персональных -компьютеров. Главная особенность этой архитектуры -- бесчисленное многообразие -устройств графического вывода (т. н. видеокарт) и непрестанное нарушение их -разработчиками всех мыслимых стандартов. Поэтому главной задачей создателей -XFree86 было устроить гибкую структуру компоновки и настройки X-сервера в -соответствии с подвернувшимся под руку устройством графического вывода, а -заодно и ввода, потому что клавиатур, мышей и заменяющих их устройств на -свете тоже немало. Сегодня XFree86 существует для многих архитектур и многих -операционных систем. - -В последние годы параллельно с XFree86 развивается основанная на тех же -исходных текстах _X Window System_ графическая подсистема XOrg. До недавнего -времени по спектру поддерживаемого оборудования, архитектур и -функциональности XOrg мало чем отличалась от XFree86, и сейчас они примерно -эквивалентны с точки зрения пользователя. Однако направления развития этих -двух проектов, состав их разработчиков и лицензионная политика несхожи. В -ближайшем будущем вполне вероятно, что Xorg обгонит XFree86 и по -возможностям, и по частоте использования. - -==== Конфигурация X-сервера ==== - -Чтобы приспособить графическую подсистему (в любой реализации) к имеющемуся -оборудованию, требуется организовать соответствующий _профиль_. Профиль -графической подсистемы находится в каталоге `/etc/X11`, основной -конфигурационный файл `XFree86` называется `XF86Config-4` footnote:[Цифра 4 -появилась в названии этого файла c выходом версии 4.0 `XFree86`, в этот момент -изменился синтаксис конфигурационного файла по сравнению с предыдущими -версиями. При этом часть старого оборудования не поддерживается четвёртой -версией `XFree86`, поэтому для такого оборудования приходится использовать -более ранние версии, для которых конфигурационный файл сохраняет старое -название, `XF86Config`.], именно его считывает при запуске X-сервер. -Конфигурационный файл `XOrg` называется `xorg.conf`, а при его отсутствии -используется файл `XF86Config`. - -Мы рассмотрим конфигурацию графической подсистемы на примере `XFree86`. Файл -`XF86Config-4` структурирован: состоит из нескольких обязательных разделов, -которые могут следовать в любом порядке. В раздел объединяется часть профиля, -связанная с одной из сторон деятельности X-сервера. Каждый раздел имеет такую -структуру: - ------------------------------------------------------------ -Section "НазваниеРаздела" -КлючевоеСлово "Параметры" -. . . -EndSection ------------------------------------------------------------ - -Внутри раздела содержатся записи, каждая из которых занимает обычно одну -строку и задаёт значение для одного из параметров _профиля_ `XFree86`. В начале -записи стоит КлючевоеСлово, за которым следуют Параметры, количество и формат -которых зависит от ключевого слова. Ниже приводится список обязательных -разделов с краткими аннотациями, для чего они служат. - ------------------------------------------------------------ -Files Пути к файлам с ресурсами, необходимыми X-серверу -ServerFlags Общие параметры X-сервера -Module Расширения, которые следует загрузить -InputDevice Описание устройств ввода -Device Описание устройства вывода (видеокарты) -Monitor Описание монитора -Modes Описание видеорежимов -Screen Описание экрана (связывает монитор и видеокарту) -ServerLayout Конфигурация сервера ------------------------------------------------------------ - -Почти каждый из перечисленных разделов может присутствовать в -конфигурационном файле в нескольких экземплярах, например, может быть -несколько разделов (`InputDevice`), описывающих разные устройства ввода (разные -мыши и клавиатуры). Однако эти разделы не равноправны, а образуют -иерархическую структуру, самым главным (корневым) элементом которой является -конфигурация сервера (`ServerLayout`). В этом разделе указывается, какие именно -из описанных в файле устройств ввода (разделы `InputDevice`, как минимум два -- -для клавиатуры и мыши) и вывода (`Screen`, который связывает в единое -устройство вывода монитор и видеокарту, ссылаясь на их описания в -соответствующих разделах) будут использованы при работе X-сервера. В каждом -разделе присутствует строка `Identifier` «идентификатор»», именно эта строка -используется для выбора нужного из однотипных устройств в разделе -`ServerLayout`. Например, на машине, где работает Мефодий, общая конфигурация -сервера выглядит так: - ------------------------------------------------------------ -Section "ServerLayout" - Identifier "layout1" - Screen "screen1" - InputDevice "Mouse1" "CorePointer" - InputDevice "Keyboard1" "CoreKeyboard" -EndSection ------------------------------------------------------------ - -Соответственно, при запуске сервера будут использованы тот раздел `Screen`, в -котором содержится запись `Identifier` `screen1`, мышь `Mouse1` и клавиатура -`Keyboard1`. - -Чтобы разобраться в подробностях каждого раздела, требуются определённые -познания в работе и характеристиках устройств ввода и вывода, поэтому здесь -мы не будем приводить конкретных примеров. Подробно о формате `XF86Config` -можно прочитать в соответствующем руководстве `XF86Config(5)`. Для многих -пользователей будет достаточно профиля графической подсистемы, созданного -одним из существующих мастеров, самый известный из которых -- `xf86config`. Во -многих дистрибутивах имеются собственные полуавтоматическме утилиты -настройки X11. С их помощью можно создать более или менее подходящий профиль, -не вникая в тонкости, нередко -- непосредственно при установке системы. Во -всяком случае, у пользователя всегда остаётся возможность корректировать -профиль вручную, отредактировав конфигурационный файл. Простой -конфигурационный файл можно получить, запустив X-сервер с ключом `-configure` -из-под суперпользователя. При этом в текущем каталоге создастся файл -`XF86Config.new`, в котором X-сервер сохранит результаты автоматического -определения внешних устройств. - -==== Модули и расширения ==== - -Требование гибкости привело к тому, что в реализации `XFree86` и `XOrg` -графическая подсистема стала совсем уже похожа на операционную систему. Сам -X-сервер играет роль ядра. Запускаясь, сервер подгружает драйверы -- -специальные компоненты, работающие с выбранной видеокартой, и модули -- -компоненты, расширяющие функциональные возможности сервера (в -конфигурационном файле `XF86Config` необходимые модули перечисляются в разделе -Modules). Есть весьма нужные расширения, вроде `glx` (высокоуровневые функции -трёхмерной графики) или `freetype` (поддержка шрифтов TrueType), а есть -экзотические, которые иногда могут понадобиться, например, `RECORD`, позволяющее -записывать, а после -- «проигрывать» все происходящие с сервером события. - -_Расширения_ называются так ещё и потому, что их возможности расширяют сам -протокол `X11R6`. Вместо того, чтобы изменять протокол всякий раз, когда в -голову придёт очередная ещё не реализованная в нём возможность, создатели X11 -предусмотрели стандартный способ дополнения этого протокола. При этом X- -клиент, желающий воспользоваться определённым расширением, всегда может -спросить у X-сервера, поддерживается ли оно, и действовать по обстановке. - -=== X-приложения === - -Программный продукт, использующий X11, называется _приложением_ (application, -другое значение -- «применение»). Если считать, что сами графические -возможности уже реализованы X-сервером и библиотеками, то программа и на -самом деле окажется приложением к системе, и вся её заслуга будет состоять в -том, что она применила эти возможности для решения своей задачи. - -==== Эмулятор терминала ==== - -С графикой или без, основным интерфейсом управления Linux была и остаётся -командная строка. X11, предлагая иной способ взаимодействия с компьютером, не -должна лишать пользователя возможности работать с самой системой испытанным и -эффективным методом -- через терминал. Поэтому первое совершенно необходимое -X-приложение должно предоставлять возможность доступа к терминалу в _X Window -System_. - -Задача дать пользователю X11 командную строку решается довольно легко. Нужно -завести X-приложение, окно которого работает аналогично окну терминала: -передаёт символьную информацию от пользователя системе и обратно. Делается -это уже описанным в лекции <> -механизмом псевдотерминалов `tty/pty` (или `pts/ptmx`): X-приложение получает -во владение специальное устройство типа `pty`, связанное по вводу и выводу с -терминальным устройством типа `tty`, с которым работает shell. Общее название -таким программам -- _эмулятор терминала для X11 (xterm)_. Мефодий может -запустить `xterm` всё из той же виртуальной консоли, в которой определено -значение переменной окружения `DISPLAY` и получить доступ к командной строке -уже из графической оболочки. - -image::images/xterm.ppm.bz2.png[Эмулятор терминала для X11 -- xterm] - -В левом верхнем углу открылось окно `xterm`, которое легло «поверх» открытого -ранее `xcalc`. В открывшемся окне `xterm` Мефодий увидел привычное приглашение -командной строки `bash`: теперь из этой командной строки можно выполнять любые -команды, в том числе и запускать новые X-приложения, например, ещё один -`xterm`. Чтобы при этом избежать наложения окон друг на друга, можно запустить -`xterm` с параметром `-geometry +150+150`, что заставить X-сервер выдать ему -окно, верхний левый угол которого отстоит на 150 экранных точек (пикселей) от -левой границы экрана, и на 150 же -- от левой. В этом `xterm` значение `DISPLAY` -унаследовано от родительского процесса и равно `:0`, так что окна всех -запущенных из него X-приложений откроются на этом же экране. - -Не следует путать программу `xterm` со способом организации рабочей станции (т. -н. «X-терминал»): термины эти созвучны, но относятся к разным областям -знаний. Нередко бывает, что на экране X-терминала (компьютера) есть окно -терминала X11 (программы `xterm`). `XTerm` передаёт сигналы как настоящий -терминал, имеет богатый набор управляющих последовательностей (унаследованный -от устройства `DEC VT102/VT220`), а вдобавок позволяет воспользоваться всеми -преимуществами графической среды: выбрать шрифт, запомнить текст на экране -(даже тот, что уже исчез с экрана) и многое другое. - -Кстати сказать, копирование текста при помощи мыши -- свойство совсем не -только `XTerm`. На самом деле любое окно, зарегистрированное в X11 как -текстовое, позволяет отметить (при постоянно нажатой первой кнопке или -последовательными нажатиями третьей) часть текста. Выделенный текст можно -немедленно вставить в любое окно текстового ввода нажатием второй кнопки. -Утилита `xcutsel` предоставляет возможность работы с буфером обмена `cutbuffer`), -в котором текст может храниться сколь угодно долго. - -==== Сеанс работы с X11 ==== - -Как догадался Мефодий, команда `startx` делает несколько больше, чем просто -запуск X-сервера, она кроме того запускает несколько _X-приложений_. Для -удобной работы в X11 пользователю прямо при запуске графической подсистемы -потребуется сразу несколько приложений. Во-первых, нужно запустить -приложение, которое позволит управлять окнами (как минимум перемещать их), -чего не делает сам X-сервер, такие приложения называются _диспетчеры окон_ и -будут обсуждаться немного позднее. Кроме того, полезно сразу запустить разные -мелкие программки, вроде индикатора загрузки системы `xload` или экранных -часов `xclock`. Сам X-сервер не мешает настроить с помощью `xset` (можно поменять -курсор, звуковой сигнал, переименовать кнопки мыши). Одним словом, -пользователю, как правило, нужен небольшой стартовый сценарий, который -запускался бы вместе с X-сервером. - -С другой стороны, сервер хорошо бы останавливать, когда он больше не -используется. Это, конечно, относится к схеме без _диспетчера экрана_ (`xdm`): -пользователь работает с терминала, потом запускает X-сервер для выполнения -графических программ, выполняет их и останавливает сервер, чтобы графическим -устройством мог воспользоваться кто-нибудь другой. Стандартный способ -аварийного завершения работы `XFree86` (*Ctrl + Alt + Backspace*), во-первых, -доступен только на `XFree86`, во-вторых, его можно отключить, а в-третьих, все -запущенные приложения получат в этом случае сообщение о внезапной смерти -сервера и тоже завершатся аварийно. - -Если запускать не сам X-сервер, а некоторую оболочку вокруг него, называемую -`startx`, то алгоритм работы будет такой. Сначала запустится X-сервер и -сформируется значение переменной окружения `DISPLAY`. Затем запустится -сценарий `.xinitrc`, находящийся в домашнем каталоге пользователя, а если -такого нет -- системный стартовый сценарий `/usr/X11R6/lib/X11/xinit/xinitrc`. -Предполагается, что X-сервер будет работать до тех пор, пока -выполняется `.xinitrc`. Когда все команды из `.xinitrc` отработают, -его выполнение завершится, -а вместе с ним завершится и сервер. Поэтому рекомендуется все X-приложения из -`.xinitrc`, кроме последнего, запускать в фоне, чтобы командный интерпретатор -не дожидался окончания их работы. В этом случае с завершением последнего -приложения из `.xinitrc` завершится и сам X-сервер. Последней программой в -стартовом сценарии может быть `xterm`, как это сделано в стандартном `xinitrc`, -или _диспетчер окон_. Для завершения `xterm` (а с ним и всего сеанса работы X11) -достаточно послать `^D` запущенному в нём shell, а окновод обычно имеет -какую- нибудь кнопочку или менюшку *Exit*. Программа, с завершением которой -завершается сеанс X11, называется _лидером сеанса_ (session leader). - -Лидер сеанса может быть указан и в качестве параметра `startx` в командной -строке, например, по команде `startx` `/usr/X11R6/bin/xterm` будет открыт сеанс -X11, лидером которого будет `xterm`, его окно откроется при запуске на экране -X-сервера. - -Диспетчер экрана организует сеанс работы с X11 сходным образом. Единственное -отличие -- в том, что ко времени запуска `startx` вручную пользователь уже -имеет настроенное _окружение_ (этим занимается _стартовый командный -интерпретатор_), а после регистрации в диспетчере экрана -- нет. Поэтому -стартовый сценарий нужно запускать другой -- `.xsession`. На самом деле и сам -X-сервер необходимо перезапускать и при использовании `xdm`. Несмотря на то, -что пользователи взаимодействуют только с X-сервером, не используя -виртуальные консоли, было бы неудобно и небезопасно сохранять какие бы то ни -было настройки, сделанные одним пользователем ко времени работы другого. -Самое неприятное -- это т. н. «клавиатурный вор» (keyboard grabber), -программа, притворяющаяся окноводом -- для того лишь, чтобы запоминать всё, -что пользователь ввёл с клавиатуры (злоумышленников интересуют, как правило, -пароли). - -Нарушения безопасности легко избежать, если не использовать `xhost` -(авторизацию на основе адреса) и не доверять X-серверу, запущенному не при -вас. Можно доверять автоматически запускаемой в сеансе программе `xauth`, -которая связывается с X-сервером и записывает в файл `~/.Xauthority` -специальный ключ доступа. Все X-приложения пользуются библиотекой `libX11`, -которая обязательно обращается к этому файлу. Таким образом, X-приложение -может воспользоваться X-сервером, если оно знает его адрес (указанный в -переменной окружения `DISPLAY` или переданный ключом `-display`) и авторизовано -сервером (по адресу компьютера или по ключу доступа в `~/.Xauthority`). - -==== Ресурсы X11 ==== - -X-приложения создаются с помощью разнообразных готовых инструментариев. -Большая их часть разрабатывается независимыми авторами по всему миру (это -общее свойство свободного ПО, см. <>), но библиотека -самого низкого уровня, `X Lib`, и несколько более высокоуровневых с давних -пор включаются в основной дистрибутив X11. Из них наиболее примечательна `X -Toolkit` (Xt), организующая из стандартных окон X11 _оконные примитивы_ -(widgets). - -Дело в том, что каждый объект X11 обладает некоторым набором свойств, вроде -размера окна, цвета фона или текстового содержимого. Для удобства доступа -примитивы `Xt`, реализованные поверх объектов `Xlib`, имеют собственные -имена (у каждого объекта своё) и фамилии (одинаковые у всех объектов одного -класса). Более того, программа, написанная на `Xt`, имеет карту объектов, в -которой указано, какой объект внутри какого находится, и приведены имена -объектов и их классов. Посмотреть структуру запущенного X-приложения можно с -помощью программы `editres` («Commands/Get Tree»). Например, программа -`xlogo` состоит из трёх примитивов: `xlogo` (класс XLogo) и вложенными в -него `xlogo.xlogo` (класс Logo) и `shellext` (неоконный, класс -VendorShellExt). Мало того, свойства этих примитивов можно подменить прямо в -работающей программе. Можно, например, на время работы перекрасить фон -`xlogo` в красный цвет. - -`Xlib`, со своей стороны, предоставляет универсальный способ хранить такие -настройки в файле. Многие приложения хранят свои настройки по умолчанию в -`/usr/X11R6/lib/X11/app-defaults/ИмяКласса` (в некоторых системах этот -каталог перенесён, как ему и подобает, в `/etc/X11`). `ИмяКласса` -- это имя -класса самого главного окна этого приложения. Пользователь может дополнить -настройки ресурсов, которые сервер накапливает при старте, при помощи -команды `xrdb -merge файл_настроек` или переписать их заново (ключ `-load`). -Приложению остаётся только вызвать специальную функцию `Xlib`, которая -считывает настройку с определённым именем из таблиц сервера. Если `xrdb` не -запускалась ни разу (в том числе и в стартовом сценарии), запрос приложения -направится не в таблицу сервера, а непосредственно в файл ресурсов -`.Xdefaults` footnote:[Кроме этого файла в домашнем каталоге пользователя -можно обнаружить файл .Xresources, очень похожий по функции и аналогичный по -синтаксису. Разница между этими файлами в использовании: `.Xresources` -загружается только в процессе исполнения `xinitrc` при помощи утилиты `xrdb`, -а `.Xdefaults` в дополнение к этому читается автоматически средствами -`libX11`.], лежащий в домашнем каталоге. В этом случае для изменения настроек -не надо запускать `xrdb``. - -`Xt` добавляет в эту процедуру иерархию ресурсов. Как это можно наблюдать в -`editres`, при задании свойства ресурса используются четыре конструкции: имя -ресурса, имя класса, разделитель `.`, означающий, что один ресурс вложен в -другой непосредственно, и разделитель `*`, означающий, что ресурс вложен в -другой в конце концов (возможно, по цепочке). Например, для задания цвета -фона в программе `xload` можно использовать именование -`xload.paned.load.background` (это всё по именам). Можно попробовать единым -махом изменить цвет фона всех примитивов этой программы, записав в -`.Xdefaults` (или передав `xrdb`) строку вида `XLoad*background: midnightblue`. - -Если в `.Xdefaults` есть несколько сторк, удовлетворяющих имени ресурса, то -имена собственные имеют преимущество над классами, а `.` -- над `*`. Так что -запись вида `*Text*background: peachpuff` повлияет только на те примитивы -класса `Text` и вложенные в них, для которых нет более строгого указания -(например, `*Text.background` или `XConsole*Text*background`). Обратите -внимание, как поэтично называются порой цвета в X11! Посмотреть таблицу -цветов можно командой `xlscolors`. - -К сожалению, `Xt` -- всё-таки довольно старая библиотека, не во всём следующая -новым веяниям в области графического интерфейса. Для быстрой разработки -оконных программ нужны разнообразные и мощные инструменты, которые -манипулируют понятиями, далеко ушедшими от стандартного «окно–меню–кнопка». -Если такие инструментарии написаны с применением `Xt` (например `Xm`, `open -Motif`, `Xaw`, `Athena Widget`), их настройки можно поселить в `.Xdefaults`. -Незадача ещё и в том, что структуру классов `Xt` неудобно использовать при -программировании на языке C++, а именно на нём сейчас пишется большинство -оконных приложений. Так что самые мощные инструментарии для X11 -- `Qt` («The -Q Toolkit») и `GTK` («The GIMP toolkit») -- не используют App-defaults. - -==== Диспетчер окон ==== - -===== Задача диспетчера окон ===== - -X-сервер берёт на себя ответственность только за выдачу X-приложению области -для ввода-вывода и управление _фокусом_ -- окна, но не занимается никакими -манипуляциями по изменению этого окна: перемещением, изменением размера, -сворачиванием и т. п. Мефодий уже наблюдал X-сервер, к которому присоединено -ровно два клиента, чьи окна перекрываются: два чёрно-белых окна друг на -друге, и их ни растащить по углам, ни сжать нельзя. X-сервер умеет очень -ловко манипулировать окошками, но сам никогда ничего не делает, дожидается -команды от пользовательской программы. А какой программе захочется -самостоятельно отслеживать перекрытие окон, фокус, заниматься изменением -размера, перемещением и тому подобным? Ведь основная задача программы может -быть совсем другой... - -Ответ очевиден: этим должна заниматься программа, основная задача которой -состоит в том, чтобы отслеживать перекрытие, изменять размер, двигать, -превращать в иконку и так далее. По совместительству эта же программа будет -рисовать при окнах всякие красивости: рамочки, заголовки, кнопки и меню -управления -- словом, делать всё, что нужно для организации логики управления -окнами. Для этого придётся также обрабатывать практически все события, -передаваемые от устройств ввода, и многочисленные «подсказки» от приложений -относительно того, какими они хотят видеть собственные окна. Это X-приложение -называется _диспетчером окон_ (window manager) footnote:[Не путать с -диспетчером экранов, который занимается совсем другим: подменяет утилиту -`login`.]. - -============================================ -Диспетчер окон:: - программа, основная функция которой -- обеспечивать манипуляции с окнами: - перемещение, изменение размера, сворачивание и т. п. -============================================ - -Благодаря стандартному протоколу X11 появилось такое множество диспетчеров -окон для _X Window System_, что перечислить их все просто невозможно. Все они -различаются видом и кругом возможностей для манипулирования окнами: от самых -простых (рамочка вокруг окна позволяет двигать его, изменять размер и -поднимать из глубины; собственно, всё) до весьма изощрённых (виртуальные -экраны, анимированные полупрозрачные меню, панели инструментов, причудливой -формы украшения на окнах; сами окна ползают по экранам, кувыркаются, -растворяются как утренний туман; всё это лязгает, попискивает и разговаривает -приятным женским голосом). Когда Мефодий в первый раз запустил команду -`startx`, была запущена утилита `wm-select`, которая предложила ему выбрать, -какой из установленных в его системе диспетчеров окон запустить. - -Выбор диспетчера окон на свой вкус -- очень непростое и вдумчивое занятие. Мы -советуем просто соблюдать меру, сообразуясь с тем, для чего вы используете -оконную систему: обилие ярких декораций отвлекает от работы (а если они -вдобавок шевелятся?), а слишком строгий минимализм её усложняет. Имейте в -виду, что чем причудливее и многообразнее возможности окновода, тем труднее -будет его полностью настроить именно под себя. Скорее всего, вы просто -согласитесь пользоваться уже настроенными -- общеупотребительными -- -возможностями, не доводя их до совершенства. - -===== Работа с окнами ===== - -Совершенно необязательно начинать сеанс работы в X11 с запуска диспетчера -окон, его можно запустить в любой момент. Например, Мефодий может к уже -запущенному им X-серверу подключить любой диспетчер окон, запустив его всё из -той же виртуальной консоли. Например, чтобы запустить WindowMaker, достаточно -выполнить команду `wmaker`. - -image::images/wmaker.ppm.bz2.png[Диспетчер окон WindowMaker] - -С запуском диспетчера окон экран X-сервера заметно преобразился: одноцветный -фон сменился изображением, по углам возникли квадратные кнопки, а вокруг -окна `xterm` образовалась рамка с названием окна и кнопками. Эта рамка -- -«органы управления» окном, так называемые _оконные примитивы_ (их собственное -имя -- «widgets» -- сокращение от «window gadgets», «оконные безделушки»). -«Ухватившись» мышью за рамку, Мефодий поменял размеры окна, а нажав на правую -кнопку мыши на заголовке окна -- увидел меню, состоящее из списка операций, -которые можно произвести над этим окном. Все эти возможности предоставлены -диспетчером окон `WindowMaker`. - -image::images/wmaker-winmenu.ppm.bz2.png[Меню операций с окном в WindowMaker] - -===== Удобства ===== - -Однако помимо своей основной функции -- операций с окнами -- многие -диспетчеры окон владеют массой других приёмов по упрощению работы -пользователя и повышению наглядности. Самые главные из таких удобств -- -кнопки для запуска типичных задач: нажатие на кнопку заменяет собой -выполнение команды в эмуляторе терминала. Команда может быть длинной или -забываться, а нажатие одно и кнопка всё время на виду -- это удобно для -привычных повседневных действий. Например, в правом верхнем углу экрана -WindowMaker присутствует кнопка с изображением монитора -- для запуска `xterm`. -Вторая важнейшая возможность -- общее меню, в котором классифицированы -доступные в системе приложения, при помощи такого меню пользователь может -найти и запустить нужную прикладную задачу. - -image::images/wm-menu.ppm.bz2.png[Общее меню в WindowMaker] - -Большое удобство, предоставляемое очень многими диспетчерами окон для X11, -- -_виртуальные экраны_. Когда пользователь работает сразу с несколькими задачами, -ем обычно приходится открывать много окон, так что они уже не умещаются без -наложения на физической поверхности экрана. Чтобы при этом переключаться -между задачами было удобно, можно использовать некоторые специально для этого -предназначенные функции диспетчера окон: сворачивание и разворачивание, -перекладывание окон «выше» и «ниже» в стопке, список активных задач и т. п. -Но ещё удобнее было бы не перекладывать окна, а разложить их на большей, чем -размеры экрана, поверхности -- _виртуальном экране_. Таким образом настоящий -экран -- это только небольшое «окошко», в которое можно видеть только часть -виртуального, а при необходимости можно это окошко сместить в другой конец -«виртуального стола», где лежат окна с другими задачами. - -Диспетчер окон организует виртуальный экран сам: X-сервер при запуске -диспетчера окон выдаёт ему одно окно размером во весь экран, так что все -остальные окна оказываются внутри него, и диспетчер окон уже сам решает, -когда и кому передать фокус, как обойтись с окнами и т. п. При этом он вполне -может «делать вид», что его экран больше экрана монитора, по определённой -команде (переключиться на другой конец виртуального экрана) запоминая и пряча -текущее расположение окон и заменяя его другим, до этого хранившимся в -памяти. Конфигурация виртуального экрана может быть любой -- она зависит -только от логики работы диспетчера окон. Виртуальный экран может состоять из -нескольких частей размером в реальный экран, поставленных в ряд, доступных по -номерам, организованных в виде прямоугольника, бывают даже трёхмерные -виртуальные экраны. - -Виртуальные экраны есть и в WindowMaker, переключение между ними -осуществляется при помощи специальной кнопки в левом верхнем углу экрана или -сочетаниями клавиш *Alt + N*, где *N* -- номер виртуального экрана. Однако чтобы -не забывать, где лежит какое окно, полезна возможность окинуть одним взглядом -всё, разложенное на виртуальном экране. Окно, отображающее в уменьшенном -масштабе вид виртуального экрана и позволяющее перейти к нужной части, -называется _пейджер_ и относится к очень распространённым в диспетчерах окон -удобствам. - -===== Настройка диспетчера окон ===== - -Удобство графического интерфейса -- понятие очень субъективное, при этом -технологически безразлично, рисовать ли кнопки в левом верхнем углу или в -правом нижнем, какой цвет и шрифт использовать в меню и т. п. -- всё это -составляет _профиль_ диспетчера окон. Поэтому в подавляющем большинстве -диспетчеров окон существуют более или менее развитые возможности изменить -внешний вид и оформление графической среды. В `WindowMaker` для этого -используется специальная утилита с графическим интерфейсом (Мефодий может её -вызвать при помощи самой верхней кнопки в левом верхнем углу экрана). В -других диспетчерах окон, как, например, в очень развитом и `fvwm`, профиль -может просто храниться в конфигурационном файле (`~/.fvwm2rc`), для изменения -внешнего вида `fvwm` следует редактировать этот файл. - -Среди диспетчеров окон в тяжёлых весовых категориях выступают и `fvwm2` -(множество функций), и `Enlightenment` (настоящая игрушка), и `WindowMaker`, и -некоторые другие. Человеку, проводящему рабочее время за экраном компьютера, -важен комфорт на рабочем месте, поэтому всякая мелочь или её отсутствие может -иметь решающее значение при выборе того или иного диспетчера окон. - -==== Рабочий стол ==== - -С появлением универсальных высокоуровневых инструментариев стала обретать -плоть идея полного воплощения метафоры «рабочего стола», впервые -реализованная в системах семейства MacOS. Смысл рабочего стола в том, чтобы -предложить принципиально иной способ взаимодействия человека и компьютера -- -способ, основанный на манипуляции единичными именованными объектами. Каталоги -превращаются в «папки с документами», причём каждый тип документов можно -«открыть» с помощью специального «документатора». Программы превращаются в -эдакие вместилища абстрактных функциональностей: «Internet», «Почта», -«Видео» и т. п. Рабочий стол особенно потребен человеку, чья область -деятельности далека от компьютерного дела, для кого он -- не вычислительная -машина, а инструмент решения отдельных -- типовых и, чаще всего, -непрофильных -- задач. - -Компьютер так стремительно вошёл «в каждый дом», что давно уже стал бытовым -прибором для игр, чтения электронной почты, просмотра WWW, а в последнее -время -- музыкальным центром и видеопроигрывателем. Грешно требовать от -садящейся за клавиатуру домохозяйки или какого-нибудь оболтуса строгого -следования принципам проективной системы. Лучше дать им в руки красивую и -сравнительно безопасную игрушку, которая способна удовлетворять бытовые их -нужды. Таких игрушек для X11 несколько. Две мощные среды «офисного» плана -- -KDE (основанное на Qt переосмысление коммерческой среды CDE) и Gnome -(основанная на GTK) -- содержат всё необходимое для деловой работы (включая -собственные офисные приложения и средства просмотра WWW). Или, например, -среда XFCE (основанная также на GTK) -- крепко сколоченный минималистский -вариант CDE, простой и ясный, как выдвижной ящик. - -Мефодий выбрал одну из таких игрушек -- KDE, начав с оформления рабочего -стола на свой вкус. Когда ему, наконец, наскучило перекрашивать меню и -украшать рабочий стол безделушками, он попробовал заняться собственно делом. -В примере отображён снимок экрана в один из моментов его работы, когда он -попытался воспользоваться для работы с файлами специально разработанной для -KDE программой (`konqueror`, которая служит заодно и браузером) вместо уже -привычной ему командной строки. При этом Мефодия насторожило время, которое -ему потребовалось на выполнение вполне привычных простейших операций над -несколькими файлами и каталогами: для каждого потребовалось отдельное -движение мышью, да и в целом всё стало происходить как-то гораздо медленнее, -чем обычно, а компьютер то и дело принимался хрустеть жёстким диском. - -image::images/konqueror.ppm.bz2.png[Работа в KDE] - -До сей поры Мефодий считал, что его -- не такой уж новый -- компьютер вполне -подходит для работы в Linux, и ничто этому утверждению не противоречило. Для -того, чтобы проверить, чем же занимается система, он запустил команду top, -нажал *M* для того, чтобы посмотреть, какие процессы занимают больше всего -памяти и обнаружил довольно неприятную, хотя и вполне терпимую картину: - ------------------------------------------------------------ -00:55:08 up 13:20, 13 users, load average: 1,71, 1,87, 0,97 -29 processes: 28 sleeping, 1 running, 0 zombie, 0 stopped -CPU states: 60,6% user, 14,6% system, 6,2% nice, 0,0% iowait, 18,4% idle -Mem: 54232k av, 53076k used, 1156k free, 0k shrd, 1628k buff - 18032k active, 22620k inactive -Swap: 200772k av, 108288k used, 92484k free 15812k cached - - PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND -15410 methody 13 5 9448 8980 8096 S N 0,0 16,5 0:01 kdeinit -15379 methody 9 0 9656 7928 7184 S 0,1 14,6 0:06 kdeinit -15404 methody 9 0 9652 7612 7428 S 0,0 14,0 0:02 kdeinit -15395 methody 9 0 9596 7376 7372 S 0,0 13,6 0:02 kdeinit -15406 methody 9 0 10084 7216 6192 S 0,0 13,3 0:09 konqueror -15397 methody 9 0 8592 7140 6560 S 0,5 13,1 0:03 korgac -15387 methody 9 0 8464 6920 6748 S 0,0 12,7 0:02 kdeinit -15390 methody 9 0 8488 6644 6640 S 0,0 12,2 0:01 kdeinit -15393 methody 9 0 8576 6636 6632 S 0,0 12,2 0:02 kkbswitch -15407 methody 9 0 6864 6164 6064 S 0,0 11,3 0:00 kdeinit -15377 methody 9 0 7592 5844 5440 S 0,0 10,7 0:04 kdeinit -15380 methody 9 0 6564 5736 5624 S 0,0 10,5 0:00 kdeinit -15346 methody 9 0 6652 5028 4744 S 0,1 9,2 0:02 kdeinit -15368 methody 9 0 6864 4972 4972 S 0,0 9,1 0:02 kdeinit -15376 methody 9 0 6164 4504 4504 S 0,0 8,3 0:01 kdeinit -15356 methody 9 0 6608 4436 4432 S 0,0 8,1 0:01 kdeinit -15366 methody 9 0 6008 4436 4436 S 0,0 8,1 0:01 kdeinit -15343 methody 9 0 5248 4388 4156 S 0,1 8,0 0:00 kdeinit -15385 methody 9 0 5412 3984 3876 S 0,0 7,3 0:01 apt-indicator -15341 methody 9 0 4540 3768 3612 S 0,0 6,9 0:00 kdeinit -15338 methody 8 0 2260 1444 1368 S 0,0 2,6 0:00 kdeinit -15411 methody 15 0 1092 1040 844 R 2,3 1,9 0:01 top -15200 methody 9 0 628 520 520 S 0,0 0,9 0:00 xinit -15159 methody 9 0 912 508 508 S 0,0 0,9 0:00 bash -15209 methody 9 0 640 476 472 S 0,0 0,8 0:01 startkde -15185 methody 9 0 564 408 408 S 0,0 0,7 0:00 startx -15364 methody 9 0 304 276 256 S 0,0 0,5 0:00 kwrapper ------------------------------------------------------------ - -Первое, что бросилось ему в глаза -- множество процессов, запущенных явно -средой KDE (кому же ещё может принадлежать программа `kdeinit`?), Мефодий -подсчитал число процессов, начинающихся на «kde» (`ps ax | grep kde | grep -v -grep | wc -l`) -- их оказалось 17 штук. Каждый из этих процессов затребовал у -системы по три-четыре мегабайта памяти (поле `SIZE`), из которых полтора-два -(поле RSS) немедленно использовал. Не так уж и много, если бы такая программа -запускалась одна. Но две дюжины `kdeinit` вполне способны израсходовать всю -оперативную память компьютера, если объём его физической памяти равен, как на -компьютере Мефодия, 64 мегабайта (из них порядка девяти мегабайтов заняло -ядро -- эта память не отображается в поле `mem` -- и сколько-то уходит на сам -X-сервер и прочие программы, не принадлежащие Мефодию). - -Впрочем, даже в таком состоянии Linux продолжает работать довольно-таки -бодро. Дело в том, что большинство из этих процессов (по словам `top` -- все, -коме одного, самого `top`, об это говорит строка `1 running`) в данный момент -неактивны (sleeping). Большинство полученных ими ресурсов система давно уже -отправила в область подкачки (swap) на диске. Затруднения начнутся, если -несколько неактивных программ «проснутся»: система начнёт поднимать из swap -их ресурсы, а чтобы для них хватило места в оперативной памяти -- откачивать -туда память других программ (отсюда и неожиданная дисковая активность, на -которую Мефодий обратил внимание). Хуже всего, если для работы всех активных -процессов одновременно не хватает места, тогда процесс откачки-закачки будет -отнимать большую часть процессорного времени, для полезных задач его просто -не останется. Определить такую ситуацию (она называется «дребезг», -threshing), можно по высоким значениям полей `system`, а ещё по постоянно -ненулевым значениям в полях `si` и so команды `vmstat`. - ------------------------------------------------------------ - procs memory swap io system cpu - r b w swpd free buff cache si so bi bo in cs us sy id - 0 1 0 106092 1352 1168 19380 14 10 265 33 127 407 14 4 82 ------------------------------------------------------------ - -Этот опыт произвёл отрицательное впечатление на Мефодия, и он решил -устраивать себе графическое рабочее место на основании какого-нибудь менее -громоздкого инструмента. Впрочем, провести границу, где заканчиваются -обязанности диспетчера окон и начинаются ухищрения рабочего стола, очень -трудно. Видимо, разумно считать, что диспетчер окон делается средой рабочего -стола, когда появляются пользовательские приложения с использованием его -особых свойств и его библиотек. Если главная задача рабочего места -- -запускать `xterm`, то достаточен даже очень старый диспетчер окон `twm` (он -всегда есть в составе `XFree86`, но редко используется по причине некрасивого, -«плоского» оформления интерфейса). Вместо него можно использовать диспетчеры, -подобные `icewm` или `fluxbox`, обладающие большими возможностями, и при этом -нетребовательными к ресурсам. Если необходимо просто и незамысловато -обеспечить доступ к основным пользовательским X-приложениям, подойдёт XFCE. -Наконец, диспетчеры, подобные `WindowMaker` или `fwvm`, предоставляют множество -возможностей и гибко настраиваются, не «вытягивая» за собой ресурсоёмких -программных структур, используемых в KDE или Gnome. - -Поразмыслив, Мефодий решил остановиться на `WindowMaker`: система меню -показалась ему приятной для глаз, а способ быстрого запуска -- удобным. Кроме -того, его позабавили «активные иконки», шевелящиеся в момент запуска -соответствующего приложения. - -[[applications]] -== Прикладные программы == - -Основная особенность программного обеспечения Linux -- многообразие -продуктов, решающих сходные задачи, особенно если дело касается области, в -которой существует несколько подходов к их решению. Открытая модель разработки -программ, описанная в лекции <>, позволяет любому выбрать самый -подходящий для него инструмент и развивать именно его. Поэтому список -проектов, так или иначе связанных с Linux, насчитывает десятки (или даже -сотни) тысяч наименований. - -Конечно же, работа с самой операционной системой не может быть самоцелью. Все -усилия Мефодия по изучению операционной системы Linux и основных утилит, -нужны были для того, чтобы он впоследствии мог наилучшим образом решать в -этой операционной системе любые из своих прикладных задач, разрешимых при -помощи компьютера. Как уже уяснил Мефодий, для очень многих задач достаточно -стандартных инструментов Linux и текстового редактора, однако есть случаи, в -которых всё-таки необходима специальная прикладная программа, именно для -этого предназначенная, или в которых специальная программа удобнее комбинации -стандартных утилит. - -Эта лекция посвящена краткому обзору _прикладных программ_ для Linux, -специально предназначенных для решения самых разных пользовательских задач. -Материал, вошедший в эту лекцию нужно воспринимать только как пример, -демонстрацию того, что и как можно делать в Linux, но вовсе не исчерпывающий -список. В отличие от основных принципов устройства системы или стандартных -утилит, обсуждавшихся в предыдущих лекциях, которые не изменяются (почти) в -течение десятилетий, прикладное программное обеспечение -- это область, где -всё меняется очень быстро. Технологии, сегодня считающиеся самыми передовыми, -уже через несколько месяцев могут устареть. Вместе с ними могут устареть -использующие их программы, а другие программы могут, наоборот, перейти в -разряд наиболее современных и развитых. Поэтому перечисленные в этой лекции -прикладные программы -- это не безусловная рекомендация, а довольно случайная -выборка, отражающая текущее состояние дел в разработке приложений для Linux. -Самый лучший способ найти и выбрать самые подходящие прикладные программы для -своих задач -- посоветоваться с людьми, которые решают подобные задачи в -Linux в настоящее время -- и попробовать. - -Нужно отдавать себе отчёт в том, что прикладные программы для Linux не -являются частью самой Linux, поэтому любой из названных ниже программ может -не оказаться в каком-то из конкретных _дистрибутивов_ Linux. Но почти наверняка -в любом дистрибутиве найдётся не меньше одной или нескольких программ для -решения каждой из перечисленных ниже прикладных задач. Чтобы не загромождать -изложение, мы остановимся лишь на самых распространённых программных -продуктах, входящих во многие дистрибутивы Linux. - -=== Рабочий стол === - -Первое, что стоит сделать, начав постоянно использовать Linux -- организовать -для себя удобное «рабочее место»: подобрать и настроить программы, с которыми -приходится работать каждый день. Рабочее место в Linux может выглядеть очень -по-разному. Можно вовсе обойтись без графического интерфейса, используя -только текстовый терминал для управления системой. Такой выбор будет -правильным, если рабочее место находится на сервере, подключённом к сети -Internet, доступ к которому осуществляется только при помощи ssh или -аналогичных клиентов удалённого доступа. Впрочем, некоторые пользователи -предпочитают работать в текстовом интерфейсе по эстетическим, а не -прагматическим соображениям. - -Если графический интерфейс используется, то и в этом случае есть огромный -выбор, как его организовать, прежде всего, нужно решить, нужно ли -организовывать _«рабочий стол»_ (для этого подходят GNOME, KDE, XFCE) или можно -обойтись возможностями одного из развитых диспетчеров окон (`Enlightenment`, -`FVWM2`, `WindowMaker` и многие другие). Помимо функциональности, в выборе -графической среды решающее значение могут сыграть и эстетические критерии. -Дальше всех в этом направлении продвинулась среда `Enlightenment`, работа с -которой в некоторых вариантах настройки количеством украшений и эффектов -напоминает участие в компьютерной игре (скорее всего, сетевой). - -==== Эмулятор терминала ==== - -Даже для такой на первый взгляд тривиальной функции, как эмуляция терминала -для _X Window System_, существует целый круг программ. Самая стандартная из них -поставляется вместе с `XFree86` -- `xterm`. Вариант `xterm`, поддерживающий -отображение шрифтов в кодировке UNICODE, вызывается командой `uxterm`. Однако -каждое приложение, организующее среду рабочего стола, включает собственный -эмулятор терминала, внешний вид и поведение которого настраивается -централизованно вместе со всеми остальными приложениями рабочего стола. Есть -и другие эмуляторы терминала, не связанные с конкретным рабочим столом, к -таким относится `9term`, повторяющий возможности «окна» системы `Plan9`, `mlterm`, -имеющий многоязыковую поддержку, `rxvt` -- очень нетребовательный к ресурсам -эмулятор терминала, или его потомки, наподобие `aterm`. - -Большое количество терминальных окон на рабочем столе может образоваться даже -если раскладывать их по разным виртуальным экранам. Некторые версии `xterm` -(например, `konsole`), позволяют открывать окна «стопками», переключаясь между -ними с помощью «закладок», как в записной книжке. Если основная работа -происходит на удалённом компьютере, и каждый `xterm` соответствует сеансу -удалённой работы, можно пойти и другим путём. Устанавливается одно соединение -с удалённым компьютером, а там запускается эмулятор терминала `screen`. Эта -программа не взаимодействует с графической средой. Она просто открывает -требуемое число _псевдотерминалов_, и в каждом из них запускает по командному -интерпретатору. Ввод со стандартного ввода попадает на тот псевдотерминал -(«экран»), который screen считает «видимым», а вывод происходит на всех -экранах независимо. С помощью управляющего символа `^A` этой утилите подаются -команды -- переключиться на следующий экран (`^A^N`, при этом пользователь -увидит то, что на этот экран выводилось), открыть новый (`^A^C`) и т. п. - -Типичное применение _screen_ -- в одном окне запущен текстовый редактор, в -другом -- командная строка. Удобство дополняется тем, что от работающего -`screen` можно «отсоединиться» (`^A^D`), при этом пользователь может прервать -терминальный сеанс и пойти спать, а интерпретатор командной строки и редактор -будут работать на удалённом компьютере, как ни в чём не бывало (но, конечно, -не будут проявлять никакой активности). Когда пользователь вернётся, он вновь -присоединится к удалённой машине и «подключится» к работающему `screen` -(команда `screen -R`), и продолжит работать с редактором и командной строкой. - -==== Диспетчеры файлов ==== - -Все изменения в файловой системе Мефодий привык производить с помощью -стандартных утилит командной строки и находит это весьма удобным. Однако -многие пользователи привыкли оперировать с файлами и каталогами как с -наглядными штучными объектами (папками и документами), они могут выбрать для -себя программу, которая позволяет наглядно и поштучно работать с объектами -файловой системы -- _диспетчер файлов_ (file manager). Поскольку представление -файлов и каталогов как папок и документов нужно в первую очередь в рамках -метафоры рабочего стола, то и диспетчеры файлов для Linux разрабатываются в -первую очередь как приложения той или иной среды рабочего стола. В частности, -и в KDE, и в GNOME есть свои диспетчеры файлов -- `konquеror` и `nautilus` -соответственно, которые по совместительству служат www-браузерами. Такое -совмещение функций вполне логично, поскольку в среде рабочего стола нужно -представлять доступные локальные и удалённые ресурсы как единое пространство, -наполненное объектами, которыми можно манипулировать, можно «открывать», т. -е. запускать соответствующее приложение для просмотра и/или редактирования. - -Для многих пользователей наиболее удобный способ работы с файловой системой --- «классический» двухпанельный диспетчер файлов, работающий в текстовом -режиме (в терминале) -- Midnight Commander (название утилиты -- `mc`) -footnote:[Пользователи, знакомые с MS-DOS, вспомнят Norton Commander, а -пользователи помоложе -- Far Manager.]. Его функциональность также шире -просто операций с файлами -- он позволяет открывать файлы для просмотра и -редактирования, вызывать вспомогательные программы для работы с архивами (и -даже «заходить» в архивы, как в каталоги), передавать данные по сети и т. п. -Midnight Commander имеет также неплохой встроенный текстовый редактор, -опять-таки «классического» стиля. - -Восторг, охвативший Мефодия при виде старых добрых синих панелек, довольно -быстро угас. Далеко не всё, что нужно делать в Linux, в среде mc так же -удобно, как и в полноценной командной строке. Кроме того, при работе с -графическими файлами сильно не хватает представления этих файлов в виде -миниатюр (thumbnails), чтобы выбирать среди них по содержимому, а не только -по имени. Такими возможностями обладают многочисленные графические диспетчеры -файлов; помимо тех, что включены в среды KDE и GNOMe, есть множество -независимых: `dfm` (похожий на диспетчер файлов `OS/2`), `emelFM2`, `EZFM` и -`X` Northern Captain (двухпанельные, причём автор последнего -- наш человек -из Дубны), `gentoo` и `worker` (двухпанельные, в стиле диспетчера файлов -DirectoryOpus из AmigaOS), `FSV` и `XCruiser` (трёхмерные! причём последний -похож скорее на космический симулятор). Среди них встречаются и -ориентированные специально на просмотр изображений, такие как `GQView`, -`endeavour`, `gview`, `qiv`, `xzgv` и некоторые другие, -- с возможностями -слайд-шоу, автоматического изменения размера, показа картинки на полный экран -и т. п. - -=== Сеть === - -==== WWW-браузеры ==== - -WWW-браузер -- программа для просмотра гипертекста, доступного через -Internet -- на сегодня чуть ли не самое важное приложение для персонального -компьютера. Сегодняшний _www-браузер_ должен «уметь» гораздо больше, чем просто -отображать страницы HTML и переходить по гиперссылкам. Фактически, на него -ложится задача работы данными Internet во всём их многообразии, сюда входит и -поддержка постоянно развивающихся стандартов, и обеспечение безопасности, и -многое другое. - -В Linux есть довольно большой выбор www-браузеров, однако первым -действительно современным свободным приложением для работы с Internet во всём -его многообразии стала Mozilla, которая до сих пор вполне успешно конкурирует -с аналогичными коммерческими программами, несмотря на затрудняющую успешное -развитие идеологию «три в одном». Mozilla -- пакет приложений для работы с -Internetом. Это мощный, насыщенный функциями коммуникационный центр для -персонального компьютера. В состав пакета входит браузер, программа для -работы с электронной почтой и редактор www-страниц. История Mozilla началась -в 1998 году, когда фирма Netscape опубликовала исходные тексты своего -браузера Netscape Navigator. Одно из важных свойств пакета Mozilla -- его -принципиальная расширяемость. В Mozilla реализован язык XUL на основе XML, -при помощи которого очень легко разрабатывать дополнительные компоненты -Mozilla, ориентированные на выполнение специальных функций. - -Более современен FireFox, разрабатываемый командой Mozilla на основе исходных -кодов, соответствующих только WWW-браузеру. Остальная часть FireFox написана -полностью на XUL, поэтому разработка этой молодой программы идёт существенно -бодрее и проще, её настройка считается самой гибкой среди www-браузеров, а -главное, любой желающий может написать на высокоуровневых языках -программирования XUL/JavaScript и опубликовать свой модуль расширения (т. н. -`plugin`; на сегодня таких модулей известно более полутораста). - -О www-браузерах, разработанных специально для той или иной среды рабочего -стола уже шла речь выше (они превосходно справляются с ролью файловых -диспетчеров). Важная разновидность www-браузеров -- текстовые браузеры, т. е. -те, которые могут быть запущены в любом текстовом терминале Linux. Самый -старый и известный из них, один из прототипов современных www-браузеров -- -Lynx. Он не имеет возможности отображать графическую информацию, но отлично -поддерживает HTML, формы и таблицы. Современные версии поддерживают также -соединения, защищённые при помощи SSL. Links -- это текстовый браузер, на -первый взгляд очень похожий на Lynx, но все же несколько отличающийся от него: - -* умением работать с таблицами и фреймами; -* отображением цветов, указанных в HTML-странице; -* использованием выпадающих меню (как в Midnight Commander); -* возможностью загрузки файлов в фоновом режиме. - -Помимо возможности просмотра WWW-страниц часто выпадает необходимость их -«скачивания», т. е. записи в файл. Это же относится и к ресурсам, доступным -по протоколу FTP. Все описанные выше браузеры способны записывать HTTP- и -FTP-ресурс в файл, но для удобной работы из командной строки они, как -правило, непригодны. Кроме старой и весьма простой утилиты `ftp`, имеются два -её мощных расширения: `lftp` и `wget`. Обе утилиты поддерживают как FTP, так и -HTTP, причём `lftp` может работать, как и `ftp`, в режиме «оболочки», а `wget` -предназначена именно для работы из командной строки. Если при получении -файлов с какого-то сервера или группы серверов необходимо описывать множество -исключений (чтобы не скачать лишнего), выполнять какие-то действия (например, -заполнять формы или выполнять java-сценарии), можно воспользоваться более -сложными программами `pavuk` или `httrack`. - -==== Почтовые программы ==== - -Подобно тому, как Firefox возрождает WWW-ипостась Mozilla, Thunderbird -повторяет -- и расширяет -- почтовую составляющую Mozilla. Большинство -сказанного о Thunderbird на сегодня справедливо и для MozillaMail. Так же, -как и в Firefox, в Thunderbird используется часть исходного кода Mozilla, -которая работает с сетью (на этот раз -- с отсылкой почты и доступом к -почтовым ящикам), а интерфейс и архитектура приложения в целом -- переделаны -для того, чтобы избавиться от стародавних частей Netscape и облегчить -дальнейшую разработку. Thunderbird (как и MozillaMail) обладает самым мощным -на сегодняшний день встроенным антиспам-фильтром. Если не прошенная почта -всё-таки попадает в ваш почтовый ящик, просто показывайте её Thunderbird со -словами «это -- спам!». Через некоторое время программа сама научится -отличать не прошенную почту от полезной. Как и Firefox, Thunderbird легко -расширять собственными модулями, написанными на высокоуровневых языках и -можно очень гибко настраивать. - -Ещё один _почтовый клиент_, несколько уступающий Thunderbird по возможностям, -но превосходящий его по быстродействию, называется Sylpheed. Интерфейс этой -программы весьма похож на стандартную почтовую программу для Windows, -Outlook Express, что может помочь избежать лишних хлопот при смене -операционной системы. Автор этой программы, Хироюки Ямамото, человек -аккуратный и пунктуальный, так что некоторый недостаток возможностей (эта -программа умеет столько же, сколько и Outlook Express) компенсируется -безотказной работой и гибкой системой интеграции с другими утилитами системы -(антивирусом, антиспам-фильтром и т. п.). Кроме того, существует ветка -Sylpheed, называемая Sylpheed-Claws, в которой проходят проверку все -нововведения. Стабильная версия Sylpheed-Claws работает ничуть не хуже -авторской Sylpheed, а возможностей у неё больше. - -Поскольку управление электронной перепиской -- одна из задач рабочего стола, -в каждой среде рабочего стола есть свой собственный почтовый клиент. Почтовый -клиент для KDE называется KMail, он поддерживает как локальную доставку -почты, так и множество почтовых протоколов (POP3, IMAP, SMTP). Почтовый -клиент для GNOME называется Evolution, он интегрирован с календарём, адресной -книгой и претендует на функции индивидуальной «записной книжки». - -Электронная переписка сама по себе не требует графического интерфейса, для -чтения и написания электронных писем вполне достаточно возможностей терминала -и текстового редактора. Среди текстовых почтовых клиентов для Linux наиболее -известны Mutt и Pine, оба очень функциональны, поддерживают множество -протоколов и форматов почтовых ящиков, хорошо настраиваются. Требовательным -пользователям, которые хотят иметь возможность изменять внешний вид и способ -работы почтового клиента, дополнять его сценариями и получать от почтовых -служб всё, что те могут дать, рекомендуется Mutt. Тем же, кому главное -- -просто получать, читать и отправлять почту (со всеми полагающимися -удобствами), стоит начать с Pine. Любители Emacs используют встроенный в него -модуль GNUS, весьма богатый функциями. - -==== Обмен сообщениями ==== - -Если компьютер подключён к Internet постоянно, бывает удобно пользоваться -службами, передающими сообщения в реальном времени (instant messaging -service). Таких служб довольно много, самая популярная из них -- ICQ. -Множественность объясняется тем, что в большинстве случаев этот сервис -предоставляется централизованно, какой-нибудь крупной корпорацией. Во многих -случаях серверы этих служб не доступны под свободной лицензией. Исключение в -ряду «собственников» -- служба Jabber, основанная на полностью открытом -протоколе XMPP. Jabber позволяет любому сообществу создавать собственные -сервера, управляемые собственными администраторами. Сам Jabber-сервер имеет -возможность соединять своих клиентов не только с другими Jabber-серверами, но -и со службами ICQ, MSN, Yahoo и AIM. В Linux есть несколько клиентских -программ для обмена мгновенными сообщениями. Особняком стоят клиенты IRC -(Internet Relay Chat), службы с более долгой историей и сложным протоколом -(имеется в виду и сетевой протокол, и протокол работы пользователя в IRC). - -Psi -- удобный графический клиент сети быстрого обмена сообщениями Jabber (а -значит, по всем протоколам, которые поддерживает выбранный Jabber-сервер). -Psi поддерживает такие возможности Jabber, как одновременная работа с -несколькими серверами, конференции, криптозащиту передаваемой информации -(через SSL и GnuPG), работу через HTTP (S) прокси-сервер и т. д. SIM -- -многопротокольный клиент обмена мгновенными сообщениями. Поддерживаются -протоколы ICQ, Jabber, MSN, AIM, YIM, а также LiveJournal. Кроме того, -имеется множество модулей, реализующих дополнительные возможности. Есть -вариант SIM, ориентированный на среду KDE. «Прицельно» на среду KDE -ориентирован и другой мощный клиент, имеющий поддержку также и IRC, -- -Kopete. На среду Gnome ориентирован Gaim -- наиболее мощный и наиболее гибко -настраиваемый клиент. Имеет модули доступа почти ко всем мыслимым протоколам, -позволяет писать сценарии на Perl и TCL. Для IRC есть и специальные клиенты: -ChatZilla (как можно догадаться из названия, он «встроен» в Mozilla, но -доступен и как дополнение к Firefox) или X-Chat -- весьма мощная программа, -ориентированная на «хитрости» IRC. - -======================================================= -Предупреждение:: -обмен информацией и бессмысленными текстами при помощи любой из -перечисленных служб, а также телефона, не заменяет человеческого -общения! Помните, что компьютер передаёт только данные, но не эмоции. -======================================================= - -Не обойдён стороной и интерфейс текстовой консоли: CenterICQ, поддерживающий -несколько протоколов (среди них Jabber и IRC); licq, обладающий как -текстовым, так и графическим интерфейсами (следовательно, им можно -пользоваться и находясь за рабочей станцией, и дистанционно); irssi, -нацеленный на службы типа IRC (на сегодняшний день поддерживаются IRC, SILC -и ICB), и т. д. - -=== Офисные программы === - -Важной частью современной рабочей станции являются так называемые офисные -средства обработки информации. Под _офисными приложениями_ обычно понимают -стандартный набор из словарного процессора, средства работы с электронными -таблицами, средства создания презентаций, средства для работы с базами -данных. Все перечисленные офисные приложения входят в пакет OpenOffice.org -- -это свободный набор офисных программ, не уступающий по возможностям -несвободному Microsoft Office, а кое в чём даже превосходящий его. Например, -частность, которая может иметь очень важное значение: компонент -OpenOffice.org OpenWriter позволяет экспортировать документы непосредственно -в формат PDF. Интерфейс OpenOffice.org устроен принципиально так же, как и у -аналогичных продуктов Microsoft, так что пользователю, привыкшему к -Microsoft Office, не составит большого труда перейти к работе в -OpenOffice.org. Кроме того, OpenOffice.org позволяет работать со всеми -форматами файлов Microsoft Office. - -История OpenOffice.org напоминает историю Mozilla: поначалу проект (под -именем StarOffice) развивался закрыто, без доступа мирового программистского -сообщества к исходным текстам. Однако в 2000-м году компания Sun Microsystems -открыла исходные тексты программного продукта, образовав OpenOffice.org. Так -же, как и в случае Netscape/Mozilla, пара StarOffice/OpenOffice.org -использует двойное лицензирование, дающее право как свободного доступа к -исходным текстам, так и использования их в закрытых коммерческих продуктах. - -По возможностям OpenOffice.org остаётся самым развитым и полным офисным -пакетом для Linux, однако есть и другие офисные средства. В частности, -офисный пакет Koffice, ориентированный на среду KDE, в котором есть примерно -тот же набор офисных приложений, что и в OpenOffice.org. Кроме того, есть -отдельные офисные приложения, не составляющие пакетов -- словарный процессор -Abiword и электронные таблицы GNUmeric. - -=== Графика === - -Чем проще пользовательская задача, тем больше программ под Linux её решают. В -частности, манипуляция геометрическими фигурами с возможностью изменения их -параметров (цвета, размера и т. п.), хранением набора фигур в файле и -преобразованием получившегося изображения в растровый формат -- довольно -простая задача, требующая аккуратной реализации основных функций какой-нибудь -высокоуровневой библиотеки (или двух -- интерфейсной и графической). -Неудивительно, что редакторы с подобными возможностями есть и для каждого -рабочего стола, и независимо от них. Это утверждение относится и к ещё более -простым программам работы с растровой графикой. Ниже описаны только -существенно более сложные программы. - -==== Векторная графика ==== - -_Векторной графикой_ называется способ работы с изображениями, при котором оно -представлено в виде фигур, каждая из которых имеет собственное описание (тип, -размеры, кривизну или иные параметры составных частей, их цвета, способ -представления и т. п.). Некоторые графические устройства (например, -распознающие формат PostScript) умеют сами интерпретировать описания фигур, -для других необходимо заранее просчитать и сформировать картинку программным -путём. - -===== Работа с PostScript и PDF ===== - -Современная полиграфия уже не мыслится в отрыве от компьютеров, все -до печатные материалы обычно существуют в электронной форме, и именно -электронные документы подаются на печатающие устройства для вывода. Причём -для современной полиграфии de facto стандартом является формат PostScript. -PostScript -- это язык описания страницы, позволяющий представить любые -полиграфические материалы в векторном формате (однако он допускает и -включение растровых фрагментов). Файл в формате PostScript фактически -представляет собой программу, описывающую, какие действия нужно произвести, -чтобы получить требуемый вывод. Профессиональные печатающие устройства умеют -непосредственно интерпретировать документы на языке PostScript. - -PDF (Portable Document Format, переносимый формат документов) -- модификация -языка PostScript, разработанная для того, чтобы обмениваться полиграфическими -документами через Internet. В PDF есть специальные возможности для публикации -документов в Сети, в частности, поддержка гиперссылок, а некоторые -возможности языка PostScript оттуда, наоборот, исключены. - -Ghostscript -- интерпретатор языка описания страниц PostScript и файлов в -формате PDF (формат переносимых документов). Ghostscript преобразует -PostScript во многие растровые форматы, подходящие для вывода данных на экран -или на принтер, не поддерживающий PostScript. Обычно Ghostscript используется -для просмотра файлов PostScript и для печати на принтерах, не поддерживающих -язык PostScript, GhostScript используется множеством приложений для вывода -данных на печать. Графический интерфейс для GhostScript предоставляет -программа GhostView (команда gv), она позволяет отображать документы в -форматах PostScript и PDF в графической среде _X Window System_. Для различных -манипуляций с файлами в формате PostScript предназначен пакет утилит -командной строки `psutils`, с их помощью можно выбрать, переупорядочивать, -масштабировать страницы в PostScript-файлах, изменять параметры текста и -делать многое другое. - -Специально для просмотра PDF-файлов предназначена программа xpdf, она -позволяет переходить по гиперссылкам в документе, просматривать структуру -документа, производить поиск и поддерживает сглаживание шрифтов. -Альтернативой xpdf может быть Acroread -- версия известного приложения Adobe -Acrobat для Linux, однако, в отличие от xpdf, оно является несвободным -программным продуктом. - -===== Диаграммы ===== - -Отдельно стоит упомянуть редакторы диаграмм, которые часто смешивают с -обычными редакторами векторной (плакатной) графики. Между тем задачи у них -разные: если для плакатной графики главное -- построение «картинки», -соответствующей задумке автора по внешнему виду, то в диаграмме автора более -беспокоит логическое соответствие изображения проекту и его наглядность. -Поэтому при построении диаграммы много внимания уделяется «стрелочкам» и -прочим соединительным линиям, оптимальному размещению объектов на странице, -типизации объектов и т. п. - -Самая старая из подобных утилит, xfig, и по сей день активно используется, -формат её диаграмм распознают многие средства работы с векторной графикой. -Более мощной является ориентированная на среду Gnome утилита Dia, возможности -которой продолжают расти (есть даже проект перевода диаграмм в нотации языка -моделирования программных продуктов UML непосредственно в текст на C++). -Аналогом Dia для KDE является встроенная в пакет KOffice утилита Kivio. - -===== Плакатная графика ===== - -Что же касается собственно векторной (плакатной) графики, то и здесь есть из -чего выбирать. Например, Sodipodi -- программа векторного рисования общего -назначения. Она использует подмножество формата W3C SVG в качества формата -собственных файлов. Применяется новейшее ядро для отображения, со -сглаживанием, альфа-каналом и векторными шрифтами. Сходными возможностями -обладает и отпочковавшаяся от Sodipodi программа Inkscape, главным отличием -которой является полная поддержка формата SVG и ориентация на среду Gnome. -Многообещающе выглядит проект Skencil, позволяющий редактировать некоторые -виды PostScript-файлов. Среда KDE также имеет «свой» редактор векторной -графики, Karbon14, входящий в состав семейства программа KOffice. - -==== Растровая графика ==== - -_Растровая графика_ означает работу с изображением, представленным в виде -матрицы точек («пикселей»). Это значит, что при сильном увеличении границы -любого объекта будут выглядеть «лесенкой» из точек (в отличие от векторного -представления, где увеличение повышает качество изображения). С другой -стороны, растр -- удобный для компьютерной обработки формат представления -фотографий, сделанных от руки рисунков и прочих изображений, которые нельзя -расчленить на отдельные фигуры. - -В GNU/Linux есть развитые средства для редактирования растровой графики. -Самым мощным из них является GIMP (GNU Image Manipulation Program). С её -помощью пользователь сможет редактировать изображения, создавать логотипы и -другие графические элементы особенно полезные при создании Web-страниц. GIMP -включает много инструментов и фильтров, аналогичных тем, которые можно найти -в коммерческих графических редакторах, а также несколько возможностей, -эксклюзивных для этой программы. GIMP предоставляет возможность работать с -цветовыми каналами, уровнями изображения, накладывать эффекты, сглаживать -шрифты и конвертировать изображения в разные форматы. В GIMP имеется -собственный язык программирования сценариев (на основе Scheme), на котором -можно создавать довольно замысловатые дополнения к основной программе. -Недостаток GIMP -- слабая (оформленная в виде дополнения) поддержка цветового -стандарта CMYK, используемого в полиграфии, поэтому в электронной -документации, редактировании изображений для www-страниц и прочих областях, -не имеющих дела с бумагой, его применяют чаще. - -Очень полезен набор утилит для обработки графики из командной строки -- -ImageMagick. В этот набор входят утилиты для отображения (display), -преобразования (convert) изображений, захвата изображений с экрана (import) и -даже собственный интерпретируемый язык программирования, Magick Scripting -Language. Для полуавтоматического перевода из растрового представления в -векторное существует несколько специальных утилит, например, -autotrace/autofig или potrace. - -==== Трёхмерная графика ==== - -Для Linux создано несколько программных пакетов, работающих с -пространственным представлением объектов. - -Исходные тексты одного из самых мощных пакетов трёхмерного моделирования, -пересчёта (рендеринга) и анимации -- Blender -- в 2002 году были открыты и -весь проект полностью переведён под свободную лицензию. Авторы Blender пришли -к выводу, что открытая разработка инструмента более эффективна и прибыльна -для тех, кто этим инструментом (а не его продажей) зарабатывает. Для этого -пришлось выкупить находящиеся в собственности спонсоров части проекта у -хозяев за сумму сто тысяч евро. Искомую сумму предоставило сообщество -пользователей Blender, уже тогда немалое: каждый внёс сколько смог, и менее, -чем за два месяца, денег на счёте оказалось достаточно. С тех пор круг -пользователей и возможности Blender продолжают постоянно расти. - -Для выполнения задач, совмещаемых Blender, есть и отдельные программные -средства. Например, популярный пакет трассировки лучей (трёхмерного -проектирования и сценографии) POV-Ray, с помощью которого создаются проекты -удивительной сложности и красоты (например, перевод картины Уильяма Марлоу -«Каприччо» в трёхмерное представление -- с тем только, чтобы из определённой -точки повторить её). Многие графические редакторы имеют встроенные средства -анимации, а иные (как, например, CinePaint, называвшийся ранее FilmGimp) -специально разрабатываются для мультипликаторов. - -Не стоит забывать, что популярный нынче стандарт OpenGL -- открытый; он -разрабатывался для UNIX-подобных систем и используется большим числом -программ для Linux (в том числе и Blender). К сожалению, производители -аппаратного обеспечения (видеокарт), как правило, скрывают не только -устройство своих карт, но даже и способ их низкоуровнего использования. -Поэтому в открытом доступе оказываются лишь готовые драйверы (без исходных -текстов) к некоторым версиям ядра Linux и определённым сборкам XFree86. -Отображение трёхмерных объектов с пересчётом на программном уровне пока -работает существенно медленнее, хотя ничуть не хуже, поэтому используя OpenGL -для игр и прочих программ, требующих действительно быстрой работы графической -подсистемы, нужно всегда помнить о необходимости получить -- возможно, -несвободный -- драйвер. - -=== Мультимедиа === - -==== Музыкальные шкатулки ==== - -Программ-проигрывателей звуковых файлов в Linux не перечесть. Очевидный лидер -по популярности среди них -- XMMS (X Multi Media System). Помимо основной -функции -- играть музыку (поддерживается множество форматов) -- в нём -реализовано немало звуковых и визуальных эффектов благодаря большому -количеству расширений. Интерфейс XMMS аналогичен интерфейсу не менее -популярного в системах Windows приложения WinAMP (кстати, XMMS умеет -использовать «шкурки» WinAMP2). Почти не уступает XMMS его «брат» BEEP, -использующий графическую библиотеку GTK2, а не GTK. Есть и другие программы, -которые ничуть не хуже этих играют музыку. Обычно каждая среда рабочего стола -реализует собственный проигрыватель звуковых файлов, хотя бы для того, чтобы -воспроизводить собственные звуковые эффекты, связанные с различными -системными событиями, однако с их помощью прослушивать файлы может и -пользователь. - -Очевидно, что для прослушивания звука совсем не обязательно использовать -графический интерфейс, поэтому в Linux есть большое количество терминальных -утилит для воспроизведения звука. Некторые из них, например, mpg123, mpg321, -ogg123 или splay, предназначены для проигрывания оцифрованного звука -(возможно, в сжатых форматах), другие, такие как lazy или cd-console, -управляют музыкальными лазерными дисками, есть утилиты, играющие музыку в -нотном (midi) и других форматах -- timidity (она отличается тем, что -преобразует ноты, записанные для инструментов в оцифрованное звучание этих -инструментов, а значит, не требует MIDI-устройства), mikmod (распознаёт -множество форматов: MOD, STM, S3M, XM и т.д.), sidplay и прочие. Чтобы -пользователь не запутался, специальные оболочки, например mpfc или cplay, -предоставляют общий интерфейс ко всем консольным проигрывателям. - -==== Музыкальные редакторы ==== - -Часть профессиональных музыкантов предпочитает использовать для работы со -звуком дорогие специализированные музыкальные компьютеры: в этом повинна и -реклама, и низкое, с точки зрения профессионала, качество звука большинства -звуковых карт в компьютерах общего назначения. Несмотря на это и для таких -компьютеров существует немало программ, работающих со звуком на -профессиональном уровне. Такие программы можно разделить на две категории: -нотные редакторы, задача которых -- создание, редактирование, запись и нотное -представление музыкальных композиций, и звуковые редакторы для собственно -звука, а также преобразования его, наложения эффектов и т. п. - -===== Нотные редакторы ===== - -В операционных системах, основанных на GNU/Linux, также присутствуют мощные -программы для редактирования музыки и звука. Пожалуй, самым известным из них -является Rosegarden. Программа изначально разрабатывалась для -профессиональных _мультимедиа-станций_ от Silicon Graphics и работала на -операционной системе IRIX, потом она была перенесена на Linux, а исходные -тексты программы были открыты. Сегодня Rosegarden представляет из себя -развитый MIDI- и аудиосеквенцер, нотный редактор, а также редактор общего -назначения для сочинения и редактирования музыки. Он прост в изучении и -идеально подходит для композиторов, музыкантов или студентов музыкальных -специальностей, работающих в маленькой студии или записывающихся дома. - -Noteedit -- нотный редактор (редактор партитур), основанный на -Midi-библиотеке TSE3. Он может писать и читать Midi файлы и сигналы от -внешней Midi-клавиатуры. Системные Midi-устройства используются для -воспроизведения нотной записи. Имеется возможность сохранить партитуры в -формате MusiXTeX или Lilypond для последующего вывода на печать. - -MusE -- это MIDI-секвенсер в стиле Cubase/Logic Audio, поддерживающий ввод -MIDI-событий с клавиатуры и последующее их редактирование в нотном редакторе, -матричном редакторе, редакторе списка событий и редакторе ударных -инструментов. - -===== Редакторы и фильтры оцифрованного звука ===== - -Популярный свободный редактор звука -- это Audacity. Он умеет записывать звук -сразу в форматы WAV, AIFF, AU, IRCAM или MP3. В нём есть всевозможные -инструменты для редактирования записанного звука, в том числе встроенный -редактор амплитуды, настраиваемый режим отображения спектрограммы и средства -частотного анализа звуковых дорожек. Встроенные простейшие аудиоэффекты -включают усиление баса, WahWah, удаление шума и т.д. Audacity поддерживает -модульные дополнения, в которых обычно поставляются более сложные -аудиоэффекты. В список поддерживаемых форматов модулей входят VST, LADSPA и -Nyquist. - -Sweep -- это многоканальный звуковой редактор, в котором реализованы все -основные операции, такие как удаление, копирование, вставка и применение -эффектов, оформленных в виде плагинов, к любой части звукового файла. -Примерно теми же возможностями обладают и другие редакторы звука -- Rezound, -WaveSurfer и GNUSound. - -Как и в случае с другими мультимедиа-форматами, в Linux существуют -терминальные утилиты для обработки звука, не требующие графического -интерфейса. Основной пакет терминальных утилит для работы со звуком -называется SOX, в него входят утилиты для преобразования, записи и -проигрывания звуковых файлов, поддерживается множество форматов. - -При помощи консольных утилит можно также сжимать звуковые файлы в различные -форматы с потерей качества. Содержимое файла, сжатого «с потерей качества», -может быть неотличима на слух от содержимого исходного файла: алгоритмы -преобразования учитывают человеческую физиологию, например, формат MP3 не -воспроизводит слишком высоких звуков, а слишком низкие не разделяет на два -канала. Смысл термина «потеря качества» -- в том, что из упакованного файла -исходный восстановить уже нельзя. Сжатие с потерей качества можно настраивать -на определённую мощность потока упакованных данных: чем больше данных можно -передавать в единицу времени, тем чище звук, поэтому такие форматы подходят -для передачи по сети (например, Internet-радио). - -Основные форматы с потерей качества -- это MP3 (с ним работают упаковщики -`lame/toolame`, `bladeenc`) и OGG Vorbis (утилита `oggenc`). Эти форматы -(особенно OGG) хорошо подходят для упаковки качественной музыки. Файлы в -формате OGG, упакованные семикратно (192 kbp/s), почти неотличимы на слух от -исходных. Если необходимо сжать звук с ощутимой потерей качества (но без -потери членораздельности и раз в двадцать), можно использовать другие -форматы -- `gsm`, `aiff`, `adpcm`, `speex` (сжатие речи) или `bonk`. -Последний формат -- нестандартный, он поддерживается одноимённой утилитой и -отличается большой гибкостью, так как может работать и в режиме «сжатие без -потерь». Для сжатия без потерь разработан специальный формат -- FLAC, его -распознают многие программы (в том числе и утилиты от авторов этого формата --- `flac` и `metaflac`) и даже аудиоустройства. - -==== Видеопроигрыватели ==== - -Наиболее полнофункциональным и удобным «домашним кинотеатром» для Linux -является программа `xine`. `Xine` поддерживает `mpeg-2` и `mpeg-1` (включая -DVD) потоки, MPEG-4 и другие форматы. Альтернативный ему универсальный -проигрыватель -- MPlayer. Существует приложение для проигрывания видеопотока, -получаемого по Сети -- VideoLAN (vlc), которое работает с форматами MPEG1, -MPEG2, MPEG4 (также известный как DivX) и DVD. - -`Xawtv` -- программа для просмотра и записи видеопотоков Video4Linux, то есть -программа для просмотра ТВ. `Xawtv` использует набор графических элементов -Athena. Может использоваться совместно с VDR для просмотра цифрового -спутникового, кабельного и эфирного ТВ формата DVB. - -==== Видеоредакторы и конвертеры ==== - -В Linux есть выбор средств для преобразования и обработки видео. LiVES (the -Linux Video Editing System) претендует на звание простого, но мощного -средства редактирования и эффект-обработки видео. Базируясь на GTK+, оно -использует для работы такие широко распространённые средства, как -MPlayer/mencoder и ImageMagick (в будущем, возможно, `gstreamer` и `Xine`). В -настоящий момент рекомендуется использовать LiVES для работы с небольшими -файлами. - -GStreamer представляет собой библиотеку для обработки медиапотоков, -основанное на идее объединённых в графы фильтров, обрабатывающих медиаданные. -Приложения, использующие эту библиотеку, смогут производить любую обработку -медиаданных от обработки звука до проигрывания видео. Модульная архитектура -позволяет реализовать поддержку любого нового формата данных, просто -установив соответствующее расширение. - -Kino -- это нелинейный редактор цифрового видео (DV) для GNU/Linux. Он хорошо -интегрирован с IEEE 1394 и позволяет захватывать изображение, управлять VTR, -и записывать на камеру. Этот редактор записывает видео на диск в формате AVI -в кодировках `type-1 DV` и `type-2 DV`. Существуют терминальные утилиты для -обработки видеопотока, например, пакет transcode. Кодирование и декодирование -видеопотока осуществляется с помощью загружаемых модулей. Также -поддерживается загрузка внешних фильтров. В число модулей входят: модули -импортирования из DVD, элементарных MPEG (ES) и программных потоков (VOB), -видео в формате MPEG, цифрового видео (DV), потоков YUV4MPEG, поддержка -формата файлов NuppelVideo и необработанных потоков видео; модули для записи -DivX;-), OpenDivX, DivX 4.xx или несжатых файлов AVI с MPEG, звука в -форматах AC3 или PCM; дополнительные модули для записи отдельных кадров (PPM) -или потоков YUV4MPEG. Пакет `transcode` содержит набор утилит для -демультиплексировани (`tcdemux`), выделения (`tcextract`) и декодирования -(`tcdecode`) видеопотока, исследования (`tcprobe`) и сканирования (`tcscan`) -ваших файлов и пост-обработки файлов AVI, изменения заголовков файлов AVI -(`avifix`), соединения нескольких файлов в один (`avimerge`) или разделения -большого файла на несколько AVI-файлов меньшего размера (`avisplit`) для -размещения на CD. - -`Ffmpeg` -- это «сверхзвуковой» кодировщик/декодировщик видео и звука, -работающий в режиме реального времени, а также потоковый сервер и -преобразователь различных звуковых и видеоформатов. `Ffmpeg` умеет захватывать -видеосигнал из источника Video4Linux и преобразовывать его в файлы различных -форматов на основе компенсирующего кодирования DCT/motion. Звук при этом -сжимается по алгоритму MPEG-2 или алгоритму, совместимому с AC3. - -==== Запись CD и DVD ==== - -Для записи дисков и сопровождающих запись задач в Linux есть как минимум два -приложения с графическим интерфейсом: входящее в комплект приложений для KDE -k3b и написанное на GTK `xcdroast`. Фактически, оба этих приложения -- это -графические оболочки над терминальными утилитами для записи CD и DVD, в -первую очередь `cdrecord` и `cdrdao`, которыми можно пользоваться и -непосредственно из командной оболочки. `cdrecord` -- утилита для записи дисков -с цифровыми данными, в нём реализована полная поддержка аудио-, смешанных, -мультисессионных и CD+ дисков. `cdrdao` -- программа записи аудиодисков в одну -сессию позволяет управлять областями в начале дорожек данных (длиной до 0, -ненулевые аудиоданные) и, например, международными стандартными кодами -записи. Все данные, которые будут записаны на диск, должны быть описаны в -текстовом файле. Аудиоданные могут быть в форматах WAVE или raw. - -Помимо того, для Linux есть множество программ, позволяющих производить -обратную операцию: считывание данных с аудиодиска в файл, такие программы -называются грабберами (grabber). Один из удобных грабберов с графическим -интерфейсом -- Grip. - -=== Издательские системы === - -Подготовка печатных документов и оригинал-макетов изданий -- хоть и не очень -распространённое, но важное приложение компьютера. В Linux самой известной и -системой подготовки качественных документов, пригодных к печати в типографии, -является TeX. TeX -- это фактически специализированный язык программирования, -специально разработанный для описания типографского набора. Документ в TeX -представляет собой текст, сопровождённый командами, указывающими, какое -форматирование следует произвести. Возможности TeX очень широки, однако для -того, чтобы их использовать в полной мере, требуются довольно серьёзные -познания в нём. Чем шире познания -- тем легче, быстрее и удобнее готовить -документы в ТеХе и тем лучше их качество. - -Обычно TeX используется совместно с пакетами форматирования более высокого -уровня, например, LaTeX. LaTeX -- это набор написанных на языке TeX -макропакетов, предоставляющих удобные средства для решения типичных задач -оформления печатных изданий. В LaTeX определено оформление для нескольких -стандартных классов документов. - -LyX -- это современных подход к написанию документов, разрывающий с -устаревшей парадигмой использования компьютеров как пишущих машинок, -применяемой в большинстве других систем подготовки документов. Он разработан -для тех, кто хочет получить профессиональное качество документа при печати, -не тратя при этом много времени и усилий, и не становясь специалистом по -полиграфическому оформлению. Основное новшество в LyX -- это WYSIWYM (What -You See Is What You Mean -- Вы видите то, что вы имели в виду), которое -означает, что автор сосредотачивается над своей работой, а не над деталями -оформления документа. Это позволяет продуктивно работать, оставляя -заключительное оформление специальному движку (такому как LaTeX), который -специально разработан для подобных задач. С LyX автор может -сконцентрироваться на содержании своей работы и позволить компьютеру взять -большинство забот об оформлении на себя. - -В Linux есть по крайней мере одна программа для визуальной подготовки -оригинал-макетов, аналогичная _издательским системам_ Adobe PageMaker, -QuarkXPress и подобным -- `scribus`. Возможности его могут быть более -ограничены, чем у перечисленных коммерческих аналогов, однако он -распространяется свободно и в настоящее время активно разрабатывается. - -=== Нельзя объять необъятного === - -В этот краткий и фрагментарный обзор не вошли собственно инструменты для -разработки программного обеспечения, которые развиты в Linux чуть ли не -лучше, чем все остальные приложения, поэтому написать краткий обзор для них -гораздо сложнее. Не сказано ничего о серверах баз данных (не не потому, что -таких серверов нет!) и серверах приложений в составе сложных проектов. -Обойдены вниманием и игры -- любой читатель этой лекции сможет самостоятельно -решить, сколько внимания и каким из них уделять. - -Напоследок повторим: главной целью приведённого обзора приложений для Linux -было показать, что приложения есть и их много, нужно только достаточно -внимательно искать -- и нужное обязательно найдётся. Мефодию для поиска -доступен очень удобный инструмент, описанный в лекции <>, менеджер пакетов APT и команда apt-cache search. Поскольку в -современные дистрибутивы Linux входят тысячи пакетов, почти наверняка среди -них найдётся нужное приложение. Кроме того, любому пользователю Internet -доступен поисковый сайт http://google.com, наиболее подходящий для поиска -чего бы то ни было, а для поиска существующих приложений для Linux можно -воспользоваться специализированными сайтами -- http://rpmfind.net, -http://freshmeat.net, http://rpm.pbone.net или сайтом, посвящённым выбранному -дистрибутиву. - -Обратите внимание, что все названные в этой лекции приложения -- это свободно -распространяемые и разрабатываемые программы (см. лекцию <>), если не -оговаривается обратное. Характерная черта свободного программного обеспечения -состоит в том, что если для решения какой-то задачи есть одно свободное -приложение, то всегда есть и несколько других (о причинах этого см. лекцию -<>, так что пользователь всегда может выбрать -себе приложение по вкусу, а если подходящего не обнаружится -- изменить для -себя одно из уже существующих или даже написать новое. В конце концов, нет -ничего дороже и милее сделанного собственными руками велосипеда. - -[[license]] -== Политика свободного лицензирования. История Linux: от ядра к дистрибутивам == - -=== История возникновения свободного ПО === - -==== Разработка ПО как научное исследование ==== - -Особенность программного обеспечения состоит в том, что оно производится в -одной форме -- в виде _исходного текста_ (source code), а распространяется и -используется в другой -- в виде двоичной программы, машинных кодов, по -которым невозможно однозначно восстановить исходный текст. Чтобы изменять -программу, исправлять ошибки или даже просто точно установить, что и как -делает программа, необходимо располагать её исходным текстом. - -Первоначально создание программного обеспечения для компьютеров было в первую -очередь академическим занятием. Для специалистов в области компьютерной -науки (computer science) каждая программа представляла собой результат -научного исследования, в некотором смысле аналогичный публикации статьи. Это -означает, что исходный текст программы был обязательно доступен всему -научному сообществу, поскольку любой научный результат должен быть -верифицируем, т. е. подтверждаться другими исследователями и быть открытым -для критики. Таким образом, процесс разработки программного обеспечения более -принципиально схож с научным процессом: учёный брал существующие программы, -исправлял их в соответствии со своими идеями и публиковал исправленные -программы -- новый результат. - -Однако технология производства компьютеров развивалась не менее активно, чем -программное обеспечение для них. В 1970-е годы существует огромное -разнообразие различных архитектур вычислительных машин, различавшихся также и -производительностью, и ценой. Естественно, для каждой архитектуры приходилось -разрабатывать отдельный набор программного обеспечения. С середины 1970-х в -большинстве американских университетов (где преимущественно и развивалась -компьютерная наука) для академических разработок использовались компьютеры -архитектуры PDP-10, что позволило сотрудникам разных университетов -использовать разработки друг друга на своих машинах. Сотрудники лаборатории -искусственного интеллекта массачуссетского технологического института в -конце 1970-х разработали для PDP-10 собственную операционную систему ITS -(Incompatible Timesharing System, несовместимая система с разделением -времени) и очень большой набор программ для неё. Исходные тексты написанных в -МТИ программ были общедоступны, сотрудники других университетов пользовались -их исходными текстами и присылали им исправления, всё программное обеспечение -в этих лабораториях было полностью академическим, а среди -учёных-разработчиков был настоящий дух сотрудничества. - -==== ПО как «патентованный» продукт ==== - -В условиях огромного многообразия архитектур компьютеров программное -обеспечение составляло неотъемлемую часть самой машины, причём далеко не -самую дорогостоящую часть. Производители компьютеров поставляли их вместе с -основным программным обеспечением, по крайней мере, с операционной системой. -Производство компьютеров было наукоёмким, в основе своей коммерческим -предприятием. - -В ситуации, когда программное обеспечение является объектом продажи наравне с -предметами обихода, на него автоматически распространяются уже не только -законы научной разработки, но и свойства материальных предметов, которыми -можно торговать, обмениваться, право владения и пользования которыми стоит -охранять законодательно. Так, программное обеспечение попало в разряд -интеллектуальной собственности: т. е. исходный текст программы стал -рассматриваться как произведение, объект применения авторского права. Чтобы -защитить свои интересы, производители компьютеров и программного обеспечения -используют _лицензии_ -- вид договора между обладателем авторских прав и -пользователем (покупателем) программного обеспечения. Подобные договоры -заключались и с университетами, например, университету передавались исходные -тексты программ и право их изменять, но запрещалось распространять их за -пределами университета. Подобные ограничения означали, что тексты -соответствующих программ не могли открыто обсуждаться в сообществе, т. е. не -существовали для научной разработки. Были у компьютеров и программного -обеспечения покупатели и вне академической среды, например, банки. Таким -пользователям не столь важно получить исходные тексты программ, они -заинтересованы в программном обеспечении как в законченном продукте и готовы -платить деньги за надёжные и удобные программы. - -В европейской культуре столь долго вырабатывались правила собственности по -отношению к материальным предметам, что распространение этих прав на предметы -нематериальные -- программные продукты -- выглядит делом естественным и не -вызывает сомнений. А поводов для сомнений немало. Главное отличие -программного продукта от, допустим, табурета -- т. н. _без ущербное -копирование_. Если грабитель отбирает у крестьянина табурет, совершается -злодеяние: крестьянин табурета лишается, терпит ущерб. Если крестьянин отдаёт -кому-то табурет добровольно, он его также лишается, поэтому вправе требовать -возмещения ущерба -- например, деньгами. Для того, чтобы ущерба у крестьянина -не происходило, табурет нужно воспроизвести: добыть досок, позвать столяра, -краснодеревщика и оплатить их работу, и один из двух получившихся предметов -обихода отдать грабителю. В этом случае ущерб -- денежный -- терпит тот, кто -оплачивает копирование табурета. Совершенно естественно при этом -законодательно запрещать нанесение ущерба, то есть признавать право -распоряжаться вещью только за одним человеком -- за её хозяином. Никаких -дополнительных механических или юридических приспособлений, запрещающих -воспроизводить табуреты, при этом не требуется. - -Иное дело -- программный продукт. Сколько бы средств ни было вложено в его -разработку, процедура его копирования (переписывания с одного носителя данных -на другой) резко отличается от процедуры воспроизведения табурета. Она не -требует участия ни одного из авторов программы, ни, по большому счёту, вообще -человека. Единственная расходная статья при этом -- цена носителя данных и -амортизация копировального устройства. В результате такого копирования -получается два экземпляра программы, создающие удобства уже для двух человек. -Таким образом, если человек оценивает приносимые программой удобства выше -стоимости носителя данных, копирование -- благо. Если же относиться к -программному продукту, как материальной вещи, и закреплять право её -использования за одним каким-то человеком, возникает множество неурядиц, -каждую из которых приходится решать искусственными, а зачастую и -противоестественными методами. - -Например, придётся изыскивать, какой ущерб всё-таки наносится «хозяину» -программы при её без ущербном копировании. Обычно при этом фигурирует понятие -«упущенная выгода», то есть та прибыль, которую хозяин мог бы получить, но не -получил из-за того, что продукт скопировали. Вспоминается история 30-х годов, -когда советский колхозник украл мешок колхозной пшеницы, и был осуждён за -хищение в крупных размерах: если, мол, эту пшеницу всю посадить, да -вырастить, да собрать, вышло бы несколько центнеров. Приходится изобретать -хитроумную аппаратуру, мешающую копированию, или причиняющую при этом ущерб. -Приходится вводить в законодательство особую категорию прав, условно назовём -её «патент» footnote:[Условно -- потому, что далеко не во всех странах -разрешено выдавать патенты на программное обеспечение, однако везде отношения -собственности на исходные тексты программ регулируются общими или -специальными разделами законов об авторском праве (разных в разных -государствах).], ограничивающую злоупотребления -- и свободу -- всего -человечества в пользу хозяина патента. Причём далеко не всегда хозяин патента -и автор изобретения -- один и тот же человек! - -Далее в лекции патентованные программные продукты и способ их разработки -будут в чём-то противопоставлены свободно распространяемым программам. Термин -_«патентованный программный продукт»_ будет означать не наличие действительного -патента на программу, а наличие у программы собственника, который относится к -ней как к материальному объекту (в случае патентованных программ). -Патентованные программы часто называют иногда «проприетарными» (от -английского термина «proprietary») или просто «коммерческими» (что, строго -говоря, неверно, так как «делать коммерцию» -- то есть получать выгоду -- -можно различными способами, и многие успешные свободные проекты это -подтверждают). - -==== Появление свободного ПО ==== - -Однако компьютеры развивались очень быстро, и бывшие вполне современными в -1970-е PDP-10 к началу 1980-х уже устарели, и значительно отставали по -производительности от более современных машин. Однако ни для одной из новых -архитектур уже не было операционной системы и прочего программного -обеспечения, разработанного исключительно в академической среде. Университеты -должны были покупать новые компьютеры с новым программным обеспечением и -выполнять условия лицензии, ограничивающей их права на разработку и -распространение ПО, иначе говоря, ограничивающей возможность научной модели -разработки программного обеспечения. - -В это время в лаборатории искусственного интеллекта МТИ разрабатывались так -называемые LISP-машины, умевшие на аппаратном уровне интерпретировать язык -программирования, похожий на LISP -- развитый и перспективный язык -программирования. На LISP же была написана операционная система для таких -машин и всё программное обеспечение для них. В начале 1980-х некоторые -сотрудники лаборатории искусственного интеллекта выкупили у МТИ права на -LISP-машины и математическую систему MACSIMA и основали собственные -коммерческие компании для дальнейшей разработки в этой области. Очень многие -сотрудники лаборатории перешли работать в эти компании, после чего все их -дальнейшие разработки уже становились закрытыми для научного сообщества. -Новые LISP-машины распространяются с лицензиями, запрещающими пользователям -модифицировать и распространять исходные тексты программ. Программы, которые -раньше для сотрудников МТИ были аналогом научных публикаций, стали -принадлежащим кому-то патентованным продуктом. - -Одному из сотрудников, оставшемуся в лаборатории искусственного интеллекта -МТИ, Ричарду Столлману, такое положение дел казалось недопустимым нарушением -открытого научного процесса разработки программного обеспечения. Он в -одиночку пытался в рамках прежней академической модели развивать LISP-машины -и открыто реализовывать изменения, аналогичные сделанным в рамках закрытой -коммерческой разработки, чтобы LISP-машины МТИ могли конкурировать с -патентованными аналогами. Конечно, эта попытка угнаться за активной -разработкой целой компании была обречена на неудачу. - -Тогда в поисках единомышленников Ричард Столлман создаёт некоммерческую -организацию Фонд свободного программного обеспечения (Free Software -Foundation, FSF). Своей основной целью Фонд ставит сохранение программного -обеспечения, процесс разработки которого всегда будет гарантированно -открытым, а исходные тексты всегда доступны. Более масштабная цель Фонда -- -разработка операционной системы, целиком состоящей из открыто -разрабатываемого программного обеспечения. Декларируя такую цель Столлман, -фактически хотел вернуть представлявшееся ему идеальным состояние, когда в -МТИ работали в собственной операционной системе для PDP-10. - -Операционная система, разрабатываемая в рамках Фонда, должна была стать -совместимой с операционной системой UNIX. Изначально UNIX был разработан в -1970-е годы Кеном Томпсоном и Деннисом Ричи в лаборатории компании AT&T и -распространялся этой компанией (а впоследствии -- и другими) как -патентованная операционная система. К началу 1980-х UNIX очень широко -использовался, в том числе и в академической среде, для этой операционной -системы существовало много программ, свободно распространявшихся в научном -сообществе, поэтому хотелось, чтобы эти программы работали и в новой -- -свободной -- операционной системе. Эта будущая операционная систему получила -название GNU footnote:[Это псевдоаббревиатура, для которой сам Столлман -предлагал рекурсивную расшифровку: GNUs Not Unix («Гну -- Не UNIX»).]. - -==== Определение свободного ПО ==== - -Для того, чтобы сохранить модель научного сотрудничества между -разработчиками, необходимо было обеспечить, чтобы исходные тексты программ, -написанных разработчиками, оставались доступными для чтения и критики всему -научному сообществу. Для этого Ричард Столлман сформулировал понятие -_свободное программное обеспечение_, в котором отразились принципы открытой -разработки программ в научном сообществе, сложившемся в американских -университетах в 1970-е годы. Столлман явно сформулировал эти принципы, они -же -- критерии свободного программного обеспечения. Эти критерии оговаривают -те права, которые автор свободной программы передаёт любому пользователю. - -* Программу можно использовать с любой целью («нулевая свобода») -footnote:[Для российских пользователей эта свобода действительно «нулевая», в -том смысле, что она присутствует всегда, в том числе и у пользователей -патентованного ПО. По российскому законодательству обладатель прав на -интеллектуальную собственность может передавать или не передавать -пользователю право на распространение копий своего произведения (в данном -случае — программного обеспечения), однако у него нет никаких прав каким бы -то ни было образом ограничивать владельца копии в использовании программы.]. -* Можно изучать, как программа работает и адаптировать её для своих целей -(«первая свобода»). Условием этого является доступность исходного текста -программы. * Можно распространять копии программы -- в помощь товарищу -(«вторая свобода»). * Программу можно улучшать и публиковать свою улучшенную -версию, с тем чтобы принести пользу всему сообществу («третья свобода»). -Условием этого является доступность исходного текста программы. - -Только удовлетворяющая всем принципам программа может считаться свободной, т. -е. гарантированно открытой и доступной для научного сообщества. Нужно -подчеркнуть, что эти принципы оговаривают только доступность программ для -всеобщего использования, критики и улучшения, но никак не оговаривают -связанные с распространением программ денежные отношения, в том числе не -предполагают и бесплатности. В англоязычных текстах здесь часто возникает -путаница, поскольку слово «free» обозначает не только «свободное», но и -«бесплатное» и нередко употребляется по отношению к программному обеспечению, -которое распространяется без взимания платы за использование, но которое при -этом совершенно недоступно для изменения сообществом, просто потому, что его -исходные тексты не опубликованы. Такое бесплатное ПО вовсе не является -свободным. Наоборот, свободное ПО вполне можно распространять, взимая при -этом плату, однако соблюдая при этом критерии свободы: каждому пользователю -предоставляется право получить исходные тексты программ, изменять их и -распространять далее. Всякое программное обеспечение, пользователям которого -не предоставляется такого права, является несвободным. - -Открытый доступ к исходным текстом программ, в действительности, является -ключевым признаком свободного ПО, поэтому предложенный несколько позднее -термин «open source software» (ПО с открытым исходным текстом) представляется -даже более удачным для обозначения феномена свободного программного -обеспечения, чем предложенный Столлманом «free software». - -==== Общественная лицензия GNU ==== - -Декларировав критерии свободного ПО, члены Фонда свободного ПО стали -распространять свои программы в соответствии с этими принципами, никак не -оформляя это документально, иначе говоря, первоначально свободные программы -распространялись вообще без _лицензии_. Однако произошедший с самим Ричардом -Столлманом прецедент убедил его в том, что документальное оформление -необходимо для свободного ПО. - -Ричард Столлман занимался разработкой текстового редактора Emacs (о котором -шла речь в лекции <>) на основе исходных -текстов Джеймса Гослинга (который впоследствии стал автором известного -сегодня продукта Java). Тогда Гослинг свободно раздавал свои исходные тексты -всем заинтересованным. Однако в некоторый момент Гослинг продал права на -распространение Emacs компании UniPress (http://www.unipress.com) и компания -попросила Столлмана прекратить распространение его версии Emacs, так как -права принадлежат им. Этот инцидент заставил Столлмана переписать заново те -части исходного текста Emacs, которые теперь принадлежали UniPress, после -чего он разработал собственную лицензию на программное обеспечение. - -Лицензия, сформулированная Столлманом, должна была работать так же, как и -лицензии на патентованное программное обеспечение: это типовой договор автора -программы (обладателя авторских прав) с пользователем, в котором автор -оговаривает права пользователя по отношению к программе. В отличие от -коммерческой лицензии, в лицензии Столлмана оговариваются те права, которые -пользователь получает по отношению к свободной программе: получать исходные -тексты программ, изменять их, распространять изменённые и не изменённые -версии (см. перечисленные выше критерии свободного ПО). Кроме того, в этой -лицензии оговаривается принципиальное для Столлмана условие распространения -свободного ПО: ни один пользователь не имеет права, сделав модифицированную -версию свободной программы, распространять её, не соблюдая всех принципов -свободного ПО, ограничивая тем самым права других пользователей по отношению -к программе. Иначе говоря, нельзя модификацию свободной программы сделать -несвободной. - -Лицензия, содержащая такое условие, получила название «copyleft». Здесь игра -слов: по-английски авторское право называется «copyright», буквально -«копироватьправо», а «copyleft», соответственно, «копироватьлево». -Действительно, условие «copyleft» прямо противоположно по смыслу авторскому -праву: авторское право призвано ограничить пользователя в копировании и -распространении копий продукта, а «авторское лево», наоборот, строго -запрещает его ограничивать. Впоследствии лицензия Столлмана получила название -«Общественная лицензия GNU» (GPL, GNU Public License). - -В настоящее время помимо GPL известны и другие лицензии, под которыми может -распространяться свободное ПО. Самая распространённая из таких лицензий -- -BSD footnote:[BSD -- Berkeley Software Distribution, пакет совместимого с -UNIX программного обеспечения, разработанный в университете Беркли и -распространявшийся свободно.] License. Лицензия BSD отличается от GPL главным -образом тем, что в ней отсутствует условие «copyleft», т. е. на основании -свободного ПО, распространяемого под этой лицензией, можно производить -несвободные модификации. Однако лицензия BSD и другие лицензии до тех пор -будут оставаться лицензиями на свободное программное обеспечение, пока они -соответствуют условиям, оговорённым принципами свободного ПО, объявленными -Фондом. - -==== Сообщество разработчиков и пользователей ==== - -Однако главное условие существования свободного ПО -- не лицензия, а люди, -которые готовы делиться текстами своих программ и совершенствовать тексты -чужих. Свободное ПО унаследовало модель открытой научной разработки, а вместе -с ней -- и специфическую организацию сообщества разработчиков и пользователей, -в некоторых отношениях напоминающую академическое сообщество. Чтобы лучше -продемонстрировать специфику этого сообщества, сравним социальные отношения, -сопровождающие использование свободного и патентованного ПО. - -У любого пользователя программного обеспечения непременно возникают вопросы, -когда он пытается применить его для решения своих задач. Традиционная -коммерческая модель разработки и использования программного обеспечения -основана на том, что исходные тексты программ являются коммерческой тайной -производителя, а пользователь получает готовый продукт -- скомпилированную -программу. Такая программа является несвободной. Пользователь несвободной -(патентованной) программы платит за неё производителю, который взамен -предоставляет ему некоторые гарантии, одна из которых -- отвечать на вопросы -о работе программы. Специально для этого производитель организует службу -поддержки, которая по телефону и по электронной почте отвечает на вопросы -пользователей. - -Пользователь свободно распространяемой программы не получает вместе с ней -никаких гарантий: автор сделал её исходный текст открытым для общества, но -при этом не брал на себя обязательств объяснять всем, как работает программа -footnote:[В общественной лицензии GNU есть даже стандартная формулировка, -закрепляющая отсутствие гарантий: «Настоящая программа поставляется на -условиях «как есть». Если иное не указано в письменной форме, автор и/или -иной правообладатель не принимает на себя никаких гарантийных обязательств, -как явно выраженных, так и подразумеваемых, в отношении программы, в том -числе подразумеваемую гарантию товарного состояния при продаже и пригодности -для использования в конкретных целях, а также любые иные гарантии». Текст -лицензии приводится в переводе Елены Тяпкиной.]. Поэтому получить ответ на -свой вопрос пользователь может из двух источников: из документации, а если её -недостаточно -- от более опытных пользователей. Хорошо, если такие -пользователи есть среди знакомых, а если нет? В этом случае их всегда можно -найти в _списке рассылки_ в Internet, посвящённом данной программе. - -Письмо, пришедшее на электронный адрес списка рассылки, будет отправлено всем -подписчикам списка, любой из них может ответить на него в списке, и ответ -также получат все подписчики и т. д. Так организуется нечто вроде виртуальной -общей комнаты для разговоров footnote:[Списки рассылки в Internet -- -наследники телеконференций сети Usenet, возникшей до появления Internet. В -Usenet существовали телеконференции буквально на любую тему, и, конечно же, -многие были посвящены программному обеспечению.]. В настоящее время сложилось -неписанное правило, что для каждой свободно распространяемой программы -существует отдельный список рассылки. Найти адрес этого списка и подписаться -на него можно в Internet (обычно на сайте, посвящённом данной программе). -Любой пользователь свободной программы может направить свой вопрос в список -рассылки. Списки рассылки читают разработчики программы и её активные -пользователи, и обычно среди них находится тот, кто ответит на вопрос -footnote:[Задавший вопрос пользователь должен принимать в расчёт, что все -подписчики списка рассылки участвуют в нём добровольно, и никто их них не -обязан отвечать на какие-либо вопросы, поэтому предъявлять претензии на этот -счёт бессмысленно и невежливо.]. Так получается, что пользователи свободных -программ, в отсутствие централизованной службы поддержки, организуются в -сообщество для взаимопомощи. - -У пользователей программ вновь и вновь возникают одни и те же вопросы и -сложности. Постоянным читателям списков рассылки это особенно очевидно, -поскольку им приходится на эти вопросы отвечать не по одному разу. В таких -ситуациях у них нередко возникает инициатива записать ответы на самые -распространённые вопросы и открыть их для всеобщего обозрения. Так к -свободной программе появляется новая документация в жанре FAQ (Frequently -Asked Questions, ЧАсто задаваемые ВОпросы), представляющая собой список -вопросов с ответами. Пользователи патентованных программ тоже задают одни и -те же вопросы, только не в списке рассылки, а службе поддержки, в результате -так же появляется документация типа FAQ, которая, почему-то, редко выходит за -пределы внутреннего пользования производителя программы. - -В любой программе непременно имеются ошибки (bugs). Производитель -патентованной программы оплачивает работу отдела контроля качества, который -занимается поиском ошибок. Тем не менее, некоторые ошибки этот отдел -пропускает, и они достигают пользователя. Пользователь несвободной программы, -столкнувшись с ошибкой, не может выявить её причину (поскольку ему недоступны -исходные тексты программы), но, скорее всего, способен описать ошибку и -условия, в которых она происходит. Он может сообщить об ошибке производителю -программы (обычно посредством обращения всё в ту же службы поддержки), и если -там решат, что ошибка действительно в программе, а не в работе пользователя, -о ней будет сообщено разработчикам. В итоге пользователь может ожидать, что в -следующей версии программы ошибка будет исправлена. - -У свободно распространяемой программы обычно нет оплачиваемого отдела -контроля качества. Значит, пользователь может столкнуться с ещё большим -количеством ошибок, чем в патентованной программе. Тем актуальнее для него -возможность сообщить об ошибке разработчикам программы. Раньше в -сопровождающей программу документации было принято указывать электронный -адрес, по которому разработчики принимали сообщения об ошибках, _bug report_. -Некоторые вводили стереотипную форму для таких сообщений, чтобы облегчить и -автоматизировать их обработку. Уже это требует существенно более высокой -связности сообщества во всём мире, существенно большей, чем достаточно для -закрытой разработки. - -Разработчики и контролёры-испытатели патентованного продукта могут ходить на -службу в один и тот же офис, и там обмениваться информацией или тратить -определённую долю рабочего времени на составление и анализ строгих -отчётностей, содержащих сообщения о ошибках и рапорты об устранении -неисправностей. Такая организация труда эффективна, если круг разработчиков -невелик, а ввести общую дисциплину относительно легко (например, угрожая -рублём). Для открытого проекта круг потенциальных разработчиков не ограничен -ничем, поэтому эффективность разработки в гораздо большей степени зависит от -того, насколько просто всем членам сообщества договариваться между собой, а -также от «сознательности» пользователей. Заметив ошибку в программе, -сознательный пользователь не просто исправит её самостоятельно (что не всегда -ему по силам), а оформит внятное сообщение об ошибке, а если исправление -готово, приложит к сообщению и его. - -Простому и упорядоченному приёму и перенаправлению сообщений об ошибках -служат системы отслеживания ошибок (Bug Tracking System), самые известные из -которых разработаны участниками больших проектов для себя, а благодаря -свободным лицензиям используются повсеместно. Таковы GNUTS (разработанная в -GNU), Bugzilla (mozilla.org), JitterBug (проект Samba) или Debian BTS. Более -ранние версии ориентируются на электронную почту, более поздние включают в -себя WWW-интерфейс. Например, при помощи Bugzilla организуется сайт в -Internet, на котором пользователь может заполнить форму сообщения об ошибке. -Каждое сообщение имеет свой номер, по которому можно попасть на -«персональную» страницу данной ошибки, где отражаются все происходящие по её -поводу события, от первоначального сообщения (открытия) до исправления -(закрытия). При каждом изменении в состоянии ошибки Bugzilla рассылает всем -заинтересованным лицам (включая, естественно, сообщившего об ошибке и -занимающихся данной программой разработчиков) письма по электронной почте. -Поскольку Bugzilla позволяет оставлять комментарии и прикладывать файлы, она -является полноценным средством для общения пользователя с разработчиком по -поводу ошибки в программе. - -Принципиальное преимущество пользователя свободной программы заключается в -том, что у него, в отличие от пользователей несвободных программ, всегда есть -возможность заглянуть в исходные тексты. Конечно, для многих пользователей -исходные тексты не более понятны, чем двоичные исполняемые файлы. Однако при -достаточном уровне познаний в программировании пользователь может установить -причину ошибки в программе и устранить её, исправив соответствующим образом -исходный текст. А если пользователь заинтересован в развитии программы, то с -его стороны будет разумно не только сообщить автору об ошибке, но и прислать -ему свои исправления к исходному тексту программы: автору останется только -применить эти исправления к тексту программы, если он найдёт их корректными и -уместными. Пересылать автору исправленный текст программы целиком -непрактично: он может быть очень большим (десятки тысяч строк), и автору -будет нелегко разобраться, что же изменено (а вдруг изменения сделаны -неграмотно?). - -Чтобы облегчить и автоматизировать процесс внесения исправлений, Ларри Уолл -(Larry Wall) в 1984 году разработал утилиту `patch` («заплатка»), которая в -формализованном (но хорошо понятном человеку) виде описывает операции -редактирования, которые нужно произвести, чтобы получить новую версию текста. -С появлением этой утилиты пользователь, обнаруживший и исправивший ошибку в -программе, мог прислать автору небольшую заплатку, по которой автор мог -понять, какие изменения предлагаются, и автоматически «приложить» их к своему -исходному тексту. С появлением patch гораздо больше пользователей стало -включаться в разработку программ с доступным исходным текстом, немалую роль и -здесь сыграла сеть Usenet (см. об этом статью Тима ОРейли -http://tim.oreilly.com/articles/paradigmshift_0504.html). Файлы-заплатки с -исправлениями -- обязательный атрибут сегодняшней разработки свободных -программ. - -Однако почему ограничивать сферу применения patch исправлением ошибок? Если -пользователю программы не хватает в ней какой-то функции, то при должной -квалификации он вполне может запрограммировать её сам и включить в исходный -текст программы. Естественно, ему выгодно, чтобы его дополнение попало в -«главный», авторский вариант программы (его называют «upstream») и появлялось -во всех последующих версиях: можно точно так же оформить его в виде patch и -выслать автору. Этой возможности лишён пользователь несвободной программы, -даже если он достаточно квалифицирован. Единственный способ включить в -программу нужную ему функцию -- обратиться к производителю (если программа -патентованная) с соответствующей просьбой, и надеяться, что производитель -сочтёт предложенную функцию действительно необходимой. - -Чем больше у свободной программы активных пользователей, готовых вносить -исправления и дополнения и делиться ими, тем надёжнее работает и быстрее -развивается программа. Причём такая свободная модель отслеживания и -исправления ошибок для программы, у которой тысячи активных пользователей, -может оказаться гораздо более эффективной, чем у любой патентованной -программы: ни одна компания не может себе позволить такой огромный штат -сотрудников в отделе контроля качества. Поэтому действительно популярная -свободная программа может оказаться гораздо надёжнее патентованных аналогов. - -Написать большую программу в одиночку довольно сложно и даже не всегда -возможно, особенно если автор занимается этим в свободное от работы время. -Большинство современных свободных программ пишется группой разработчиков. -Даже если начинал писать программу один человек, и она оказалась интересной, -к разработке могут присоединиться активные пользователи. Чтобы они могли не -только вносить отдельные исправления, но и вообще всю разработку вести -совместно, нужны специальные инструменты. Помимо patch, для организации -совместной разработки ПО применяются системы контроля версий. Функции системы -контроля версий состоят в том, чтобы организовать доступ к исходным текстам -программы для нескольких разработчиков и хранить историю всех изменений в -исходных текстах, позволяя объединять и отменять изменения и пр. Самая ранняя -свободная система контроля версий, RCS использовалась ещё на заре свободного -ПО абонентами сети Usenet, затем на смену ей пришла более развитая CVS, но -сегодня и она считается во многом устаревшей, и всё чаще заменяется -Subversion, Arch и другими. К слову, названные системы контроля версий -сегодня активно используются и разработчиками патентованного ПО для -организации совместной разработки. - -Нужно заметить, что преимущества свободной разработки для пользователя не -следует преувеличивать. Не все свободные программы в равной степени доступны -для изменения пользователям, и это совершенно не связано с лицензией на их -распространение. Важный фактор здесь -- объём программы: если в ней десятки -тысяч строк (как, например, в OpenOffice.org), то даже квалифицированному -пользователю потребуется слишком много времени, чтобы разобраться, что к -чему. А если при этом ещё нет толковой документации... Рассчитывать же на то, -что разработчики ответят на все замечания и предложения пользователя -немедленным исправлением программы тоже нельзя, поскольку они не несут перед -пользователем никаких обязательств по качеству программы. В этом отношении -пользователь патентованной программы может быть даже в лучшем положении. - -Очень многие свойства сообщества разработчиков и пользователей свободных -программ проистекают из того, что все его участники обычно занимаются этой -программой из интереса или потому, что эта программа -- необходимый для них -инструмент (например, зарабатывания денег). Время, потраченное ими на -программу, не оплачивается, поэтому нет никакой надежды, что обстоятельства -не переменятся и разработка не прекратится вовсе. Нередки случаи, когда -разработка программы начинается благодаря одному автору-энтузиасту, который -привлекает многих к участию в разработке, а потом энтузиазм лидера гаснет, а -вместе с ним затухает и разработка. К сожалению, сегодня существуют тысячи -свободных программ, так никогда и не достигших версии 1.0, хотя «выгорание» -лидеров и не единственная этому причина. Кроме того, программа может быть -необходимой, но «неинтересной», а потому не найдётся и свободных -разработчиков. - -Место свободных программ на сегодняшнем рынке ПО очень значительно, и многие -коммерческие и государственные предприятия используют свободное ПО прямо или -опосредованно. Собственно, опосредованно все пользователи Internet -задействуют, например, свободную программу Bind, предоставляющую службу DNS. -Многие организации, особенно предоставляющие услуги через Internet, -используют свободный web-сервер Apache, от работы которого непосредственно -зависит их прибыль, не говоря уже о серверах на платформе Linux. Выгода -использования свободного ПО очевидна: за него не приходится платить, а если -приходится -- оно стоит гораздо дешевле патентованных аналогов. Главный -недостаток с точки зрения коммерческого пользователя: разработчики свободных -программ не несут никаких обязательств по качеству программы, кроме -моральных. Поэтому сегодня большие корпорации, например, Intel или IBM, -находят необходимым поддерживать проекты по разработке свободного ПО, -оплачивая сотрудников, которые работают в рамках этих проектов. - -[[linuxhistory]] -=== История Linux === - -==== GNU без Linux ==== - -К 1990 году в рамках проекта GNU были разработаны и постоянно развивались -свободные программы, составляющие основной инструментарий для разработки -программ на языке Си: текстовый редактор Emacs, компилятор языка Си gcc, -отладчик программ `gdb`, командная оболочка `bash`, библиотека важнейших функций -для программ на Си `libc`. Все эти программы были написаны для операционных -систем, похожих на UNIX. Это означает, что в них использовался стандартный -для UNIX механизм запроса ресурсов компьютера, необходимых программе -- -_системные вызовы_, которые исполняются ядром операционной системы. При помощи -системных вызовов программы получают доступ к оперативной памяти, файловой -системе, устройствам ввода и вывода. Благодаря тому, что системные вызовы -выглядели более-менее стандартно во всех реализациях UNIX, программы GNU -могли работать (с минимальными изменениями или вообще без изменений) в любой -UNIX-подобной операционной системе. - -С помощью имевшихся инструментов GNU можно было бы писать программы на Си, -пользуясь только свободными программными продуктами, однако свободного -UNIX-совместимого _ядра_, на основе которого могли бы работать все эти -инструменты, не существовало. В такой ситуации разработчики GNU вынуждены -были использовать одну из патентованных реализаций UNIX, т. е. вынуждены были -следовать принятым в этих операционных системах архитектурным решениям и -технологиям и основывать на них свои собственные разработки. Идеал Столлмана -о научной разработке ПО, свободной от решений, движимых коммерческими целями, -был недоступен, пока в основе свободной разработки лежало патентованное -UNIX-совместимое _ядро_, исходные тексты которого оставались тайной для -разработчиков. - -==== Linux -- ядро ==== - -В 1991 году Линус Торвальдс, финский студент, чрезвычайно увлёкся идеей -написать совместимое с UNIX ядро операционной системы для своего -персонального компьютера с процессором ставшей очень широко распространённой -архитектуры Intel 80386. Прототипом для будущего ядра стала операционная -система MINIX: совместимая с UNIX операционная система для персональных -компьютеров, которая загружалась с дискет и умещалась в очень ограниченной в -те времена памяти персонального компьютера. MINIX был создан Энди -Танненбаумом в качестве учебной операционной системы, демонстрирующей -архитектуру и возможности UNIX, но непригодной для полноценной работы с точки -зрения программиста. Так же, MINIX можно было использовать только в -некоммерческих целях. Именно полноценное ядро для своего ПК и хотел сделать -Линус Торваьдс. Название для своего ядра он соорудил из собственного имени, -заменив последнюю букву и сделав его похожим на анаграмму слова UNIX. - -Совместимость с UNIX в этот момент означала, что операционная система должна -поддерживать стандарт POSIX. POSIX -- это _функциональная модель_ совместимой -с UNIX операционной системы, в которой описано, как должна вести себя система -в той или иной ситуации, но не приводится никаких указаний, как это следует -реализовать программными средствами. POSIX описывал те свойства -UNIX-совместимых систем, которые были общими для разных реализаций UNIX на -момент создания этого стандарта. В частности, в POSIX описаны системные -вызовы, которые должна обрабатывать операционная система, совместимая с этим -стандартом. - -Важнейшую роль в развитии Linux сыграли глобальные компьютерные сети Usenet -и Internet. На самых ранних стадиях он обсуждал свою работу и возникающие -трудности с другими разработчиками в телеконференции comp.os.minix в сети -Usenet, посвящённой операционной системе MINIX. Ключевым решением Линуса -стала публикация исходных текстов ещё мало работоспособной первой версии ядра -под свободной лицензией GPL. Благодаря этому и получавшей всё большее -распространение сети Internet очень многие получили возможность -самостоятельно компилировать и тестировать это ядро, участвовать в обсуждении -и исправлении ошибок, и присылать исправления и дополнения к исходным текстам -Линуса. Теперь над ядром работал уже не один человек, разработка пошла -быстрее и эффективнее. - -В 1992 году версия ядра Linux достигла 0.95, а в 1994 году вышла версия 1.0, -что свидетельствует о том, что разработчики наконец сочли, что ядро в целом -закончено и все ошибки (теоретически) исправлены. В настоящее время -разработка ядра Linux -- дело уже гораздо большего сообщества, чем во времена -до версии 0.1, изменилась и роль самого Линуса Торвальдса, который теперь не -главный разработчик, но главный авторитет, который традиционно оценивает -исходные тексты, которые должны быть включены в ядро и даёт своё добро на их -включение. Тем не менее, общая модель свободной разработки сообществом -сохраняется. В настоящее время параллельно всегда разрабатывается два -варианта ядра. Стабильная версия, считающаяся достаточно надёжной и пригодной -для пользователей, её номер заканчивается на чётное число, например, «2.4». -Номер соответствующей экспериментальной версии ядра оканчивается на нечётное -число -- «2.5». Экспериментальная версия адресована в первую очередь -разработчикам ядра, тестирующим новые возможности. - -==== GNU и Linux ==== - -Однако как нельзя сделать операционную систему без ядра, так и ядро будет -бесполезно без утилит, которые использовали бы его возможности. Благодаря -проекту GNU Линус Торвальдс сразу имел возможность использовать в Linux -свободные утилиты: `bash`, компилятор `gcc`, `tar`, `gzip` и многие другие уже -известные и широко используемые приложения, которые могли работать с его -UNIX-совместимым ядром. Так Linux сразу попал в хорошее окружение и в -сочетании с утилитами GNU представлял собой очень интересную среду для -разработчиков программного обеспечения даже на самой ранней стадии своего -развития. - -Принципиальным шагом вперёд было именно то, что из ядра Linux и утилит и -приложений GNU впервые стало возможно сделать полностью свободную -операционную систему, т. е. работать с компьютером и, более того, -разрабатывать новое программное обеспечение, пользуясь только свободным -программным обеспечением. Идеал полностью некоммерческой разработки Столлмана -теперь мог быть реализован в жизни. - -Однако появление теоретической возможности воплощения идеала не означало его -немедленной практической реализации. Совместимость Linux и утилит GNU была -обусловлена тем, что и то, и другое писалось с ориентацией на одни и те же -стандарты и практику. Однако, в рамках этой практики (множество различных -UNIX-систем) оставался большой простор для несовместимости и различных -решений. Поэтому на начальном этапе разработки ядра каждое заработавшее под -Linux приложение GNU было для Линуса очередным достижением: первыми стали -`bash` и `gcc`. Таким образом, сочетание GNU и Linux было возможностью создать -свободную операционную систему, но само по себе ещё не составляло такой -системы, потому что Linux и различные утилиты GNU оставались разрозненными -программными продуктами, которые писали разные люди, не всегда принимая в -расчёт то, что делают другие. Основное же качество системы -- согласованность -её компонентов. - -==== Возникновение дистрибутивов ==== - -После определённого периода разработки под Linux уже стабильно работал ряд -важнейших утилит GNU. Скомпилированное ядро Linux с небольшим комплектом -скомпилированных уже в Linux утилит GNU составляло набор инструментов для -разработчика программного обеспечения, желающего использовать свободную -операционную систему на своём персональном компьютере. В таком виде Linux уже -не только годился для разработки Linux, но и представлял собой операционную -систему, в которой можно было уже выполнять какие-то прикладные задачи. -Конечно, первое, чем можно было заниматься в Linux -- писать программы на Си. - -Первоначально, чтобы получить компьютер с работающей системой Linux, -разработчики пользовались специальными комплектами дискет со скомпилированным -ядром Linux и утилитами: с этих дискет можно было загрузить Linux и работать -в нём. Однако это не слишком удобно, когда нужно работать в Linux постоянно, -да и объём дискет накладывал очень сильные ограничения на дальнейшее -расширение системы и включение новых утилит. - -Когда задача получить компьютер с постоянно работающей на нём системой Linux -стала востребованной и довольно распространённой, разработчики в хельсинкском -и техасском университетах создают собственные наборы дискет, с которых -скомпилированное ядро и основные утилиты можно записать на жёсткий диск, -после чего загружать операционную систему прямо с него. Эти наборы дискет -- -первые прототипы современных _дистрибутивов_ Linux -- комплекты программного -обеспечения, на основе которых можно получить работающую операционную систему -на своём компьютере. Нужно отметить, что в дистрибутив Linux с самого начала -входили программные продукты GNU. На самом деле, всякий раз, когда говорится -«операционная система Linux», подразумевается «ядро Linux и утилиты GNU». -Фонд свободного ПО даже рекомендует называть это операционной системой -GNU/Linux. - -Однако скопировать все нужные программы на жёсткий диск ещё недостаточно, -чтобы получить подходящую для нужд пользователя операционную среду (пусть -даже это очень профессиональный пользователь). Поэтому первые наборы дискет -можно только условно назвать дистрибутивами. Чтобы получить работающую -операционную систему, требуются какие-то специальные средства установки и -настройки программного обеспечения. Именно наличие таких средств и отличает -современные дистрибутивы Linux. Другое важнейшая задача дистрибутива -- -регулярное обновление. Программное обеспечение, особенно свободное, -- одна -из самых быстро развивающихся областей, поэтому мало один раз установить -Linux, нужно ещё регулярно его обновлять. Первым дистрибутивом в современном -понимании, получившим широкое распространение, стал Slackware, созданный -Патриком Фолькердингом (кстати, этот дистрибутив сохранился и до наших дней). -Он был широко известен пользователям Linux уже к 1994 году. - -Несмотря на то, что с появлением первых дистрибутивов установка Linux уже не -требует самостоятельной компиляции всех программ из исходных текстов, -использование Linux оставалось уделом разработчиков: пользователь этой -операционной системы в тот период её развития мог заниматься почти -исключительно программированием. По крайней мере, чтобы решать в ней другие -повседневные прикладные задачи (например, чтение электронной почты, написание -статей и т. п.), он должен был сначала некоторое время позаниматься -программированием и даже разработкой самой системы Linux, чтобы создать для -себя соответствующие прикладные программы или заставить их работать в Linux. - -Однако разработчики -- тоже люди, которые пишут и электронные письма, и -статьи, и даже рисуют картинки. Всё программное обеспечение для Linux было -открытым, поэтому вскоре стало появляться всё больше прикладных программ для -Linux, которые использовались всё большим сообществом, отчего становились -надёжнее и получали всё новую функциональность. В конце концов возникает -идея, что из Linux и GNU-приложений для Linux целенаправленными усилиями -небольшой группы разработчиков можно делать целостные операционные системы, -подходящие для очень широкого круга пользователей и продавать эти системы -пользователям за деньги как аналог и альтернативу существующим патентованным -операционным системам. - -Выгода операционной системы, целиком состоящей из свободного программного -обеспечения, очевидна -- собирающие эту систему не должны никому платить за -входящие в неё программы. Более того, дальнейшая разработка и обновление -имеющихся программ ведётся сообществом разработчиков также совершенно -бесплатно, не нужно платить сотрудникам, которые занимались бы этим. В итоге -затраты фирмы, собирающей _дистрибутив_ Linux для пользователя, ограничиваются -оплатой программистов, интегрирующих разрозненные приложения в систему и -пишущих программы для стандартизации процедур установки и настройки системы, -чтобы облегчить эти задачи неподготовленному пользователю, а также затратами -на само издание получившегося дистрибутива. Для конечного покупателя это -означает принципиальное снижение цены на операционную систему. - -Первой успешной компанией, работающей по такой схеме, стала RedHat, -появившаяся в 1995 году. RedHat адресовала свои разработки не только -программистам профессионалам, но и обыкновенным пользователям и системным -администраторам, для которых компьютер -- в первую очередь офисное рабочее -место или рабочий сервер. Ориентируясь на уже существующие на рынке -предложения для такого класса пользователей, RedHat всегда уделял большое -внимание разработке приложений с графическим интерфейсом для выполнения -типичных задач по настройке и администрированию системы. Бизнес RedHat -развивался довольно успешно, в 1999 году эта компания акционировалась -- -сразу после выпуска акции росли в цене очень энергично, однако потом ажиотаж -улёгся. В настоящее время доля RedHat на рынке серверов и рабочих станций -Linux очень велика. Благодаря RedHat в сообществе пользователей Linux очень -широкое распространение получил формат пакетов RPM. - -Практически одновременно с RedHat появился проект Debian. Его задача была -примерно той же -- сделать целостный дистрибутив Linux и свободного -программного обеспечения GNU footnote:[Официальное название дистрибутива -- -Debian GNU/Linux.], однако этот проект был задуман как принципиально -некоммерческий, проводимый в жизнь сообществом разработчиков, нормы -взаимодействия в котором полностью соответствовали бы идеалам свободного ПО. -Сообщество разработчиков Debian -- международное, участники которого -взаимодействуют через Internet, а нормы взаимодействия между ними -определяются специальными документами -- _полиси_ (policy). - -Сообщество разработчиков не извлекает никакой прибыли от продажи Debian, его -версии распространяются свободно, доступны в Интернет, могут распространяться -и на твёрдых носителях (CD, DVD), но и в этом случае их цена редко сильно -превышает стоимость носителя и наценку, окупающую затраты на издание. -Первоначально разработка Debian спонсировалась Фондом свободного программного -обеспечения. Адресатами дистрибутивов Debian всегда в первую очередь были -профессиональные пользователи, так или иначе связанные с академической -разработкой программного обеспечения, которые готовы читать документацию и -собственными руками организовать нужный _профиль_ системы, соответствующий -именно их задачам. Ориентация на такую аудиторию предопределила некоторые -тенденции развития Debian: в нём никогда не было обилия «простых» графических -средств настройки среды, всевозможных _мастеров_, однако всегда уделялось много -внимания средствам последовательной и единообразной интеграции программного -обеспечения в единую систему. Именно в Debian появился менеджер пакетов -(APT). В настоящее время Debian -- самый популярный дистрибутив Linux среди -пользователей, являющихся профессионалами в области информационных технологий. - -Всякий раз, когда свободное программное обеспечение оказывается -востребованным, немедленно возникает множество альтернативных решений -- так -произошло и с дистрибутивами Linux. После 1995 года возникло (и продолжает -возникать) огромное количество коммерческих компаний и свободных сообществ, -которые ставят своей задачей подготовку и выпуск дистрибутивов Linux. У -каждого из них -- свои особенности, своя целевая аудитория, свои приоритеты. -К настоящему времени на рынке дистрибутивов выделилось несколько лидеров, -которые предлагают более или менее универсальные решения и наиболее широко -известны и используются. Помимо уже названных RedHat и Debian следует назвать -в ряду дистрибутивов, ориентированных на рядового пользователя, немецкий SuSE -и французский Mandrake, среди адресованных специалистам -- Gentoo. Но помимо -«крупных» игроков на рынке дистрибутивов есть гораздо большее количество менее -распространённых дистрибутивов. Теперь перед пользователем, желающим -установить Linux, встаёт вопрос выбора дистрибутива. Критерии выбора -- и -задачи, которые предполагается решать с помощью Linux, и уровень подготовки -пользователя, и технологии, и предстоящие контакты с тем сообществом, которое -занимается разработкой дистрибутива. - -==== История Linux в России ==== - -Получилось так, что в международном сообществе разработчиков, начинавших и -продолжавших развивать Linux, все в той или иной степени могли объясниться -по-английски. Это и неудивительно, поскольку исторически английский оказался -языком компьютерной науки и операционной системы UNIX, глобальной сети -Internet, программирования. В международном сообществе разработчиков -программного обеспечения английский выполнял и выполняет роль, подобную -латыни в научном сообществе средневековой Европы. Но если Linux -предполагается использовать не только для программирования и общения с -программистами, но и для повседневных задач, необходима локализация -- т. е. -возможность общаться с компьютером и при помощи компьютера и на других языках. - -Локализация -- комплексный процесс, затрагивающий самые разные стороны -системы. Для полноценной поддержки того или иного языка в системе необходимо -обеспечить возможность ввода на этом языке (поддержка раскладок клавиатуры и -кодировок), вывода (экранных шрифтов), печати, а затем уже необходимо -переводить интерфейс различных приложений на данный язык, разрабатывать -средства подготовки электронных и бумажных публикаций на этом языке и т. д. В -этой лекции мы кратко рассмотрим только историю локализации Linux в России -для русского языка, т. е. русификации Linux. - -Первой компанией, поставившей своей целью выпуск дистрибутивов Linux для -русскоговорящих пользователей, была УрбанСофт, открытая в Петербурге в 1992 -году. Весь её бизнес состоял в выпуске и продаже CD-дисков с дистрибутивами -свободного программного обеспечения. В первую очередь это были дистрибутивы -RedHat, а также Debian, в которые включались разработанные силами УрбанСофт -пакеты для русификации. - -Несколько позже в Москве IPLabs Linux Team выпускает Linux Mandrake Russian -Edition -- модифицированный (чтобы соответствовать нуждам русского -пользователя) вариант дистрибутива Mandrake Linux. Впоследствии эта команда -начинает выпускать дистрибутивы, которые отличаются от Mandrake уже не только -наличием пакетов для русификации, но и другими принципиальными возможностями. -В конце концов команда разработчиков создаёт фирму ALT Linux и начинает -выпускать дистрибутивы под маркой ALT Linux. - -Также появляется компания ASPLinux, целью которой является выпуск RedHat с -модификациями для поддержки русского языка, название продукта совпадает с -именем компании. - -Все перечисленные Российские производители дистрибутивов Linux существуют и -по сей день, и продолжают с большей или меньшей активностью выпускать -дистрибутивы. diff --git a/admin-basics/terminal/basic/images/konqueror.ppm.bz2.png b/admin-basics/terminal/basic/images/konqueror.ppm.bz2.png deleted file mode 100644 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 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:<пароль>`. - -=== Удаление пользователей === - -Для удаления пользователей используйте `userdel`. - -Команда `userdel test2` удалит пользователя test2 из системы. Если будет -дополнительно задан параметр -d, то будет уничтожен и домашний каталог -пользователя. Нельзя удалить пользователя, если в данный момент он еще работает -в системе. - -Утилиты `vigr` и `vipw` используются для ручного редактирования файлов -`/etc/passwd` и `/etc/group`, в которых хранятся основные записи о -пользователях и группах в системе. - -Не рекомендуется создавать пользователей с правами сверх необходимых. -Предпочтительнее создать серию новых групп и включить в них требуемого -пользователя. А для данных групп установить соответствующие права на объектах -файловой системы (утилиты `chmod` и `chown`). - diff --git a/asciidoc.conf b/asciidoc.conf deleted file mode 100644 index 09cf980..0000000 --- a/asciidoc.conf +++ /dev/null @@ -1,5 +0,0 @@ -[replacements] -# (DISTRO) Альт Линукс 0.1 Дистрибутив -(?Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oOPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oOPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oO Содержание*. - -Первый подраздел. - -- «Домашняя папка», в ней по умолчанию хранятся ваши личные файлы. - -- «Рабочий стол», папка внутри вашей «Домашней папки», в ней хранятся файлы и - папки, отображаемые на рабочем столе. - -- Дальнейшие пункты соответствуют вашим закладкам в файловом менеджере Nautilus. - -Второй подраздел. - -- «Компьютер» - этот подраздел позволяет увидеть все файлы в компьютере и файлы на подключённых - внешних носителях. - -Третий подраздел. - -- «Сеть» позволяет просматривать сетевые подключения вашего компьютера. Осуществляет - получение доступа к файлам и другим ресурсам, доступным в этих сетях. - -- «Соединиться с сервером» позволяет вам создать подключение к публичным или - локальным сетям. - -Четвёртый подраздел. - -- «Искать файлы» позволяет быстро найти файлы, хранящиеся на вашем компьютере. - -- «Недавние документы» содержит список последних документов, с которыми вы - работали. Последний пункт этого подменю позволяет очистить список. - -==== Меню *Система* ==== - -С помощью меню *Система* осуществляется доступ к настройкам GNOME, справочной -информации и функциям запуска, перезагрузки и отключения компьютера. Это меню разделено -на три подраздела. - -Первый подраздел. - -- «Параметры» содержит доступ к различным настройкам и предоставляет доступ к - инструментам администрирования системы. В меню «Параметры» входят перечисленные - ниже настройки. - -** «Внешний вид» позволяет настроить внешний вид вашего рабочего стола, - включая фоновую картинку. -** «Вспомогательные технологии» дают возможность выбирать программы для - увеличения частей экрана или для прочтения вами содержимого экранов. -** «Bluetooth» позволяет настраивать Bluetooth-устройства для работы с вашим - компьютером. -** «Звук» даёт возможность выбирать звуки, сопровождающие действия или события - в вашем компьютере. -** «Запускаемые приложения» выбирают приложения для автоматического запуска - при входе. -//*** «Цветовые профили» служат для управления, установки и создания цветовых профилей. -//*** «Эффекты рабочего стола» включают или выключают специальные визуальные -// эффекты рабочего стола. -** «Управление файлами» влияет на предоставление вам файлов и папок. -//*** «Метод ввода» позволяет вам выбрать методы для ввода языков, письменная -// система которых не использует алфавит, как, например, некоторые индийские -// или восточно-азиатские языки. -** «Клавиатура» позволяет задать тип клавиатуры, используемой на - данном компьютере. -** «Комбинации клавиш клавиатуры» задают сочетания клавиш для выполнения - определённых заданий в определённых программах или в окружении рабочего - стола в целом. -//*** «Учётные записи для обмена сообщениями и VoIP». Настройка учётных записей -// для клиента обмена мгновенными сообщениями Empathy и приложения VoIP -** «Monitors» задаёт разрешение и другие параметры вашего монитора. -** «Мышь» позволяет настроить кнопки и другие параметры вашей мыши. -//*** «Network Authentication» - для настройки параметров Kerberos Network -// Authentication. -** «Обо мне» хранит ту информацию о вас, которую вы можете передать другим людям - в виде электронной визитки. -** «Сетевые соединения» отображают сетевые подключения компьютера и позволяют - их настраивать. -** «Сетевая прокси-служба» позволяет вам настроить прокси-сервер для вашего - компьютера. -//*** «Общий доступ к личным папкам» предоставлять доступ другим пользователям -// этого компьютера или пользователям других компьютеров по сети к своим -// документам и другим файлам. -** «Управление питанием» настраивает ваш компьютер на работу с различными - параметрами энергосбережения. -** «Предпочтительные приложения» дают вам возможность выбрать, какие - приложения вы хотите использовать для конкретных задач. -//*** «Remote Desktop» permits you or other people to access your computer's -// desktop from a remote location over a network connection. -** «Хранитель экрана» позволяет настроить заставку для рабочего стола. -//*** «Seahorse-Preferences» allows you to set the cipher-key's properties. -//*** «Обновление программ» определяет, как ваш компьютер должен обрабатывать -// обновления программ, когда они появляются. - -/////////////////////////////////////////////////////////////////////////////// -** The Administration menu contains tools that affect the whole system and - require root access. These tools prompt for the root password when launched. -*** «Установка и удаление программ» даёт вам возможность изменять состав - программного обеспечения, установленного в системе. -*** «Аутентификация» даёт вам возможность управлять тем, как система проверяет - пользователей, пытающихся войти в систему. -*** «Загрузчик» позволяет выбрать пункт для загрузки по умолчанию и время, в - течение которого отображается сообщение о загрузке. -*** «Дата и время» позволяет изменить системные дату и время. -*** «Межсетевой экран» позволяет настроить и сконфигурировать межсетевой экран в - вашем компьютере. -*** «Язык» позволяет изменить язык по умолчанию. -*** «Управление логическими томами» позволяет сконфигурировать LVM в графической - среде. -*** «Сеть» позволяет сконфигурировать ваши сетевые подключения и устройства. -*** «Управление устройствами сети» даёт вам возможность осуществлять наблюдение и - управлять своими сетевыми устройствами. -*** «Печать» позволяет настраивать принтеры. -*** «SELinux Management» позволяет изменять настройки безопасности, защищающие - ваш компьютер. -*** «Services» lets you decide which services will run when the system starts. -*** «Update System» looks for software updates at your selected software sources. -*** «Users and Groups» allows you to add or remove users and groups. -/////////////////////////////////////////////////////////////////////////////// - -Второй подраздел. - -- «Справка» содержит руководство по рабочей среде GNOME. -- «О среде GNOME» показывает информацию об установленной среде GNOME. -//- «О системе» предоставляет основную информацию о вашем компьютере, управление -// процессами и монитор ресурсов. - -Третий подраздел. - -- «Заблокировать экран» служит для запуска хранителя экрана. Для возобновления работы - после блокировки необходим ввод пароля. -- «Завершить сеанс пользователя» необходим для завершения работы пользователя без - выключения компьютера. -- «Выключить» позволяет вам выбрать одно из действий: «Ждущий режим», «Спящий - режим», «Перезагрузить» или «Выключить» компьютер. - -[IMPORTANT] -=================================================================================== -Если ваш компьютер запрашивает пароль администратора (root), то это значит, что -будут производиться важные системные настройки. Будьте предельно внимательны к -выводимым сообщениям. -=================================================================================== - -/////////////////////////////////////////////////////////////////////////////////// -==== Application launchers ==== - -The series of icons next to the menus provide quick access to commonly used -applications. These icons are called launchers. - -image::images/icon-firefox.png[] - -The icon for Mozilla Firefox, a web browser - -image::images/icon-evolution.png[] - -To add more launchers to a panel, right-click on the panel and select Add to -Panel. You can also add launchers that are in the Applications menu. Right -click on the application you want to add and select Add this launcher to panel - -==== Область уведомлений ==== - -The Notification area displays icons that alert you to new events taking place -on your computer. For example, your email program might display an icon here to -indicate the arrival of new email, or your printer software might display an -icon here to indicate that a document is now printing. - -==== Регулятор громкости ==== - -The volume control allows you to quickly change the overall volume of sound on -your computer. Click the icon to show a slider, and then use the mouse to drag -the slider to the desired volume. If you double-click the icon, a volume -control window appears in which you can separately change the volume of -different sound sources. - -==== Приложение Network Manager ==== - -The Network Manager applet allows you to quickly connect and disconnect from -available networks, both wired and wireless. Left click on the applet to see -what connections are enabled or available. If you choose to connect to a -connection, say a wireless connection in a coffee shop, you also have the -option to save those settings and automatically connect when you return. Right -click on the applet to enable and disable network devices or to edit or remove -saved connections. See Глава 7, Подключение к Интернету for more information. - -==== The user switch area ==== - -If you click the current username located next to the clock, a list of -available users appears. To switch to a different user account, select the -username. - -==== Часы и календарь ==== - -To access the calendar, click the clock on the right hand side of the panel. -When you double-click a date, the Evolution personal information manager opens. -There is also a weather feature. Click the edit button to modify or add -locations to be displayed. - -==== Область рабочего стола ==== - -The default desktop area, or workspace, contains three icons: - -- the Computer icon. If you double-click this icon, a window appears that - contains available storage devices on the computer. These are also listed in - the Places → Computer menu. - -- the Home icon, which represents the location where all of the logged in - user's files, such as music, movies, and documents, are stored by default. - There is a different home directory for each user, and users cannot access - each other's home directories by default. - -- the Trash icon. Normally, when you choose to delete a file, it is not - permanently removed from your system. Instead, it is sent to the trash - folder, which you can access from this icon. To permanently remove a file from - your system, you must empty the trash. To empty the trash, right-click the icon - and select Empty Trash. - -[NOTE] -================================================================================= -Permanently deleting files - -To bypass the trash and permanently delete a file, hold down the Shift key when -deleting the file. -================================================================================= - -==== Использование рабочего стола ==== - -Right-click on the desktop area for a menu of actions related to the desktop -area. For example, the Change Desktop Background action lets you choose a -different image or photograph to display on the desktop. Add program icons to -your desktop by a left click on the program's icon and select Add this launcher -to desktop. - -=== The window list panel === - -This panel has three components: - -- Any open applications appear as button icons in the middle part of the window - list panel. It shows all application windows in use on the desktop workspace, - whether they are visible or hidden. A hidden window button appears with a - white background. The currently selected application window button has a gray - background, and is said to have focus. Usually, this is the application whose - window is on top of all the others on the screen. To switch from one running - application to another using the mouse, click on the desired application's - button in the panel. - -[NOTE] -============================================================================= -Используйте комбинацию клавиш Alt+Tab для переключения между открытыми окнами - -Holding down the Alt key and pressing the Tab key will open a small window -containing icons of all of your open windows. Repeatedly pressing the Tab key -cycles through the icons. Release both keys on your selection to pull it to the -front -============================================================================= - -- The Workspace Switcher is the group of squares situated on the far right. - They allow you to move between workspaces. Workspaces have long been a - feature of UNIX and Linux desktop environments. Each workspace provides a - separate desktop where applications can be organized, and a corresponding - window list panel. By default there are four workspaces available. To change - this number, right-click on the workspace switcher and choose preferences. - -[NOTE] -============================================================================= -Переключение между рабочими столами - -Используйте комбинацию клавиш Ctrl+Alt+Left Arrow or Ctrl+Alt+Right Arrow для -переключения между рабочими столами. Hold down the Ctrl and Alt keys and press -either the Left Arrow key or Right Arrow key to cycle through the available -workspaces on your system. -============================================================================= - -- The Trash icon on the right end of the window list panel works the same way - as the Trash icon in the desktop area. If you delete a file, it is moved to - this location. A right click on the Trash icon brings up the options to Open - the folder, Empty Trash, Remove from Panel, and Lock to Panel. -/////////////////////////////////////////////////////////////////////////////////// diff --git a/desktop-kde/images/kde-desktop-with-widgets.png b/desktop-kde/images/kde-desktop-with-widgets.png deleted file mode 100644 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 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 пункт *Поместить на рабочий стол*). - -В графической среде KDE вы найдёте массу других полезных возможностей по -организации рабочего пространства. Как будет выглядеть ваш рабочий стол зависит -от выполняемых на компьютере задач. Поэкспериментировав с расположением -виджетов, можно совсем отказаться от традиционных элементов управления, -например, удалив с рабочего стола панель KDE. В любом случае, вы имеете -возможность наиболее удобно организовать своё рабочее пространство. - -=== Настройка параметров KDE === - -image::images/kde-settings.png[Параметры KDE4] - -Самые широкие возможности по настройке графической среды KDE предлагает -диалог *Параметры KDE4*. Он открывается из меню запуска приложений. Здесь -можно изменять фон рабочего стола, тему значков, цветовую схему, шрифты, -внешний вид и поведение окон, а также настраивать различные системные -параметры. В KDE 4 персонализация интерфейса ограничена лишь вашей фантазией. - -=== Запуск приложений === - -В левой части панели рабочего стола KDE находится меню запуска приложений. -Из *Меню запуска приложений* осуществляется запуск всех приложений, -установленных на ваш компьютер. - -image::images/kde-menu.png[Меню запуска приложений] - -*Меню запуска приложений* состоит из нескольких разделов: - -Ссылки на часто используемые программы (они же избранное):: - Располагаются в верхней части меню. Здесь находятся - ссылки на часто используемые программы. Для добавления ссылки щёлкните - на названии программы правой кнопкой мыши и выберите в контекстном меню - пункт *Добавить в избранное*. - -Поиск:: - Если вам известно название нужной программы или инструмента, но вы не знаете - где именно они расположены в меню, то воспользуйтесь поиском по меню. По мере - ввода текста в строку *Поиск* в меню останутся только те программы, в - названиях которых встречается набранное сочетание букв. - -Все приложения и Справка:: - Доступ к установленным в системе программам. Ссылки на программы расположены в - функциональных группах, назначение которых понятно из их названия. - -Действия:: - Эта часть меню запуска приложений состоит из пунктов, которые обеспечивают - быстрый доступ к недавним - документам, позволяют выполнять команды и управлять сеансами, - перезагрузкой и выключением компьютера. - -=== Справка к приложениям === - -Все приложения, входящие в состав KDE, сопровождаются руководством пользователя. -Руководство описывает как предназначение и возможности программы, так и аспекты -её использования. Обращайтесь к справке, когда вы хотите узнать подробности -использования конкретного приложения. - -image::images/kde-helpcenter.png[Руководство пользователя] - -Если вы просто желаете ознакомиться с руководствами к приложениям или получить -общую информацию о использовании KDE, то «Центр справки KDE» можно запустить -как любое другое приложение: из меню запуска приложений -> пункт *Справка*. -После запуска выберите интересующий вас раздел. Кроме руководств к установленным -приложениям «Центр справки KDE» позволяет просмотреть и стандартные страницы документации -по UNIX (man и info-страницы). - -«Центр справки KDE» можно открыть и из меню *Справка* запущенного приложения. -В результате откроется руководство на интересующее вас приложение. diff --git a/desktop-lxde/images/desktop-lxde.png b/desktop-lxde/images/desktop-lxde.png deleted file mode 100644 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmV+o0`mQdP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oOPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oO Персональные -> Настройка внешнего вида*. Также можно настроить параметры -рабочего стола с помощью раздела контекстного меню *Параметры рабочего стола*, -вызываемого щелчком правой кнопкой мыши на поле рабочего стола. -В настройках рабочего стола объединены настройки внешнего вида LXDE. - -image::images/lxde-setting-manager.png[Окно настроек внешнего вида,align="center"]] - -Виджет:: - -Настройка пользовательских тем окон предлагает выбор общего стиля окон -из списка имеющихся в системе, выбор внешнего вида значков, настройки стиля -отображения текста и значков рабочего стола. - -Цвет:: - -Выбор цвета окон, цвета текста окон, цвета выбранных элементов и подсказок -позволяет изменять цветовую схему и указывать место её применения. - -Темы значков:: - -Вкладка темы значков предлагает варианты тем, имеющихся в системе, и -установку новых тем значков. - -Курсор мыши:: - -Вкладка курсор мыши содержит разнообразные смены темы курсора и предоставляет -возможность установки новой темы. - -Рамка окна:: - -Модуль располагает настройками внешнего вида рамки окна. Эта функция позволяет задать -режим отображения темы окна, строки заголовка, а также выбрать предпочтительные -шрифты для заголовка и элементов в меню окна. - -Шрифт:: - -Вкладка шрифт позволяет скорректировать контуры шрифта и свести к минимуму искажения -шрифтовой формы при выводе на монитор или при мелком кегле. - -Другие:: - -Модуль предоставляет пользователю возможность выбрать следующие параметры графического интерфейса: -стиль панели инструментов и размер значков, расположенных на ней, указать поведение -при показе изображения на кнопках или в меню, установить параметры звуковых эффектов. - -Новые инструменты LXDE находятся в постоянной разработке см. http://www.lxde.org/. diff --git a/desktop-mate/images/desktop-mate.png b/desktop-mate/images/desktop-mate.png deleted file mode 100644 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmV+o0`mQdP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oO Содержание*. - -Первый подраздел. - -- «Домашняя папка» -- в ней по умолчанию хранятся ваши личные файлы. - -- «Рабочий стол» -- папка внутри вашей «Домашней папки», содержащая файлы и - папки, отображаемые на рабочем столе. - -- Дальнейшие пункты соответствуют вашим закладкам в файловом менеджере Caja. - -Второй подраздел. - -- «Компьютер» -- этот подраздел позволяет увидеть все файлы в компьютере и файлы на подключённых - внешних носителях. - -- «Устройство CD/DVD» -- этот подраздел позволяет получить доступ к CD/DVD дисководу. - -Третий подраздел. - -- «Сеть» позволяет просматривать сетевые подключения вашего компьютера. Осуществляет - получение доступа к файлам и другим ресурсам, доступным в этих сетях. - -- «Соединиться с сервером» позволяет вам создать подключение к публичным или - локальным сетям. - -Четвёртый подраздел. - -- «Искать файлы» позволяет быстро найти файлы, хранящиеся на вашем компьютере. - -- «Недавние документы» содержит список последних документов, с которыми вы - работали. Последний пункт этого подменю позволяет очистить список. - -=== Меню *Система* === - -С помощью меню *Система* осуществляется доступ к настройкам MATE, справочной -информации и функциям запуска, перезагрузки и отключения компьютера. Это меню разделено -на три подраздела. - -Первый подраздел. - -- «Параметры» содержит доступ к различным настройкам и предоставляет доступ к - инструментам администрирования системы. В меню «Параметры» входят перечисленные - ниже настройки. - -** «Adobe Flash Player» позволяет открыть настройку данного приложения. -** «Bluetooth» позволяет настраивать Bluetooth-устройства для работы с вашим - компьютером. -** «Java Plugin Control Panel» запускает настройки Java. -** «Внешний вид» позволяет настроить внешний вид вашего рабочего стола, - включая фоновую картинку. -** «Всплывающие уведомления» позволяет настроить стиль и позицию уведомлений. -** «Вспомогательные технологии» дают возможность выбирать программы для - увеличения частей экрана или для прочтения вами содержимого экранов. -** «Главное меню» позволяет изменять список отображаемых элементов в меню - Приложений и меню Настроек. -** «Запускаемые приложения» выбирают приложения для автоматического запуска - при входе. -** «Клавиатура» запускает диалог настройки клавиатуры. Тут же можно задать - используемые в системе раскладки клавиатуры. -** «Комбинации клавиш клавиатуры» задают сочетания клавиш для выполнения - определённых заданий в окружении рабочего стола. -** «Мониторы» задаёт разрешение и другие параметры вашего монитора. -** «Мышь» позволяет настроить кнопки и другие параметры вашей мыши. -** «Обо мне» хранит ту информацию о вас, которую вы можете передать другим людям - в виде электронной визитки. -** «Окна» позволяет вам настроить параметры поведения окон. -** «Предпочтительные приложения» дают вам возможность выбрать, какие - приложения вы хотите использовать для конкретных задач. -** «Программа управления пакетами Synaptic» позволяет управлять пакетами. - С помощью Synaptic вы можете управлять источниками пакетов (репозиториями), - получать сведения об доступных пакетах, устанавливать/удалять/обновлять пакеты, - производить поиск по ключевым словам среди доступных пакетов. -** «Сетевая прокси-служба» позволяет вам настроить прокси-сервер для вашего - компьютера. -** «Сетевые соединения» отображают сетевые подключения компьютера и позволяют - их настраивать. -** «Управление питанием» настраивает ваш компьютер на работу с различными - параметрами энергосбережения. -** «Управление файлами» влияет на предоставление вам файлов и папок. -** «Хранитель экрана» позволяет настроить заставку для рабочего стола. -//** «Звук» даёт возможность выбирать звуки, сопровождающие действия или события -// в вашем компьютере. -//*** «Цветовые профили» служат для управления, установки и создания цветовых профилей. -//*** «Эффекты рабочего стола» включают или выключают специальные визуальные -// эффекты рабочего стола. -//*** «Метод ввода» позволяет вам выбрать методы для ввода языков, письменная -// система которых не использует алфавит, как, например, некоторые индийские -// или восточно-азиатские языки. -//*** «Учётные записи для обмена сообщениями и VoIP». Настройка учётных записей -// для клиента обмена мгновенными сообщениями Empathy и приложения VoIP -//*** «Network Authentication» -- для настройки параметров Kerberos Network -// Authentication. -//*** «Общий доступ к личным папкам» предоставлять доступ другим пользователям -// этого компьютера или пользователям других компьютеров по сети к своим -// документам и другим файлам. -//*** «Remote Desktop» permits you or other people to access your computer's -// desktop from a remote location over a network connection. -//*** «Seahorse-Preferences» allows you to set the cipher-key's properties. -//*** «Обновление программ» определяет, как ваш компьютер должен обрабатывать -// обновления программ, когда они появляются. - -- «Администрирование» позволяет получить доступ к следующим настройкам. - -** «Настройка печати» позволяет настроить принтеры и задать параметры печати. -** «Установка RPM» позволяет установить RPM пакеты. -** «Центр управления системой» позволяет управлять наиболее востребованными -настройками системы: пользователями, сетевыми подключениями, настройками даты/времени и т. п. - -//[Note] -//Подробнее о «Центр управления системой» вы можете почитать в LINK_HOLDER -/////////////////////////////////////////////////////////////////////////////// -** The Administration menu contains tools that affect the whole system and - require root access. These tools prompt for the root password when launched. -*** «Установка и удаление программ» даёт вам возможность изменять состав - программного обеспечения, установленного в системе. -*** «Аутентификация» даёт вам возможность управлять тем, как система проверяет - пользователей, пытающихся войти в систему. -*** «Загрузчик» позволяет выбрать пункт для загрузки по умолчанию и время, в - течение которого отображается сообщение о загрузке. -*** «Дата и время» позволяет изменить системные дату и время. -*** «Межсетевой экран» позволяет настроить и сконфигурировать межсетевой экран в - вашем компьютере. -*** «Язык» позволяет изменить язык по умолчанию. -*** «Управление логическими томами» позволяет сконфигурировать LVM в графической - среде. -*** «Сеть» позволяет сконфигурировать ваши сетевые подключения и устройства. -*** «Управление устройствами сети» даёт вам возможность осуществлять наблюдение и - управлять своими сетевыми устройствами. -*** «Печать» позволяет настраивать принтеры. -*** «SELinux Management» позволяет изменять настройки безопасности, защищающие - ваш компьютер. -*** «Services» lets you decide which services will run when the system starts. -*** «Update System» looks for software updates at your selected software sources. -*** «Users and Groups» allows you to add or remove users and groups. -/////////////////////////////////////////////////////////////////////////////// - -Второй подраздел. - -//- «Справка» содержит руководство по рабочей среде MATE. -- «О среде MATE» показывает информацию об установленной среде MATE. -//- «О системе» предоставляет основную информацию о вашем компьютере, управление -// процессами и монитор ресурсов. - -Третий подраздел. - -- «Заблокировать экран» служит для запуска хранителя экрана. Для возобновления работы - после блокировки необходим ввод пароля. -- «Завершить сеанс пользователя...» необходим для завершения работы пользователя без - выключения компьютера. -- «Выключить...» позволяет перезагрузить либо выключить компьютер. - -[IMPORTANT] -=================================================================================== -Если ваш компьютер запрашивает пароль администратора (root), то это значит, что -будут производиться важные системные настройки. Будьте предельно внимательны к -выводимым сообщениям. -=================================================================================== - -== MATE: Область рабочего стола == - -Область рабочего стола включает в себя три значка: - -- значок *«Компьютер»*. Если вы щелкните дважды по этому значку, то откроется -окно, с доступными устройствами хранения данных. - -- значок *«Домашняя папка пользователя»*. Этот значок ведет в папку, где -хранятся пользовательские файлы (например аудиозаписи, видеозаписи, документы) -по умолчанию. У каждого пользователя своя «Домашняя» директория. Каждый -пользователь имеет доступ только в свою «Домашнюю» директорию. - -- значок *«Корзина»*. Обычно, когда вы удаляете файл, он не удаляется из вашей -системы. Вместо этого он помещается в «Корзину». С помощью этого значка вы и -можете посмотреть или восстановить «удаленные файлы». Чтобы удалить файл из -вашей системы, вы должны очистить «Корзину». Чтобы очистить «Корзину», щелкните -правой кнопкой мыши по значку и выберите «Очистить корзину». - -[NOTE] -================================================================================= -Удаление файлов - -Вы можете миновать корзину и сразу удалять файл из системы. Для этого зажмите -клавишу *Shift* и удаляйте файл. -================================================================================= - -== MATE: Панель со списком окон == - -У этой панели три основных компонента: - -- Любые открытые приложения отображаются как кнопки в средней части окна. Тут - отображаются все окна с области рабочего стола вне зависимости от того, - видно окно или нет. Кнопка скрытого окна будет отображаться с белым фоном. - Кнопка приложения, которое выбрано в данный момент, будет с серым фоном. - Что бы переключаться между приложениями с помощью мыши, кликните по желаемому - приложению левой кнопкой мыши, чтобы переключиться на него. - -[NOTE] -============================================================================= -Используйте комбинацию клавиш *Alt+Tab* для переключения между открытыми окнами - -Удерживая нажатой клавишу *Alt*, нажимайте *Tab* для последовательного переключения -между окнами. Отпустите обе клавиши, чтобы подтвердить свой выбор. -============================================================================= - -- Переключатель рабочих мест -- это группа квадратов в правом нижнем углу - экрана. Они позволяют вам переключать рабочие места. Каждое рабочее место - предоставляет отдельный рабочий стол, на котором можно расположить - приложения. По умолчанию активно 4 рабочих места. Вы можете изменить это - число нажмите правой кнопкой мышки на «переключателе рабочих мест» и - выберите «Параметры». - -[NOTE] -============================================================================= -Переключение между рабочими столами - -Используйте комбинацию клавиш *Ctrl+Alt+стрелка влево* или *Ctrl+Alt+стрелка вправо* для -переключения между рабочими столами. -============================================================================= - -- Свернуть все окна -- кнопка позволяет свернуть (развернуть) все открытые окна -на текущем рабочем месте. - -/////////////////////////////////////////////////////////////////////////////////// -==== Application launchers ==== - -The series of icons next to the menus provide quick access to commonly used -applications. These icons are called launchers. - -image::images/icon-firefox.png[] - -The icon for Mozilla Firefox, a web browser - -image::images/icon-evolution.png[] - -To add more launchers to a panel, right-click on the panel and select Add to -Panel. You can also add launchers that are in the Applications menu. Right -click on the application you want to add and select Add this launcher to panel - -==== Область уведомлений ==== - -The Notification area displays icons that alert you to new events taking place -on your computer. For example, your email program might display an icon here to -indicate the arrival of new email, or your printer software might display an -icon here to indicate that a document is now printing. - -==== Регулятор громкости ==== - -The volume control allows you to quickly change the overall volume of sound on -your computer. Click the icon to show a slider, and then use the mouse to drag -the slider to the desired volume. If you double-click the icon, a volume -control window appears in which you can separately change the volume of -different sound sources. - -==== Приложение Network Manager ==== - -The Network Manager applet allows you to quickly connect and disconnect from -available networks, both wired and wireless. Left click on the applet to see -what connections are enabled or available. If you choose to connect to a -connection, say a wireless connection in a coffee shop, you also have the -option to save those settings and automatically connect when you return. Right -click on the applet to enable and disable network devices or to edit or remove -saved connections. See Глава 7, Подключение к Интернету for more information. - -==== The user switch area ==== - -If you click the current username located next to the clock, a list of -available users appears. To switch to a different user account, select the -username. - -==== Часы и календарь ==== - -To access the calendar, click the clock on the right hand side of the panel. -When you double-click a date, the Evolution personal information manager opens. -There is also a weather feature. Click the edit button to modify or add -locations to be displayed. - -==== Область рабочего стола ==== - -The default desktop area, or workspace, contains three icons: - -- the Computer icon. If you double-click this icon, a window appears that - contains available storage devices on the computer. These are also listed in - the Places → Computer menu. - -- the Home icon, which represents the location where all of the logged in - user's files, such as music, movies, and documents, are stored by default. - There is a different home directory for each user, and users cannot access - each other's home directories by default. - -- the Trash icon. Normally, when you choose to delete a file, it is not - permanently removed from your system. Instead, it is sent to the trash - folder, which you can access from this icon. To permanently remove a file from - your system, you must empty the trash. To empty the trash, right-click the icon - and select Empty Trash. - -[NOTE] -================================================================================= -Permanently deleting files - -To bypass the trash and permanently delete a file, hold down the Shift key when -deleting the file. -================================================================================= - -==== Использование рабочего стола ==== - -Right-click on the desktop area for a menu of actions related to the desktop -area. For example, the Change Desktop Background action lets you choose a -different image or photograph to display on the desktop. Add program icons to -your desktop by a left click on the program's icon and select Add this launcher -to desktop. - -=== The window list panel === - -This panel has three components: - -- Any open applications appear as button icons in the middle part of the window - list panel. It shows all application windows in use on the desktop workspace, - whether they are visible or hidden. A hidden window button appears with a - white background. The currently selected application window button has a gray - background, and is said to have focus. Usually, this is the application whose - window is on top of all the others on the screen. To switch from one running - application to another using the mouse, click on the desired application's - button in the panel. - -[NOTE] -============================================================================= -Используйте комбинацию клавиш Alt+Tab для переключения между открытыми окнами - -Holding down the Alt key and pressing the Tab key will open a small window -containing icons of all of your open windows. Repeatedly pressing the Tab key -cycles through the icons. Release both keys on your selection to pull it to the -front -============================================================================= - -- The Workspace Switcher is the group of squares situated on the far right. - They allow you to move between workspaces. Workspaces have long been a - feature of UNIX and Linux desktop environments. Each workspace provides a - separate desktop where applications can be organized, and a corresponding - window list panel. By default there are four workspaces available. To change - this number, right-click on the workspace switcher and choose preferences. - -[NOTE] -============================================================================= -Переключение между рабочими столами - -Используйте комбинацию клавиш Ctrl+Alt+Left Arrow or Ctrl+Alt+Right Arrow для -переключения между рабочими столами. Hold down the Ctrl and Alt keys and press -either the Left Arrow key or Right Arrow key to cycle through the available -workspaces on your system. -============================================================================= - -- The Trash icon on the right end of the window list panel works the same way - as the Trash icon in the desktop area. If you delete a file, it is moved to - this location. A right click on the Trash icon brings up the options to Open - the folder, Empty Trash, Remove from Panel, and Lock to Panel. -/////////////////////////////////////////////////////////////////////////////////// diff --git a/desktop-software/file-manager/dolphin/images/dolphin-address.png b/desktop-software/file-manager/dolphin/images/dolphin-address.png deleted file mode 100644 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmV+o0`mQdP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oOPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oOPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oO Папку...*). - -[TIP] - -Контекстное меню вызывается при помощи щелчка правой кнопкой мыши на объекте. -Контекстное меню файла, папки и свободного пространства могут сильно отличаться -друг от друга. - -Dolphin, как и прочие приложения KDE, содержит руководство пользователя, -вызываемое из раздела *Справка* основного меню или нажатием *F1*. Ниже описаны -лишь некоторые возможности файлового менеджера. За полным руководством -обращайтесь к встроенному руководству пользователя Dolphin. - -//application path -[TIP] - -По умолчанию основное меню скрыто. Отобразить его можно из меню *Управление -> -Показать меню*. - -==== Быстрый доступ к нужным файлам ==== - -Для быстрого доступа к важным и часто используемым папкам, таким как домашняя -папка, сетевые папки или корзина, можно воспользоваться панелью *Точки входа* -слева в окне просмотра содержимого папки. Сюда же можно добавить и другие -популярные папки. Это можно сделать различными способами. Например: - -* вызвать в свободной области панели *Точки входа* контекстное меню, выбрать в нём пункт - *Добавить запись...* и заполнить предложенные поля открывшегося диалога; -* вызвать контекстное меню на значке папки, которую вы хотите добавить на - панель, и выбрать в нём пункт *Добавить в «Точки входа»*. - -image::images/dolphin-places.png[Панель «Точки входа»] - -Ориентироваться в сложно организованной системе вложенных папок и быстро -перемещаться по ней поможет путь в адресной строке, которая расположена над областью -просмотра содержимого папки. Каждая папка в этом пути представлена в виде -ссылки. Нажав на ссылку, можно быстро открыть нужную папку. - -image::images/dolphin-address.png[Адресная строка] - -==== Копирование и перемещение файлов ==== - -Скопировать или переместить файл или папку можно различными способами: - -* «перетащить» папку или файл из одного открытого окна Dolphin в - другое (где открыта целевая папка). Перетаскивание можно осуществлять и в - двупанельном режиме. В этом случае не потребуется запускать два экземпляра - Dolphin. Нажмите на кнопку *Две панели* и вы сможете перемещать и копировать - файлы и папки, перетаскивая их между панелями. -* копировать и перемещать папку или файл можно, используя основное стандартное меню - *Правка* (либо контекстное меню): -** необходимо выделить то, что вы желаете скопировать или переместить, - наведя курсор на файл или папку и нажав появившийся знак *+*; -** из основного меню *Правка* или из контекстного меню выберите *Копировать* (для - копирования) или *Вырезать* (для перемещения); -** открыть папку, в которую вы хотите скопировать или переместить объект; -** вызвать в этой папке из основного меню *Правка* пункт *Вставить* (или из контекстного - меню). -[TIP] -Для выбора сразу нескольких файлов или папок можете отмечать их списком, -удерживая при этом клавишу *Ctrl*. - -==== Удаление файлов ==== - -По умолчанию фалы и папки удаляются в *Корзину*. Это позволяет восстановить -объект при его ошибочном удалении. - -Удалить выделенный объект можно из основного меню *Файл* (пункт *Удалить в -корзину*). Можно использовать контекстное меню, перетаскивая -объект на значок *Корзина* в панели *Точки входа* или удалять объекты -клавишей *Del*. - -При ошибочном удалении можно восстановить объект из корзины. Для этого нужно -открыть корзину, вызвать на удалённом файле или папке контекстное меню и в -нём выбрать пункт *Восстановить*. Выбор в контекстном меню пункта *Удалить* может -окончательно удалить ненужный файл или папку, без возможности её восстановления. - -Для того чтобы безвозвратно удалить всё содержимое корзины, выберите в контекстном меню -пункт *Очистить корзину*. - -//application path -Для того чтобы не засорять жёсткий диск компьютера ненужными файлами и сразу удалять их, -минуя корзину, можно воспользоваться основным меню *Файл -> Удалить* или выбрать -соответствующий пункт в контекстном меню. - -==== Открытие файлов ==== - -Открыть файл из Dolphin -- значит запустить приложение, ассоциированное с этим -типом файлов, в нём и откроется файл. - -//application path -[TIP] -Привязки файлов можно настраивать через *Параметры KDE4*. Выберите в *Меню запуска приложений -> -Настройки -> KDE -> Параметры KDE4 -> Привязки файлов*. - -Например, при щелчке на файл, являющийся изображением (например `.jpg` файл) -откроется программа просмотра изображений Gwenview, в которой откроется -изображение. Таким образом вы можете открывать интересующие вас файлы простым -щелчком прямо из файлового менеджера Dolphin. - -//application path -Если на компьютере установлено несколько программ для работы с изображениями, -то вы можете запустить нужную, выбрав её из контекстного меню (щелчок правой -кнопкой мыши по файлу, далее *Открыть с помощью...*). Вы можете выбрать программу из -предлагаемого списка или попробовать открыть файл в произвольном приложении на -ваше усмотрение (*Открыть с помощью... -> В другой программе...*). diff --git a/desktop-software/file-manager/index.txt b/desktop-software/file-manager/index.txt deleted file mode 100644 index 614bcf0..0000000 --- a/desktop-software/file-manager/index.txt +++ /dev/null @@ -1,16 +0,0 @@ -== Файловые менеджеры == - -Файловые менеджеры предоставляют интерфейс пользователя для работы с файловой -системой и файлами. Файловые менеджеры позволяют выполнять наиболее частые -операции над файлами -- создание, открытие/проигрывание/просмотр, -редактирование, перемещение, переименование, копирование, удаление, изменение -атрибутов и свойств, поиск файлов и назначение прав. Помимо основных функций, -многие файловые менеджеры включают ряд дополнительных возможностей, например, -таких как работа с сетью (через FTP, NFS и т.п.), резервное копирование, -управление принтерами и прочее. - -include::thunar/index.txt[] - -include::pcmanfm/index.txt[] - -include::dolphin/index.txt[] diff --git a/desktop-software/file-manager/pcmanfm/images/pcmanfm.png b/desktop-software/file-manager/pcmanfm/images/pcmanfm.png deleted file mode 100644 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmV+o0`mQdP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oO -Учебник*. Примечательно то, что уроки открываются как обычные файлы SVG, в них -можно рисовать прямо на полях рядом с текстом и иллюстрациями. diff --git a/desktop-software/graphics/kde/index.txt b/desktop-software/graphics/kde/index.txt deleted file mode 100644 index 2c92a50..0000000 --- a/desktop-software/graphics/kde/index.txt +++ /dev/null @@ -1,32 +0,0 @@ -=== Графические приложения KDE === - -В состав KDE входит большое число приложений для работы с графикой. Все они -находятся в меню приложений *Графика*. - -Ниже приведены наиболее популярные приложения для работы c графическими -изображениями. - -Просмотрщик изображений (Gwenview) - -Gwenview позволяет просматривать как отдельные изображения, так и группу -изображений в режиме слайд-шоу. Кроме функций просмотра программа имеет -дополнительный возможности: поворот изображения, изменение размера, -удаление с фотографий эффекта красных глаз и пр. В руководстве пользователя, -вызываемом из меню *Справка*, дано полное описание возможностей программы. - -Графический редактор (KolourPaint) - -KolourPaint позволяет создавать новые изображения и обрабатывать -существующие. Она предназначена для работы с растровой графикой и обладает -стандартным набором инструментов: кисть, перо, распылитель и др. KolourPaint -обладает базовым набором функций для работы с изображениями, их вполне -достаточно для выполнения наиболее часто востребованных действий. В руководстве -пользователя, вызываемом из меню *Справка*, дано полное описание возможностей -программы. - -Создание снимков экрана (KSnapshot) - -KSnapshot может сохранять изображение всего экрана, отдельного окна или -отдельной области экрана. Программу можно вызывать из меню или нажатием на -клавиатуре кнопки *PrtSc* (print screen). В руководстве пользователя, -вызываемом из меню *Справка*, дано полное описание возможностей программы. diff --git a/desktop-software/graphics/viewnior/index.txt b/desktop-software/graphics/viewnior/index.txt deleted file mode 100644 index 3bbfbe5..0000000 --- a/desktop-software/graphics/viewnior/index.txt +++ /dev/null @@ -1,25 +0,0 @@ -=== Графический просмотрщик Viewnior === - -Viewnior -- программа для просмотра изображений, поддерживающая большое -количество графических форматов. Программа имеет простой интерфейс и быстрый -отклик на любые ваши действия. - -Возможности Viewnior: - -- редактирование; -- обрезка; -- просмотр в основном окне, в полноэкранном режиме, слайдшоу; -- навигация; -- поддержка анимированных изображений; -- просмотр свойств изображения в отдельном окне; -- обновление измненённого открытого изображения; -- открытие файла в других программах просмотра и редактирования изображений, -имеющихся в системе. - -Особенности настройки Viewnior: - -- режим открытия новых изображений; -- отключаемое сглаживание при масштабировании; -- отключаемые подтверждения при удалении и изменениях; -- показ скрытых изображений из папки; -- настройка качества сохранения jpeg и png. diff --git a/desktop-software/index.txt b/desktop-software/index.txt deleted file mode 100644 index cc1b481..0000000 --- a/desktop-software/index.txt +++ /dev/null @@ -1,26 +0,0 @@ -= Обзор приложений = - -== Введение == - -Linux содержит огромное число приложений (программ) для выполнения всех -повседневных задач. При этом важно понимать, что для выполнения одного и того -же действия могут быть использованы разные приложения. Например, для написания -простых текстов доступен целый ряд текстовых редакторов с разным набором -возможностей. Со временем вы сами сможете выбрать наиболее удобные для вас -приложения. - -Набор программ с диска покрывает обычные потребности. Если же определённая -программа отсутствует в системе, то вы можете доустановить её с диска или из -огромного банка программного обеспечения ALT Linux. - -include::internet/index.txt[] - -include::office/index.txt[] - -include::file-manager/index.txt[] - -include::graphics/index.txt[] - -include::multimedia/index.txt[] - -include::others/index.txt[] diff --git a/desktop-software/internet/im/index.txt b/desktop-software/internet/im/index.txt deleted file mode 100644 index 21cfceb..0000000 --- a/desktop-software/internet/im/index.txt +++ /dev/null @@ -1,41 +0,0 @@ -== Обмен мгновенными сообщениями == - -Для обмена сообщениями в режиме реального времени через Интернет необходима -специализированная клиентская программа, передающая текстовые сообщения, а -также файлы различных типов. Система мгновенного обмена сообщениями является -одним из самых доступных и востребованных средств общения в Интернете. -Преимущества инструментов мгновенного обмена информацией: - -* Скорость -- мгновенные сообщения позволяют собеседникам общаться со скоростью -нажатия на кнопку, без необходимости открывать письма и ждать ответа; -* Удобство -- программы обмена мгновенными сообщениями включают широкий набор -коммуникативных и производственных функций. - -Большинство современных программ мгновенного обмена сообщениями позволяют -видеть, подключены ли в данный момент абоненты, занесённые в список -контактов. Сообщения появляются на мониторе собеседника только после -окончания редактирования и отправки. В список основных функций служб -мгновенных сообщений входят: - -* чат (видеочат, текстовый и голосовой); -* VoIP сервисы: звонки на компьютер, звонки на стационарные и мобильные -телефоны; -* возможность отправки SMS; -* передача файлов; -* инструменты для совместной работы в режиме реального времени; -* возможность общаться в чате непосредственно на веб-странице; -* напоминания и оповещения; -* хранение истории общения по каждому контакту; -* индикация о сетевом статусе занесённых в список контактов пользователей -(в сети, нет на месте и т.д.). - -Существуют клиентские программы, позволяющие подключаться одновременно к -нескольким сетям. Они поддерживают наиболее популярные протоколы, что -избавляет вас от необходимости устанавливать отдельный IM-клиент для каждой -сети. - -include::telepathy/index.txt[Контакты для обмена сообщениями] - -include::kopete/index.txt[] - -include::pidgin/index.txt[] diff --git a/desktop-software/internet/im/kopete/images/kopete-settings.png b/desktop-software/internet/im/kopete/images/kopete-settings.png deleted file mode 100755 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmV+o0`mQdP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oOPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oO Настроить... -> Добавить учётную запись...*. - -Из списка поддерживаемых служб выберите ту, которую собираетесь использовать. -Возможно, вы уже решили какую службу IM будете использовать (потому что вы уже -пользовались ей, либо потому что ей пользуются ваши друзья). Если вы ещё не -остановили свой выбор на какой-то определённой службе IM, то выберите службу, -основанную на открытых стандартах, например jabber. - -image::images/kopete-settings.png[Добавление учётной записи] - -[NOTE] -Если вы ещё не зарегистрированы ни в одной службе мгновенных сообщений, то -предварительно необходимо создать аккаунт на соответствующем веб-сайте. - -После настройки учётной записи добавьте в список контактов ваших -собеседников (кнопка *Добавить* в главном окне программы) и, при условии, что -нужный вам собеседник подключён к службе мгновенных сообщений, можете начинать -общение. - -//application path -За дополнительной информацией по использованию Kopete можно обратиться к -справке, вызываемой из меню *Справка -> Руководство пользователя Kopete*. diff --git a/desktop-software/internet/im/pidgin/index.txt b/desktop-software/internet/im/pidgin/index.txt deleted file mode 100644 index d015c25..0000000 --- a/desktop-software/internet/im/pidgin/index.txt +++ /dev/null @@ -1,73 +0,0 @@ -=== Pidgin === - -Pidgin -- мультипротокольная программа-клиент для мгновенного обмена -сообщениями, позволяющая одновременно подключиться к нескольким сетям. -Поддерживает наиболее популярные протоколы: -AIM, -Bonjour, -Facebook (XMPP), -Gadu-Gadu, -Google-общение, -GroupWise, -ICQ, -IRC, -MSN, -MXit, -MySpaceIM, -SIMPLE, -Sametime, -XMPP, -Yahoo, -Yahoo JAPAN и -Zephyr. - -image::images/pidgin.png[Окно программы Pidgin] - -[float] -==== Функции Pidgin ==== - -* Поддержка особенностей различных сетей (статус-сообщения, значки друзей, -уведомление о наборе текста...); -* Шифрованный чат; -* Возможность установки модулей расширения; -* Возможность «метаконтактов»; -* Запись протокола событий; -* Поддержка вкладок в окне разговора; -* Одновременное подключение к нескольким аккаунтам; -* Слежение за пользователями; -* Многоязычный интерфейс. - -[float] -==== Первоначальная настройка ==== - -//application path -После запуска Pidgin необходимо произвести его первоначальную настройку. При -первом запуске Pidgin из меню *Уч.записи -> Управление учётными записями* -необходимо запустить диалоговое окно мастера создания учётной записи и -создать учётную запись пользователя. - -Из списка поддерживаемых служб выберите ту, которую собираетесь использовать. -Возможно, вы уже решили, какую службу IM будете использовать (потому что вы уже -пользовались ею, либо потому что ею пользуются ваши друзья). Если вы ещё не -остановили свой выбор на какой-то определённой службе IM, то выберите службу, -основанную на открытых стандартах, например jabber. - -image::images/pidgin-settings.png[Добавление учётной записи] - -[NOTE] -Если вы ещё не зарегистрированы ни в одной службе мгновенных сообщений, то -предварительно необходимо создать аккаунт на соответствующем веб-сайте. - -После настройки учётной записи добавьте в список контактов ваших -собеседников (кнопка *Добавить собеседника...*) и, при условии, что нужный -вам собеседник подключён к службе мгновенных сообщений, можете начинать -общение. - -[NOTE] -Вы можете использовать Pidgin для общения в социальных сетях. Например, вы -можете почитать о том, как настроить Pidgin для -http://www.facebook.com/sitetour/chat.php[Facebook]. - -//application path -За дополнительной информацией по использованию Pidgin можно обратиться к -справке, вызываемой из меню *Помощь -> Помощь в сети*. diff --git a/desktop-software/internet/im/telepathy/images/telepathy-settings.png b/desktop-software/internet/im/telepathy/images/telepathy-settings.png deleted file mode 100644 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmV+o0`mQdP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oOPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oOPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oOPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oO Создать новую учётную запись...*. - -В случае наличия нескольких учётных записей вы можете выбирать метод их -компоновки на панели почтовых папок. По умолчанию происходит создание единой -группы папок, но есть возможность переключиться на раздельное отображение -каждой учётной записи. - -[float] -==== Использование почтового клиента ==== - -Для составления письма нажмите *Составление*. В открывшемся окне *Составить -сообщение* введите адрес получателя, тему и текст письма. Для проверки ошибок -в тексте выберите кнопку *Орфография*. - -image::images/clawsmail-message.png[Создание сообщения] - -В виде вложения к письму можно пересылать электронные документы, изображения, -архивы и т.п. Для того чтобы добавить вложение, нажмите *Вложить* и выберите -нужный файл в открывшемся окне. Закончив составление письма, нажмите -*Отправить*. - -//application path -Более подробную информацию об использовании и настройке -Claws Mail смотрите *Справка -> О Claws Mail...* или при помощи -клавиши *F1*. diff --git a/desktop-software/internet/mail/evolution/images/evolution-message.png b/desktop-software/internet/mail/evolution/images/evolution-message.png deleted file mode 100644 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmV+o0`mQdP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oOPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oO Параметры -> Учётные записи -> Добавить*. -В программе отсутствует автоматизация при создании учётных записей. - -//application path -Для редактирования характеристик учётной -записи и параметров программы используйте меню *Правка -> Параметры*. - -[float] -==== Использование почтового клиента ==== - -Для составления письма нажмите на стрелку рядом со значком *Создать* и -выберите *Почтовое сообщение*. В открывшемся окне редактора писем введите -адрес получателя, тему и текст письма. Для проверки ошибок в тексте выберите -*Правка -> Проверить орфографию*. - -В виде вложения в письмо можно пересылать электронные документы, изображения, -архивы. Чтобы добавить вложение, нажмите *Добавить вложение...* и выберите -нужный файл в открывшемся окне. Закончив составление письма, нажмите -*Отправить*. - -image::images/evolution-message.png[Редактор писем] - -//application path -Более подробную информацию об использовании и настройке -Evolution смотрите *Справка -> Содержание* или при помощи клавиши *F1*. diff --git a/desktop-software/internet/mail/index.txt b/desktop-software/internet/mail/index.txt deleted file mode 100644 index b17234a..0000000 --- a/desktop-software/internet/mail/index.txt +++ /dev/null @@ -1,54 +0,0 @@ -== Электронная почта == - -Для работы с электронной почтой применяются специализированные программы -- -почтовые клиенты, предоставляющие пользователю гибкие и эффективные -возможности работы с электронной корреспонденцией: различные средства -сортировки сообщений, выбор шаблонов из готового набора, проверку орфографии -по мере набора текста и другие полезные функции. - -[NOTE] - -===================================== -Современные пользователи предпочитают работать с электронной почтой через -веб-интерфейс, используя браузер. Подручных средств, предоставляемых -популярными почтовыми сервисами, для повседневных почтовых нужд пользователя -практически достаточно, но использование специально предназначенных программ -даёт некоторые преимущества: - -* возможность одновременной работы с несколькими учётными записями; - -* гибкие правила сортировки почты; - -* обеспечение ограниченного доступа к отдельным папкам или учётным записям; - -* наличие антиспам-систем и систем фильтрации рекламы; - -* экономия входящего трафика. -===================================== - -Для Linux создано большое количество почтовых клиентов. Все они обладают своими -особенностями и, как правило, имеют всё необходимое для успешной работы с -электронной почтой: сортировку и фильтрацию сообщений, поддержку различных -кодировок сообщений, возможность работы со списками рассылки и т.п. - -Выбор почтового клиента зависит от ваших личных предпочтений. -Для первоначальной настройки любого из них вам потребуются следующие -данные: - -- адрес электронной почты; -- пароль для доступа к ящику электронной почты; -- имена серверов входящей и исходящей почты; -- тип сервера входящей почты (IMAP или POP3). - -Адрес и порт для доступа к SMTP и POP3 серверам необходимо выяснить у -провайдера электронной почты или у администратора вашей сети (в случае -использования почтового сервера локальной сети). - - -include::kmail/index.txt[] - -include::thunderbird/index.txt[] - -include::evolution/index.txt[] - -include::clawsmail/index.txt[] diff --git a/desktop-software/internet/mail/kmail/images/kmail-message.png b/desktop-software/internet/mail/kmail/images/kmail-message.png deleted file mode 100755 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmV+o0`mQdP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oOPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oO Мастер учётной записи...*. - -//application path -Для редактирования характеристик -учётной записи и параметров программы используйте меню *Настройка -> -Настроить KMail...*. - -[float] -==== Использование почтового клиента ==== - -Для составления письма нажмите *Новое*. В открывшемся окне редактора писем -введите адрес получателя, тему и текст письма. Для проверки ошибок в тексте -выберите *Сервис -> Проверка орфографии...*. - -image::images/kmail-message.png[Редактор писем] - -В виде вложения к письму можно пересылать электронные документы, изображения, -архивы и т.п. Для того чтобы добавить вложение, нажмите *Вложить* и выберите -нужный файл в открывшемся окне. Закончив составление письма, нажмите -*Отправить*. - -//application path -Более подробную информацию об использовании и настройке -KMail смотрите *Справка -> Руководство пользователя KMail* или при помощи -клавиши *F1*. diff --git a/desktop-software/internet/mail/thunderbird/index.txt b/desktop-software/internet/mail/thunderbird/index.txt deleted file mode 100644 index e3c7bee..0000000 --- a/desktop-software/internet/mail/thunderbird/index.txt +++ /dev/null @@ -1,73 +0,0 @@ -=== Thunderbird === - -Mozilla Thunderbird -- мощный почтовый клиент, позволяющий максимально -эффективно работать с электронной почтой. Mozilla Thunderbird позволяет работать -с электронной корреспонденцией через протоколы POP, SMTP и IMAP, участвовать -в конференциях Usenet, а также осуществлять подписку на новостные ленты RSS. - -[float] -==== Функции Thunderbird ==== - -* Настройка интерфейса (изменение расположения окон, наличие и -отсутствие кнопок на панели инструментов, изменение их размера и т.д.); -* Отображение любого форматирования HTML, обеспечивающее кроссплатформенную -совместимость; -* Выбор режимов показа и компоновки учётных записей и почтовых папок; -* Поддержка смены тем и установки расширений. - -image::images/thunderbird.png[Почтовый клиент Thunderbird] - -[float] -==== Первоначальная настройка Thunderbird ==== - -//application path - -При первом запуске почтового клиента Thunderbird будет автоматически запущен -мастер *Добро пожаловать в Thunderbird*. С его помощью можно получить новый -адрес электронной почты (если у вас еще нет адреса). Если у вас уже есть адрес -электронной почты и вы хотите настроить Thunderbird на работу с ним, то следует -перейти к мастеру *Настройка учётной записи почты* щёлкнув по кнопке -*Пропустить это и использовать мою существующую почту*. - -*Мастер создания учётной записи* запросит: - -* ваше имя; -* адрес электронной почты; -* пароль. - -Далее, на основании введённой информации, мастер определяет протокол -доступа (IMAP или POP3) и адреса серверов входящих и исходящих сообщений. Вы -можете принять предложенные настройки, если они верны, нажав на кнопку -*Готово*, или указать правильные настройки, воспользовавшись -кнопкой *Настройка вручную*. -Добавить дополнительную учётную запись можно также при помощи мастера *Добро -пожаловать в Thunderbird*. Вызвать его можно выбрав в левой части окна -программы одну из существующих учётных записей, затем нажав кнопку *Создать -учётную запись: Электронная почта* в открывшемся в правой части окна списке. - -Если вы имеете почтовый ящик на сервисе Gmail, то вся настройка происходит -автоматически -- вам необходимо ввести только имя учётной записи и пароль. - -В случае наличия нескольких учётных записей вы можете выбирать метод их -компоновки на панели почтовых папок. По умолчанию происходит создание единой -группы папок, но есть возможность переключиться на раздельное отображение -каждой учётной записи. - -[float] -==== Использование почтового клиента ==== - -Для составления письма нажмите *Создать*. В открывшемся окне *Создание -сообщения* введите адрес получателя, тему и текст письма. Для проверки ошибок -в тексте выберите кнопку *Орфография*. - -image::images/thunderbird-message.png[Создание сообщения] - -В виде вложения к письму можно пересылать электронные документы, изображения, -архивы и т.п. Для того чтобы добавить вложение, нажмите *Вложить* и выберите -нужный файл в открывшемся окне. Закончив составление письма, нажмите -*Отправить*. - -//application path -Более подробную информацию об использовании и настройке -Thunderbird смотрите *Справка -> О Thunderbird* или при помощи -клавиши *F1*. diff --git a/desktop-software/internet/web/chromium/images/chromium.png b/desktop-software/internet/web/chromium/images/chromium.png deleted file mode 100644 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmV+o0`mQdP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oO -Параметры*). - diff --git a/desktop-software/internet/web/firefox/index.txt b/desktop-software/internet/web/firefox/index.txt deleted file mode 100644 index b55ca52..0000000 --- a/desktop-software/internet/web/firefox/index.txt +++ /dev/null @@ -1,45 +0,0 @@ -=== Mozilla Firefox === - -Программа Mozilla Firefox -- веб-браузер нового поколения, поддерживающий -большинство современных веб-технологий и интернет-протоколов. Браузер -Mozilla Firefox предлагает пользователю логичный интерфейс и возможность -полностью контролировать свою работу в Интернете. - -image::images/firefox.png[Веб-браузер Mozilla Firefox] - -Веб-браузер Mozilla Firefox предоставляет широкие возможности настройки: -пользователь может устанавливать дополнительные темы, изменяющие внешний вид -программы, и расширения, добавляющие новую функциональность. - -[float] -==== Просмотр веб-страниц ==== - -Для того чтобы открыть интернет-страницу, введите её адрес в адресную строку -браузера и нажмите *Enter*. Если вы хотите открыть ссылку на следующую -страницу в новой вкладке, то нажмите на ней средней кнопкой (колесом) мыши. -Возможно настроить одновременный просмотр нескольких страниц в разных -вкладках одного окна. - -[float] -==== Быстрый доступ к нужным сайтам ==== - -Для быстрого доступа к часто посещаемым веб-страницам создайте ссылки на -*Панели закладок*. Управление закладками и их редактирование осуществляется в -рамках диалогового окна *Библиотека*. - -Удобный доступ к нужным сайтам предоставляет *Панель навигации*: - -* интеллектуальная строка ввода адреса предоставляет окно-подсказку с историей -ранее открытых сайтов; -* строка поиска предлагает пользователю функцию поиска по мере набора текста. - -[float] -==== Загрузка файлов из Интернета ==== - -//application path -Веб-браузер Mozilla Firefox работает как полнофункциональный FTP-клиент. -Процесс загрузки найденных в Интернете файлов на жёсткий диск компьютера -отображается в диалоговом окне менеджера загрузок. В меню веб-браузера -*Правка -> Настройки* можно указать папку для сохранения файлов или выбрать -возможность назначать папку при сохранении файлов. - diff --git a/desktop-software/internet/web/index.txt b/desktop-software/internet/web/index.txt deleted file mode 100644 index 038765b..0000000 --- a/desktop-software/internet/web/index.txt +++ /dev/null @@ -1,30 +0,0 @@ -== Веб-навигация == - -Веб-браузеры -- комплексные программы для обработки и отображения -HTML-страниц по протоколу HTTP и HTTPS (открытие страниц сайтов, блогов и -т.д.). Основное назначение веб-браузера -- предоставление интерфейса между -веб-сайтом и его посетителем. В базовые функции современных веб-браузеров -входят: - -* навигация и просмотр веб-ресурсов; -* показ оглавлений FTP-серверов и скачивание файлов; -* поддержка скриптовых языков. - -Основные принципы работы с веб-браузером неизменны. Программа -предоставляет пользователю адресную строку, в которую вносится адрес -необходимого вам сайта. Для более быстрого доступа адреса часто посещаемых -сайтов добавляются в закладки. Для перехода к предыдущей/следующей -просмотренной веб-странице, как правило, предусмотрены специальные кнопки на -панели инструментов. - -Возможно, по опыту работы в других операционных системах вы уже знакомы с -определённым браузером. Определить, какой браузер лучше, практически -невозможно. Эту задачу каждый пользователь решает сам, ориентируясь на свои -личные предпочтения. В любом случае рассмотрите основные предложения -и выберите наиболее удобный для вас веб-навигатор. - -include::konqueror/index.txt[] - -include::firefox/index.txt[] - -include::midori/index.txt[] diff --git a/desktop-software/internet/web/konqueror/images/konqueror.png b/desktop-software/internet/web/konqueror/images/konqueror.png deleted file mode 100644 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmV+o0`mQdP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oO Видимые панели -инструментов* опцию *Дополнительная панель инструментов*. В зависимости от -размеров вашего монитора можно увеличивать или уменьшать области занимаемого -каждой вкладкой пространства. - -[float] -==== Быстрый доступ к нужным сайтам ==== - -//application path -Быстро открывать нужные веб-страницы можно, создав на них ссылки. Значок из -строки адреса (слева от самого адреса) перетащите мышью на рабочий стол и -выберите *Создать ссылку*. Создать серию ярлыков веб-страниц возможно из -меню *Закладки -> Изменить закладки...*. Затем, из открывшегося окна с помощью -мыши перетащите на рабочий стол или на панель закладок необходимое количество -значков закладок. Ярлыки будут созданы автоматически. - -[float] -==== Загрузка файлов из Интернета ==== - -Веб-браузер Konqueror эффективный двух-панельный FTP-клиент. Сохранять, -перемещать или копировать файлы можно при помощи контекстного меню, а также, -перетаскивая ссылку с помощью мыши из окна браузера в окно файлового -менеджера. - diff --git a/desktop-software/internet/web/midori/images/midori.png b/desktop-software/internet/web/midori/images/midori.png deleted file mode 100644 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmV+o0`mQdP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oO Параметры -> Поведение* можно указать папку для сохранения файлов или выбрать -возможность назначать папку при сохранении файлов. diff --git a/desktop-software/multimedia/amarok/index.txt b/desktop-software/multimedia/amarok/index.txt deleted file mode 100644 index 42ce674..0000000 --- a/desktop-software/multimedia/amarok/index.txt +++ /dev/null @@ -1,9 +0,0 @@ -=== Amarok === - -Amarok -- очень мощный аудио-проигрыватель. Кроме стандартных возможностей по -работе с локальными аудио-коллекциями программа предоставляет возможность -прослушивания материалов непосредственно из сети Интернет и работу с внешними -устройствами. Информация о проигрываемом произведении и даже текст песни могут -отображаться в соответствующем окне. Функции программы этим не исчерпываются. -Мы советуем попробовать использовать Amarok для работы с вашей музыкальной -коллекцией. diff --git a/desktop-software/multimedia/audacious/index.txt b/desktop-software/multimedia/audacious/index.txt deleted file mode 100644 index 6c8c4fc..0000000 --- a/desktop-software/multimedia/audacious/index.txt +++ /dev/null @@ -1,31 +0,0 @@ -=== Audacious === - -Audacious -- это свободный универсальный аудио проигрыватель, работающий с -большинством форматов музыкальных файлов. В набор входят плагины для -воспроизведения форматов MP3, Ogg Vorbis, FLAC и Monkey's Audio. - -Audacious имеет многоязычный, очень удобный интерфейс, выполненный по подобию -популярного Winamp для Windows. - -Широкий набор возможностей в Audacious достигается благодаря проигрыванию самых -популярных звуковых форматов, а также поддержке дополнений и модулей. Обычно -самые полезные модули поставляются вместе с проигрывателем. В этот набор -входят модули для воспроизведения звуковых форматов: Audio CD, MPEG (mp3), -Ogg Vorbis, WMA, AAC, FLAC, ALAC, WAVE, а также Midi, Musepack (mpc), -Wavpack. - -Audacious полностью поддерживает графические оболочки для Winamp 2, а также -графические оболочки в произвольном формате. Присутствует модуль для last.fm, -поддержка LIRC, различные эффекты, такие как «удаление голоса», конвертор -частоты семплирования, эффекты визуализации, компрессор и т.д. - -Кроме того, в последних версиях программы следует отметить следующие важные -дополнения к основным функциям: - -- частичная поддержка GTK+ 3.0; -- вывод звука с помощью SDL; -- быстрый поиск; -- новая визуализация; -- реорганизация диалога настроек; -- показ обложек в главном окне. - diff --git a/desktop-software/multimedia/audacity/images/audacity.png b/desktop-software/multimedia/audacity/images/audacity.png deleted file mode 100755 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmV+o0`mQdP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oO Импортировать -> Звуковой файл без заголовка (Raw)...*). - -[NOTE] -В настоящее время Audacity не поддерживает форматы WMA и AAC, а -также остальные форматы файлов с закрытыми спецификациями. - -[float] -==== Редактирование ==== - -Редактор Audacity обеспечивает выполнение достаточного количества основных -операций, необходимых для редактирования звуковых файлов. Доступны следующие -функции: - -- базовые операции вырезания, копирования, вставки и удаления; -- неограниченная история изменения, по которой можно отменить и повторить - действие; -- очень быстрое изменение больших файлов; -- изменение и сведение неограниченного числа дорожек; -- использование «карандаша» для редактирования отдельных точек образца звука; -- плавное изменение громкости при помощи инструмента редактирования огибающей. - -[float] -==== Эффекты ==== - -Audacity имеет функцию обработки звуковых файлов различными эффектами, -присутствующими как в комплекте поставки, так и устанавливаемыми отдельно. -Доступны следующие эффекты: - -- смена высоты тона без изменения темпа и наоборот; -- удаление статического шума, гула, шипения и других постоянных шумовых - дефектов записи; -- изменение частотных характеристик при помощи эквалайзера, фильтров и эффекта - усиления баса; -- подстройка громкости при помощи компрессора, эффекта усиления и или - нормализации; -- другие встроенные эффекты. - -[float] -==== Качество звука ==== - -Audacity работает со всеми форматами звуковых файлов, принятых за -шаблоны в мировой звуковой индустрии. Возможна работа со звуком в следующих -форматах: - -- запись и редактирование 16/24/32-битных (32бит — с плавающей точкой) звуковых - данных; -- частота дискретизации до 96 кГц; -- преобразования частот дискретизации и битовой глубины производятся с - использованием качественных алгоритмов ресэмплинга и дитеринга; -- сведение дорожек, обладающих разными качественными характеристиками, с - автоматическим преобразованием до характеристик проекта в режиме реального - времени. - -[float] -==== Модули (Plug-Ins) ==== - -В Audacity присутствует возможность использования встроенных или установленных -дополнительно модулей, расширяющих функциональность обработки звуковых файлов. -Доступны следующие возможности для работы с модулями: - -- всегда можно добавить новые модули; -- audacity включает несколько модулей Стива Хэрриса (Steve Harris); -- использование VST-модулей под Windows и Mac при помощи скачиваемого отдельно - модуля VST Enabler; -- создание своих эффектов на простом встроенном языке Nyquist. - -[float] -==== Анализ ==== - -С помощью данной функции вам будет доступно визуальное отображение особенностей -формы звуковой волны для последующей обработки. Доступны следующие варианты -анализа звукового файла: - -- спектрографический режим отображения дорожек; -- команда «Построить график спектра» для детального анализа частотных - характеристик. - -[float] -==== Свобода использования и многоплатформенность ==== - -Программа распространяется на условиях GNU General Public License (GPL), -работает в GNU/Linux и некоторых других Unix-системах, а так же в Mac OS X, -Windows. diff --git a/desktop-software/multimedia/deadbeef/index.txt b/desktop-software/multimedia/deadbeef/index.txt deleted file mode 100644 index cbba985..0000000 --- a/desktop-software/multimedia/deadbeef/index.txt +++ /dev/null @@ -1,28 +0,0 @@ -=== DeaDBeeF === - -DeaDBeeF -- это программа для воспроизведения аудиофайлов, музыкальный -проигрыватель, работающий с большинством форматов музыкальных файлов. -Поддерживает воспроизведение форматов MP3, Ogg Vorbis, FLAC и Monkey's Audio, -множества форматов трекерной музыки и музыки с игровых приставок. Успешно -используется под операционными системами FreeBSD и OpenIndiana, представлена -версия для мобильной ОС Android. - -DeaDBeeF имеет многоязычный, удобный интерфейс и имеет следующие отличительные черты: -одновременная работа с несколькими плейлистами; возможность отображения обложек альбомов; -поддержка пользовательских группировки и сортировки треков в плейлисте; настраиваемые -колонки плейлиста; 18-полосный эквалайзер. - -Широкий набор возможностей в DeaDBeeF достигается благодаря проигрыванию самых -популярных звуковых форматов, а также поддержке дополнений и модулей. Обычно -самые полезные модули поставляются вместе с проигрывателем. В этот набор -входят модули для воспроизведения звуковых форматов: Audio CD, MPEG (mp3), -Ogg Vorbis, WMA, AAC, FLAC, ALAC, WAVE, а также Midi, Musepack (mpc), -Wavpack. - -Кроме того, в последних версиях программы следует отметить следующие важные -дополнения к основным функциям: - -- поддержка last.fm; -- онлайн радио; -- быстрый поиск; -- новая визуализация. diff --git a/desktop-software/multimedia/index.txt b/desktop-software/multimedia/index.txt deleted file mode 100644 index 7cf9918..0000000 --- a/desktop-software/multimedia/index.txt +++ /dev/null @@ -1,16 +0,0 @@ -== Мультимедиа == - -Для работы с мультимедиа файлами (музыка, видео и т.п.) вы можете -воспользоваться предназначенными для этого приложениями. - -include::kde/index.txt[] - -include::amarok/index.txt[] - -include::kino/index.txt[] - -include::audacious/index.txt[] - -include::audacity/index.txt[] - -include::deadbeef/index.txt[] diff --git a/desktop-software/multimedia/kde/index.txt b/desktop-software/multimedia/kde/index.txt deleted file mode 100644 index 5fb10b8..0000000 --- a/desktop-software/multimedia/kde/index.txt +++ /dev/null @@ -1,10 +0,0 @@ -=== Мультимедиа KDE === - -Dragonplayer -- простой видео-проигрыватель. Вы можете воспользоваться им для -просмотра клипов, фильмов или других видео-материалов. - -JuK -- это музыкальный центр. Как и все подобные программы, JuK позволяет -редактировать «теги» музыкальных файлов и управлять коллекцией музыки. - -KsCD -- простой проигрывать AudioCD. Воспользуйтесь этой программой для -прослушивания ваших аудио дисков. diff --git a/desktop-software/multimedia/kino/index.txt b/desktop-software/multimedia/kino/index.txt deleted file mode 100644 index 27ba93c..0000000 --- a/desktop-software/multimedia/kino/index.txt +++ /dev/null @@ -1,6 +0,0 @@ -=== Kino === - -Kino -- программа для редактирования цифрового видео. Kino -- нелинейный -редактор Digital Video (DV) для Linux. Программа имеет интеграцию с IEEE 1394 -для захвата, VTR-контроля и записи обратно на камеру. Захватывает видео на -диск в Raw DV и AVI-форматы типа-1 DV и тип-2 DV. diff --git a/desktop-software/office/abiword/images/abiword.png b/desktop-software/office/abiword/images/abiword.png deleted file mode 100644 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmV+o0`mQdP)Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oOPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oOPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RX0~-hj3?Xz^?f?J)8FWQhbVF}# zZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b00Lr5M??VshmXv^0004ONkl`(YJ>&j0^&8H5@hzFq@TxQRie|H8}F#tdy_TJrb*|5psGK=LJn08rrbq9h|( zP6p=x|D70WVG7+CR)Ls@7|hAE1QhrP@|G4nj3gP(!&FGZN?RfFEkPo~7>pO6d;T57 z=a6)YhRVm{^vG1^)5PD}o6^ygA3eFGM_=^-c+a*aU{BzGoK zk5AAr`!H=v;VTTrv@Ytuo-|`9r>P~7FqQd8Q%ihhIeGO9-;b>7mks~`%=23-?oO -v0.1-alt1, Jan 2010 - -= Введение = - -Добро пожаловать в документацию дистрибутива **(DISTRO)**. -Данное руководство предназначено как для начинающих, так и для опытных -пользователей. Руководство описывает подготовку системы для установки, -процесс установки дистрибутива, а также процедуру настройки и -использования системы. - -Названия компаний и продуктов, встречающихся в руководстве, могут -являться торговыми знаками соответствующих компаний. - -Данное руководство соответствует текущему состоянию сведений, но -какие-либо окончательные правки могли не попасть в него. -В случае обнаружения ошибок и неточностей в руководство вносятся -изменения. Актуальная версия руководства в формате HTML со всеми -текущими изменениями и дополнениями размещена на сайте с -документацией компании ALT Linux http://docs.altlinux.org/. - -= Что такое (DISTRO) = - -include::whatis-distro/index.txt[Введение] - -include::whatis-linux/index.txt[] - -include::whatis-alt/index.txt[] - -include::install-guide/index.txt[Установка] - -include::rescue/index.txt[] - -include::system-start/index.txt[Загрузка системы] - -include::desktop-gnome/index.txt[] - -include::desktop-xfce/index.txt[] - -include::desktop-lxde/index.txt[] - -include::desktop-mate/index.txt[] - -include::desktop-software/index.txt[Обзор приложений] - -include::school-software/index.txt[] - -= Настройка системы = - -include::system-management/index.txt[] - -include::packages/index.txt[Установка приложений] - -include::admin-basics/index.txt[Основы администрирования] - -include::support/index.txt[Технич. поддержка] - -include::old-docs/index.txt[Документациия из старых RPM пакетов] diff --git a/install-guide/alternative-install.txt b/install-guide/alternative-install.txt deleted file mode 100644 index 916a976..0000000 --- a/install-guide/alternative-install.txt +++ /dev/null @@ -1,94 +0,0 @@ -== Альтернативные способы установки == - -Обычно для установки дистрибутива используется установочный загрузочный -CD/DVD-диск или USB flash-накопитель. Если вы производите установку именно -таким образом, можете пропустить этот раздел и сразу перейти к разделу -<>. - -Установка с загрузочного диска -- это один из возможных способов установки системы. -Он является самым распространённым способом установки системы, но не работает, -например, в случае отсутствия на компьютере CD/DVD-привода. Для таких случаев -поддерживаются альтернативные методы установки. - -Необходимо понимать, что для начала процесса установки необходимо присутствие -двух составляющих: возможности загрузить компьютер и доступа к установочным -файлам. В случае загрузки с установочного диска эти две возможности -предоставляются самим диском: он является загрузочным и содержит все -необходимые для установки файлы. Однако, вполне допустим и такой вариант: -первоначальная загрузка происходит со специально подготовленного USB -flash-накопителя, а установочные файлы берутся с FTP-сервера сети. - -Таким образом, для альтернативной установки дистрибутива необходимо: - -* <>; -* <>. - -[[INSTALLSOURCE]] -=== Источники установки === - -После первоначальной загрузки с одного из поддерживаемых носителей можно -выбрать _источник установки_ -- место, откуда программа установки будет брать -все необходимые при установке данные (прежде всего устанавливаемое ПО). -Так как установка системы возможна не только с -лазерного диска, то можно выбрать один из поддерживаемых альтернативных -источников установки. - -image::images/boot.png[Загрузка,align="center"] - -.Источники установки: -* <> -** FTP-сервер; -** HTTP-сервер. -** NFS-сервер; -* <> -** внешний жёсткий диск. - -Условием для всех способов установки является доступность дерева файлов, -аналогичного содержимому установочного диска. - -[[NETINSTALL]] -[float] -==== Запуск сетевой установки ==== - -Кнопка *F4* позволяет выбрать источник сетевой установки: FTP, HTTP или -NFS-сервер. Нужно указать имя или IP-адрес сервера и каталог (начиная с '/'), в -котором размещён дистрибутив ALT Linux. В случае установки по протоколу FTP -может понадобиться также ввести имя и пароль пользователя. - -Пример установки: - -- Имя сервера: 192.168.0.1 -- Каталог: `/pub/netinstall/` - * в данном каталоге на сервере должны находиться: - ** файл `altinst`; - ** каталог `Metadata`; - ** каталог `ALTLinux` с подкаталогами `RPMS.секция`, содержащими rpm-пакеты. - -Для того чтобы получить подобное дерево каталогов, на стороне сервера достаточно -скопировать содержимое установочного лазерного диска в один из подкаталогов -FTP-сервера (либо HTTP или NFS-сервера). В описанном примере это каталог -`/pub/netinstall`. - -При сетевой установке со стороны клиента (компьютера, на который производится -установка) может понадобиться определить параметры соединения с сервером. В этом -случае на экране будут появляться диалоги, например, с предложением выбрать -сетевую карту (если их несколько) или указать тип IP-адреса: статический -(потребуется вписать его самостоятельно) или динамический (DHCP). - -После успешного соединения с сервером в память компьютера будет загружен образ -установочного диска. После этого начнётся установка системы подобно -установке с лазерного диска. - -[[HDINSTALL]] -[float] -==== Установка с жёсткого диска ==== - -Установка ALT Linux с жёсткого диска происходит аналогично установке по сети. Для -этого понадобится подключить дополнительный жёсткий диск с дистрибутивом. Чтобы -выбрать подключённый диск в качестве источника установки, нужно кнопкой *F4* -выбрать источник установки *Жёсткий диск*. Затем выберите пункт *Установка* в загрузочном меню, -нажмите *Enter* и по прошествии некоторого времени на экране появится диалог выбора дискового -раздела, а после -- диалог выбора пути к каталогу с дистрибутивом. После указания пути -начнётся установка системы. При желании, можно сразу указать путь к дистрибутиву, сделав в -строке параметров загрузки запись вида: -`automatic=method:disk,disk:hdb,partition:hdbX,directory:<путь_к_каталогу_с_дистрибутивом>`. diff --git a/install-guide/backup-before-install.txt b/install-guide/backup-before-install.txt deleted file mode 100644 index ef813f0..0000000 --- a/install-guide/backup-before-install.txt +++ /dev/null @@ -1,31 +0,0 @@ -== Сохранение данных и меры предосторожности == - -Если вы хотите установить ALT Linux и при этом сохранить уже установленную на -вашем компьютере операционную систему (например, другую версию GNU/Linux или -Microsoft Windows), вам нужно обязательно позаботиться о подготовке компьютера -к установке второй системы и о сохранении ценных для вас данных. - -Если у вас нет загрузочного диска для уже установленной системы, -создайте его. В случае прерванной установки ALT Linux или неправильной -настройки загрузчика, вы можете потерять возможность загрузиться в вашу -предыдущую ОС. - -Если на диске, выбранном для установки ALT Linux, не осталось свободного -раздела, то программа установки должна будет изменить размер существующего -раздела. От этой операции могут пострадать ваши данные, поэтому предварительно -надо сделать следующие действия. - -* Выполнить проверку раздела, который вы собираетесь уменьшать. Для этого - воспользуйтесь соответствующим программным обеспечением (далее -- ПО), - входящим в состав уже установленной ОС. - Программа установки ALT Linux может обнаружить некоторые очевидные ошибки - при изменении размера раздела, но специализированное ПО предустановленной ОС - справится с этой задачей лучше. - -* Выполнить дефрагментацию уменьшаемого раздела в целях повышения уровня - безопасности данных. Это действие не является обязательным, но мы - настоятельно рекомендуем его произвести: изменение размера раздела - пройдёт легче и быстрее. - -[IMPORTANT] -Полной гарантией от проблем, связанных с потерей данных, является резервное копирование! diff --git a/install-guide/bacula-select.txt b/install-guide/bacula-select.txt deleted file mode 100644 index 511850b..0000000 --- a/install-guide/bacula-select.txt +++ /dev/null @@ -1,11 +0,0 @@ -[[bacula-select]] -== Установка или восстановление == - -image::images/bacula-select.png[Установка или восстановление,align="center"] - -Этот шаг предусмотрен для выбора между установкой и восстановлением из ранее -сохранённой копии. Для первоначальной установки просто нажмите «Далее». При -выборе варианта «Восстановление системы из резервной копии» будет произведён -поиск резервных копий на подключённых носителях и, если резервная копия -найдена, предложено произвести восстановление. Резервные копии, поддерживаемые -установщиком, можно создать в любой момент после установки системы. diff --git a/install-guide/boot.txt b/install-guide/boot.txt deleted file mode 100644 index 2ffa894..0000000 --- a/install-guide/boot.txt +++ /dev/null @@ -1,73 +0,0 @@ -== Начало установки: загрузка системы == - -[[INITIALBOOT]] -=== Способы первоначальной загрузки === - -Для загрузки компьютера с целью установки системы необходимо воспользоваться -носителем, содержащим начальный загрузчик. - -Простейший способ запустить программу установки -- загрузить -компьютер с помощью загрузочного носителя, находящегося на -установочном DVD с дистрибутивом (при условии, что система -поддерживает загрузку с устройства для чтения DVD). - -Также программу установки можно запустить с другого -загрузочного носителя. Например, в качестве загрузочного носителя -может использоваться загрузочный USB flash-накопитель. Это подходит в -случае, если ваш компьютер нельзя загрузить с устройства для чтения -оптических дисков, но возможна загрузка с помощью USB flash-накопителя. - -=== Загрузка системы === - -Для того чтобы начать обычную установку (при наличии -установочного диска с дистрибутивом и устройства для чтения DVD), -необходимо загрузиться с CD или DVD-диска, на котором записан -дистрибутив. В этом случае может потребоваться включить в BIOS опцию -загрузки с CD/DVD-привода. - -[NOTE] -В большинстве случаев указание способа входа в BIOS -отображается на вашем мониторе непосредственно после включения -компьютера. Способ входа в меню BIOS и информация о расположении -настроек определяется производителем используемого оборудования. За -информацией можно обратиться к документации на ваше оборудование. - -image::images/boot.png[Загрузка,align="center"] - -После загрузки компьютера с установочного диска выводится меню, в котором вы -можете выбрать возможные варианты загрузки системы, а так же запустить уже -установленную на жёстком диске ОС, выполнить проверку памяти, загрузиться -в восстановительном режиме или в режиме LiveCD. - -Кроме установки системы с лазерного диска, в данном меню доступны несколько -вариантов сетевой установки и установка системы с жёсткого диска (об этом рассказано -в разделе <>). - -[NOTE] -Мышь на этом этапе установки не поддерживается. Для выбора опций установки и -различных вариантов необходимо использовать клавиатуру. - -В нижней части экрана отображаются дополнительные опции, влияющие на дальнейший -ход установки. - -* Для получения справочной информации нажмите *F1*. -* От выбора языка в загрузчике зависит язык интерфейса загрузчика и программы -установки. Выбор языка осуществляется клавишей *F2*. -* Клавишей *F3* открывается меню доступных видеорежимов (разрешений экрана). Это -разрешение будет использоваться во время установки и загрузки установленной -системы. -* Выбрать источник установки можно при помощи клавиши *F4*. -* Дополнительные режимы работы ядра можно задать при помощи клавиши *F5*. - -Для начала процесса установки, клавишами перемещения курсора *вверx* и *вниз*, -необходимо выбрать пункт меню *Установка*, а затем нажать *Enter*. -Начальный этап установки не требует вмешательства: происходит -автоматическое определение оборудования и запуск компонентов программы -установки. Сообщения о происходящем на данном этапе можно просмотреть, -нажав клавишу *ESC*. - -[NOTE] -В начальном загрузчике выставлено небольшое время ожидания действий пользователя: -если вы не сделали никаких шагов по выбору нужного вам пункта меню, будет -загружена та система, которая уже установлена на жёстком диске. Если вы пропустили -нужный момент, то перезагрузите компьютер и вовремя выберите пункт *Установка*. diff --git a/install-guide/datetime.txt b/install-guide/datetime.txt deleted file mode 100644 index d47fd3b..0000000 --- a/install-guide/datetime.txt +++ /dev/null @@ -1,34 +0,0 @@ -[[datetime]] -== Дата и время == - -Для корректной установки даты и времени достаточно правильно указать часовой -пояс и выставить желаемые значения для даты и времени. - -image::images/datetime-0.png[Дата и время (выбор часового пояса),align="center"] - -Для установки часового пояса в соответствующих списках выберите страну, а затем -регион. Поиск по списку можно ускорить, набирая на клавиатуре первые буквы -искомого слова. - -Обратите внимание на отметку *Хранить время в BIOS по Гринвичу*. Если Linux -- -единственная установленная операционная система, то поставьте эту отметку. Если -Linux устанавливается как вторая система, то эту отметку необходимо снять. -Если этого не сделать, то время и дата в уже установленной операционной системе -могут отображаться неверно. - -Проверьте, верно ли отображаются дата и время в графе *Текущее время*, и, при -необходимости, выставьте правильные значения (кнопка *Изменить...*). - -image::images/datetime-1.png[Дата и время,align="center"] - -Если ваш компьютер подключён к локальной сети или к сети Интернет, можно -включить функцию синхронизации системных часов с удалённым сервером времени -(NTP). Это позволит вашему компьютеру автоматически подводить часы так, чтобы -время было максимально точным. Для этого достаточно отметить пункт *Получать -точное время с NTP-сервера* и указать предпочитаемый NTP-сервер. В большинстве -случаев вас устроит сервер 'pool.ntp.org'. - -Если выбрана опция *Получать точное время с NTP-сервера*, то ваш компьютер -может и сам быть сервером точного времени. Например, использоваться как сервер -точного времени машинами вашей локальной сети. Для активации этой возможности -отметьте *Работать как NTP-сервер*. diff --git a/install-guide/grub.txt b/install-guide/grub.txt deleted file mode 100644 index c6487f6..0000000 --- a/install-guide/grub.txt +++ /dev/null @@ -1,21 +0,0 @@ -[[grub]] -== Установка загрузчика == - -image::images/grub.png[Установка загрузчика,align="center"] - -Загрузчик Linux -- это программа, которая позволяет загружать Linux и другие -операционные системы. Если на вашем компьютере будет установлен только Linux, -то здесь не нужно ничего изменять, просто нажмите *Далее*. - -Если же вы планируете использовать и другие операционные системы, уже -установленные на этом компьютере, тогда имеет значение на каком жёстком диске -или в каком разделе будет расположен загрузчик. В большинстве случаев программа -установки сама правильно подберёт расположение загрузчика. Вы можете указать -расположение самостоятельно, либо вовсе не устанавливать предлагаемый -загрузчик, если, к примеру, вы уже используете какой-то сторонний загрузчик. - -[NOTE] - -При установке на EFI выберите в качестве устройства для установки -«EFI». Рекомендуется выбрать автоматическое разбиения на этапе -разметки диска для создания необходимых разделов для загрузки с EFI. diff --git a/install-guide/hpc-node.txt b/install-guide/hpc-node.txt deleted file mode 100644 index f07902e..0000000 --- a/install-guide/hpc-node.txt +++ /dev/null @@ -1,19 +0,0 @@ -[[hpc-node]] -== Общие настройки узла == - -image::images/hpc-node.png[Общие настройки узла,align="center"] - -Все узлы вычислительного кластера используют единое хранилище данных, -смонтированное в каталог /home. В случае использования протокола NFS, -местоположение хранилища указывается в формате «хост:путь на файловой -системе». - -Второй важный параметр -- способ хранения журналов с системными сообщениями. -Возможные варианты: - -- сбор всех протоколов со всех узлов -- передача всех протоколов на удалённый узел - -Первый вариант используется на головной машине кластера, второй -- на -вычислительных узлах. Во втором случае необходимо указать на какую машину будут -отсылаться сообщения. diff --git a/install-guide/images/bacula-select.png b/install-guide/images/bacula-select.png deleted file mode 100644 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 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 -* <>; -* <>; -* <>; -* <>; -* <>; -* <>; -* <>; -* <>; -* <>; -* <>; -* <>. diff --git a/install-guide/installer-network.txt b/install-guide/installer-network.txt deleted file mode 100644 index 4100db4..0000000 --- a/install-guide/installer-network.txt +++ /dev/null @@ -1,10 +0,0 @@ -[[installer-network]] -== Настройка сети == - -image::images/installer-network.png[Настройка сети,align="center"] - -На этом этапе необходимо задать параметры настройки сети: IP-адреса сетевых -интерфейсов, DNS-сервер, шлюз и т.п. Конкретные значения будут зависеть от -используемого вами сетевого окружения. Ручного введения настроек можно избежать -при наличии в вашей сети настроенного DHCP-сервера. В этом случае все -необходимые сетевые настройки будут получены автоматически. diff --git a/install-guide/installer-preinstall.txt b/install-guide/installer-preinstall.txt deleted file mode 100644 index e4bea46..0000000 --- a/install-guide/installer-preinstall.txt +++ /dev/null @@ -1,16 +0,0 @@ -[[installer-preinstall]] -== Сохранение настроек == - -image::images/installer-preinstall.png[Сохранение настроек,align="center"] - -По завершении установки базовой системы начинается шаг сохранения настроек. Он -проходит автоматически и не требует вмешательства пользователя. На экране -отображается индикатор выполнения. - -На этом шаге производится перенос настроек, выполненных на первых шагах -установки, в только что установленную базовую систему. В список доступных -источников программных пакетов добавляется репозиторий, из которого происходила -установка системы. - -После сохранения настроек осуществляется автоматический переход к -следующему шагу. diff --git a/install-guide/junior_cd2.txt b/install-guide/junior_cd2.txt deleted file mode 100644 index e0c334f..0000000 --- a/install-guide/junior_cd2.txt +++ /dev/null @@ -1,11 +0,0 @@ -[[junior-cd2]] -== Дополнительные диски == - -image::images/junior-cd2.png[Дополнительные диски] - -Если дистрибутив поставляется на нескольких дисках, то этот шаг позволяет -сменить диск для продолжения установки. Для этого вставьте требуемый диск в -привод лазерных дисков и нажмите «Далее». Последует установка пакетов с -добавленного диска. - -image::images/junior-cd2-install.png[Дополнительные диски (установка пакетов)] diff --git a/install-guide/license.txt b/install-guide/license.txt deleted file mode 100644 index 300087b..0000000 --- a/install-guide/license.txt +++ /dev/null @@ -1,16 +0,0 @@ -[[license]] -== Лицензионный договор == - -image::images/license.png[Лицензионный договор,align="center"] - -Перед продолжением установки следует внимательно прочитать условия лицензии. В -лицензии говорится о ваших правах. В частности, за вами закрепляются права на: - -- эксплуатацию программ на любом количестве компьютеров и в любых целях; -- распространение программ (сопровождая их копией авторского договора); -- получение исходных текстов программ. - -Если вы приобрели дистрибутив, то данное лицензионное соглашение прилагается в -печатном виде к вашей копии дистрибутива. Лицензия относится ко всему -дистрибутиву ALT Linux. Если вы согласны с условиями лицензии, отметьте пункт -*Да, я согласен с условиями* и нажмите *Далее*. diff --git a/install-guide/lilo.txt b/install-guide/lilo.txt deleted file mode 100644 index b695232..0000000 --- a/install-guide/lilo.txt +++ /dev/null @@ -1,19 +0,0 @@ -[[lilo]] -== Установка загрузчика == - -image::images/lilo.png[Установка загрузчика,align="center"] - -*Загрузчик Linux* -- программа, которая позволяет загружать Linux и другие -операционные системы. Если на вашем компьютере будет установлен только Linux, то -здесь не нужно ничего изменять, просто нажмите «Далее». - -Если же вы планируете использовать и другие операционные системы, уже -установленные на этом компьютере, тогда имеет значение, на каком жёстком диске -или разделе будет расположен загрузчик. В большинстве случаев программа -установки правильно подберёт расположение загрузчика. - -Опытным пользователям может пригодиться возможность тонкой настройки загрузчика -(кнопка «Режим эксперта»). Параметры, которые можно здесь изменять, напрямую -соотносятся с соответствующими параметрами конфигурационного файла загрузчика -LILO (`/etc/lilo.conf`). Для простоты сохранены латинские названия параметров, -об их значении можно справиться в документации по LILO (`lilo.conf(5)`). diff --git a/install-guide/luks-set-password.txt b/install-guide/luks-set-password.txt deleted file mode 100644 index d16ff02..0000000 --- a/install-guide/luks-set-password.txt +++ /dev/null @@ -1,16 +0,0 @@ -[[luks_set_pass]] -== Установка пароля на шифрованные разделы == - -[IMPORTANT] -Если вы не создавали шифруемые разделы, то этот шаг пропускается автоматически. -В этом случае сразу переходите к <>. - -image::images/luks-set-password.png[Загрузка,align="center"] - -На этом этапе требуется ввести пароль для шифруемых разделов. -Этот пароль потребуется вводить для того, чтобы получать доступ к информации -на данных разделах. - -Например, если вы зашифровали `/home`, то во время загрузки системы -будет необходимо ввести пароль для этого раздела, иначе вы не -сможете получить доступ в систему под своим именем пользователя. diff --git a/install-guide/office-desktop-auth.txt b/install-guide/office-desktop-auth.txt deleted file mode 100644 index bee5e72..0000000 --- a/install-guide/office-desktop-auth.txt +++ /dev/null @@ -1,7 +0,0 @@ -[[office-desktop-auth]] -== Аутентификация == - -image::images/office-desktop-auth.png[Аутентификация,align="center"] - -На этом шаге вы можете выбрать домен, управляемый (SERVERDISTRO). -В результате будут использоваться доменные аутентификационные данные. diff --git a/install-guide/pkg-groups.txt b/install-guide/pkg-groups.txt deleted file mode 100644 index 2330765..0000000 --- a/install-guide/pkg-groups.txt +++ /dev/null @@ -1,24 +0,0 @@ -image::images/pkg-groups.png[Установка системы (выбор),align="center"] - -В любом дистрибутиве ALT Linux доступно значительное количество программ (до -нескольких тысяч), часть из них составляет саму операционную систему, а -остальные -- это прикладные программы и утилиты. - -В операционной системе Linux все операции установки и удаления производятся над -_пакетами_ -- отдельными компонентами системы. Пакет и программа соотносятся -неоднозначно: иногда одна программа состоит из нескольких пакетов, иногда один -пакет включает несколько программ. - -В процессе установки системы обычно не требуется детализированный выбор -компонентов на уровне пакетов -- это требует слишком много времени и знаний от -проводящего установку. Тем более, что комплектация дистрибутива подбирается -таким образом, чтобы из имеющихся программ можно было составить полноценную -рабочую среду для соответствующей аудитории пользователей. Поэтому, в процессе -установки системы пользователю предлагается выбрать из небольшого списка _групп -пакетов_, объединяющих пакеты, необходимые для решения наиболее распространённых -задач. Под списком групп на экране отображается информация об объёме дискового -пространства, которое будет занято после установки пакетов, входящих в выбранные -группы. - -Выбрав необходимые группы, следует нажать *Далее*, после чего начнётся установка -пакетов. diff --git a/install-guide/pkg.txt b/install-guide/pkg.txt deleted file mode 100644 index d866d7a..0000000 --- a/install-guide/pkg.txt +++ /dev/null @@ -1,22 +0,0 @@ -[[pkg]] -== Установка системы == - -include::pkg-groups.txt[] - -image::images/pkg.png[Установка системы,align="center"] - -На этом этапе происходит установка набора программ, необходимых для работы -системы. - -Установка происходит автоматически в два этапа: - -- получение пакетов; -- установка пакетов. - -Получение пакетов осуществляется из источника, выбранного на этапе начальной -загрузки. При сетевой установке (по протоколу FTP или HTTP) время выполнения -этого шага будет зависеть от скорости соединения и может быть значительно -большим в сравнении с установкой с лазерного диска. - -TIP: Время ожидания окончания процесса установки программ можно посвятить чтению -руководства. diff --git a/install-guide/prepare-installation-media.txt b/install-guide/prepare-installation-media.txt deleted file mode 100644 index 0b95bca..0000000 --- a/install-guide/prepare-installation-media.txt +++ /dev/null @@ -1,139 +0,0 @@ -== Подготовка установочного диска == - -Наиболее частый способ установки операционной системы на компьютер представляет -собой установку с установочного DVD-диска. В этой главе описываются различные -способы записи дистрибутива ALT Linux на DVD-диск. - -Начиная с Шестой платформы установочные образы ALT Linux являются гибридными, -что позволяет производить установку записав такой образ на USB -flash-накопитель. Об записи установочного образа на USB flash-накопителя также -рассказано в этой главе. - -=== Запись образа ISO дистрибутива на DVD === - -==== Запись образа диска под операционной системой MS Windows ==== - -Файл ISO-образа диска — это файл специального формата, подготовленный для -записи на диск. Для записи iso-образа под операционной системой MS Windows -используйте специальные программы: SCDWriter, Nero BurningROM и другие. -Рекомендуем для записи использовать новые диски от известных производителей, -таких как: Verbatim, Mirex, Memorex. Записанный на плохой диск образ может -вызвать неразрешимые проблемы при установке. - -===== Запись образа диска с помощью Small CD-Writer ===== - -Весь процесс записи установочного диска при помощи Small CD-Writer состоит из -следующих шагов: - -* скачайте архив программы Small CD-Writer -http://gluek.info/wiki/_media/software/scdwriter14.zip; - -* распакуйте скачанный архив в любую директорию; - -* вставьте чистый диск в привод; - -* войдите в распакованную папку и запустите программу SCDWriter.exe; - -* откройте пункт меню *Диск* -> *Записать ISO-образ на диск* и, в -появившемся окне, укажите путь к образу диска; - -* нажмите кнопку *Записать*. - -image::images/small_cd-writer.png[Окно программы Small CD-Writer,align="center"] - -===== Запись образа диска с помощью Nero BurningROM ===== - -Весь процесс записи установочного диска при помощи Small CD-Writer состоит из -следующих шагов: - -* если у вас не установлена эта программа, скачайте её с сайта производителя -http://www.nero.com и установите; - -* запустите программу и выберите в списке устройств необходимый для записи -CD/DVD дисковод; - -* щёлкните по кнопке *Открыть проект* в главном окне. В появившемся окне -выберите необходимый iso образ для записи и нажмите кнопку *Открыть*; - -* в окне *Запись проекта (Записать образ)* настройте необходимые параметры; - -* приступайте к записи iso образа на диск, щёлкнув по кнопке *Запись -(Burn)*. - -==== Запись образа диска под операционной системой Linux ==== - -Для записи ISO-образов можно использовать множество утилит и программ с -графическим или текстовым интерфейсом. Наиболее удобно использовать программы -K3b или Brasero, которые поставляются в комплекте любого дистрибутива -операционной системы Linux. - -===== Запись образа диска с помощью K3b ===== - -* если программа `k3b` отсутствует, установите её в систему, используя -стандартные для вашего дистрибутива инструменты установки программ; - -* запустите программу. При правильных настройках программа сообщит об -отсутствии проблем с системой и предложит перейти к записи на диск; - -* в меню главного окна *Сервис (Service)* выберите пункт *Записать образ -DVD (Burn DVD image)*; - -* в появившемся окне *Записать образ DVD (Burn DVD image)* нажмите на -кнопку *Выбор файла для записи*. Откроется диалог, в котором необходимо -выбрать iso образ для записи и после выбора нажать клавишу *ОК*; - -* если вы всё сделали правильно, программа покажет информацию о iso файле и -начнёт вычислять контрольную сумму. Эта операция может занять несколько минут. -Вы можете сравнить полученную контрольную сумму с MD5SUM суммой на странице -дистрибутива; - -* если числа не сходятся, то значит вы выбрали для записи не тот файл или -скачанный вами iso образ был испорчен во время передачи данных по сети; - -* если цифры сходятся, вставьте диск для записи в дисковод. Дождитесь активации -кнопки *Начать (Start)*; - -* нажмите на кнопку *Начать (Start)*. - -=== Запись установочного образа на USB flash-накопителя === - -Как и при записи DVD-диска вам потребуется iso-образ установочного диска. - -==== В операционной системе Windows ==== - -Весь процесс записи установочного диска на USB flash-накопитель при помощи Image Writer -состоит из следующих шагов: - -* скачайте архив с программой Image Writer -http://www.simplylinux.ru/media/win32diskimager-RELEASE-0.3-r27-binary-alt1.zip; - -* распакуйте архив c Image Writer в каталог, не содержащий кириллических -символов; - -* вставьте USB flash-накопитель в USB-разъем (объём накопителя должен быть не -менее размера установочного образа); - -* запустите файл .exe; - -* в появившимся окне укажите ссылку на образ и выбрать устройство (USB -flash-накопитель); - -* нажмите кнопку *Write*. - -==== В операционной системе Linux ==== - -Для записи установочного образа можно воспользоваться утилитой командной строки -`dd`. Выполните с правами пользователя root следующие команды: - -------------------------------- -dd if=alt.iso of=/dev/sdX bs=1M -sync -------------------------------- - -где alt.iso — образ диска ISO, а */dev/sdX* — usb-устройство. Просмотреть список -доступных можно командой `lsblk` или (если такой команды нет): `blkid`. - -WARNING: Будьте внимательны при указании имени usb-устройства — запись образа -по ошибке на свой жёсткий диск приведёт к почти гарантированной потере данных -на нём! - diff --git a/install-guide/release-notes.txt b/install-guide/release-notes.txt deleted file mode 100644 index f5aba68..0000000 --- a/install-guide/release-notes.txt +++ /dev/null @@ -1,11 +0,0 @@ -[[release-notes]] -== Завершение установки == - -image::images/release-notes.png[Завершение установки,align="center"] - -На экране последнего шага установки отображается информация о завершении -установки. Эта информация может содержать важные замечания по использованию -дистрибутива. После нажатия кнопки *Завершить* -происходит перезагрузка компьютера. Не забудьте извлечь установочный DVD -(если это не происходит автоматически). Далее можно загружать -установленную систему в обычном режиме. diff --git a/install-guide/sysconfig.txt b/install-guide/sysconfig.txt deleted file mode 100644 index a6d85f6..0000000 --- a/install-guide/sysconfig.txt +++ /dev/null @@ -1,21 +0,0 @@ -[[sysconfig]] -== Язык == - -image::images/sysconfig.png[Язык,align="center"] - -Установка начинается с выбора _основного языка_ -- языка интерфейса программы -установки и устанавливаемой системы. В списке, помимо доступных языков региона -(выбранного на этапе начальной загрузки), указан и английский язык. - -На этом же этапе выбирается вариант переключения раскладки клавиатуры. Раскладка -клавиатуры -- это привязка букв, цифр и специальных символов к клавишам на -клавиатуре. Помимо ввода символов на основном языке, в любой системе Linux -необходимо иметь возможность вводить латинские символы (имена команд, файлов и -т.п.). Для этого обычно используется стандартная английская раскладка клавиатуры. -Переключение между раскладками осуществляется при помощи специально -зарезервированных для этого клавиш. Вы можете выбрать один из предлагаемых -вариантов. - -Если выбранный основной язык имеет всего одну раскладку (например, при выборе -английского языка в качестве основного), эта единственная раскладка будет -принята автоматически. diff --git a/install-guide/users-add.txt b/install-guide/users-add.txt deleted file mode 100644 index fcd8507..0000000 --- a/install-guide/users-add.txt +++ /dev/null @@ -1,26 +0,0 @@ -[[users-add]] -== Системный пользователь == - -image::images/users-add.png[Системный пользователь,align="center"] - -Помимо администратора (root) в систему необходимо добавить по меньшей мере -одного обычного _системного пользователя_. Работа от имени администратора системы считается -опасной, поэтому повседневную работу в Linux следует выполнять от имени -ограниченного в полномочиях системного пользователя. - -При добавлении системного пользователя предлагается ввести имя учётной записи -пользователя. Имя учётной записи всегда представляет собой одно слово, -состоящее только из строчных латинских букв (заглавные запрещены), цифр и -символа подчёркивания «_» (причём цифра и символ «_» не могут стоять в -начале слова). - -Для того чтобы исключить опечатки, пароль пользователя вводится дважды. -Пароль пользователя можно создать автоматически, по аналогии с автоматическим -созданием пароля суперпользователя. - -В процессе установки предлагается создать только одну учётную запись системного -пользователя -- от его имени можно выполнять задачи, -не требующие привилегий суперпользователя. - -Учётные записи для всех прочих пользователей системы можно будет создать в -любой момент после установки операционной системы. diff --git a/install-guide/users-root.txt b/install-guide/users-root.txt deleted file mode 100644 index 87e5d31..0000000 --- a/install-guide/users-root.txt +++ /dev/null @@ -1,38 +0,0 @@ -[[users-root]] -== Администратор системы == - -Linux -- это многопользовательская система. На практике это означает, что для -работы в системе необходимо _зарегистрироваться_, т.е. дать понять системе, кто -именно находится за монитором и клавиатурой. Наиболее распространённый способ -регистрации на сегодняшний день -- использование _системных имён_ (login name) -и _паролей_ (password). Это надёжное средство подтверждения того, что с системой -работает тот, кто нужно. Пользователям рекомендуется создавать достаточно -сложные, не слишком короткие пароли и хранить их в секрете. - -При наборе пароля вместо символов на экране высвечиваются звёздочки. Чтобы -избежать опечатки при вводе пароля, его предлагается ввести дважды. Можно -воспользоваться автоматическим созданием пароля, выбрав *Создать -автоматически*. Вам будет предложен случайно сгенерированный и достаточно -надёжный вариант пароля. Можно принять автоматически сгенерированный пароль (не -забудьте при этом запомнить пароль!) или запросить другой вариант пароля при -помощи кнопки *Сгенерировать*. - -image::images/users-root.png[Администратор системы,align="center"] - -В любой системе Linux всегда присутствует один специальный пользователь -- -_администратор системы_, он же _суперпользователь_. Для него зарезервировано стандартное -системное имя -- root. - -Администратор системы отличается от всех прочих пользователей тем, что ему позволено -производить _любые_, в том числе самые разрушительные изменения в системе. -Поэтому выбор пароля администратора системы -- очень важный момент для _безопасности_. -Любой, кто сможет ввести его правильно (узнать или подобрать), получит -неограниченный доступ к системе. Даже ваши собственные неосторожные действия от -имени root могут иметь катастрофические последствия для всей системы. - -[IMPORTANT] - -Стоит запомнить пароль root -- его нужно будет вводить для получения права -изменять настройки системы с помощью стандартных средств настройки ALT Linux. -Более подробную информацию о режиме суперпользователя вы можете прочитать в -разделе <>. \ No newline at end of file diff --git a/install-guide/vm.txt b/install-guide/vm.txt deleted file mode 100644 index b2abfae..0000000 --- a/install-guide/vm.txt +++ /dev/null @@ -1,184 +0,0 @@ -[[vm]] -== Подготовка диска == - -Переход к этому шагу может занять некоторое время. Время ожидания зависит от -производительности компьютера, объёма жёсткого диска, количества разделов на -нём и т.п. - -На этом этапе подготавливается площадка для установки ALT Linux, в первую -очередь -- выделяется свободное место на диске. - -=== Выбор профиля разбиения диска === - -image::images/vm.png[Выбор профиля разбиения диска,align="center"] - -В списке разделов перечислены уже существующие на жёстких дисках разделы (в том -числе здесь могут оказаться съёмные flash-диски, подключённые к компьютеру в -момент установки). Ниже перечислены доступные профили разбиения диска. - -Профиль -- это шаблон распределения места на диске для установки Linux. Можно -выбрать один из профилей: - -- Использовать неразмеченное пространство; -- Удалить все разделы и создать разделы автоматически; -- Подготовить разделы вручную. - -Первые два профиля предполагают автоматическое разбиение диска. - -=== Автоматические профили разбиения диска === - -[WARNING] - -Будьте внимательны при использовании автоматических профилей разбиения дисков. -Соответствующие изменения на диске происходят сразу же по нажатию кнопки -*Далее*. - -Если при применении одного из профилей автоматического разбиения диска -доступного места на диске окажется недостаточно, то на монитор будет выведено -сообщение об ошибке: *Невозможно применить профиль, недостаточно места на -диске*. - -Если данное сообщение появилось после попытки применить профиль *Использовать -неразмеченное пространство*, то вы можете полностью очистить место на диске, -применив профиль *Удалить все разделы и создать разделы автоматически*. - -Если сообщение о недостатке места на диске появляется и при применении профиля -*Удалить все разделы и создать разделы автоматически*, то это связано с -недостаточным для использования автоматических методов разметки объёмом всего -диска. В этом случае вы можете воспользоваться методом ручной разметки: профиль -*Подготовить разделы вручную*. - -[WARNING] - -Будьте осторожны при применении профиля *Удалить все разделы и создать разделы -автоматически*! В этом случае будут удалены _все_ данные со всех дисков -(включая внешние flash-диски) без возможности восстановления. Рекомендуется -использовать эту возможность при полной уверенности в том, что диски не -содержат никаких ценных данных. - -=== Ручной профиль разбиения диска === - -При необходимости освободить часть дискового пространства следует -воспользоваться профилем разбиения вручную. Вы сможете удалить некоторые из -существующих разделов или содержащиеся в них файловые системы. После этого -можно создать необходимые разделы самостоятельно или вернуться к шагу выбора -профиля и применить один из автоматических профилей. Выбор этой возможности -требует знаний об устройстве диска и технологиях его разметки. - -По нажатию *Далее* будет произведена запись новой таблицы разделов на диск и -форматирование разделов. Только что созданные на диске программой установки -разделы пока не содержат данных и поэтому форматируются без предупреждения. -Уже существовавшие, но изменённые разделы, которые будут отформатированы, -помечаются специальным значком в колонке *Файловая система* слева от названия. -Если вы уверены в том, что подготовка диска завершена, подтвердите переход к -следующему шагу нажатием кнопки *Далее*. - -Не следует форматировать разделы с теми данными, которые вы хотите сохранить, -например, со старыми пользовательскими данными (`/home`) или с другими -операционными системами. Отформатировать можно любые разделы, которые вы хотите -«очистить» (т.е. удалить все данные). - -//application path -[WARNING] - -Не уменьшайте NTFS-раздел с установленной Microsoft Windows -Vista/Windows 7 средствами программы установки. В противном случае вы не -сможете загрузить Microsoft Windows Vista/Windows 7 после установки ALT Linux. -Для выделения места под установку ALT Linux воспользуйтесь средствами, -предоставляемыми самой Microsoft Windows Vista/Windows 7: *Управление дисками --> Сжать*. - -=== Дополнительные возможности разбиения диска === - -Ручной профиль разбиения диска позволяет установить ОС на программный -RAID-массив, разместить разделы в томах LVM и использовать шифрование на -разделах. Данные возможности требуют от пользователя понимания принципов -функционирования указанных технологий. - -[float] -==== Создание программного RAID-массива ==== - -NOTE: Обратите внимание, что для создания программного RAID-массива потребуется -минимум два жёстких диска. - -Программа установки поддерживает создание программных RAID-массивов следующих -типов: - -* RAID 1; -* RAID 0; -* RAID 4/5/6; -* RAID 10. - -Процесс подготовки к установке на RAID условно можно разбить на следующие шаги: - -* создание разделов на жёстких дисках; -* создание RAID-массивов на разделах жёсткого диска; -* создание файловых систем на RAID-массиве. - -image::images/raid-create-partition.png[Создание разделов для RAID-массива,align="center"] - -При создании разделов на жёстких дисках для последующего включения их в -RAID-массивы следует указать *Тип раздела* для них равным *Linux RAID*. - -NOTE: При создании разделов следует учесть, что объём результирующего массива -может зависеть от размера, включённых в него разделов жёсткого диска. Например, -при создании RAID 1, результирующий размер массива будет равен размеру -минимального участника. - -После создания разделов на дисках можно переходить к организации самих -RAID-массивов. Для этого в списке следует выбрать пункт *RAID*, после чего -нажать кнопку *Создать RAID*. - -Далее мастер предложит выбрать тип массива и указать его участников. - -image::images/raid-select-members.png[Выбор участников RAID-массива,align="center"] - -После создания RAID-массивов их можно использовать как обычные разделы на -жёстких дисках, то есть, на них можно создавать файловые системы или же, -например, включать их в LVM-тома. - -[float] -==== Создание LVM-томов ==== - -//WARNING: Не работает! - -Процесс подготовки к установке на LVM условно можно разбить на следующие шаги: - -* создание группы томов LVM; -* создание томов LVM; -* создание файловых систем на томах LVM. - -image::images/lvm-create-volume-group.png[Создание группы томов LVM,align="center"] - -NOTE: Для создания группы томов LVM может потребоваться предварительно удалить -таблицу разделов с жёсткого диска. - -Для создания группы томов LVM в списке следует выбрать пункт *LVM*, после чего -нажать кнопку *Создать группу томов*. - -image::images/lvm-create-logical-volume.png[Создание тома,align="center"] - -После создания группы томов LVM её можно использовать как обычный жёсткий диск, -то есть внутри группы томов можно создавать тома (аналог раздела на физическом -жёстком диске) и файловые системы внутри томов. - -[float] -==== Создание шифрованных разделов ==== - -//WARNING: Не дописано! - -//WARNING: Не работает! - -Программа установки позволяет создавать шифрованные разделы. - -image::images/luks-create-partition.png[Создание шифрованного раздела,align="center"] - -Процесс создания шифрованного раздела ничем не отличается от процесса создания -обычного раздела и инициируется нажатием на кнопку *Создать шифруемый раздел*. - -После создания шифрованного раздела мастер, как и при создании обычного -раздела, предложит создать на нём файловую систему и при необходимости -потребует указать точку монтирования. - -WARNING: Вы не сможете установить загрузчик на зашифрованный раздел. - diff --git a/install-guide/x11.txt b/install-guide/x11.txt deleted file mode 100644 index ac9c773..0000000 --- a/install-guide/x11.txt +++ /dev/null @@ -1,60 +0,0 @@ -[[x11]] -== Настройка графической системы == - -image::images/x11.png[Настройка графической системы,align="center"] - -Современное графическое оборудование в большинстве случаев поддаётся -автоматическому определению, хотя некоторое очень новое или редкое оборудование -может отсутствовать в базе данных. Автоматически определённые видеокарта и -монитор будут указаны в разделе «Обнаруженное оборудование». В разделе «Текущие -настройки» будут предложены наиболее подходящие настройки графического режима --- их стоит испробовать в первую очередь. Довольно часто видеокарта может -работать с несколькими разными драйверами. По умолчанию предлагается тот, -который считается наилучшим для данной модели. - -Нужно заметить, что оптимальные настройки -- это не всегда максимальные -значения из возможных (разрешение, глубина цвета и т.п.). При указании -рекомендуемых значений учитываются свойства конкретного оборудования и -драйвера, поэтому выбор более высоких значений не обязательно приведёт к -улучшению качества изображения. Если оборудование автоматически не -определилось, то драйвер для видеокарты и модель монитора придётся выбрать -вручную. - -Проверить работоспособность выбранных параметров можно, нажав на кнопку -«Проверить». В случае успешной активации графического режима с новыми -параметрами, вы увидите сообщение на чёрном экране, где можете либо подтвердить -работоспособность графического режима нажатием кнопки «Да», либо отказаться от -текущих настроек, нажав «Нет». Кнопка «Стоп» служит для приостановки счётчика -времени задержки перед возвращением в диалог настройки графического режима. -Если не нажимать никаких кнопок в окне тестирования видеорежима, к примеру, -если из-за неверных настроек графического режима данное сообщение вообще не -отобразилось на экране, то через несколько секунд будет возвращено исходное -состояние, где вы можете выбрать более подходящие настройки. - -=== Смена драйвера видеокарты === - -При необходимости вы можете сменить драйвер видеокарты. В списке перечислены -названия доступных драйверов с указанием через дефис производителя и, в -некоторых случаях, моделей видеокарт. Вы можете выбрать тот из них, который -считаете наиболее подходящим. Драйвер, рекомендуемый для использования, помечен -«рекомендовано». - -Если в списке нет драйвера для вашей модели видеокарты, можно попробовать один -из двух стандартных драйверов: «vga -- Generic VGA Compatible» или «vesa -- -Generic VESA Compatible». - -=== Выбор модели монитора === - -Модели мониторов можно выбирать по производителям: кнопка «Другой -производитель». Ускорить передвижение по спискам можно, набирая первые буквы -искомого слова. После выбора производителя в списке становятся доступны модели -мониторов данного производителя. Не всегда обязательно подбирать монитор с -точностью до номера модели: некоторые пункты в списке не содержат конкретного -номера модели, а указывают на целый ряд устройств, например «Dell 1024x768 -Laptop Display Panel». - -Если в списке не нашлось производителя или близкой модели, то можно попробовать -один из стандартных типов монитора. Для этого в списке производителей нужно -выбрать «Generic CRT Display» (для электронно-лучевых мониторов) либо «Generic -LCD Display» (для жидкокристаллических мониторов), а далее выбрать модель, -руководствуясь желаемым разрешением. diff --git a/old-docs/cmc_communication_stand.txt b/old-docs/cmc_communication_stand.txt deleted file mode 100644 index 1ad373c..0000000 --- a/old-docs/cmc_communication_stand.txt +++ /dev/null @@ -1,831 +0,0 @@ -//// -Пакет: docs-cmc_communication_stand -RPM файл: docs-cmc_communication_stand-0.1-alt2.noarch.rpm -Аннотация: Отчёт о проделанной на ф-те ВМиК МГУ работе: sendmail, ClamAV, - SpamAssassin, SquirrelMail, Jabberd2, Samba и OpenLDAP на одной - стендовой машине либо на нескольких; рекомендации по выбору - клиентского ПО и наращиванию дополнительных возможностей. - Выполнено на FreeBSD5. -Автор: Георгий Курячий -Лицензия: FDL -URL: http://heap.altlinux.org/modules/Compact30_CHIP.george.prev/index.html -//// - -== Разработка публичного коммуникационного центра с единой системой авторизации доступа. == - -[float] -=== Введение === - -Рабочей группе была поставлена задача по созданию коммуникационного центра, с -единой системой авторизации доступа к почтовой и файловой службе, а также к -службе обмена мгновенными сообщениями. При выборе платформы и программных -продуктов, решающих поставленную задачу, учитывались следующие требования: - -Реноме:: - -В качестве платформы должна выступать надёжная ОС серверного класса, -имеющая значительную историю эксплуатации систем подобного профиля и богатый -выбор соответствующего ПО - -Стандарт:: - -Единая служба авторизации должна поддерживаться по возможности большим -числом программных продуктов, для обеспечения свободы выбора - -Обслуживание:: - -Ресурсы, затрачиваемые на администрирование служб комплекса, не должны расти -более, чем линейно, с ростом количества выполняемых им функций (иными словами, -добавление очередной службы должно сводиться только к настройке именно этой -службы) - -Качество ПО:: - -Программные продукты, обеспечивающие ту или иную функциональность комплекса, -должны обладать следующими свойствами: - -* Надёжность и защищённость -* Работа под нагрузкой в масштабе факультета (с запасом прочности) -* Наличие всех востребованных возможностей -* Простота настройки/сопровождения - -Свобода выбора:: - -По каждой из функциональностей, предлагаемых комплексом, должен существовать -выбор из нескольких программных продуктов, для обеспечения возможности перехода -на другое ПО, если использованное в стендовом проекте со временем перестанет -устраивать - -Адаптация:: - -Должна существовать действительная возможность адаптировать используемое ПО к -нуждам факультета и особенностям эксплуатации комплекса - -Масштабируемость:: - -Должна быть возможность организации каждой службы комплекса, включая единую -службу авторизации, на отдельном компьютере. При этом должна быть возможность -как безопасного обмена авторизационными данными, так и обмена с использованием -незащищённой версии протокола, имеющей низкую вычислительную мощность (при -размещении серверов внутри ДМЗ) - -Свобода использования:: - -Все задействованные в комплексе пользовательские службы должны быть доступны с -помощью стандартного клиентского ПО, причём обязательно должен существовать -полнофункциональный (желательно — многоплатформенный) свободно распространяемый -набор клиентского ПО - -=== Пользовательские службы === - -Комплекс предоставляет три вида доступа к пользовательским ресурсам: -обслуживание электронной посты, обмен мгновенными сообщениями и доступ к -персональному файловому пространству. - -[float] -==== Электронная почта ==== - -[float] -===== Приём и пересылка почты ===== - -Комплекс функционирует как сервер приёма и пересылки электронной почты по -протоколу SMTP. Принимается только почта, направленная зарегистрированным -пользователям комплекса. - -В качестве примера почтовый сервер настроен таким образом, чтобы он принимал -почту, адресованную любому пользователю обслуживаемого домена (в том числе и -пользователю другого почтового сервера в домене) с целью её дальнейшей -пересылки. Кроме того, определён диапазон IP-адресов, которым разрешено -пересылать через сервер почту любому внешнему абоненту. Эти и множество других -свойств сервера гибко настраиваемы. См. также раздел «Внедрённые службы». - -Право пересылки почты можно получить также по результатам авторизации (т. н. -SMTP auth, используется защищённый канал передачи личных данных). Таким -образом, почтовый сервер можно использовать, находясь в отъезде или с домашнего -компьютера, с использованием любого подключения к сети Интернет. - -[float] -===== Сервер доступа к почтовым ящикам ===== - -Доступ к почтовым ящикам пользователей производится по протоколам IMAP4/SSL и -POP3/SSL, использующим защищённый канал передачи личных данных, а также по -протоколам IMAP4 и POP3 с обязательным использованием расширения STARTTLS для -защиты передаваемых личных данных. Поддерживаются основные расширения IMAP4, не -требующие значительного увеличения вычислительной мощности (в частности, -несколько вариантов сортировки списка сообщений на сервере, режим ожидания и т. -п.). См. также раздел «Рекомендации по клиентскому ПО». - -[float] -===== Доступ к почтовым ящикам через WWW ===== - -Для пользователей, которые по какой-то причине не имеют возможности -воспользоваться клиентской почтовой программой, организован доступ к почтовым -ящикам через WWW-интерфейс. Используется защищённый канал передачи личных -данных пользователя. Для связи с почтовым сервером может применяться как -защищённый протокол IMAP4/SSL, так и обладающий низкой вычислительной -стоимостью IMAP4 (при размещении WWW-интерфейса и службы доступа к почтовым -ящиком на одном компьютере или внутри ДМЗ). Поддерживаются несколько видов -фильтрации сообщений (в том числе по результатам анализа спам-категоризатора). -Возможно подключение всевозможных расширений интерфейса, включая изменение -пароля, настройку внешнего вида, автоматического перемещения сообщений, доступ -к внешним почтовым ящикам и т. д. - -Аналогичный WWW-интерфейс (предыдущей версии) внедрён и активно используется на -почтовом сервере ВМиК МГУ, в состав стенда он был включён из соображений -проверки совместимости с новыми версиями почтовой службы и службы доступа к -почтовым ящикам. - -[float] -==== Сервер обмена мгновенными сообщениями ==== - -Электронная почта не подходит для обмена сообщениями «в реальном времени», так -как почтовый протокол допускает значительную задержку при пересылке сообщений -(вплоть до нескольких дней). Вместе с тем множество задач, в особенности — -связанных с деловой, административной или производственной перепиской, требуют -быстрого (в пределах скорости передачи данных), «мгновенного» отклика. Раньше -такие задачи решались по телефону, в последнее время стали популярны службы -мгновенного обмена сообщениями (ICQ, AIM, YM, IM, Jabber и т. п.). При этом -обычно упускается из внимания, что все перечисленные службы (кроме Jabber) -имеют не просто закрытую, а нетиражируемую реализацию серверной части. Это -означает, что при использовании для деловой переписки, допустим, ICQ, вся -информация становится достоянием организаций, имеющих доступ к серверу. - -[float] -===== Служба Jabber ===== - -Jabber — открытый стандарт обмена сообщениями, поддерживающий мгновенный, -отложенный; групповой, приватный и другие виды обмена сообщениями, передачу -файлов и т. п. Поскольку серверная часть реализована в составе комплекса, а для -доступа к серверу может использоваться защищённый протокол, переписка остаётся -личной тайной абонентов (при условии административного контроля за -обслуживающим персоналом сервера). Поддерживается также и обмен сообщениями с -абонентами других серверов Jabber. - -[float] -===== Терминалы к другим службам обмена мгновенными сообщениями ===== - -Для доступа к другим службам мгновенных сообщений, например, ICQ, MSN, AIM или -YM, абоненту Jabber-сервера незачем устанавливать дополнительное ПО, так как -для этих служб разработано терминальное серверное ПО, обеспечивающее -преобразование соответствующего протокола в Jabber. Таким образом, используя -только Jabber-клиент, пользователь может иметь доступ к этим и некоторым другим -службам. - -[float] -==== Файловый сервер ==== - -Подключение файлового сервера к единой системе авторизации вместе с почтовой -службой и службой передачи коротких сообщений имеет, на наш взгляд, некоторые -слабые с точки зрения безопасности стороны. Следует понимать, что тем самым -уровень приватности данных в файловом архиве уравнивается с уровнем приватности -почтовых учётных записей. Это означает, что утечка почтового пароля (например, -при неосторожном использовании почтового клиента в незащищённом режиме или -разглашении сохранённого пароля) приведёт к открытию посторонним доступа к -файлам в личном архиве пользователя. Верно также и обратное: при использовании -«слабого» формата .pwl для хранения пароля файлового сервера может привести к -его раскрытию, и под угрозой окажется также почтовый архив. - -При соблюдении правила равной приватности файловым архивом пользоваться можно. -Доступ к архиву осуществляется на основании персональной авторизации по -протоколу SMB. Доступ по другим популярным протоколам «удалённых дисков», -например, NFS, не реализован, так как для него используется другая, основанная -на верификации IP-адреса, схема авторизации. - -=== Системные службы и техническая информация === - -Помимо служб, доступных пользователю непосредственно, в комплексе доступны -системные средства, предоставляемые платформой, а также предусмотрены две -дополнительные системные службы для единой авторизации и административного -доступа к учётным записям. - -[float] -==== Единая служба авторизации ==== - -Одним из самых распространённых способов разделения учётных записей между -несколькими службами-абонентами является хранение этих учётных записей и -сопутствующей им информации в общей службе каталогов LDAP. Большинство -серверного ПО либо изначально имеет возможность обращаться к LDAP за -авторизационной информацией, либо пользуется системной службой авторизации, -которая, в свою очередь, может быть настроена на использование LDAP. Для -доступа к службе авторизации внутри ДМЗ используется незащищённый протокол -LDAP, для доступа внешних абонентов — LDAP/SSL. - -[float] -==== Административный WWW-интерфейс ==== - -Для проведения администраторских действий над учётными записями предусмотрен -WWW-интерфейс с возможностью единичного и пакетного добавления и удаления -пользователей, изменения пользовательских настроек, создания шаблонов профиля и -некоторыми другими наиболее востребованными операциями. Используется только -защищённый протокол передачи данных HTTPS. - -[float] -==== Задействованные внутренние системные службы ==== - -Дополнительно в стендовом проекте задействованы системные службы, -предоставляемые ОС FreeBSD: защищённый терминальный доступ к серверам (для -настройки и адаптации служб, а также проведения профилактики) с помощью Secure -Shell, централизованное ведение системных журналов (при необходимости системные -журналы всех служб можно сосредоточить на одном компьютере), регулярная ротация -журналов, использование пользовательской и групповой квоты на объём почтового и -файлового пространства, запуск действий по расписанию, фильтрация трафика с -помощью межсетевого экрана и т. п. - -=== Рекомендации по клиентскому ПО === - -Для того, чтобы воспользоваться службами комплекса, не требуется применения -какого-либо специализированного или уникального клиентского ПО. Однако можно -сформулировать некоторые рекомендации по выбору ПО, связанные с требованиями -безопасности, удобством использования или спектром возможностей. Кроме того, в -наши рекомендации мы старались включить программные продукты, доступные на -большинстве платформ и распространяемые только под свободной лицензией (что -означает, в числе прочего, право свободного их использования в любых условиях). - -[float] -==== Почта ==== - -Почтовый клиент Thunderbird доступен на всех основных пользовательских -платформах, включая Linux, FreeBSD и большинство других POSIX-совместимых ОС, а -также MacOS X и Windows. Thunderbird — продолжение почтовой составляющей -проекта Seamonkey/Mozilla/Netscape, так что смело можно рекомендовать последние -версии любого их них. - -Для доступа к почтовому серверу достаточно поддержки протокола IMAP/SSL или -POP3/SSL, а для анализа результатов спам-категоризатора — возможности -фильтрации по произвольному SMTP-заголовку письма. Такими возможностями, -например, обладает почтовый клиент Sylpheed Claws, доступный под многие -POSIX-платформы (включая основные ветки Linux, и BSD) и Windows. - -Thunderbird:: - http://www.mozilla.org/products/thunderbird - -Sylpheed Claws:: - http://sylpheed-claws.sourceforge.net/ - -[float] -==== Служба мгновенных сообщений ==== - -Ближе всего отвечающим поставленным задачам нам показался многоплатформенный -Jabber-клиент PSI. В нём наиболее полно реализованы возможности протокола -Jabber (стоит напомнить, что возможности других протоколов подключаются в виде -терминалов Jabber-сервера). Клиент доступен для всех основных пользовательских -платформ. - -Альтернативой PSI для UNIX-подобных платформ является клиент SIM, а для Windows -— Miranda. Эти клиенты имеют встроенную поддержку также и других служб обмена -мгновенными сообщениями (в случае когда возможности серверных терминалов -недостаточны). - -PSI:: - http://psi.affinix.com/ - -SIM:: - http://sim-icq.sourceforge.net/ru/jabber.shtml - -Miranda:: - http://miranda-im.org/ - -[float] -==== Файловый сервер ==== - -Поддержка протокола SMB встроена в ядро всех операционных систем семейства -Windows, а для UNIX-подобных ОС существует реализация как на уровне модулей -ядра (модули smbfs или cifs, позволяющие подключать удалённые носители данных с -помощью команды mount), так и прикладные программы (например, smbclient, -входящий в серверный пакет Samba). - -Текущая версия серверного ПО не поддерживает технологии Active Directory (по -причине закрытости отдельных её составляющих), поэтому для доступа к файловому -пространству необходимо отключать поддержку AD в настройках соединения с -сервером. - -// На дворе 2014 год, и самба уже поддерживает Active Directory - -Samba:: - http://www.samba.org/ - -[float] -==== WWW-интерфейс ==== - -Для доступа к WWW-интерфейсу почтового сервера и администратора рекомендуется -использовать любой стандартный навигатор с поддержкой Java Script (в случае -интерфейса к почтовой службе это требование не является обязательным). Мы -рекомендуем Firefox, завоевавший в 2004 году множество наград (в том числе -«Лучший WWW-навигатор» и «WWW-навигатор года») авторитетных сетевых изданий. -Кроме всего прочего, этот навигатор поддерживает передовую технологию написания -расширений, из которых рекомендуются: Adblock (для фильтрации рекламы), -Tabbrowser Preferences (для настройки многооконности), DictionarySearch (для -поиска в сетевых словарях, в т. ч. толковых), Mouse Gestures или All-in-One -Gestures (для управления навигацией движениями мыши) и Image Zoom (для -изменения размера картинок). - -Firefox:: - http://www.mozilla.org/products/firefox/ - -Adblock:: - http://adblock.mozdev.org/ - -Tabbrowser Preferences:: - http://www.pryan.org/mozilla/site/TheOneKEA/tabprefs/ или http://216.55.161.203/theonekea/tabprefs/ - -DictionarySearch:: - http://dictionarysearch.mozdev.org/ - -Mouse Gestures и All-in-One Gestures:: - http://optimoz.mozdev.org/gestures/ и http://perso.wanadoo.fr/marc.boullet/ext/extensions-en.html - -Image Zoom:: - http://imagezoom.yellowgorilla.net/ - -=== Обоснование выбора, доработка и дополнительная настройка служб === - -В этой части отчёта описываются технические детали реализации стендового -проекта, включающие в себя обоснование выбора платформы, используемого -серверного ПО и особенности их настройки/доработки в соответствии с -поставленной задачей. - -[float] -==== FreeBSD ==== - -В качестве платформы стенда была выбрана ОС FreeBSD ветки STABLE (FreeBSD5). -При этом принимались во внимание следующие факты: - -* FreeBSD — наиболее популярная серверная платформа в российском интернете - -* Серверный парк факультета ВМиК в течение нескольких успешно эксплуатирует ОС - FreeBSD4 на похожих задачах (в частности, почтовый сервис и WWW) - -* Ветка FreeBSD5 включает в себя передовые наработки в области ОС и насчитывает - более двух лет эксплуатации, а сам проект FreeBSD (зарегистрирован как - отдельный проект в 1993 году) восходит к проекту 4BSD, являясь, таким - образом, одним из долгожителей среди ОС. С выпуска FreeBSD 5.3 (ноябрь 2004 - года) FreeBSD5 является стабильной веткой FreeBSD, а разработка по FreeBSD4 - сворачивается - -Альтернативные платформы (Debian GNU Linux, ALT Linux, Solaris 10) были -отвергнуты, главным образом, по двум причинам: во-первых, проект планируется -внедрять на факультете ВМиК, где уже функционирует серверный парк на базе -FreeBSD, поэтому целесообразно не умножать задачи администрирования; во-вторых, -на факультете существует достаточно продуктивное FreeBSD-сообщество (главным -образом, в лаборатории ПО, традиционно занимающейся серверным парком). - -В дополнение к единой службе идентификации LDAP (см. ниже) в системе были -установлены пакеты nss_ldap, для включения каталога LDAP в пространство -идентификационных имён сервера, и pam_ldap — для обеспечения любым службам -единообразного доступа к LDAP посредством системной службы идентификации PAM -(были сделаны также соответствующие изменения в PAM-профилях этих служб). Кроме -того, во всех случаях, когда доступ к службам по незащищённым протоколам стоило -запретить из соображений безопасности, а настройки этих служб этого не -позволяли, использовался встроенный межсетевой экран PF. - - -[float] -==== Sendmail ==== - -В качестве почтового сервера был выбран пакет Sendmail. Альтернативные варианты -почтового сервера того же класса — Exim, QMail и PostFix — обладают во многом -схожими (хота и несколько меньшими) возможностями, поэтому выбор Sendmail -обосновывался тем, что он полностью отвечает поставленным задачам, и при этом в -течение нескольких лет успешно эксплуатируется на факультетском почтовом -сервере. Кроме того, часть задач, связанных с обработкой полученных почтовых -сообщений (антиспам и антивирус) уже реализована на основном почтовом сервере -факультета. Чтобы не делать одну и ту же работу дважды, и при этом облегчить -процесс внедрения, было решено дорабатывать имеющийся почтовый комплекс, а в -стендовом проекте реализовать только нововведения (в частности, SMTP-auth и -STARTTLS). См. также раздел «Внедрённые службы». - -Пакет Sendmail был собран с поддержкой TLS (для STARTTLS) и SASL2 (для -SMTP-auth); для SMTP-auth потребовался также пакет cyrus-sasl-saslauthd. Демон -saslauthd может пользоваться для идентификации системной службой PAM, которая, -в свою очередь, обращается к единой службе авторизации (см. подраздел -«OpenLDAP»). Настройки sendmail были скопированы с факультетского почтового -сервера (с изменением имени обслуживаемого домена). - -[float] -==== Dovecot ==== - -Вместо используемой в настоящее время службы доступа к почтовым ящикам IMAP-UW -было решено задействовать пакет Dovecot. Два более популярных и обладающих -большими возможностями программных продукта — Courier IMAP и Cirrus IMAP — были -отвергнуты. Свою роль сыграли следующие доводы: - -* Функциональность IMAP-UW, в отличие от Dovecot, недостаточна даже для имеющегося WWW-интерфейса - -* Большинство возможностей Courier и Cirrus, отсутствующих в Dovecot, требуют - повышения вычислительной мощности (например, поиск подстроки среди сообщений - на сервере) - -* Courier поддерживает только собственный формат почтовых ящиков, что - затрудняет миграцию - -* Cirrus имеет неоправданно сложную систему настройки, хотя и поддерживает - наиболее полный спектр расширений протокола IMAP4 - -* Среди авторов всех перечисленных продуктов только авторы Dovecot заявляют, - что надёжность и эффективность являются для них приоритетной задачей - -Для настройки Dovecot в соответствии с поставленной задачей потребовалось -только разрешить доступ к серверу по незащищённому протоколу (при этом, -согласно RFC, доступ со всех адресов, кроме самого сервера, допускает только -авторизацию с применением TLS, то есть в защищённой форме) и указать в качестве -идентификационной службы PAM. Кроме того, был использован тот же -SSL-сертификат, что и на сервере (для удобства проверки подлинности с помощью -WWW-навигатора). Следует отметить, что в случае различия доменных имён -необходимо использовать общий для ДМЗ сертификат, выданный группе доменных имён -вида (*.обслуживаемый.домен). - -[float] -==== Apache ==== - -WWW-сервер Apache ветки 1.3 был выбран за универсальность функций: при всей -эффективности и простоте таких пакетов, как Wywern или TinyHTTPD, спектр -возможностей «лёгких» ограничивает свободу моделирования и диапазон пригодного -для совместной эксплуатации дополнительного ПО. Возможности ещё более мощного -HTTP-сервера Apache ветки 2 задействовать не предполагалось. Для обеспечения -полноценной и удобной работы сервера потребовались следующие возможности -Apache: - -* Организация доступа по защищённому протоколу (для введения авторизационных - данных WWW-интерфейсов администратора и службы доступа к почтовым ящикам) - -* Организация т. н. «виртуальных серверов» (для различных WWW-интерфейсов). - -* Использование встроенного модуля PHP - -* Использование CGI и преобразования части URL (alias, rewrite и т. п.) - -Сервер, во избежание утечки паролей, должен быть настроен на использование -только защищённого протокола для обоих WWW-интерфейсов (с помощью виртуальных -серверов или выделенных URL). - -[float] -==== Squirrelmail ==== - -WWW-интерфейс к почтовой службе факультета обеспечивается пакетом Squirrelmail. -Аналогичная реализация WWW-интерфейса в стендовом проекте представляет собой -развитие уже имеющейся технологии: использовалась более новая версия -Squirrelmail с «заплатками», разработанными студентом 5-го курса Карлосом -Оливьера Зара Мамани (устраняющими некоторую путаницу в кодировках). -Воссоздание Squirrelmail в стендовом проекте имело две цели: во-первых, -оттестировать более новую версию ПО (имеется негативный опыт «молчаливого» -обновления на факультетском сервере); во-вторых, проверить совместимость -Squirrelmail со службой доступа к почтовым ящикам Dovecot, отличающейся от -используемой в настоящее время на факультете. - -В дополнение к стандартному пакету squirrelmail и входящим в него расширениям, -было использовано дополнительное расширение change_ldappass, позволяющее -пользователю сменить пароль после идентификации (интерфейс Squirrelmail -доступен в стендовом проекте только по защищённому протоколу). - -[float] -==== Jabberd2 ==== - -В качестве сервера Jabber был выбран пакет Jabberd2. По сравнению с другим ПО -(например, предыдущим вариантом дизайна этого же сервера, Jabberd, или продукта -EJabberd, имеющего принципиально иную архитектуру) этот сервер отличается -простотой настройки и удобным интерфейсом для написания терминалов в другие -службы передачи мгновенных сообщений (что позволяло надеяться на быстрый рост -функциональности). К сожалению, выбор Jabberd2 оказался (на время создания -стенда) не самым удачным: интернет-сервер, предоставляющий сообществу Jabberd2 -ресурсы, был взломан около года назад, причём все файловые архивы были -испорчены. Это оказалось очень серьёзным ударом по сообществу (стопроцентно -сетевому), и работа над Jabberd2 и его терминалами приостановилась в стадии -полностью работоспособной, но не обладающей большим списком функциональностей. - -При внедрении планируется ещё раз внимательнее изучить состояние проекта -Jabberd2 (к моменту написания отчёта сообщество уже освоилось на новой -площадке, восстановило там большинство ресурсов и возобновило разработку по -многим направлениям). Вполне возможен переход на EJabberd, достоинствами -которого являются: большой спектр возможностей, высокоуровневый язык разработки -ERLang (что позволяет оперативно вносить изменения в существующий код), и также -то, что сообщество EJabberd — в основном, российское (автор имеет прямое -отношение к крупнейшему открытому Jabber-серверу jabber.ru). - -В дополнение к пакету jabberd-2 были установлены терминалы к службам AIM, MSN и -два терминала к ICQ, на момент разработки стенда обладающие различными -функциональностями (в одном варианте реализован экспорт ICQ-контактов, в другом -— поиск ICQ-клиентов; это особенность текущих версий терминалов, планы -разработки каждого из них предусматривают существенное расширение -функциональностей; кроме того, этими недостатками не обладает сервер EJabberd). -Сервер настраивался согласно инструкции. - -[float] -==== Samba ==== - -Относительно выбора протокола, предоставляющего доступ к сетевым дискам, было -сказано выше: SMB — один из немногих широко распространённых протоколов, -использующий идентификацию по учётным записям, а не по IP-адресу абонента, что -делает включение этого рода служб формально пригодным для реализации в рамках -стендового проекта. Из ПО, распространяющегося под свободной лицензией, -наиболее популярен сервер Samba. Альтернативой Samba является только -использование в качестве серверной платформы Windows-системы, однако это -создаёт множество неприятностей, в том числе неисправимых: принудительное -разделение аппаратной части для различных ОС, удвоение процесса -администрирования, проблемы утечки информации по ненадёжным каналам, -вычислительная неэффективность, и — главное — невозможность полноценной -интеграции со стандартным сервером идентификации LDAP (не Active Directory). - -Есть очевидная возможность применения того же сервиса для организации общей -службы паролей SMB (т. н. «Domain Contriller»), однако в масштабе факультета -пользоваться этой службой можно только в соответствии с общим низким уровнем -секретности (почтовые учётные записи и или учётные записи службы мгновенных -сообщений являются таковыми по определению). Выше говорилось о том, что даже -приравнивание разделяемых сетевых дисков к этому уровню может спровоцировать -нарушение политики безопасности, когда на удалённом диске сохраняются учётные -записи более высокого уровня. - -Даже настройка Samba для использования LDAP в качестве хранилища учётных -записей имеет несколько сложностей: во-первых, в SMB используются алгоритмы -идентификации и поля учётных записей, несовместимые с PAM, поэтому необходима -поддержка обращения к LDAP напрямую. Несовместимость алгоритмов состоит в том, -что для обеспечения безопасности обмена авторизационной информацией в протоколе -SMB предусмотрена передача от клиента серверу не пароля, а значения хеш-функции -от этого пароля. Это требует, в свою очередь, от сервера хранить не -фиксированное значение хеш-функции, а сам пароль в восстановимом виде. -Поскольку в большинстве случаев хранение восстановимых паролей где бы то ни -было считается нарушением политики безопасности, этот алгоритм не используется, -а зачастую и вообще не предусмотрен стандартами. - -Во-вторых, для хранения учётных записей SMB в LDAP используется специальная -схема (поставляется вместе с пакетом samba, но требует ручного включения в -настройки slapd согласно инструкции). В-третьих, необходимо зарегистрировать -саму службу Samba в качестве отдельного абонента единой службы авторизации, -обладающего повышенными правами (добавление, удаление и редактирование учётных -записей в рамках собственной схемы). Именно введение SMB потребовало -непременной организации административного WWW-интерфейса, так как обновление и -синхронизация различных схем LDAP требует дополнительного, на включённого в -состав базовой системы ПО (работа в рамках одной схемы позволяла бы -использовать системные утилиты pw, adduser и т. п.). - -[float] -==== OpenLDAP ==== - -Существует несколько систем, предоставляющих доступ к единой службе -авторизации. Наиболее старая и органично вписывающаяся в использованную -серверную ОС — Network Information System, NIS. Эта служба успешно -эксплуатируется в классах практикума и общего доступа, однако для применения в -масштабах факультета непригодна из-за некоторых проблем с безопасностью и -несовместимостью со специфическими схемами SMB. Более безопасная замена NIS — -NIS+ не имеет свободной реализации и оттого с клиентской стороны поддерживается -также хуже. Действительной альтернативой LDAP было бы использование NIS внутри -ДМЗ или совместно с IPSec, стандартно входящим в базовую ОС: в этом случае -стандартная (POSIX-подобная) часть процедур авторизации была бы сведена к -системному минимуму, однако возникли бы проблемы синхронизации нестандартных -учётных записей (например, SMB), решать которые пришлось бы вручную. - -Выбор служб, предоставляющих LDAP-сервис, не так уж велик. Мы остановились на -OpenLDAP, как на самом популярном на сегодня свободном продукте, обладающим -широкими возможностями. Альтернативой может быть разработка самой компании -Samba, призванная в будущем стать частью свободной версии службы AD, однако на -сегодня этот проект находится в стадии усиленного развития т. н. «нестабильной» -ветки. Другие реализации LDAP, например, пакет Tiny LDAP, имеют, на наш взгляд, -неубедительную эксплуатационную историю. - -Настройка службы LDAP сводится к аккуратной реализации (или включению готовых) -используемых схем хранения учётных записей и к составлению списков управления -доступом (ACL) для абонентов-администраторов. Кроме того, предусмотрен доступ -LDAP-серверу по защищённому протоколу. - -Как уже было замечено выше, для обеспечения доступа к LDAP со стороны служб, -использующих стандарт PAM, были установлены и настроены два дополнительных -системных модуля, nss_ldap и pam_ldap. - -[float] -==== LAM ==== - -Для организации удобного управления учётными записями в LDAP, поддерживающими -несколько схем представления, недостаточно имеющихся системных средств. Главным -образом это связано с необходимостью синхронизации нескольких схем учётных -записей. Кроме того, хотелось иметь механизм, позволяющий передать повседневные -операции (например, добавление и удаление пользователей) -низкоквалифицированному персоналу (т. н. «оператору»). Операторский интерфейс -не должен быть излишне сложным, но обязан содержать шаблоны основных -операторских действий (добавление и удаление учётных записей, в том числе -пакетное, и редактирование их). - -Из множества интерфейсов нами был выбран пакет LDAP Account Manager (LAM). -Некоторые альтернативные продукты, такие как PHPLdapAdmin или WebMin, оказались -чересчур усложнёнными, а другие (такие, как luma или gq) требуют установки на -стороне клиента, и, следовательно, ограничивают выбор ПО на рабочем месте -администратора (впрочем, luma — платформо-независимый клиент, хотя и не до -конца доработанный). - -«Очком» в пользу LAM стало следующее его удобство: при создании учётной записи -пользователя есть возможность сгенерировать печатный документ (в формате PDF), -содержащий все данные этой учётной записи, включая учётное имя, пароль и прочую -информацию, необходимую пользователю для настройки клиентского ПО. - -Основной трудностью при использовании единой службы авторизации является то, -что принадлежащие пользователю ресурсы некоторых служб не исчерпываются только -учётными записями. Эти ресурсы не появляются сами собой при добавлении учётной -записи в LDAP и не исчезают при её удалении. Например, при заведении почтового -пользователя необходимо создать его почтовый ящик и структуру фильтров -(например, спам-классификатор по умолчанию), а при заведении пользователя -файловой службы — домашний каталог. Задача усложняется ещё и тем, что создание -таких ресурсов должно происходить, в общем случае, на удалённом сервере -(который обеспечивает именно эту службу), а не локально. - -У этой задачи есть два решения. На каждом из серверов можно запускать по -расписанию (например, раз в пять минут) специальный сценарий, который будет -проверять, не произошли ли изменения в каталоге LDAP, и создавать при -необходимости соответствующие ресурсы. Дополнительное достоинство этого способа -— каждый сервер может при этом хранить закешированную достаточно актуальную -версию каталога (максимум пятиминутной давности), что позволит избежать -вычислительных и сетевых перегрузок во время пика запросов (например, при -утреннем включении всех клиентских рабочих мест). Главный недостаток такого -способа — задержка между изменением учётной записи и созданием ресурса, -сокращение которой оплачивается серьёзным повышением паразитной вычислительной -нагрузки. - -Поэтому в стендовой реализации был использован второй способ, предусмотренный -WWW-интерфейсом администратора LAM. Суть его в том, что непосредственно после -добавления учётной записи на LDAP-сервере запускается специальный сценарий, в -задачи которого входит уведомление соответствующих серверов о том, какие -ресурсы необходимо добавить. На сервере предусматривается простейшая служба, -доступ к которой ограничен исключительно IP-адресом LDAP-сервера. Эта служба не -выполняет деструктивных действий (например, не удаляет каталоги и почтовые -ящики) и не требует передачи пароля, кроме того, работает исключительно в -рамках ДМЗ. Так дополнительная служба на SMB-сервере принимает единственный -параметр — имя пользователя — и производит следующие действия: - -* Если такого пользователя нет в LDAP, не происходит ничего, кроме записи в - системный журнал о странном происшествии - -* Если пользователь есть в LDAP, но не имеет домашнего каталога, этот каталог - заводится - -* Если пользователь есть в LDAP, но не имеет прав доступа к собственному - домашнему каталогу, значит налицо конфликт нового и старого учётных имён; - имеющийся каталог перемещается в архив и заводится новый - -* Если пользователь есть в LDAP и имеет права доступа к домашнему каталогу, не - происходит ничего, кроме записи в системный журнал о странном происшествии - -Аналогичным способом организована дополнительная служба на почтовом сервере. - -При внедрении возможно решение, сочетающее в себе достоинства обоих описанных -выше способов: использовать первый алгоритм, но вместо запуска обновляющего -сценария по расписанию, использовать универсальную для всех серверов и ещё -более простую службу-«строб», единственная задача которой — дать команду -LDAP-клиенту обновить кеш и проверить наличие дополнительных ресурсов. Это -решение требует дальнейшего исследования. - -=== Внедрённые службы === - -В этом разделе описаны службы и технологии, не вошедшие в состав стендового -проекта, так как целесообразнее было внедрять их непосредственно на серверах -факультета. Как правило, речь идёт о доработке имеющихся служб или о службах, -уже функционирующих на факультете, включение которых в комплекс остаётся только -технической задачей на этапе внедрения. - -[float] -==== Почтовый антивирус и антиспам ==== - -Большинство нововведений и усовершенствований почтовой службы, за исключением -упомянутых ранее, проводились на факультетском почтовом сервере imap.cs.msu.su. - -[float] -==== Антивирус ClamAV ==== - -На факультетском почтовом сервере внедрена и работает система антивирусной -защиты почтовой пересылки. Используется свободно распространяемый антивирус -ClamAV. До 2000 года использовалась лицензированная серверная версия KAV, а до -2003 года — лицензированная серверная версия DrWEB. Обновление программной -составляющей KAV несколько раз приводило к останову службы (нарекания есть до -сих пор), а компания-производитель DrWEB находится в стадии организационной -перестройки (уже почти два года!) и, как следствие, имеет на сегодня -неопределённую политику в области лицензий и поддержки. - -База данных ClamAV обновляется очень оперативно (за счёт распределённости -сообщества), в прошлом году этот продукт заслужил отметку «Editors Choice» в -Linux Journal. Опыт эксплуатации ClamAV на факультете выявил единственную -неисправность, связанную с отсылкой информационного сообщения непосредственно в -момент приёма зараженного письма (в настоящий момент отключено). ClamAV не -умеет «лечить заражённые файлы», однако статистика показывает, что доля -вредоносных программ, сохраняющих исходный код заражённого фала, неуклонно -понижается (на сегодня отношение числа сообщений с «настоящими вирусами» к -общему количеству отфильтрованной почты, включая «троянское ПО», «spyware» и -пр., составляет доли процента). Существует реализация ClamAV также для Windows, -MacOS X и BeOS. - -Антивирус настроен в качестве почтового фильтра Sendmail (т. н. «milter») таким -образом, что при обнаружении вируса почтовое соединение разрывается и -сервер-отправитель получает уведомление о нарушении политики безопасности. - -[float] -==== Фильтрация непрошеной почты на основе чёрных списков ==== - -Большая часть непрошеной почты (спама) отсекается почтовым сервером ещё во -время SMTP-соединения. Делается это на основании публичных сетевых «чёрных -списков», содержащих IP-адреса компьютеров, хозяева которых уличены в рассылке -спама. В рамках проекта было проведено исследование современных чёрных списков -и реорганизация наборов чёрных списков на сервере. Основным направлением -исследования была попытка организовать эффективное распознавание т. н. -спам-агентов — пользовательских машин, заражённых троянским ПО и рассылающих -спам по команде из сети, а также составить каталог сетей с динамически -выделяемыми адресами (абонент такой сети имеет право пересылать почту только -через почтовый сервер своего провайдера). Более подробно о фильтрации см. -http://imap.cs.msu.su/spam/spam.html. - -[float] -==== Категоризация спама с помощью SpamAssassin ==== - -На сегодня невозможно достигнуть стопроцентной эффективности фильтрации спама -на основании одних только чёрных списков. Связано это с тем, что заражение -клиентских машин троянским ПО поставлено на поток (по причине слабой -защищённости ОС на этих машинах), и обновление чёрных списков происходит с -некоторым запаздыванием. - -Поэтому на факультете применяется классификатор полученных писем, позволяющий -сделать предположение о непрошености письма на основании анализа его -содержимого. Используется пакет SpamAssasin с набором дополнительных правил -SARE. Для удовлетворительной работы SpamAssassin необходимо было отключить все -правила, согласно которым письма в кириллической кодировке более подозрительны, -чем прочие (набор правил и SpamAssassin, и SARE — международный, так что -получение письма на русском языке, например, в Голландии сразу наводило бы -мысль о спаме). К сожалению, на факультете вообще нельзя использовать кодировку -как значимый фактор непрошености, так как почтовый сервер используется -иностранными студентами. Более подробно о работе SpamAssassin см. -http://imap.cs.msu.su/spam/antispam/sa-pres/text0.html. - -[float] -==== Ведение статистики ==== - -Сбор данных, пригодных для извлечения статистики, ведётся UNIX-подобными -системами автоматически посредством заполнения системных журналов. В рамках -проекта были рассмотрены несколько средств визуализации статистики (от простых, -наподобие mrtg, до «высокоинтеллектуальных», вроде nrg). Решено было -остановиться на промежуточном уровне: для универсального отображения любых -видов обновляемой информации используется пакет rrdtool, являющийся развитием -mrtg, а для составления разнообразных профилей отображения статистики — пакет -happystats (использующий rrdtool). Диаграммы, порождаемые rrdtool, включены в -упомянутую выше титульную страницу сервера, посвящённую спаму, а страницу -happystats можно увидеть на http://imap.cs.msu.su/cgi-bin/happystats.cgi. - -По данным статистики, за неделю чёрными списками и антивирусом отвергается -587588 соединений, а принимается — 130857 (18% по отношению к общему числу -SMTP-соединений, включая внутреннюю переписку и технический обмен сообщениями), -при этом доля сообщений, принятых сервером извне, составляет 9% (66767). Среди -них 49477 (74%) помечается классификатором как спам. Итого, общее число -«чистых» сообщений, составляет 17290 в неделю, или 2.4% от общего количества -SMTP-соединений, а если исключить из из числа внутренние и служебные, то — -2.65%. - -=== Домашние WWW-страницы пользователей и сервер совместной разработки === - -Во время разработки стендового проекта стоял вопрос об организации домашних -страниц пользователей на базе предложенной схемы. Никаких дополнительных -настроек это не требует: доступ к файловому пространству пользователя есть -посредством SMB, а в настройках HTTP-сервера достаточно разрешить использовать -UserDir. На этом уровне задача решена и в рамках стендового проекта (см. -http://jail.lvk.cs.msu.su/~tmpuser/), однако в предлагаемой схеме есть -определённые допущения, мешающие развитию проекта в этом направлении. -Во-первых, предполагается, что службы SMB и HTTP совмещены в одном компьютере и -пользуются одним и тем же дисковым пространством. Это противоречит методике -разработки комплекса, требующей возможности переноса любой службы на отдельный -компьютер. Во-вторых, имеет место различие уровней секретности публичных -(WWW-страница) и частных (файловый архив) данных, что требует различных учётных -записей и/или политик доступа к этим данным. В-третьих, предоставление -пользователям возможности использовать популярные технологии, наподобие CGI, -PHP, Zope и т. д., требует индивидуального подхода и существенно более -тщательного контроля доступа к ресурсам. - -Также не составило бы труда реализовать сервер совместной разработки -HTTP-страниц (т. н. «Wiki»), так как для этого требуется только установка и -простейшая настройка любого из нескольких десятков свободно распространяемых -продуктов класса «Wiki» или «CMS». Однако включение такой службы в единую -систему авторизации означало бы серьёзное (по нашему мнению — недопустимое) -изменение общей политики безопасности, так как проекты Wiki предусматривают -регистрацию и продуктивную работу любого заинтересованного субъекта глобальной -сети. - -В рамках проекта было проведено исследование подобного рода ПО на предмет -безопасности, простоты настройки и администрирования, простоты доработки и -спектра поддерживаемых функций. Было решено остановиться на пакете MoinMoin -(язык разработки — Python), дополнительным свойством которого является -встроенная в каждую страницу новостная лента RSS, отражающая изменения этой -страницы. Пример сайта, разработанного с помощью moinMoin — -http://uneex.cs.msu.su (время разработки — сутки, включая установку и настройку -самого MoinMoin, перенос содержимого, разработку нового стиля LeftSideBar, -цветовое оформление и разделение двух интерфейсов — https:, с возможностью -редактирования, и http: — только для чтения). - -Вместе с тем, на факультете в течение нескольких лет функционирует -хостинг-сервер, предоставляющий сотрудникам и учащимся ВМиК возможность -размещать свои WWW-страницы с поддержкой технологии VirtualHosting, -использованием языков программирования PHP, Perl, Python и др,, работает сервер -Wiki, есть возможность хранения данных в PostgreSQL и т д. - -На сервере организована дополнительная защита доступа: каждый пользователь -получает изолированное по технологии chroot окружение, не имея доступа к -файловому пространству системы и других пользователей. Обновление содержимого -производится по защищённому протоколу SSH (SCP/SFTP, рекомендуемый клиент для -Windows — WinSCP). - -О разрешении какого-либо доступа, кроме общего, и притом на чтение, по -протоколу FTP на сегодняшний день думать не приходится, так как в классическом -FTP авторизационная информация передаётся в открытом виде, а клиентские -реализации FTP с поддержкой TLS пока что непопулярны. Тем не менее, серверная -реализация FTP с поддержкой TLS существует в нескольких вариантах, один из -которых успешно эксплуатируется на факультетском -сборочном/информационном/FTP-сервере в течение нескольких лет. diff --git a/old-docs/console_setup.txt b/old-docs/console_setup.txt deleted file mode 100644 index 5e84eca..0000000 --- a/old-docs/console_setup.txt +++ /dev/null @@ -1,121 +0,0 @@ -//// -Пакет: docs-console_setup -RPM файл: docs-console_setup-0.1-alt2.noarch.rpm -Аннотация: Настройка консоли в Linux: шрифты, раскладки клавиатуры, - русификация. -Автор: Георгий Курячий -Лицензия: FDL -URL: http://heap.altlinux.org/modules/console_setup.kirill/index.html -//// - -== Настройка консоли == - -Виртуальная консоль Linux организована на основе текстовых возможностей -графического контроллера (как правило, совместимого со стандартом VESA или, по -крайней мере. EGA/VGA). VGA поддерживает загрузку однобайтовых шрифтов (256 -изображений размера 8x16, 8x14 или 8x8 пикселей) в специальный раздел -видеопамяти. Это означает, что полноценная поддержка языка, содержащего большее -количество символов (например, маньчжурского) в такой консоли невозможна. К -счастью, в русском языке букв гораздо меньше. - -К сожалению, существует более чем одна договорённость о том, как именно -располагаются русские буквы в шрифте (т. н. кодировка, или codepage). Для -кириллических шрифтов VGA принята кодировка cp866 (т. н. “ДОСовская”). Дело в -том, что в некоторых текстовых режимах VGA одно знакоместо занимает не 8, а 9 -пикселей. Поскольку изображение, тем не менее, используется восьмиточечное, -девятая точка всегда рисуется цветом фона. Исключение делается для символов -шрифта с порядковым номером от 192 до 223 включительно, соответствующих в -стандартной кодировке псевдографике с горизонтальными линиями. При выводе -такого символа на экран девятая точка каждой линии в его изображении рисуется -так же, как восьмая. В результате горизонтальные линии получаются непрерывными. - -Загрузкой шрифта занимается утилита consolechars. Ей можно подать на вход шрифт -в двоичном (raw) формате. Двоичный формат содержит изображения всех символов -шрифта и имеет, например, размер 256 символов * 16 точек в высоту * 8 точек в -ширину = 32768 бит (4096 байт). Можно использовать шрифты, оставшиеся от -русификаторов DOS, вроде RK или VGACYR! Стандартный для consolechars формат PSF -дополнительно содержит информацию о том, каким символам в кодировке Unicode -(двухбайтовой) соответствует каждое изображение в шрифте. Эту информацию (т. н. -таблицу соответствия шрифта, Screen Font Map), можно подгружать и отдельно, с -помощью ключа -u таблица.sfm. Для того, чтобы загрузить только изображения из -формата RAW и получить полноценный PSF-шрифт с внедрённой таблицей SFM, можно -воспользоваться командами - ----- -$ consolechars -f VGACYR.RAW -$ consolechars -F VGACYR_with_SFM.psf ----- - -Система позволяет установить любую из имеющихся кодировок при выводе данных на -виртуальную консоль. Поскольку данные о соответствии шрифта и Unicode -добываются из SFM или PSF-файла, остаётся только сообщить, как в ту же Unicode -преобразуется выбранная кодировка вывода. Для этого используется т. н. рабочая -таблица кодировки (Allpication Charset Map, называемая также screenmap). Вывод -на консоль выглядит так, как если бы данные сначала преобразовывались в Unicode -на основании загруженной ACM-таблицы, а затем превращались в восьмибитное -представление с помощью загруженной таблицы ACM. Загрузкой ACM-таблицы -занимается та же утилита: consolechars -a таблица.acm. - -Наконец, для локализации ввода с консольной клавиатуры необходимо сообщить -системе используемую раскладку (keymap). Клавиатура IBM-совместимого компьютера -— довольно сложное устройство, передающее в различных случаях разное количество -информации. Задача виртуальной консоли — преобразовать эту информацию в поток -символов, как если бы он приходил с настоящего терминала. Консоль может -находиться в нескольких состояниях; от того, в каком состоянии находится -консоль, зависит то, что будет происходить при нажатии на конкретную клавишу. -Раскладка — это карта соответствия клавиш на клавиатуре действиям, выполняемым -в разном состоянии консоли. - -Раскладка обычно использует не менее двух состояния: Shift и Control. Первое -состояние используется для того, чтобы посылать одной и той же клавишей -прописной или строчный вариант буквы, цифру или специальный символ и т. п. -Второе используется, чтобы посылать с клавиатуры символы с ascii-кодом, меньшим -0x20 (32), т. н. непечатные. Если, допустим, клавиша A посылает символ с кодом -0x41 (65), то в состоянии Control эта клавиша посылает символ с кодом 0x1, то -есть от кода символа в двоичном представлении отрезаются все биты, кроме первых -пяти. Ещё одно состояние — AltGr — используется в локализованных раскладках для -того, чтобы возвращать буквы национального алфавита. Таких состояний определено -восемь (см. руководство keymaps(5)). В раскладке им соответствует 256 (!) -вариантов поведения консоли для каждой клавиши — по одному варианту на любое -сочетание состояний. - -Клавиши, переводящие консоль в новое состояние, называются модификаторами -состояний: Shift, Alt и Ctrl. В раскладке им будет соответствовать функция -перевода консоли в соответствующее состояние — на время, пока клавиша нажата. -Если клавиша переводит консоль в определённое состояние до другого нажатия на -эту клавишу, это — залипающий модификатор. Такими модификаторами являются, -например, Caps Lock или выбираемый при установке по умолчанию переключатель на -русский язык — сочетание Ctrl+Shift. - -Загрузкой раскладки в консоль занимается утилита loadkeys. Ей на вход подаётся -файл раскладки, в котором описано поведение каждой клавиши. Формат этого файла -похож на тот, что используется в системе X11 утилитой xmodmap. Если в этом -файле опущены строки, описывающее поведение некоторых клавиш, то при его -загрузке оно не меняется. Поэтому если вам необходимо только изменить уже -загруженную раскладку, достаточно создать kmap-файл, описывающий эти изменения -и загрузить его. Например, такой файл может отменять установленные по умолчанию -функции переключения виртуальных консолей при нажатии на клавиши Menu и Windows -105-клавишной клавиатуры (они находятся между Ctrl и Alt, и по ним часто -попадаешь случайно). Кроме того, может заставить клавишу Backspace в состоянии -Shift возвращать не Delete, а именно BackSpace и присвоить клавише Menu функцию -переключения на локальную раскладку и обратно. - ----- -$ cat mnu_bs.kmap - keycode 14 = Delete BackSpace Delete BackSpace - keycode 125 = CapsShift - keycode 126 = AltGr - keycode 127 = AltGr_Lock -$ loadkeys mnu_bs.kmap ----- - -Систему можно настроить так, чтобы ещё при начальной загрузке устанавливались -определённые шрифты и раскладки. Файл /etc/sysconfig/i18n описывает язык по -умолчанию, шрифт (поле SYSFONT) и ACM-таблицу (поле SYSFONTACM). -Соответствующий шрифт, ACM и, если надо, SFM-таблицу система берёт из каталогов -/etc/sysconfig/console/consolefonts и /etc/sysconfig/console/consoletrans. Все -возможные консольные шрифты хранятся в /usr/lib/kbd/consolefonts, а таблицы — в -каталоге /usr/lib/kbd/consoletrans. Раскладка определяется содержимым файла -/etc/sysconfig/keyboard (поле KEYTABLE), всевозможные консольные раскладки -лежат в подкаталогах /usr/lib/kbd/keymaps (сообразно архитектуре и типу -клавиатуры). diff --git a/old-docs/corpnet.txt b/old-docs/corpnet.txt deleted file mode 100644 index b3525ec..0000000 --- a/old-docs/corpnet.txt +++ /dev/null @@ -1,165 +0,0 @@ -//// -Пакет: docs-corpnet -RPM файл: docs-corpnet-0.1-alt1.noarch.rpm -Аннотация: Рекомендации по организации корпоративной - сети на базе Linux -Автор: Андрей Горев -Лицензия FDL -URL: http://heap.altlinux.org/modules/dhcp.kirill.prev/index.html -//// - -== Организация корпоративной сети == - -При организации корпоративных сетей очень важен этап предварительного -планирования топологии сети, нагрузки по сегментам сети, расчёт протяжённости -кабельной системы, а также затратная часть на сетевую инфраструктуру и серверы, -предоставляющие сервис в этой сети. От правильности начального планирования -зависит производительность и масштабируемость всей сети в целом и её отдельных -компонентов. Ваша сеть скорее всего будет работать по Ethernet, а там, как -известно используется протокол обнаружения коллизий. Чем правильнее вы -спланируете свою сеть, тем меньше будет этих коллизий и тем лучше будет -работать сеть в целом. На стадии планирования вам поможет статья по адресу -http://citforum.ru/nets/articles/lso.shtml. - -После того, как вы набросали план вашей будущей сети и приобрели необходимое -оборудование, нужно распределить адресное пространство. В разделе Настройка -сети приводилось несколько ссылок, помогающих разобраться в тонкостях -организации подсетей, работе с сетевыми масками и пр. Здесь мы рассмотрим, -почему используют подсети при организации корпоративных сетей. - -Очень важным является следование RFC1918, которая регламентирует используемое -для построения внутренних сетей адресное пространство. Напомним, что это блоки -адресов: 10.0.0.0/8 для сетей класса A, 172.16.0.0/16—172.31.0.0/16 для сетей -класса B, 192.168.0.0/16 для сетей класса C. Здесь после знака / указана -битовая маска сети. Если вы не будете следовать этим рекомендациям, то у вас -могут возникнуть сложности при подключении сети к Интернет. - -Далее нужно выбрать из перечисленных выше вариантов сетевой блок, который будет -удовлетворять размерам вашей сети. Как правило, в случае небольшой сети (до 254 -машин), выбирают сеть 192.168.0.0/24. Для сети масштаба предприятия выбирают -сеть класса А. - -Введите организацию подсетей: адрес сети класса A может быть разбит на -несколько (если не много) отдельных сетей. Управлять каждой отдельной сетью -значительно проще. - -Это позволяет устанавливать и управлять небольшими сетями — весьма возможно -использовать различные технологии организации сетей. Помните, вы не можете -смешивать Ethernet, Token Ring, FDDI, ATM и т. п. на одной физической сети, -однако они могут быть связаны мостами (bridges). - -Другие причины для организации подсетей: - -* Физическое размещение сайта может быть ограничено длиной кабеля. Ясно, что - физическая инфраструктура может быть связана, требуя множественные сети. - Организация подсетей позволяет это сделать, используя единственный сетевой - номер. Сейчас это обычно делают интернет-провайдеры, которые желают дать - своим постоянным клиентам с локальными сетями статические IP-адреса. - -* Сеть перегружена. Её разбивают на подсети так, чтобы трафик был сосредоточен - внутри подсетей, разгружая таким образом всю сеть, без необходимости - увеличивать её общую пропускную способность. - -* Разделение на подсети может быть продиктовано соображениями безопасности, т. - к. трафик в общей сети может быть перехвачен. Организация подсетей - обеспечивает способ, позволяющий предохранить отдел маркетинга от “сующих нос - не в свои дела”. - -* Имеется оборудование, которое использует несовместимые технологии организации - сетей, и есть потребность связать их (как упомянуто выше). - -Каждая сеть имеет два адреса, не используемых для сетевых интерфейсов -(компьютеров) — сетевой номер сети и широковещательный адрес. Когда вы -организуете подсеть, каждая из них требует собственного, уникального IP-адреса -и широковещательного адреса, причём они должны быть правильными внутри -диапазона адресов сети, которую вы организуете. - -Таким образом, разделение сети на две подсети приводит к тому, что образуются -два адреса сети и два широковещательных адреса — увеличивается число -“неиспользуемых” адресов интерфейсов; создание 4-х подсетей приведёт к -образованию 8-и неиспользуемых адресов интерфейсов и т. д. - -Фактически, самая маленькая пригодная для использования подсеть состоит из 4 -IP-адресов: - -* Два используются для интерфейсов: один для маршрутизатора в этой сети, другой - для единственной машины в этой сети. - -* Один адрес сети. - -* Один широковещательный адрес. - -Если у вас в подсети один компьютер, то любые сетевые сообщения должны -отправляться в другую подсеть. Этим будет заниматься маршрутизатор, на котором -вы в таблицу маршрутизации прописываете пути в эти подсети. А на этом -единственном компьютере в подсети вы указываете маршрутизатор как маршрут по -умолчанию, или шлюз. Для того, чтобы маршрутизатор перебрасывал пакеты между -интерфейсами, вам обязательно надо включить форвардинг. Делается это в файлах -/etc/sysconfig/network и /etc/sysctl.conf. - -Сетевая маска позволяет разделить сеть на несколько подсетей. Сетевая маска для -сети, не разделённой на подсети — это просто четвёрка чисел, которая имеет все -биты в полях сети, установленные в 1 и все биты машины, установленные в 0. - -Таким образом, для трёх классов сетей стандартные сетевые маски выглядят -следующим образом: - -|============================================= -|Класс A|8 сетевых битов |255.0.0.0 -|Класс B|16 сетевых битов |255.255.0.0 -|Класс C|24 сетевых бита |255.255.255.0 -|============================================= - -Способ организации подсетей заимствует один или более из доступных битов номера -хоста и заставляет интерпретировать эти заимствованные биты как часть сетевых -битов. Таким образом, чтобы получить возможность использовать вместо одного -номера подсети два, мы должны заимствовать один бит машины (крайний левый), -установив его в сетевой маске в 1. - -Для адресов сети класса C это привело бы к маске вида -11111111.11111111.11111111.10000000 или 255.255.255.128 К примеру, для сети -класса C с сетевым номером 192.168.1.0, есть несколько случаев: - -[options="header"] -|======================================================= -|Число подсетей |Число машин на сеть |Сетевая маска -|2 |126 |255.255.255.128 -|4 |62 |255.255.255.192 -|8 |30 |255.255.255.224 -|16 |14 |255.255.255.240 -|32 |6 |255.255.255.248 -|64 |2 |255.255.255.252 -|======================================================= - -В принципе, нет абсолютно никакой причины следовать вышеупомянутым способам -организации подсетей, где сетевые биты добавлены от старшего до младшего бита -хоста. Однако, если вы не выберете этот способ, то в результате IP-адреса будут -идти в очень странной последовательности! Но в результате, решение, к какой -подсети принадлежит IP-адрес, получается чрезвычайно трудным для нас (людей), -поскольку мы не слишком хорошо считаем в двоичной арифметике (с другой стороны, -компьютеры, с равным хладнокровием, будут использовать любую схему, которую вы -им предложите). - -Выбрав подходящую сетевую маску, вы должны определить сетевые, -широковещательные адреса и диапазоны адресов для получившихся сетей. Учтите, -что при увеличении числа подсетей сокращается число доступных адресов для -компьютеров. Располагая этой информацией, вы можете назначить адреса машин, -сетевые адреса и сетевые маски. - -Последним этапом будем считать настройку маршрутизатора. Статические маршруты в -подсети описываются в файле /etc/sysconfig/static-routes. Заметьте, что по -умолчанию этого файла нет! Синтаксис записей в файле примерно такой: - ----- -eth1 host 172.16.50.2 -eth1 net 0/0 gw 10.255.16.1 ----- - -Здесь во второй строке для примера нестандартным образом указан маршрут по -умолчанию. Стандартно он оформляется в файлах-описаниях интерфейсов и -/etc/sysconfig/network. Напоминаем про необходимость включения форвардинга. Это -можно сделать не перезагружая систему, дав команду echo "1" > -/proc/sys/net/ipv4/ip_forward - -Ну и напоследок, не лишней будет настройка на маршрутизаторе межсетевого -экрана, подробнее об этом см. раздел Сетевая безопасность. diff --git a/old-docs/dhcp.txt b/old-docs/dhcp.txt deleted file mode 100644 index a128777..0000000 --- a/old-docs/dhcp.txt +++ /dev/null @@ -1,140 +0,0 @@ -//// -Пакет: docs-dhcp -RPM файл: docs-dhcp-0.1-alt2.noarch.rpm -Аннотация: Описаны технологии автоматической настройки Сети -Автор: Георгий Курячий -Лицензия: FDL -URL: http://heap.altlinux.org/modules/dhcp.kirill/index.html -//// - -== Автоматическая настройка сети (RARP и DHCP) == - -Если система устанавливается на компьютер, включённый в корпоративную сеть, -многие параметры сетевых настроек известны заранее. Более того, нежелательно, -чтобы эти известные заранее настройки хозяин компьютера мог самостоятельно -изменять. Наконец, необходим механизм автоматической передачи -компьютерам-абонентам сети таких заранее определяемых системным администратором -настроек, как сетевой адрес и маска, адрес маршрутизатора (шлюза), адрес -сервера доменных имён (DNS) и некоторых других. - -Следует понимать, что всей мощью сетевых протоколов TCP/IP компьютер, не -имеющий пока своего IP-адреса, воспользоваться не может. Поэтому сервис -удалённой настройки должен опираться на информацию более низкого уровня -(интерфейсного уровня TCP/IP). В частности, при использовании сети Ethernet, в -качестве идентификатора компьютера может выступать уникальный идентификатор его -сетевого интерфейса (т. н. MAC-адрес сетевой карты). MAC-адрес шестибайтное -число, традиционно представляемое в виде шести шестнадцатеричных чисел, -разделённых символом :; он содержится, например, в выдаче команды ifconfig. -Любые пакеты (фреймы), передаваемые в Ethernet, содержат MAC-адрес в полях -идентификатор отправителя и идентификатор получателя. Сетевая карта, получив -пакет, сравнивает MAC-адрес получателя со своим, и только в случае совпадения -передаёт в систему. Исключение — т. н. широковещательный идентификатор -получателя, ff:ff:ff:ff:ff:ff, пакеты с которым передаются системе в любом -случае. - -Компьютер-абонент локальной сети при включении посылает специальный -широковещательный Ethernet-пакет, который трактуется как запрос “настрой меня”. -В сети должен находиться хотя бы один (и лучше, чтобы один) сервер, способный -обрабатывать такой запрос, который, на основании MAC-адреса отправителя и -некоторой собственной информации, формирует ответ, содержащий настроечные -данные для абонента. Система абонента должна такой ответ обработать, выбрать -оттуда интересующую её информацию и настроить сетевые параметры. Таким образом, -автоматическая настройка требует наличия в сети сервера, который раздаёт -параметры и следит за их употреблением, и клиента на абонентской машине, -который эти параметры применяет. - -Самый простой способ автоматической настройки воспользоваться стандартной для -семейства протоколов TCP/IP службой преобразования адресов — RARP (Reverse -Address Resolution Protocol). Служба эта преобразует низкоуровневые адреса (в -случае Ethernet — MAC-адреса, интерфейсный уровень) в высокоуровневые -(IP-адрес, сетевой уровень). (Протокол ARP, преобразующий высокоуровневые -адреса в низкоуровневые, используется в TCP/IP сетях постоянно для определения -MAC-адресов абонентов локальной сети). В Linux формированием RARP-запроса -занимается ядро. Сервер rarpd, отвечая на RARP-запросы, пользуется простейшей -таблицей соответствия IP-адресов MAC-адресам в сети. Никакой другой информации -по RARP передать нельзя, поэтому сегодня он используется главным образом для -сетевой загрузки компьютеров (в этом случае простой RARP-запрос формирует не -система, а сама сетевая карта, она же запоминает ответ, а система считывает -этот ответ при загрузке). - -Более гибкий протокол удалённой настройки — DHCP (Dynamic Host Configuration -Protocol). Он позволяет передавать не только IP-адрес, но и адреса -маршрутизаторов, список DNS-серверов, позволяет управлять удалённой загрузкой, -и передавать вообще любые данные, лишь бы они распознавались с клиентской -стороны. Что не менее важно, сервер dhcpd (из пакета dhcp-server║), может -настраивать компьютеры, MAC-адрес которых заранее неизвестен, выделяя им -IP-адреса из заданного диапазона (не навсегда, а на время) и следя за тем, -чтобы разным компьютерам выдавались разные адреса. Более того, однажды выданный -IP-адрес закрепляется за определённым компьютером и выдаётся ему при повторных -запросах — до тех пор, пока адресов в диапазоне хватает для вновь подключаемых -абонентов DHCP. Если запас адресов всё же исчерпан, очередному новому -компьютеру будет выдан адрес, который дольше всего не использовался. - -Сетевая настройка клиента при этом сводится к запуску клиентского демона -dhcpcd, который регулярно засылает в сеть DHCP-запросы и интерпретирует ответы. -dhcpcd умеет обновлять /etc/resolv.conf и некоторые другие настроечные файлы, -модифицируя поведение соответствующих служб системы. Чтобы активизировать -настройку по DHCP при начальной загрузке системы, достаточно в файле, допустим, -/etc/sysconfig/network-scripts/ifcfg-eth0, указать строку BOOTPROTO=dhcp и -убрать строки настройки IP-адреса и/или маршрутизатора. - -Настройка сервера dhcpd, в общем случае, довольно проста. Прежде всего следует -убедиться в том, что ваш DHCP-сервер — единственный в локальной сети, в -противном случае следует настраивать взаимодействие между серверами. Затем -создать файл настройки /etc/dhcp/dhcpd.conf, в котором при помощи ключевого -слова subnet должны быть описаны все сетевые подключения, имеющиеся на вашем -компьютере. В обязательном порядке надо сообщить, какой стиль динамического -обновления DNS будет использоваться (проще всего его выключить). Наконец, хотя -бы в одной из подсетей необходимо выделить диапазон адресов для раздачи. После -этого можно запускать DHCP-демон. - -Предположим, адрес вашего компьютера в Интернет (подключён посредством -интерфейса eth0) — 207.68.172.234, а интерфейс eth1 подключён к внутренней -локальной сети, адрес вашего компьютера в которой — 10.10.10.2. Тогда файл -настройки примет вид - ----- -ddns-update-style none; - -subnet 207.68.172.0 255.255.255.0; - -subnet 10.10.10.0 netmask 255.255.255.0 { - range 10.10.10.10 10.10.10.254; -} ----- - -В нашем примере машинам из внутренней сети будут выдаваться адреса от -10.10.10.10 до 10.10.10.254 (точнее, от 10.10.10.254 до 10.10.10.10, так как -dhcpd начинает с наибольшего адреса). - -Если необходимо, чтобы ваш компьютер выполнял функции маршрутизатора и сервера -имён для внутренней сети (домен internal.com), то после настройки -соответствующих служб, в этот файл следует добавить — по аналогии с range — -строки - ----- -option routers 10.10.10.2; -option domain-name-servers 10.10.10.2; -option domain-name "internal.com"; ----- - -Чтобы постоянно выдавать определённый IP-адрес определённому компьютеру, -необходимо, как и в случае RARP, привязать IP-адрес к идентификатору сетевого -интерфейса этого компьютера. В случае сети Ethernet в этой роли выступает -MAC-адрес. Соответствующая запись в /etc/dhcp/dhcpd.conf может выглядеть, -например, так: - ----- -host fixed { - hardware ethernet 0:c0:c3:49:2b:57; - fixed-address 10.10.10.11; -} ----- - -Следует помнить, что сервис ║dhcpd║ использует технологию chroot: его рабочий -каталог — /var/lib/dhcp/dhcpd. В этом каталоге, помимо прочего, в файле -/var/lib/dhcp/dhcpd/state/dhcpd.leases хранится информация о когда-либо -выданных адресах и сроках их действия. - -Более подробную информацию о работе с DHCP можно найти в руководствах, входящих -в соответствующие пакеты. diff --git a/old-docs/emacs_email.txt b/old-docs/emacs_email.txt deleted file mode 100644 index ced4441..0000000 --- a/old-docs/emacs_email.txt +++ /dev/null @@ -1,364 +0,0 @@ -//// -Пакет: emacs_email -RPM файл: docs-emacs_email-0.1-alt2.noarch.rpm -Аннотация: Краткое описание использования Emacs для работы с почтой и - новостями Usenet -Автор: Алексей Отт (http://xtalk.msk.su/~ott/) -Лицензия: http://creativecommons.org/licenses/by-nc-sa/2.0/ -URL: http://heap.altlinux.org/modules/EmacsEmail.kirill/index.html -//// - -== Использование Emacs для работы с электронной почтой и новостями Usenet == - -[float] -=== Введение === - -В этом документе рассказывается о том, как можно использовать Emacs для работы -с электронной почтой и новостями Usenet. В статье упоминается GNU Emacs, но -практически всё сказанное справедливо и для XEmacs. - -Достаточно подробный список пакетов для работы с почтой вы можете -http://www.emacswiki.org/cgi-bin/wiki?GettingMail[найти] на сервере -http://www.emacswiki.org/[EmacsWiki] - -=== Пакет Gnus === - -Gnus — это пакет Emacs, разработанный в первую очередь для чтения и отправки -новостей Usenet. Его также можно использовать для чтения и написания ответов на -сообщения из многих других источников — почты, удалённых каталогов, дайджестов -и других источников данных. Большой набор заметок о Gnus вы сможете найти в -соответствующем разделе EmacsWiki. - -[float] -==== Буфера Gnus ==== - -Для показа информации и получения команд Gnus использует несколько разных -буферов. Большую часть времени пользователи проводят в трех буферах — буфере -групп, буфере резюме и буфере статьи. - -Буфер групп содержит перечень групп. Это первый буфер, который Gnus показывает -после запуска. Обычно в нем показаны только те группы, на которые вы подписаны, -и в которых есть непрочитанные статьи. Используйте этот буфер для выбора -конкретной группы. - -Буфер резюме построчно перечисляет статьи одной группы. По умолчанию для каждой -статьи показываются автор, заголовок и число строк, но это можно настроить по -своему вкусу, как и большую часть того, что отображает Gnus. Буфер резюме -создается, когда вы выбираете группу в буфере групп, и уничтожается, когда вы -покидаете эту группу. Используйте этот буфер для выбора статьи. - -Буфер статьи отображает саму статью. При обычном использовании Gnus вы не -выбираете этот буфер — все полезные команды, предназначенные для работы над -статьей, прекрасно работают и из буфера резюме. Но вы можете выбрать буфер -статьи и выполнять все команды Gnus из него, если вы этого хотите. - -[float] -==== Запуск Gnus ==== - -Для запуска Gnus просто наберите M+x gnus. При запуске Gnus считывает ваш файл -инициализации новостей .newsrc и пытается установить связь с локальным сервером -новостей, который служит хранилищем статей. Сервер новостей не обязан быть тем -же компьютером, на который вы вошли. - -Если вы запустили Gnus и соединились с сервером, но не видите в буфере групп ни -одной группы, наберите L или A k, чтобы получить список всех доступных групп. -Затем нажимайте u на нужной вам группе, чтобы переключать подписку на данную -группу. - -Когда вы запускаете Gnus первый раз, он подписывает вас на несколько избранных -групп. Все остальные группы сначала невидимы для вас; вы можете получить их -список с помощью последовательности клавиш A k. Все новые группы, появляющиеся -в дальнейшем на сервере, становятся для вас «зомбированными»; чтобы получить их -перечень наберите A z. Вы можете подписаться на группы, показанные в этих -списках, используя команду u. - -Когда вы покидаете Gnus при помощи команды q, то он автоматически записывает в -ваших файлах инициализации .newsrc и .newsrc.eld статус подписки всех групп. -Обычно вам не стоит редактировать эти файлы вручную, но вы можете это сделать, -если точно уверены в том, что надо в них писать. - -[float] -==== Работа с Gnus ==== - -Для чтения статей из конкретной группы, надо просто установить курсор на нужную -группу и нажать на клавишу пробела. При этом будет открыт буфер резюме, в -котором будет отображен список непрочитанных статей и отображена первая -непрочитанная вами статья. Если непрочитанных статей слишком много, то Gnus -выдаст запрос о том, сколько статей необходимо отобразить. Переменная -gnus-large-newsgroup определяет пороговое значение, при превышении которого -группа будет считаться большой и будет выдаваться предупреждение. - -Если вам необходимо увидеть и прочитанные статьи, то для их выбора вам нужно -использовать комбинацию C+u space. Кроме того, после префиксной комбинации вы -можете указать число, которое определит количество выбираемых статей. -Положительное число N выбирает N самых последних статей, а отрицательное число -— N самых старых статей. Например, C+u - 5 0 space выберет 50 самых старых -статей. - -[float] -==== Настройка Gnus для работы с электронной почтой ==== - -Gnus обрабатывает почту точно также, как и новости Usenet. Для того чтобы -читать электронную почту в Gnus, надо просто задать метод для обработки почты и -источники её получения. Это определяется с помощью следующего кода в вашем -файле ~/.emacs или ~/.gnus (этот файл используется только для инициализации -Gnus): - ----- - (setq gnus-secondary-select-methods '((nnml ""))) - (setq mail-sources - '((file :path "/var/spool/mail/user-name") - (pop :server "pop3.mail.server" - :user "user-name" - :port "pop3" - :password "secret"))) ----- - -Первая строка задает список вторичных методов получения новостей для Gnus. В -нашем примере этот список состоит только из одного элемента — nnml, который -задает метод для чтения почты. Вторая и последующая строки перечисляют -источники получения почты. Переменная mail-sources содержит список, каждый -элемент которого является списком, в котором первый элемент указывает на тип -источника почты, а затем идет список ключевых слов и значений для них. Список -ключевых слов зависит от типа источника почты и полное их описание вы можете -найти в справке по Gnus. В нашем примере задаётся два источника почты. Первый — -это локальный файл с почтой, который задается путем /var/spool/mail/user-name, -а второй источник — это POP3-сервер, для которого указывается большее -количество ключевых слов, описывающих параметры подключения к данному серверу. -Будьте внимательны, помещая пароль для доступа к почте в ваш файл настройки -Emacs: если вы хотите хранить в нём ваш пароль, то запретите чтение этого файла -для всех остальных пользователей вашей системы. - -Gnus обладает очень богатыми возможностями по разбиению почты на группы. Его -возможности позволяют разбить почту по множеству признаков. Разбиение почты на -группы зависит от содержимого переменной nnmail-split-methods, которая содержит -список списков, состоящих из пар строк — имени группы и регулярного выражения, -при соответствии которому сообщение помещается в соответствующую группу. -Следующий код продемонстрирует простой пример обработки входящей почты: - ----- - (setq nnmail-split-methods '( - ("ALT-sisyphus" "^\\(To\\|From\\|Cc\\):.*sisyphus@altlinux\\.ru.*") - ("ALT-devel" "^\\(To\\|From\\|Cc\\):.*devel@altlinux\\.ru.*") - ("inbox" ""))) ----- - -В этом примере создается три группы. В первые две группы помещаются сообщения -только из списков рассылки ALTLinux Sisyphus и ALTLinux Devel. В группу inbox -помещаются все остальные сообщения, для которых не было совпадения по -регулярным выражениям. - -Чтобы создать новое почтовое сообщение просто нажмите на клавишу m в буфере -групп или буфере резюме. При этом будет отображено новое окно, в котором вы -можете ввести адрес получателя и тему сообщения, а также сам текст сообщения. -Текст сообщения должен идти после строки - ---text follows this line-- - -Все, что находится до этой строки, рассматривается как заголовки. Это позволяет -вам вручную задавать дополнительные заголовки, такие как Bcc. Часть заголовков -может подставляться автоматически. К примеру, чтобы все отправляемые сообщения -складывались в отдельную группу, вам необходимо вписать в ваш файл -инициализации следующий код: - -(setq gnus-outgoing-message-group "nnml:sent") - -После установки этой переменной, все отправляемые сообщения будут помещаться в -группу sent, доступ к которой осуществляется с помощью метода nnml. - -[float] -==== Другие возможности Gnus ==== - -В предыдущем тексте была описана лишь малая часть возможностей Gnus. Кроме -обычных групп для почты и новостей, Gnus позволяет создавать виртуальные -группы, которые состоят из частей других групп. Также можно отображать в виде -групп новостей результаты поиска в Интернете, серверы каталогов и прочее. - -Кроме того, Gnus обладает мощными средствами по фильтрации и удалению ненужных -вам сообщений. Работа этого средства основана на подсчёте весов сообщения -(Scoring). Веса могут добавляться или удаляться в зависимости от текста и -заголовка сообщения, его авторов и многих других параметров. Это позволяет -эффективно работать с новостями, читая только то, что необходимо. - -Gnus также умеет взаимодействовать с разными системами определения -нежелательных почтовых рассылок, позволяя вам не отвлекаться на ненужную вам -почту. - -=== Пакет Rmail === - -Этот пакет поставляется вместе с GNU Emacs и предназначен для чтения и хранения -получаемой вами почты. Для запуска этого пакета достаточно просто набрать M+x -rmail. При этом будет прочитан файл с почтой Rmail (обычно это ~/RMAIL), -забрана почта из ваших почтовых ящиков, и отображено первое непрочитанное вами -сообщение. - -Emacs использует сужение для того, чтобы отображать только одно сообщение в -каждый отдельно взятый момент времени. Внутри файла Rmail сообщения -располагаются в порядке их поступления в ваши почтовые ящики. Вы также можете -указать другие методы сортировки сообщений. - -Кроме основного файла с сообщениями Rmail вы можете создавать и использовать -другие файлы с сообщениями. Почта в эти файлы может поступать из других -почтовых ящиков или из своего основного файла Rmail. - -Rmail предоставляет пользователю возможность назначения меток на конкретные -почтовые сообщения, или группы сообщений. Обычно метки используются для -классификации сообщений. Затем эти метки можно использовать для сортировки -писем, или для перемещения их в другие файлы Rmail. - -Более подробную информацию о пакете Rmail можно получить в документации, -которая поставляется вместе с GNU Emacs. Вы также можете прочитать об этом -пакете в русском переводе руководства по GNU Emacs. - -=== Пакет MH-E === - -Этот пакет предоставляет доступ к почтовой программе MH прямо из Emacs. Этот -пакет поставляется вместе с GNU Emacs, так что нет никакой необходимости -устанавливать его самостоятельно. - -Пакет поддерживает чтение и отправку электронной почты, в том числе и -сообщений, соответствующих стандарту MIME. Умеет работать с каталогами, в -которых вы можете хранить письма, например, относящиеся к одной теме. Также -поддерживается работа с письмами-дайджестами, и письмами, закодированными -программами shar и uuencode. - -=== Дополнительные пакеты === - -[float] -==== Отправка почты без использования дополнительных пакетов ==== - -GNU Emacs умеет отправлять электронную почту без использования каких-либо -дополнительных пакетов. Для создания сообщения используется команда -compose-mail, которая создает буфер *mail*. - -Метод отправки и создания сообщения зависит от того, какое значение имеет -переменная mail-user-agent. В настоящее время можно отправлять почту с помощью -программы Sendmail, пакетов Emacs MH-E, Gnus и Message. - -Для получения более подробной информации смотрите раздел Sending Mail в -руководстве по GNU Emacs. - -[float] -==== Пакет Supercite ==== - -Этот пакет позволяет гибко настроить параметры цитирования чужих писем при -ответе на них почтой или в группы Usenet. Пакет поддерживает все основные -пакеты Emacs для работы с почтой и новостями. - -Когда вы отвечаете на письмо или статью, то производится вызов функции -Supercite sc-cite-original, которая осуществляет анализ заголовков исходного -текста, запоминая их параметры. Затем Supercite проходится по каждой из строк -ответа и изменяет их в соответствии с заданными функциями преобразования. -Оригинальное сообщение может быть отформатировано в соответствии с вашими -предпочтениями во время работы функций Supercite. - -Для того чтобы любой почтовый пакет Emacs стал использовать Supercite для -цитирования писем, вам необходимо вставить в файл инициализации ~/.emacs -следующую строку: - ----- - (add-hook 'mail-citation-hook 'sc-cite-original) ----- - -Но если вы используете пакет Gnus, то вам надо добавить ещё и следующую строку - ----- - (setq news-reply-header-hook nil) ----- - -которая предотвратит вставку одинаковых заголовков обоими пакетами. Более -полную информацию вы сможете найти в справочных страницах Info, которые -поставляются вместе с пакетом. - -[float] -==== Пакет Mailcrypt ==== - -Этот пакет является интерфейсом к популярной системе шифрования PGP. Он -позволяет работать как с оригинальным PGP, так и с его свободным клоном — -GnuPG. Использование этих программ возможно из нескольких пакетов для работы с -почтой — Gnus, VM, Rmail, MH-E, Mew. Среди реализованных операций — шифрование -и расшифровка сообщений, подпись сообщений, проверка электронных подписей. -Данный пакет входит в состав дистрибутивов ALTLinux. Кроме того, его можно -скачать с сайта http://mailcrypt.sourceforge.net. - -Вот как можно заставить Mailcrypt работать вместе с пакетом Gnus: - ----- - (load-library "mailcrypt") - (mc-setversion "gpg") - (autoload 'mc-install-write-mode "mailcrypt" nil t) - (autoload 'mc-install-read-mode "mailcrypt" nil t) - (add-hook 'mail-mode-hook 'mc-install-write-mode) ----- - -Первые пять строк одинаковы для всех пакетов работы с почтой. Первая строка -загружает пакет Mailcrypt. Вторая строка задает тип программы, которая будет -использоваться для обработки почты (в нашем примере это gpg — GNU-версия -программы PGP). Третья и четвертая строки описывают, что при вызове функций -mc-install-write-mode и mc-install-read-mode необходимо подгрузить их из -библиотеки mailcrypt. Пятая строка устанавливает ловушку на запуск режима -работы с почтой (mail-mode). - ----- - (add-hook 'gnus-summary-mode-hook 'mc-install-read-mode) - (add-hook 'message-mode-hook 'mc-install-write-mode) - (add-hook 'news-reply-mode-hook 'mc-install-write-mode) ----- - -Эти команды являются специфическими для пакета Gnus и устанавливают «ловушки» -на создание списка сообщений, создание сообщения и режим ответа на сообщение в -Usenet. - -В составе пакета для GNU Emacs в дистрибутивах ALTLinux поставляется скрипт -инициализации, в котором можно раскомментировать строку, соответствующую -используемому вами пакету для работы с почтой. Полное описание пакета и примеры -настройки можно найти в руководстве, которое поставляется вместе с пакетом. - -[float] -==== Пакет BBDB ==== - -Этот пакет позволяет организовать на основе Emacs базу данных для хранения -адресов, телефонов и прочей информации. Пакет обеспечивает интеграцию со -многими популярными пакетами чтения новостей usenet и почты. Существуют -утилиты, которые позволяют экспортировать эту базу данных в формате, понятном -для программ синхронизации с популярным PDA Palm Pilot. Данный пакет входит в -состав дистрибутивов ALTLinux. Кроме того, пакет можно скачать с его -собственного сайта http://bbdb.sourceforge.net. - -В руководстве, которое поставляется вместе с BBDB, приведены примеры настройки -данного пакета для разных пакетов работы с почтой. Следующий пример -демонстрирует настройку пакета для работы с почтой с помощью пакета Gnus: - ----- - (require 'bbdb) - (bbdb-initialize 'gnus 'message) - (add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus) - (add-hook 'message-setup-hook 'bbdb-define-all-aliases) - (defun my-message-mode-hook () (local-set-key [(tab)] 'bbdb-complete-name)) - (setq bbdb-use-pop-up nil) - (defun my-bbdb-tab-complete () - (interactive) - (if (mail-abbrev-in-expansion-header-p) - (bbdb-complete-name) - (message-tab))) - (define-key message-mode-map [tab] 'my-bbdb-tab-complete) ----- - -Этот пример можно сразу помещать в ваш файл настройки Emacs. Предварительно -стоит убедиться, что у вас установлены пакеты Gnus и BBDB. - -Первая строка данного примера производит загрузку самого пакета. Вторая строка -производит начальную настройку BBDB, указывая, что пакет будет использоваться -вместе с пакетом Gnus (message — это специальный режим из поставки Gnus, -который используется при создании электронных сообщений. Третья и четвертая -строки устанавливают ловушки для правильной инициализации пакета при запуске -соответствующих режимов. Пятая строка устанавливает локальную привязку клавиши -Tab для дополнения имен из базы BBDB. Шестая строка запрещает открытие -отдельного окна для отображения информации о выбранном пользователе (слишком -частое открытие окна может просто раздражать, поэтому и используется такая -настройка). - -Строки с седьмой по одиннадцатую определяют функцию, которая производит -дополнение имени только в том случае, если точка находится в почтовом -заголовке. Двенадцатая строка связывает данную функцию с клавишей Tab при -использовании режима редактирования электронного сообщения. diff --git a/old-docs/emacs_im.txt b/old-docs/emacs_im.txt deleted file mode 100644 index 4ded356..0000000 --- a/old-docs/emacs_im.txt +++ /dev/null @@ -1,939 +0,0 @@ -//// -Пакет: docs-emacs_im -RPM файл: docs-emacs_im-0.1-alt2.noarch.rpm -Аннотация: Руководство по использованию Emacs для интерактивного - общения: ICQ, Yahoo! Chat, AIM, Jabber, IRC. -Автор: Алексей Отт (http://xtalk.msk.su/~ott/) -Лицензия: FDL -URL: http://heap.altlinux.org/modules/emacs-im.kirill/ -//// - -== Использование Emacs для интерактивного общения == - -[float] -=== Введение === - -Кроме поддержки "неинтерактивных" средств обмена сообщениями, таких как почта и -новости Usenet, Emacs имеет поддержку практически всех видов интерактивного -обмена информацией: - -* Instant Messaging. Сюда входит поддержка протоколов ICQ, Yahoo Messenger, AIM - (AOL Instant Messaging), Jabber и MSN; -* Internet Relay Chat (IRC). - -Для каждого из перечисленных сервисов существует как минимум одна реализация, -но часто существует две и более реализации, отличающееся полнотой реализации и -степенью поддержки. Некоторые из реализаций уже не развиваются, но часто просто -работают. В данной статье я не буду описывать реализации которые уже не -поддерживаются, и для которых существуют альтернативы. - -=== Instant Messaging и Emacs === - -[float] -==== ICQ ==== - -ICQ — средство для быстрого обмена сообщениями, особенно популярное среди -пользователей Windows, также может использоваться и из Emacs. В настоящее время -существует одна реализация ICQ — eicq, но она может использоваться только с -XEmacs. Данная реализация поддерживает следующие возможности: - -* Поддержку протокола ICQ версии 8 (версия из CVS); -* Регистрацию новых пользователей и смену пароля; -* Передавать сообщения и URL; -* Авторизовывать пользователей, обновлять мета-информацию и получать список контактов; -* Преобразовывать список контактов micq и licq в собственный формат; -* Изменять привязки клавиш, и писать функции на Emacs Lisp. - -К сожалению данная реализация не поддерживает чаты, передачу файлов. - -В связи с тем, что я не пользуюсь XEmacs, я не смог протестировать данную -реализацию, но судя по документации, она достаточно просто устанавливается и -настраивается. - -[float] -==== Yahoo! Chat Messenger ==== - -Существует две реализации клиента Yahoo! Chat для Emacs. Первая из них -называется ElGyach и доступна с http://www.nongnu.org/elgyach, а вторая -называется yod.el и доступна с http://users.starpower.net/marti1/yod.el.html, -однако ElGyach имеет больше возможностей по сравнению с yod.el, поэтому я -остановлюсь на его описании более подробно. - -[float] -===== Возможности ElGyach ===== - -ElGyach поддерживает следующие возможности: - -* Сохранение буферов с сообщениями в файлах; -* Проверка грамматики; -* Подсветка сообщений; -* Поддержка шифрования с помощью AES; -* Механизм дополнений имен, команд и текста; -* Настройка цветов и атрибутов текста; -* Одновременное использование разных учетных записей; -* История сообщений, по которой можно перемещаться вперед и назад; -* Игнорирование сообщений от пользователей; -* Интеграция с другими модулями Emacs. - -Более подробную информацию вы можете найти на страницах, относящихся к -разработке ElGyach. - -[float] -===== Установка ElGyach ===== - -Для установки ElGyach необходимо скачать его с -http://savannah.nongnu.org/projects/elgyach, развернуть и скомпилировать -(поскольку для общения с сервером Yahoo, ElGyach использует реализацию на языке -С). Вот так будет выглядеть загрузка ElGyach в вашем файле инициализации: - ----- -(add-to-list 'load-path "path_to_elgyach") -(autoload "gyach" "gyach" "Autoload for ElGyach") ----- - -После загрузки вы можете задать необходимые параметры с помощью команд -настройки Emacs — M+x customize-group gyach. Здесь вы можете задать имя и -пароль пользователя Yahoo! Chat, а также имя программы elgyach, если она стоит -в нестандартном месте. - -[float] -===== Использование ElGyach ===== - -Для запуска ElGyach используется команда M+x gyach, которая создаст буфер -процесса. Вы также можете использовать несколько процессов ElGyach -одновременно. Это произойдет, если вы перед выполнением команды зададите -префикс, вот так C+u M+x gyach. Однако вы не можете войти больше чем в один -чат, используя одно и то же имя — это ограничение Yahoo! Chat. - -[float] -===== Команды ElGyach ===== - -ElGyach поддерживает выполнение различных команд, задаваемых в форме /имя. В -настоящее время доступны следующие команды: - -* /ignore User и /unignore User — для игнорирования сообщений от - определенных пользователей, и для отмены этого ограничения; - -* /highlight User и /unhighlight User — для подсветки сообщений от - определенного пользователя, и окончания использования данной настройки; - -* /version — печатает номер версии ElGyach. - -[float] -===== Настройка ElGyach ===== - -Основным параметром настройки являются имя и пароль пользователя, которые -используются для подключения к Yahoo! Chat. Эти значения хранятся в переменных -gyach-yahoo-username и gyach-yahoo-password. - -Для обеспечения настройки параметров буфера ElGyach может использоваться код, -который будет выполняться с помощью хука gyach-mode-hook. - -ElGyach легко расширяется. При каждом вызове команды вида /КОМАНДА, будет -вызываться функция gyach-custom-КОМАНДА. Таким образом, вы можете добавить свою -функциональность с помощью небольшого объема кода. - -[float] -===== AOL Instant Messaging (AIM) ===== - -Поддержка AIM в Emacs осуществляется пакетом TNT. Он позволяет обмениваться -сообщениями, и участвовать в групповых чатах. - -_Установка пакета_ - -Получить данный пакет можно с его домашней страницы, расположенной по адресу -http://tnt.sourceforge.net/. Установка пакета достаточно проста — надо раскрыть -архив, и настроить Emacs для его использования. Это выполняется с помощью -следующих команд: - ----- -(add-to-list 'load-path "path_to_tnt_dir") -(require 'tnt) ----- - -Вот и все. - -_Работа с пакетом_ - -Для работы с AIM вам нужно иметь уже зарегистрированное имя. Если у вас его -нет, то вы можете зарегистрировать новое имя по адресу http://www.aol.com/aim. - -Основная работа с пакетом осуществляется с помощью сочетаний клавиш, что -позволяет удобно работать с пакетом. Все команды можно разделить на несколько -частей, которые представлены в виде соответствующих разделов. - -_Подключение, отключение и статус_ - -Подключение к сервису AIM выполняется с помощью команды tnt-open (C+x t o). При -подключении вам необходимо указать ваше имя и пароль, и если все пройдет -нормально, то пакет сообщит о том, что вы подключились к системе. Чтобы каждый -раз не вводить имя и пароль, вы можете задать их с помощью переменных -tnt-default-username и tnt-default-password. вы также можете использовать -несколько разных имен для входа в систему. Более подробную информацию вы можете -найти в разделе Настройка. - -После подключения, вы можете выполнять стандартные задачи — ведение -переговоров, общение в чатах и т.п. - -Изменение статуса с "доступен" в "занят" производится с помощью команды -tnt-away-toggle (или C+x t A). вы можете задать сообщение, которое будет -отображаться для пользователей, которые будут пытаться соединиться с вами, -когда вы находитесь в данном режиме. - -Прекращение работы с AIM выполняется с помощью команды tnt-kill (C+x t q). - -_Обмен информацией_ - -TNT поддерживает два типа обмена информацией — прямые беседы между двумя -пользователями, и общение к чатах. - -Для прямого общения используется команда tnt-im (или сочетание клавиш C+x t i). -При этом у вас запросят имя пользователя с которым вы хотите пообщаться, и -после установления связи, будет открыт буфер, в котором вы сможете печатать -свои сообщения и видеть ответы. Если пользователь есть в вашем списке -пользователей, то вы можете использовать механизм дополнения для ввода имени. - -Для начала общения в чатах используется команда tnt-join-chat (или сочетание -C+x t j). вы можете ввести имя существующего чата, или ввести новое, и тогда -чат будет создан. Как и в предыдущем случае, создается новый буфер, в котором и -ведутся все переговоры. Для выхода из чата вы можете использовать -tnt-leave-chat (или C+x t l). - -В том случае, если кто-то другой присылает вам приглашение в чат, или -сообщение, то вы можете принять его с помощью tnt-accept (C+x t a) или -отклонить с помощью tnt-reject (C+x t r) — это может быть полезным, если вы -заняты, или не хотите беседовать с данным пользователем. В том случае, если вы -получаете несколько сообщений, или приглашений в чат, то они накапливаются в -очереди, в которой их можно просматривать с помощью команд tnt-next-event (C+x -t n) — для получения следующего сообщения, и tnt-prev-event (C+x t p) — для -получения предыдущего сообщения. - -_Прочие команды_ - -Вы можете формировать списки друзей, для того, чтобы быстро набирать их имена. -Для просмотра существующего списка используется команда tnt-show-buddies (C+x t -b), а для редактирования — команда tnt-edit-buddies (C+x t B). Имена заданные в -этом списке будут использованы для реализации механизма дополнений в строках -ввода, там, где необходим ввод имен пользователей. - -TNT может также работать как мост между AIM и электронной почтой. Это очень -удобно, если вы хотите получать сообщения из AIM на ваш почтовый адрес. Это -выполняется с помощью команды tnt-toggle-email (C+x t M). И для ее работы нужно -задать две переменные tnt-email-to-pipe-to и tnt-email-binary. - -В том случае, если у вас несколько зарегистрированных имен, то вы можете -использовать команду tnt-switch-user (C+x t s) для переключения между разными -именами. - -Команда tnt-mute (C+x t m) может использоваться для включения и отключения -звуковых сигналов, используемых TNT для оповещения пользователя. - -[float] -===== Настройка ===== - -Настройку TNT можно осуществлять как с помощью стандартных механизмов настройки -Emacs, так и с помощью кода на Emacs Lisp. Для вызова настройки можно -использовать команду M+x tnt-customize, или M+x customize-group tnt. - -_Настройка входа в систему_ - -TNT позволяет пользователю использовать несколько учетных записей для -использования. Для задания имени и пароля для входа, сразу после запуска TNT, -используются переменные tnt-default-username и tnt-default-password. А для -задания связей между именами и паролями в учетных записях, используется -ассоциативный список tnt-username-alist. Но будьте осторожны с этими -переменными — помните, что они хранятся в вашем файле настройки как обычный -текст, и в случае установки неправильных прав на файл, могут быть прочитаны -другими пользователями. - -_Настройка звука_ - -TNT позволяет настроить проигрывание разных сигналов в зависимости от разных -событий. Настройка сигналов управляется с помощью переменных tnt-beep-on-..., -например tnt-beep-on-incoming-message. Кроме этого, вы можете настроить то, с -помощью какой программы будут проигрываться звуковые сигналы. Эти настройки -определяются переменными tnt-sound-exec и tnt-sound-exec-args. - -_Прочие настройки_ - -Пользователь имеет возможность настроить множество других параметров, полное -описание которых доступно в файле README из поставки TNT, и которые можно -настроить используя буфер настройки Emacs. - -[float] -==== Jabber ==== - -Поддержку сервиса Jabber в настоящее время осуществляют несколько пакетов для -Emacs — ejab, который уже не развивается (замороженная версия доступна с -http://ejab.sourceforge.net), smyrno, который также почти не развивается, но -обладает достаточным набором возможностей (он доступен с -http://www.nongnu.org/smyrno/) и Jabber.el, который активно развивается и -представляет достаточно полную и расширяемую поддержку протокола Jabber. -Поскольку Jabber.el динамично развивается, то я сосредоточусь исключительно на -данном пакете. - -[float] -===== Получение и установка ===== - -Пакет требует для своей работы GNU Emacs 21 и Gnus 5.10.x (из него нужно только -пара файлов — sha1-el.el и hex-util.el, так что вы можете их установить не -устанавливая весь Gnus), или XEmacs с поддержкой Mule, а также установленными -пакетами gnus, net-utils и mule-ucs. Кроме этого, если установлен пакет FLIM, -то Jabber.el может использовать его для поддержки SASL. - -Установка пакета достаточно проста — надо просто скачать его дистрибутив с -http://emacs-jabber.sourceforge.net, развернуть его и настроить загрузку в -стартовом скрипте Emacs'а, например следующими командами: - ----- -;; если вы установили jabber.el в нестандартное место -(add-to-list 'load-path "path_to_jabber.el_dir") -(require 'jabber) ----- - -После загрузки пакета, необходимо задать имя пользователя и сервера, что -делается с помощью команды M+x jabber-customize. С помощью этой команды можно и -зарегистрировать нового пользователя, если перед выполнением команды задать -префикс. - -[float] -===== Основные действия ===== - -После настройки, Jabber.el готов к работе, необходимо только подключиться к -выбранному серверу Jabber. - -_Подключение, отключение и состояние_ - -Подключение к серверу выполняется одной командой — M+x jabber-connect, после -подключения с помощью команды M+x jabber-send-presence можно отправить на -сервер уведомление о присутствии. Эта команда дает возможность вам указать -статус присутствия, если вы оставили статус пустым, то будет установлено -значение по умолчанию равное Online. - -Для отключения от сервера Jabber, просто выполните команду M+x -jabber-disconnect, и ваше подключение будет закрыто. - -Jabber.el позволяет вам изменять состояние вашей доступности. Это можно сделать -как явно, с помощью команды M+x jabber-send-presence, так и программно, с -помощью этой же функции. Кроме этого, вы можете запрограммировать сервер Jabber -на уведомление вас, об изменении статуса нужного вам человека. Это выполняется -с помощью команды M+x jabber-send-subscription-request. - -_Переговоры (chatting)_ - -После подключения, пользователю становится доступен буфер roster'а, находясь в -котором он может выполняться различные действия. Одно из таких действий — -переговоры (или chatting). Для начала переговоров, нужно лишь выбрать персону с -кем вы будете переговариваться и набрать C+c C+c, и будет создан буфер с именем -*-jabber-chat-:-ИМЯПЕРСОНЫ-*, в котором вы и сможете вести переговоры. - -_Групповые чаты_ - -Для подключения к групповому чату пользователь может использовать команду M+x -jabber-groupchat-join, или использовать сочетание клавиш C+c C+m находясь в -буфере roster'а. После подключения к чату, будет создан буфер с именем -*-jabber-groupchat-:-ИМЯЧАТА-*, что позволяет одновременно участвовать в -нескольких обсуждениях. Работа с буфером осуществляется точно так же, как и при -обычных переговорах. Для выхода из группового чата просто наберите M+x -jabber-groupchat-leave. - -Кроме этого, если вы являетесь владельцем данного чата, пакет позволяет -произвести его настройку, используя команду M+x jabber-groupchat-get-config. - -_Работа с буфером roster_ - -Буфер roster'а называется *-jabber-*, и содержит в себе список контактов вашего -roster'а. С использованием данного буфера проводятся все операции, которые -требуют указания Jabber ID, такие как переговоры, групповые и -многопользовательские чаты, получение информации roster'а и работа с сервисами. - -_Работа с сервисами jabber_ - -Jabber.el позволяет пользователю получить доступ к большинству возможностей -предоставляемых Jabber. Сюда входят — просмотр списка сервисов, поиск в -каталогах, регистрация для использования сервисов, а также поддержка набора -специализированных команд (ad-hoc). - -Для использования каких-либо сервисов, вам сначала нужно их найти. Это может -выполняться двумя способами — поиском (discovering) и просмотром (browsing). -Первый способ является предпочтительным, поскольку использует новые протоколы. -Для поиска сервисов могут использоваться две команды — M+x -jabber-get-disco-items и M+x jabber-get-disco-info, которые выдают информацию -либо о конкретном сервисе, либо о сервисах, относящихся к выбранному сервису. -Эти же команды доступны через меню, которое вызывается сочетанием клавиш C+c -C+i из буфера roster'а. - -Поиск по сервисам выполняется с помощью команды M+x jabber-get-search, или -выбором пункта меню, отображаемого с помощью сочетания клавиш C+c C+s. После -выполнения запроса, вам будет показана форма поиска, которую необходимо -заполнить для его выполнения. - -Регистрация производится аналогично проведению поиска, только используется -команда M+x jabber-get-register. С помощью данного сервиса, вы можете например, -сменить свой пароль, или зарегистрироваться для использования конкретного -сервиса. Как и в случае с поиском, при регистрации, модуль отобразит форму -регистрации, которую вам необходимо будет заполнить. - -Для работы со специализированными командами, пользователь сначала должен -получить их список, поддерживаемых сервером. Это выполняется с помощью команды -M+x jabber-ahc-get-list. Для выполнения специализированной команды, -используется команда M+x jabber-ahc-execute-command. Специализированные команды -могут использоваться, например, для того, чтобы удаленно изменить состояние -вашего клиента, или другие вещи. - -[float] -===== Настройка и расширение возможностей ===== -_Настройка клиента_ - -Настройка клиента выполняется с помощью команды M+x jabber-customize или, что -тоже самое, с помощью команды M+x customize-group jabber. Переходя по разделам -группы, вы можете настроить как основные параметры, такие как имя, сервер, так -и другие, например уведомления о событиях, параметры начертаний (faces) и -различные хуки. - -Этот процесс является интуитивно-понятным, и поэтому я не буду заострять на нем -внимание. Список переменных, которые используются для настройки с помощью этих -команд, приведен в руководстве для Jabber.el. - -_Расширение возможностей пакета_ - -Jabber.el позволяет пользователю расширять возможности пакета, предоставляя -возможности по приему и отправке новых типов запросов и ответов, осуществлять -доступ к данным соединения и многое другое. - -XML, который используется для общения с сервером jabber, представляется в виде -списков, которые создаются модулем xml.el — каждый тег представляется в виде -списка, первым элементом которого является символ представляющий тег, за тем -следует список из списков атрибутов, и затем идут вложенные тэги и содержимое. - -Текущее состояние roster'а представляется списком с именем *jabber-roster*. В -данном списке можно найти подробную информацию о группах, состоянии соединения -и прочих параметрах. - -Подробное описание процесса расширения возможностей пакета приведено в разделе -"Hacking and extending" справочной страницы Jabber.el - -[float] -==== MSN ==== - -Судя по информации в Internet, кроме вышеперечисленных модулей, также -существует и рудиментарная поддержка служб мгновенного обмена сообщениями MSN. -Реализация этого сервиса доступна с -http://www.geocities.co.jp/SiliconValley-SanJose/7474/EmacsLisp.html, но -страницы написаны на японском языке, и поэтому информации не так уж и много, -хотя по скриншоту видно, что клиент работает. - -=== IRC === - -IRC является достаточно популярным сервисом в среде пользователей Unix, которых -много среди пользователей Emacs, и это привело к появлению нескольких пакетов, -поддерживающих данный сервис. В настоящее время наиболее активно развивающимся -является пакет Erc, но существует и альтернативная реализация, Zenirc, которая -также имеет много возможностей, но уже практически не поддерживается (если вы -хотите посмотреть на него, то вы можете найти исходные тексты по адресу -ftp://ftp.splode.com/pub/zenirc). - -Дальнейший рассказ будет в основном про пакет Erc, хотя может быть я буду -упоминать и его конкурента. - -[float] -==== Основные возможности пакета Erc ==== - -Пакет Erc предоставляет для пользователя множество возможностей, вот основные: - -* Поддержку работы с несколькими каналами и серверами. Каждый канал работает - в своем буфере; -* Уведомления; -* Дополнения имен пользователей; -* Поддержку разных языков; -* Отслеживание активности на каналах; -* Расширение возможностей, за счет написания скриптов; -* Подсветку ключевых слов и различных действий; -* Взаимодействовать с другими средствами обмена сообщениями, используя - BitlBee (более подробно о настройке Erc для использования вместе с BitlBee - смотрите страницу http://www.emacswiki.org/cgi-bin/wiki?BitlBee; -* и многое, многое другое. - -Пакет работает как с GNU Emacs, так и с XEmacs. - -[float] -==== Установка пакета ==== - -Исходные тексты Erc доступны по адресу http://sourceforge.net/projects/erc/. -Необходимо только раскрыть полученный архив, и поместить несколько команд в ваш -файл инициализации, например вот так: - ----- -(add-to-list 'load-path "path_to_erc_dir") -(require 'erc) ----- - -Это минимальный набор команд, необходимых для загрузки данного пакета. Но Erc -предоставляет намного больше возможностей, поэтому у человека, который часто -пользуется данным пакетом, файл инициализации выглядит намного сложнее. вы -можете найти такие примеры на Emacs WiKi, или в разделе Пример файла -инициализации Erc. А более подробно про настройку я расскажу в разделе -Настройка клиента. - -[float] -==== Основные операции ==== - -Начала работы вам необходимо набрать команды M+x erc-select, которая запросит у -вас имя сервера, порт и другие параметры. Вы можете задать эти параметры один -раз произведя настройку клиента (см. раздел Настройка клиента). В зависимости -от настройки, клиент может сразу подключиться к нужным вам каналам — это -выполняется пакетом erc-autojoin, который поставляется с Erc. - -После того, как вы подключились к IRC-серверу, вы можете выполняться обычные -команды IRC — подключение к новым каналам, получение информации и много других -вещей. Команды вводятся в строке, которая начинается с ERC>. -//Окно канала может -//выглядеть как изображено на рисунке Окно сеанса Erc, -Кроме того, вы можете использовать стандартные команды Emacs для разделения -фрейма на несколько окон и отображать в них разные каналы. - -//Рисунок 1. Окно сеанса Erc -//Окно сеанса Erc - -Во время работы, erc изменяет строку состояния, в которой отображает имя канала -и сервера, а также изменение статуса других каналов, в виде сокращения # и -первой буквы имени канала, и разным цветом, синим — когда кто-то заходит на -канал или покидает в него, и красным когда кто-то беседует на канале. В верхней -строке окна отображается название канала, текущий лаг, и тема канала. Кроме -этого, erc позволяет использовать стандартные механизмы дополнения имен -пользователей и каналов, при их наборе. - -Для того, чтобы закончить работу с IRC, наберите команды erc-quit-server. - -[float] -==== Модули Erc ==== - -В составе Erc идет некоторое количество модулей, которые расширяют основную -функциональность пакета. Для каждого из этих модулей пользователь может -выполнить дополнительную настройку, управляющую его поведением. Часть модулей -загружается автоматически, а некоторые требуют индивидуальной загрузки. Список -автоматически загружаемых модулей хранится в переменной erc-modules. - -Ниже приведен список наиболее часто используемых модулей, и того какие -настройки для них могут выполняться. - -[float] -===== erc-autojoin ===== - -Данный пакет позволяет запоминать на какие каналы заходил пользователь -используя команды /JOIN и /PART, и при следующем сеансе использования erc -восстановить сохраненную конфигурацию. Список автоматически подключаемых -каналов сохраняется в переменной erc-autojoin-channels-alist. Данная переменная -состоит из списков вида "имя сервера" "канал1" "канал2"..., например: - ----- -(setq erc-autojoin-channels-alist - '(("freenode.net" "#emacs" "#arch" "#squiddev"))) ----- - -По умолчанию, данный режим включен, и используется. - -[float] -===== erc-button ===== - -Данный модуль позволяет создать нажимаемые кнопки на основе текста буфера. По -умолчанию данный режим включен, и используется для организации нажимаемых -кнопок для самых разных объектов, таких как: - -* адресов сайтов (URL's); -* запросов к Google; -* имен пользователей IRC; -* RFC (что позволяет сразу перейти к нужному документу); -* разделов документации в формате Info; -* интернет-времени. - -Пользователи могут определять и свои типы, используя механизм сокращений -(abbrevs). Кроме этого, пользователь имеет возможность перехода между кнопками, -используя сочетание C+c C+w C+b для перехода на предыдущую кнопку, и C+c C+w -C+f для перехода на следующую. - -[float] -===== erc-track ===== - -Данный модуль позволяет отслеживать изменения в буферах erc — данный режим -включен по умолчанию. При использовании данного модуля, в строке статуса -отображается список каналов, в которых произошли изменения. По умолчанию, -отслеживается вся активность — вход новых посетителей, выход с канала, и -изменение имени, что не всегда нужно знать. С помощью переменной -erc-track-exclude-types вы можете исключить некоторые команды из списка -отслеживаемой активности. Например, вот так: - ----- -(setq erc-track-exclude-types '("JOIN" "NICK" "PART" "QUIT")) ----- - -Для перехода в буфер, в котором, в последнем была какая-либо активность, вы -можете использовать сочетание клавиш C+c C+space или C+c C+@. В том случае, -если нет больше активных каналов, данное сочетание переключает вас в тот буфер, -в котором вы работали перед этим. - -[float] -===== emacs-completion ===== - -Данный модуль позволяет использовать дополнение имен каналов и посетителей, а -также команд Erc, используя клавишу TAB. Этот модуль разрешен по умолчанию, и -для своей работы использует программируемый механизм дополнений, который -реализуется библиотекой pcomplete, которая обычно поставляется с Emacs. В том -случае, если у вас нет этой библиотеки, вы все равно можете воспользоваться -возможностями дополнения, переключившись на использование старого механизма, -правда это не рекомендуется делать — лучше установите библиотеку pcomplete. - -[float] -===== rc-fill ===== - -По умолчанию Erc позволяет красиво заполнять и выравнивать отображаемый текст. -По умолчанию используется режим заполнения, с переменным префиксом, зависящим -от длины имени посетителя, который написал данное сообщение. Однако вы можете -изменить эту настройку с помощью установки переменной erc-fill-prefix, в -которой вы можете задать данные для заполнения — например, несколько пробелов -подряд. Кроме этого, существуют и другие варианты заполнения, про которые вы -можете прочитать на Emacs WiKi. - -[float] -===== erc-stamp ===== - -Кроме всего прочего, Erc позволяет вам вставлять в текст буферов временные -пометки, для того, чтобы вам было удобней просматривать журналы бесед, или -точно находить нужную беседу. По умолчанию данный модуль не подгружается -автоматически, так что вам необходимо добавить его к списку загружаемых -модулей. Для настройки отображения можно задать несколько переменных, которые -будут описывать вид отображаемых временных пометок, и другие параметры. - -[float] -===== erc-netsplit ===== - -Данный модуль обеспечивает определение отключение от сети целых IRC-серверов -(так называемый netsplit), и подключение ранее отключенных серверов. Вы можете -выполнять свой код в данных случаях, воспользовавшись хуками erc-netsplit-hook -и erc-netjoin-hook. - -[float] -===== erc-autoaway ===== - -Иногда вы отходите от клавиатуры на длительный срок, и можете забыть сообщить -серверу, что вы отсутствуете. Чтобы это делалось автоматически, с Erc -поставляется модуль erc-autoaway, который сам изменит режим после заданного -отрезка времени. Данный модуль не загружается автоматически, так что вам нужно -самим подключить его, с помощью команд, подобных этим: - ----- -(require 'erc-autoaway) -(setq erc-autoaway-idle-seconds 600) -(setq erc-auto-discard-away t) ----- - -первая команда подгружает сам модуль, вторая задает через сколько времени вы -будете считаться отсутствующим, а последняя задает режим автоматического выхода -из режима отсутствия, если вы что-то напишете в каком-либо из буферов. - -[float] -===== erc-log ===== - -Erc позволяет вам сохранять журналы бесед на IRC. Для этого существует модуль -erc-log. Однако, данная возможность не подключается автоматически, а требует -ручной загрузки, например вот так: - ------ -(require 'erc-log) -(setq erc-log-channels-directory "~/.irc/logs/") ------ - -первая команда загружает нужный модуль, а вторая задает расположение для -журнальных файлов. - -Сохранение журналов может производиться несколькими способами. Для обычных -пользователей, наиболее приемлемым будет использование команды - ------ -(setq erc-save-buffer-on-part t) ------ - -что приведет к сохранению журналов при выходе из канала. Однако пользователи -могут явно сохранить журналы с помощью сочетания клавиш C+c C+l или явно -выполнив команду M+x erc-save-buffer-in-logs. Вы можете также поместить -временные метки в сохраняемые журналы — это контролируется с помощью переменной -erc-hide-timestamps. - -Erc умеет восстанавливать часть содержимого предыдущих сессий используя -журнальные файлы. Если вы хотите, чтобы в буфере отображались старые разговоры, -то установите переменную erc-log-insert-log-on-open в истинное значение. По -умолчанию, данная переменная равна nil. - -Более подробную информацию о настройке журналирования, а также о возможных -проблемах, и способах их решения читайте на Emacs WiKi. - -[float] -===== erc-nickserv ===== - -В некоторых IRC-сетях вы можете зарегистрировать свое имя, и таким образом -избежать возможных конфликтов между пользователями. Эта возможность реализуется -с помощью сервиса под названием NickServ. По умолчанию, когда вы входите в -такую сеть, в ответ на приглашение сервера, erc в мини-буфере запрашивает у вас -пароль для регистрации. Чтобы избежать повторяющихся действий, был разработан -модуль erc-nickserv, который идет в поставке erc, но не загружается -автоматически. Настройку этого модуля можно выполнить с помощью следующих -команд: - ----- -(require 'erc-nickserv) -(erc-nickserv-mode t) -(setq erc-prompt-for-nickserv-password nil) -(setq erc-nickserv-passwords - '((freenode (("nick" . "password"))))) ----- - -Первые две команды загружают модуль и включают соответствующий режим. Третья -команда отключает запрос пароля у пользователя при запросе от сервера. Ну а -четвертая команда задает параметры ассоциативного списка, описывающего сервера, -имена и пароли для них. Для каждого из серверов, вы можете задать одно или -несколько имен, и соответствующие пароли для них. Заметьте, что в качестве -ключа списка задается символ, соответствующий IRC-сети. Отображение между -именами сетей и доменными именами серверов хранится в переменной erc-networks, -которую вы при необходимости можете изменять. - -[float] -===== erc-truncate ===== - -В том случае, если вы постоянно пользуетесь IRC, размеры буферов с разговорами, -могут расти очень быстро, и поэтому может быть желательно держать их в рамках -определенных размеров. Для этого используется модуль erc-truncate, которые -следит за размерами буферов каналов, и при необходимости выбрасывает лишние -данные. Данный модуль поставляется с erc, но не загружается автоматически. - -Параметры модуль контролируются несколькими переменными. Переменная -erc-max-buffer-size задает максимальный размер буфера, в байтах. А если -установлена переменная erc-truncate-buffer-on-save, то обрезание буферов будет -происходить при сохранении журналов. вы также можете явно выполнить обрезание -буферов, используя команду M+x erc-truncate-buffer. - -[float] -===== erc-dcc и erc-xdcc ===== - -Для Erc реализована поддержка прямой передачи данных между клиентами (DCC), -которая реализуется с помощью модуля erc-dcc. Данный модуль не загружается -автоматически, так что вы должны сделать это сами. После загрузки этого модуля, -вам будут доступны команды /dcc, которые вы можете использовать для разговоров, -и для передачи файлов между клиентами. - -Кроме этого, в Erc реализована возможность организации файловых сервисов, на -основе IRC. Эта возможность реализуется с помощью модуля erc-xdcc. - -[float] -===== Прочие модули ===== - -Кроме описанных выше модулей существуют еще и другие: - -* erc-bbdb — для интеграции erc и BBDB; -* erc-notify — для организации оповещения, когда определенный пользователь - входит или выходит из сети; -* erc-smileys — для преобразования smileys в изображения с соответствующими - эмоциями; -* erc-sound — для проигрывания звуков при некоторых событиях; -* erc-nicklist — отображает список имен для данного канала в отдельном - буфере; -* erc-speedbar — обеспечивает интеграцию erc и speedbar; -* erc-chess — позволяет играть в шахматы с другими пользователями на IRC; -* erc-lang — реализует новую команду /lang для выбора языка на канале; -* erc-list — обеспечивает быстрый механизм получения списка каналов; -* erc-menu — добавляет меню к буферам Erc, что может быть очень удобно, - особенно для начинающих пользователей; -* erc-speak — позволяет проговаривать содержимое разговоров с помощью - Emacspeak; -* erc-page — обеспечивает обработку /ctcp page команд; -* erc-replace — выполняет замены в тексте сообщений. - -[float] -==== Настройка клиента ==== - -Настройку Erc можно выполнить используя команду M+x customize-group erc. -Появившееся окно настройки позволяет вам задать основные параметры клиента, а -также перейти к настройку разных подсистем клиента. Но кроме визуальной -настройки, вы можете и сами определять порядок инициализации, используя Emacs -Lisp. - -[float] -===== Настройка auto-query ===== - -Erc позволяет настроить свое поведение в отношении личных сообщений. По -умолчанию, они отображаются в буфере сервера, что не всегда удобно, когда ты -разговариваешь с несколькими людьми. Однако, с помощью переменной -erc-auto-query вы можете изменить поведение Erc. Среди разрешенных значений: - -* 'buffer — показывать личные сообщения в отдельном буфере; -* 'window — показывать новые сообщения в новом, выбранном окне; -* 'window-noselect — то же, что и предыдущее, но без перехода в новое окно; -* 'bury — создает новый буфер, но не переходит в него; -* 'frame — открывает новый фрейм. - -вы можете создавать такие буфера не только для личных сообщений, но и для -уведомлений сервера. Это делается добавлением соответствующего хука. - -[float] -===== Игнорирование и скрытие лишней информации ===== - -С помощью Erc вы можете делать часть информации невидимой. Это относится как к -посетителям серверов, так и к различным уведомлениям, поступающим от самих -серверов. - -Например, чтобы не отображать данные о входе и выходе с каналов, вы можете -использовать переменную erc-hide-list, в качестве значения которой задается -список игнорируемых команд. Например, вот так: - ----- -(setq erc-hide-list '("JOIN" "PART")) ----- - -Для временного игнорирования сообщений от какого-либо посетителя, вы можете -использовать команду /IGNORE, но она будет действовать только до окончания -сессии. Для установки постоянного игнорирования, вам необходимо в переменной -erc-ignore-list задать список имен пользователей, или регулярных выражений, -которые будут приводить к игнорированию сообщений от посетителей, чьи имена и -сетевые адреса подпадают под заданное выражение. - -Кроме этого, вы можете скрывать часть содержимого, основываясь на более сложных -вещах, например, если кто-то произносит определенные фразы, или разговаривает с -роботами, засоряя канал ненужным текстом. Как это сделать описано на странице -Emacs WiKi. - -[float] -===== Настройка подсветки ===== - -Erc позволяет вам подсвечивать различные части сообщений на канале. Вы можете -подсвечивать текст, имена пользователей, при этом по умолчанию есть разделение -на "друзей" и "дураков" :-) вы можете задать список имен, и они будут -отображаться с заданным оформлением. По умолчанию этот режим отключен, но вы -можете его легко включить с помощью команды M+x customize-group erc-match. В -этой группе вы также обнаружите опции для настройки списков друзей, подсветки -вашего собственного имени, а также можете задать подсветку произвольного -текста. Для настройки параметров отображения, воспользуйтесь группой настройки -erc-faces. - -[float] -===== Настройка кодировок каналов ===== - -Erc позволяет своим пользователям использовать разные кодовые страницы для -разных каналов (конечно, это только для тех пользователей, которые используют -Emacs с поддержкой mule). Используя переменную erc-encoding-coding-alist вы -можете задать соответствие между именами каналов, и кодировками, которые -используются на этих каналах. Например, я могу нормально общаться на -немецко-говорящих каналах, хотя на остальных каналах будет использоваться -кодировка koi8-r. - -[float] -===== Хуки ===== - -По реализации Erc, по большей части управляется событиями, которые -обрабатываются соответствующими хуками. Существующие хуки можно разделить на -несколько больших групп: - -* Хуки для сообщений сервера; -* Хуки для /ctcp команд; -* Хуки для отображения и ввода; -* Прочие хуки. - -_Хуки для сообщений сервера_ - -Стандарт для IRC определяет, что сервер должен посылать команды клиентам в -специальном формате. Сама команда может быть либо трехзначным числом, либо -именем команды. При получении данных команд Erc запускает соответствующий -обработчик, и при его выполнении также запускает соответствующий хук, который -именуется erc-server-команда-hook. - -_Хуки для команд /ctcp_ - -Для команд /ctcp существует два вида хуков — когда вы получаете запрос на -выполнение команды, и когда вы получаете ответ о выполнении команды. -Соответственно запускаются хуки erc-ctcp-query-команда-hook и -erc-ctcp-reply-команда-hook. - -_Хуки для отображения и ввода_ - -Эти хуки также делятся на две группы — для отображения, и для обработки ввода. - -К хукам отображения относятся: - -* erc-insert-pre-hook — вызывается перед вставкой сообщения в буфер; -* erc-insert-modify-hook — вызывается когда текст уже вставлен, но при этом, - буфер в которые вставлен текст, сужается до самого текста; -* erc-insert-post-hook — вызывается после вставки текста, но может - обрабатывать весь буфер. - -К хукам ввода относятся: - -* erc-send-pre-hook — вызывается перед отправкой введенного пользователем - сообщения; -* erc-send-modify-hook — вызывается после вставки текста в буфер, но при - этом, буфер в которые вставлен текст, сужается до самого текста; -* erc-send-post-hook — вызывается после вставки текста, но может - обрабатывать весь буфер. - -erc-send-modify-hook и erc-send-post-hook никаким образом не влияют на -отправляемый на сервер текст, и в основном могут использоваться для изменения -параметров отображения текста в буфере. - -_Прочие хуки_ - -* erc-mode-hook — вызывается для каждого буфера erc — буферов каналов, - буферов серверов и т.п.; -* erc-timer-hook — вызывается при получении любого события от сервера; -* erc-before-connect и erc-after-connect — вызываются перед подключением к - конкретному серверу, а также после выдачи сервером сообщения дня (MOTD). - -[float] -===== Пример файла инициализации Erc ===== - -Ниже приведен пример настройки Erc, который используется у меня. Я буду писать -комментарии сразу в коде, чтобы сделать его понятным: - ----- -;; здесь мы просто загружаем erc -(add-to-list 'load-path "~/emacs/erc") -(require 'erc) - -;; загружаем авто-подключение к каналам, и задаем список каналов для -;; подключения -(require 'erc-autojoin) -(erc-autojoin-mode t) -(setq erc-autojoin-channels-alist - '(("relay2" "#dansguardian" "#emacs" "#arch" "#linux.de" - "#c.de" "#squiddev"))) - -;; -(require 'erc-fill) -(erc-fill-mode t) - -;; задаем персональные данные, хотя их можно задать и через -;; M-x customize-group erc -(setq erc-user-full-name "Alex Ott") -(setq erc-email-userid "alexott@gmail.com") - -;; часть относящаяся к логированию переговоров на каналах -;; нужно ли вставлять старый лог в окно канала? -(setq erc-log-insert-log-on-open nil) -;; логировать переговоры на каналах? -(setq erc-log-channels t) -;; где будут храниться логи -(setq erc-log-channels-directory "~/.irclogs/") -;; сохранять ли логи при возникновении PART -(setq erc-save-buffer-on-part t) -;; убирать или нет временные отметки? -(setq erc-hide-timestamps nil) -;; максимальный размер буфера канала -(setq erc-max-buffer-size 500000) ----- - -большую часть использованных переменных можно установить воспользовавшись -командами настройки Emacs, я показал этот пример только для наглядности. вы -можете найти большое количество примеров настройки на страницах Emacs WiKi. - -=== Дополнительная информация === - -Вы можете найти огромное количество информации о Erc на страницах Emacs WiKi по -адресу http://www.emacswiki.org/cgi-bin/emacs-en/EmacsIRCClient. Там вы сможете -найти множество советов по настройке клиента, а также по интеграции его с -различными приложениями, например, клиентом для игры в шахматы. diff --git a/old-docs/filesystems_use.txt b/old-docs/filesystems_use.txt deleted file mode 100644 index e03a775..0000000 --- a/old-docs/filesystems_use.txt +++ /dev/null @@ -1,116 +0,0 @@ -//// -Пакет: docs-filesystems_use -RPM файл: docs-filesystems_use-0.1-alt1.noarch.rpm -Аннотация: В документе описаны базовые операции с файловыми системами в - Linux: монтирование и проверка целостности (fsck). Дан - пример fstab. Документ представляет собой фрагмент из книги - ``Руководство по установке и использованию системы Linux'' - с некоторыми дополнениями из документации ALT Docs. -Автор: Мэтт Уэлш (Matt Welsh), М. Гильман (перевод) -Лицензия: GPL -URL: http://docs.altlinux.org/archive/2.4/master/alt-docs-master/ch06s08.html -//// - -== Работа с файловыми системами == - -=== Монтирование файловых систем === - -Прежде, чем файловая система станет доступной операционной системе, она должна -быть смонтирована (mounted) в некоторый каталог. Например, если имеется -файловая система на дискете, то для того, чтобы обеспечить доступ к её файлам, -её нужно смонтировать, например, в каталог /mnt/floppy — этот каталог -называется точкой монтирования. После монтирования этой файловой системы все её -файлы оказываются в соответствующем каталоге. После размонтирования -(unmounting) файловой системы этот каталог окажется пустым. - -То же самое относится и к файловым системам на жёстком диске. Так называемая -корневая файловая система (root file system) монтируется в каталог /. Если -имеется отдельная файловая система /home, то она монтируется в каталог /home. -Если имеется лишь корневая файловая система, то все файлы (включая и те, -которые находятся в каталоге /home) находятся только в ней. Операционная -система автоматически монтирует файловые системы, расположенные на жёстких -дисках, во время загрузки. Файловые системы на съёмных носителях (такие как -дискеты, CD-ROM и проч.) также в большинстве случаев монтируются автоматически -при помощи программы automount. - -Для монтирования и размонтирования файловых систем используются программы mount -и umount (не unmount). Команда mount -av выполняется автоматически во время -загрузки системы. Информация о файловых системах и точках монтирования -находится в файле /etc/fstab. Пример файла /etc/fstab приведён ниже. - ----- -# device directory type options -# (устройство) (каталог) (тип) (опции) -# -/dev/hda1 / ext3 defaults -/dev/hda2 /home ext3 defaults -/dev/cdrom /mnt/cdrom auto user,noauto,ro -/dev/hda4 none swap swap -/proc /proc proc none ----- - -На первом поле (device) находится имя раздела, который нужно монтировать. -Второе поле — точка монтирования. Третье поле — тип файловой системы, auto -здесь обозначает, что тип файловой системы должен определяться автоматически. -Последнее поле содержит опции монтирования. Часто они бывают установленными по -умолчанию (defaults). В приведённом примере опция user обозначает, что файловая -система может быть смонтирована обычным пользователем (обычно это — привилегия -суперпользователя), noauto — что файловая система не будет смонтирована -автоматически при загрузке. Подробнее об опциях монтирования можно узнать из -экранной документации по mount. Ниже перечислены поддерживаемые в ALT Linux 2.3 -Junior типы файловых систем. - -Ext2:: - Является наиболее традиционной для Linux и самой стабильной из всех -доступных файловых систем, однако она не является журналируемой, т. е. в случае -перебоя питания и т. п. сбоев вся информация, которая не была записана на диск, -будет утрачена и возможно появление ошибок в файловой системе. Поэтому после -сбоя требуется произвести проверку файловой системы при помощи fsck. - -Ext3:: - Развитие Ext2 с поддержкой журналируемости; хорошо совместима с Ext2. Ext2 -может быть легко преобразована в Ext3 командной tune2fs -j /dev/hdXN. Для -обратного преобразования достаточно смонтировать этот раздел как Ext2. - -ReiserFS:: - Журналируемая система, оптимизированная под каталоги, содержащие большое -количество файлов, а также под небольшие файлы. Для использования в данный -момент рекомендуется версия 3.6 для ядер 2.4.x. - -ISOFS:: - Используется на носителях CD-ROM. - -UDF:: - Используется на носителях DVD-ROM. - -VFAT:: - Используется в операционных системах Microsoft Windows 9x, Microsoft -Windows 2000. - -NTFS:: - Используется в операционных системах Microsoft Windows NT, Microsoft -Windows XP. В настоящее время поддерживается только чтение файловых систем -этого типа. - -Файловые системы ISOFS и UDF используются в носителях CD/DVD-ROM; VFAT и NTFS -используются семейством ОС Microsoft. - -В файл /etc/fstab также включена информация о swap-разделах. Они имеют точку -монтирования none (т. е. не монтируются) и тип swap. - -Файл /etc/fstab содержит одну специальную запись для файловой системы /proc. -Эта файловая система содержит информацию о протекающих в системе процессах, -доступной памяти и т. д.. Если раздел /proc не смонтирован, то команды типа ps -не будут работать. - -=== Проверка файловой системы === - -В Junior проверка файловых систем на наличие повреждённых файлов выполняется -автоматически во время загрузки в случае необходимости, а также регулярно — в -профилактических целях. Однако иногда требуется вручную запустить проверку: для -этого достаточно отдать команду fsck /dev/hdXN, и она сама автоматически -определит тип проверяемой файловой системы и запустит нужную команду. - -Перед проверкой файловую систему полезно размонтировать, а если программа fsck -будет производить какие-либо восстановления в файловой системе, то это сделать -необходимо. diff --git a/old-docs/finding.txt b/old-docs/finding.txt deleted file mode 100644 index 56987b1..0000000 --- a/old-docs/finding.txt +++ /dev/null @@ -1,111 +0,0 @@ -//// -Пакет: docs-finding -RPM файл: docs-finding-0.1-alt1.noarch.rpm -Аннотация: Кратко о поиске в файловой системе как таковом и более - подробно про использование find -Автор: Антон Бояршинов -Лицензия: FDL -URL: http://heap.altlinux.org/modules/finding.boyarsh/index.html -//// - -== Поиск == - -Поиск информации в файловой системе можно условно разделить на поиск по -атрибутам файла (понимая их расширительно, то есть включая имя, путь и т. п.) и -поиск по содержимому. Для этих видов поиска как правило используются программы -find и grep соответственно. Благодаря удобным средствам межпроцессного -взаимодействия, эти два вида поиска легко объединить, то есть искать нужную -информацию только в файлах с нужными атрибутами[1]. - -[NOTE] -Необходимость искать файлы с нужными атрибутами среди файлов с нужным -содержимым возникает реже, так как поиск по атрибутам в общем случае работает -намного быстрее. - - -=== Поиск по атрибутам === - -Основным средством поиcка по атрибутам файла является программа find. -Обобщенный вызов find выглядит так: find путь выражение, где путь — это список -каталогов, в которых надо искать, а выражение — набор выражений, описывающих -критерии отбора файлов и действия, которые надо произвести над найденными -файлами. По умолчанию имена найденных файлов просто выводятся на стандартный -вывод, но это можно переопределить и передавать список имён найденных файлов -любой команде для обработки. По умолчанию find ищет во всех подкаталогах -каталогов, заданных в списке путей. Выражения - -Выражения, определяющие критерии поиска файлов, состоят из пар ключ — значение. -Ниже перечислены некоторые из возможных параметров поиска: - --amin, -anewer, -atime:: - Время последнего доступа к файлу. Позволяет искать файлы, которые были -открыты в некоторый период времени, или наоброт, файлы, к которым никто не -обращался в течение некоторого периода. - --cmin, -cnewer, -ctime:: - Время последнего изменения статуса файла. - --fstype:: - Тип файловой системы, на которой расположен файл. - --gid, -group:: - Пользователь и группа, которым принадлежит файл. - --name, -iname:: - Соответствие имени файла заданному шаблону. - --regex, -iregex:: - Соответствие имени файла регулярному выражению. - --path, -ipath:: - Соответствие полного имени файла (с путём) заданному шаблону. - --perm:: - Права доступа. - --size:: - Размер файла. - --type:: - Тип файла. - -[float] -==== Действия ==== - -Программа find может выполнять различные действия над найденными файлами. -Наиболее важные из них: - --print:: - Вывести имя файла на стандартный выход (действие по умолчанию); - --delete:: - удалить файл; - --exec:: - выполнить команду, передав ей в качестве параметра имя файла. - -Об остальных можно прочитать в экранной документации по команде find, отдав -команду man find. - -[float] -==== Параметры ==== - -Параметры влияют на общее поведение find. Наиболее важные из них: - --maxdepth:: - максимальная глубина поиска в подкаталогах; - --mindepth:: - минимальная глубина поиска в подкаталогах; - --xdef:: - поиск только в пределах одной файловой системы. - -Об остальных можно прочитать в экранной документации по команде find. - -Пример 1. Перекодировка имён файлов и каталогов из koi8-r в cp1251 - ----- -find ./ -print | tac | sed -e 's/"/\\"/' | while read name; do mv "$name" - "`dirname "$name"`/`basename "$name" | iconv -f koi8-r -t cp1251`"; done ----- diff --git a/old-docs/firewall.txt b/old-docs/firewall.txt deleted file mode 100644 index 036d7e9..0000000 --- a/old-docs/firewall.txt +++ /dev/null @@ -1,122 +0,0 @@ -//// -Пакет: docs-firewall -RPM файл: docs-firewall-0.1-alt2.noarch.rpm -Аннотация: Краткое описание принципов работы iptables -Автор: Андрей Горев -Лицензия: FDL -URL: http://docs.altlinux.org/archive/2.4/master/alt-docs-master/ch06s05.html -//// - -== Сетевая безопасность == - -Безопасность бывает различная, в данном разделе мы рассмотрим внешнюю сетевую -безопасность. Главным правилом для обеспечения безопасности при доступе по -сети, является следующее условие: выключайте на сервере весь неиспользуемый -сервис! Команды netstat -anp | grep udp и netstat -anp | grep LISTEN помогут -определить, какой сервис в данный момент предоставляет ваш сервер. Отключить -ненужный сервис вы можете с помощью команд chkconfig или ntsysv. - -Вторым правилом будет следующее: по возможности обновляйте серверные компоненты -из updates дистрибутива, особенно в том случае, если в обновлениях исправлены -ошибки в безопасности. Подпишитесь на список рассылки security-announce По -этому списку приходит очень немного сообщений, но содержащаяся в них информация -и объявления могут иметь очень большое значение для безопасности вашей системы. - -Третьим правилом можно считать следующее: не подключайте критически важные -ресурсы к глобальной сети Интернет, если это возможно. - -Четвёртое правило: используйте где возможно криптование, ssh-туннелирование, -SSL-подписи. Это предохранит ваш трафик от подслушивания. - -Последнее правило — фильтруйте весь нежелательный трафик. Об этом поговорим -подробнее. - -=== Настройка межсетевого экрана === - -Для построения фильтра пакетов на уровне ядра в Linux применяются следующие -пакеты: для ядер 2.2 — ipchains; для ядер 2.4 — iptables; для ядер 2.6 — -iptables и ebtables. Далее будем рассматривать iptables как наиболее популярный -для настройки межсетевого экрана. - -Фундаментальную информацию по настройке iptables и пакетного фильтра на его -основе, включая настройку маскарадинга и NAT, с примерами и готовыми скриптами, -можно найти в статье -http://gazette.linux.ru.net/rus/articles/index-iptables-tutorial.html. - -Фильтр пакетов — это программа (iptables) которая просматривает заголовки -пакетов по мере их прохождения, и решает дальнейшую судьбу всего пакета. Фильтр -может сбросить DROP-пакет (т. е. как будто пакет и не приходил вовсе), принять -ACCEPT-пакет (т. е. пакет может пройти дальше), или сделать с ним что-то ещё -более сложное. - -Под Linux, фильтр пакетов встроен в ядро (как модули), и мы можем делать с -пакетами несколько хитроумных вещей, но основной принцип в просмотре заголовков -пакетов и решении их дальнейшей судьбы сохраняется. - -Ваша текущая настройка межсетевого экрана хранится в ядре, и соответственно -будет потеряна при перезагрузке системы. Для сохранения текущих настроек -существует команда iptables-save. Она помогает сохранить настройки в файле -/etc/sysconfig/iptables. Не исправляйте этот файл вручную! Конфигурация из него -зачитывается и восстанавливается при запуске сервиса iptables. Альтернативным -вариантом будет размещение в каталоге /etc/rc.d сценария rc.firewall, -производящего настройку межсетевого экрана. Файл сценария, естественно, должен -быть исполняемым. - -Для того, чтобы разобраться в работе iptables, необходимо понять, как пакеты -проходят цепочки. На рисунке представлен этот механизм. Как видите, по левой -цепочке пакет проходит в случае когда ваш маршрутизатор переправляет пакет -дальше, а по правой — когда это локальный трафик, или предназначенный самому -маршрутизатору. - -//http://docs.altlinux.org/archive/2.4/master/alt-docs-master/images/tables_traverse.jpg - -Более наглядно можно себе представить картину маршрутизации на примере -межсетевого экрана, установленного между домашней сетью и Интернет (см. -следующий рисунок). - -//iptables3.jpg - -О назначении самих цепочек и расширенных возможностях iptables читайте -документацию по представленной выше ссылке или man iptables. - -Для примера приведём несколько правил. - ----- -# Политики цепочек по умолчанию. Если межсетевой экран не находит описания для -# данного пакета, он поступает с ним согласно этих правил. - -iptables -P INPUT DROP -iptables -P OUTPUT ACCEPT -iptables -P FORWARD DROP - -# Обнуление существующих цепочек - -iptables -F INPUT -iptables -F OUTPUT -iptables -F FORWARD - -# Защита от Syn-flood. -iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT - -# Защита от скрытого сканирования портов. -iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit ---limit 1/s -j ACCEPT - -# Защита от Ping of death. -iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --j ACCEPT - -# Запрещаем NEW и INVALID входящие пакеты с ppp. -iptables -A INPUT -i ppp+ -m state --state NEW,INVALID -j DROP - -# Разрешаем пакеты, принадлежащие и относящиеся к уже установленному -# соединению. -iptables -N block -iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT -iptables -A block -m state --state NEW -i ! ppp+ -j ACCEPT -iptables -A block -j DROP - -iptables -A INPUT -j block ----- - -В этих правилах описывается примерная защита для одиноко стоящего хоста с коммутируемым (или ADSL) подключением к Интернет. В самом конце цепочки INPUT осуществляется переход в самодельную цепочку block. diff --git a/old-docs/freesoft_history.txt b/old-docs/freesoft_history.txt deleted file mode 100644 index 8e38a10..0000000 --- a/old-docs/freesoft_history.txt +++ /dev/null @@ -1,847 +0,0 @@ -//// -Пакет: docs-freesoft_history -RPM файл: docs-freesoft_history-0.1-alt2.noarch.rpm -Аннотация: Изложена история появления понятия ``свободное программное - обеспечение'' и свободных лицензий. -Автор: Кирилл Маслинский, Пётр Новодворский, Георгий Курячий -Лицензия: FDL -URL: http://heap.altlinux.org/kirill/LinuxIntro/Linux.html -Comment: На http://heap.altlinux.org было больше информации, чем - в пакете. Текст ниже содержит информацию из ссылки в том - числе. -//// - -== История возникновения свободного ПО == - -=== Разработка ПО как научное исследование === - -Особенность программного обеспечения состоит в том, что оно производится в -одной форме — в виде исходного текста (source code), а распространяется и -используется в другой — в виде двоичной программы, машинных кодов, по которым -невозможно однозначно восстановить исходный текст. Чтобы изменять программу, -исправлять ошибки или даже просто точно установить, что и как делает программа, -необходимо располагать её исходным текстом. - -Первоначально создание программного обеспечения для компьютеров было в первую -очередь академическим занятием. Для специалистов в области компьютерной науки -(computer science) каждая программа представляла собой результат научного -исследования, в некотором смысле аналогичный публикации статьи. Это означает, -что исходный текст программы был обязательно доступен всему научному -сообществу, поскольку любой научный результат должен быть верифицируем, т. е. -подтверждаться другими исследователями и быть открытым для критики. Таким -образом, процесс разработки программного обеспечения более принципиально схож с -научным процессом: учёный брал существующие программы, исправлял их в -соответствии со своими идеями и публиковал исправленные программы — новый -результат. - -Однако технология производства компьютеров развивалась не менее активно, чем -программное обеспечение для них. В 1970-е годы существует огромное разнообразие -различных архитектур вычислительных машин, различавшихся также и -производительностью, и ценой. Естественно, для каждой архитектуры приходилось -разрабатывать отдельный набор программного обеспечения. С середины 1970-х в -большинстве американских университетов (где преимущественно и развивалась -компьютерная наука) для академических разработок использовались компьютеры -архитектуры PDP-10, что позволило сотрудникам разных университетов использовать -разработки друг друга на своих машинах. Сотрудники лаборатории искусственного -интеллекта массачуссетского технологического института в конце 1970-х -разработали для PDP-10 собственную операционную систему ITS (Incompatible -Timesharing System, несовместимая система с разделением времени) и очень -большой набор программ для неё. Исходные тексты написанных в МТИ программ были -общедоступны, сотрудники других университетов пользовались их исходными -текстами и присылали им исправления, всё программное обеспечение в этих -лабораториях было полностью академическим, а среди учёных-разработчиков был -настоящий дух сотрудничества. - -=== ПО как «патентованный» продукт === - -В условиях огромного многообразия архитектур компьютеров программное -обеспечение составляло неотъемлемую часть самой машины, причём далеко не самую -дорогостоящую часть. Производители компьютеров поставляли их вместе с основным -программным обеспечением, по крайней мере, с операционной системой. -Производство компьютеров было наукоёмким, в основе своей коммерческим -предприятием. - -В ситуации, когда программное обеспечение является объектом продажи наравне с -предметами обихода, на него автоматически распространяются уже не только законы -научной разработки, но и свойства материальных предметов, которыми можно -торговать, обмениваться, право владения и пользования которыми стоит охранять -законодательно. Так, программное обеспечение попало в разряд интеллектуальной -собственности: т. е. исходный текст программы стал рассматриваться как -произведение, объект применения авторского права. Чтобы защитить свои интересы, -производители компьютеров и программного обеспечения используют лицензии — вид -договора между обладателем авторских прав и пользователем (покупателем) -программного обеспечения. Подобные договоры заключались и с университетами, -например, университету передавались исходные тексты программ и право их -изменять, но запрещалось распространять их за пределами университета. Подобные -ограничения означали, что тексты соответствующих программ не могли открыто -обсуждаться в сообществе, т. е. не существовали для научной разработки. Были у -компьютеров и программного обеспечения покупатели и вне академической среды, -например, банки. Таким пользователям не столь важно получить исходные тексты -программ, они заинтересованы в программном обеспечении как в законченном -продукте и готовы платить деньги за надёжные и удобные программы. - -В европейской культуре столь долго вырабатывались правила собственности по -отношению к материальным предметам, что распространение этих прав на предметы -нематериальные — программные продукты — выглядит делом естественным и не -вызывает сомнений. А поводов для сомнений немало. Главное отличие программного -продукта от, допустим, табурета — т. н. безущербное копирование. Если грабитель -отбирает у крестьянина табурет, совершается злодеяние: крестьянин табурета -лишается, терпит ущерб. Если крестьянин отдаёт кому-то табурет добровольно, он -его также лишается, поэтому вправе требовать возмещения ущерба — например, -деньгами. Для того, чтобы ущерба у крестьянина не происходило, табурет нужно -воспроизвести: добыть досок, позвать столяра, краснодеревщика и оплатить их -работу, и один из двух получившихся предметов обихода отдать грабителю. В этом -случае ущерб — денежный — терпит тот, кто оплачивает копирование табурета. -Совершенно естественно при этом законодательно запрещать нанесение ущерба, то -есть признавать право распоряжаться вещью только за одним человеком — за её -хозяином. Никаких дополнительных механических или юридических приспособлений, -запрещающих воспроизводить табуреты, при этом не требуется. - -Иное дело — программный продукт. Сколько бы средств ни было вложено в его -разработку, процедура его копирования (переписывания с одного носителя данных -на другой) резко отличается от процедуры воспроизведения табурета. Она не -требует участия ни одного из авторов программы, ни, по большому счёту, вообще -человека. Единственная расходная статья при этом — цена носителя данных и -амортизация копировального устройства. В результате такого копирования -получается два экземпляра программы, создающие удобства уже для двух человек. -Таким образом, если человек оценивает приносимые программой удобства выше -стоимости носителя данных, копирование — благо. Если же относиться к -программному продукту, как материальной вещи, и закреплять право её -использования за одним каким-то человеком, возникает множество неурядиц, каждую -из которых приходится решать искусственными, а зачастую и противоестественными -методами. - -Например, придётся изыскивать, какой ущерб всё-таки наносится «хозяину» -программы при её безущербном копировании. Обычно при этом фигурирует понятие -«упущенная выгода», то есть та прибыль, которую хозяин мог бы получить, но не -получил из-за того, что продукт скопировали. Вспоминается история 30-х годов, -когда советский колхозник украл мешок колхозной пшеницы, и был осуждён за -хищение в крупных размерах: если, мол, эту пшеницу всю посадить, да вырастить, -да собрать, вышло бы несколько центнеров. Приходится изобретать хитроумную -аппаратуру, мешающую копированию, или причиняющую при этом ущерб. Приходится -вводить в законодательство особую категорию прав, `условно` назовём её «патент», -ограничивающую злоупотребления — и свободу — всего человечества в пользу -хозяина патента. Причём далеко не всегда хозяин патента и автор изобретения — -один и тот же человек! - -[NOTE] -Условно — потому, что далеко не во всех странах разрешено выдывать -патенты на программное обеспечение, однако везде отношения собственности на -исходные тексты программ регулируются общими или специальными разделами законов -об авторском праве (разных в разных государствах). - -Далее в лекции патентованные программные продукты и способ их разработки будут -в чём-то противопоставлены свободно распространяемым программам. Термин -«патентованный программный продукт» будет означать не наличие действительного -патента на программу, а наличие у программы собственника, который относится к -ней как к материальному объекту (в случае патентованных программ). -Патентованные программы часто называют иногда «проприетарными» (от английского -термина «proprietary») или просто «коммерческими» (что, строго говоря, неверно, -так как «делать коммерцию» — то есть получать выгоду — можно различными -способами, и многие успешные свободные проекты это подтверждают). - -=== Появление свободного ПО === - -Однако компьютеры развивались очень быстро, и бывшие вполне современными в -1970-е PDP-10 к началу 1980-х уже устарели, и значительно отставали по -производительности от более современных машин. Однако ни для одной из новых -архитектур уже не было операционной системы и прочего программного обеспечения, -разработанного исключительно в академической среде. Университеты должны были -покупать новые компьютеры с новым программным обеспечением и выполнять условия -лицензии, ограничивающей их права на разработку и распространение ПО, иначе -говоря, ограничивающей возможность научной модели разработки программного -обеспечения. - -В это время в лаборатории искусственного интеллекта МТИ разрабатывались так -называемые LISP-машины, умевшие на аппаратном уровне интерпретировать язык -программирования, похожий на LISP — развитый и перспективный язык -программирования. На LISP же была написана операционная система для таких машин -и всё программное обеспечение для них. В начале 1980-х некоторые сотрудники -лаборатории искусственного интеллекта выкупили у МТИ права на LISP-машины и -математическую систему MACSIMA и основали собственные коммерческие компании для -дальнейшей разработки в этой области. Очень многие сотрудники лаборатории -перешли работать в эти компании, после чего все их дальнейшие разработки уже -становились закрытыми для научного сообщества. Новые LISP-машины -распространяются с лицензиями, запрещающими пользователям модифицировать и -распространять исходные тексты программ. Программы, которые раньше для -сотрудников МТИ были аналогом научных публикаций, стали принадлежащим кому-то -патентованным продуктом. - -Одному из сотрудников, оставшемуся в лаборатории искусственного интеллекта МТИ, -Ричарду Столлману, такое положение дел казалось недопустимым нарушением -открытого научного процесса разработки программного обеспечения. Он в одиночку -пытался в рамках прежней академической модели развивать LISP-машины и открыто -реализовывать изменения, аналогичные сделанным в рамках закрытой коммерческой -разработки, чтобы LISP-машины МТИ могли конкурировать с патентованными -аналогами. Конечно, эта попытка угнаться за активной разработкой целой компании -была обречена на неудачу. - -Тогда в поисках единомышленников Ричард Столлман создаёт некоммерческую -организацию Фонд свободного программного обеспечения (Free Software Foundation, -FSF). Своей основной целью Фонд ставит сохранение программного обеспечения, -процесс разработки которого всегда будет гарантированно открытым, а исходные -тексты всегда доступны. Более масштабная цель Фонда — разработка операционной -системы, целиком состоящей из открыто разрабатываемого программного -обеспечения. Декларируя такую цель Столлман, фактически хотел вернуть -представлявшееся ему идеальным состояние, когда в МТИ работали в собственной -операционной системе для PDP-10. - -Операционная система, разрабатываемая в рамках Фонда, должна была стать -совместимой с операционной системой UNIX. Изначально UNIX был разработан в -1970-е годы Кеном Томпсоном и Деннисом Ричи в лаборатории компании AT&T и -распространялся этой компанией (а впоследствии — и другими) как патентованная -операционная система. К началу 1980-х UNIX очень широко использовался, в том -числе и в академической среде, для этой операционной системы существовало много -программ, свободно распространявшихся в научном сообществе, поэтому хотелось, -чтобы эти программы работали и в новой — свободной — операционной системе. Эта -будущая операционная систему получила название GNU. - -[NOTE] -Это псевдоаббревиатура, для которой сам Столлман предлагал рекурсивную -расшифровку: GNUs Not Unix («Гну — Не UNIX»). - -=== Определение свободного ПО === - -Для того, чтобы сохранить модель научного сотрудничества между разработчиками, -необходимо было обеспечить, чтобы исходные тексты программ, написанных -разработчиками, оставались доступными для чтения и критики всему научному -сообществу. Для этого Ричард Столлман сформулировал понятие свободное -программное обеспечение, в котором отразились принципы открытой разработки -программ в научном сообществе, сложившемся в американских университетах в -1970-е годы. Столлман явно сформулировал эти принципы, они же — критерии -свободного программного обеспечения. Эти критерии оговаривают те права, которые -автор свободной программы передаёт любому пользователю. - -* Программу можно использовать с любой целью («нулевая свобода»). - -[NOTE] -Для российских пользователей эта свобода действительно «нулевая», в том смысле, -что она присутствует всегда, в том числе и у пользователей патентованного ПО. -По российскому законодательству обладатель прав на интеллектуальную -собственность может передавать или не передавать пользователю право на -распространение копий своего произведения (в данном случае — программного -обеспечения), однако у него нет никаких прав каким бы то ни было образом -ограничивать владельца копии в использовании программы. - -* Можно изучать, как программа работает и адаптировать её для своих целей - («первая свобода»). Условием этого является доступность исходного текста - программы. - -* Можно распространять копии программы — в помощь товарищу («вторая свобода»). - -* Программу можно улучшать и публиковать свою улучшенную версию, с тем чтобы - принести пользу всему сообществу («третья свобода»). Условием этого является - доступность исходного текста программы. - -Только удовлетворяющая всем принципам программа может считаться свободной, т. -е. гарантированно открытой и доступной для научного сообщества. Нужно -подчеркнуть, что эти принципы оговаривают только доступность программ для -всеобщего использования, критики и улучшения, но никак не оговаривают связанные -с распространением программ денежные отношения, в том числе не предполагают и -бесплатности. В англоязычных текстах здесь часто возникает путаница, поскольку -слово «free» обозначает не только «свободное», но и «бесплатное» и нередко -употребляется по отношению к программному обеспечению, которое распространяется -без взимания платы за использование, но которое при этом совершенно недоступно -для изменения сообществом, просто потому, что его исходные тексты не -опубликованы. Такое бесплатное ПО вовсе не является свободным. Наоборот, -свободное ПО вполне можно распространять, взимая при этом плату, однако -соблюдая при этом критерии свободы: каждому пользователю предоставляется право -получить исходные тексты программ, изменять их и распространять далее. Всякое -программное обеспечение, пользователям которого не предоставляется такого -права, является несвободным. - -Открытый доступ к исходным текстом программ, в действительности, является -ключевым признаком свободного ПО, поэтому предложенный несколько позднее термин -«open source software» (ПО с открытым исходным текстом) представляется даже -более удачным для обозначения феномена свободного программного обеспечения, чем -предложенный Столлманом «free software». - -=== Общественная лицензия GNU === - -Декларировав критерии свободного ПО, члены Фонда свободного ПО стали -распространять свои программы в соответствии с этими принципами, никак не -оформляя это документально, иначе говоря, первоначально свободные программы -распространялись вообще без лицензии. Однако произошедший с самим Ричардом -Столлманом прецедент убедил его в том, что документальное оформление необходимо -для свободного ПО. - -Ричард Столлман занимался разработкой текстового редактора Emacs (о котором шла -речь в лекции Текстовые редакторы) на основе исходных текстов Джеймса Гослинга -(который впоследствии стал автором известного сегодня продукта Java). Тогда -Гослинг свободно раздавал свои исходные тексты всем заинтересованным. Однако в -некоторый момент Гослинг продал права на распространение Emacs компании -UniPress (http://www.unipress.com) и компания попросила Столлмана прекратить -распространение его версии Emacs, так как права принадлежат им. Этот инцидент -заставил Столлмана переписать заново те части исходного текста Emacs, которые -теперь принадлежали UniPress, после чего он разработал собственную лицензию на -программное обеспечение. - -Лицензия, сформулированная Столлманом, должна была работать так же, как и -лицензии на патентованное программное обеспечение: это типовой договор автора -программы (обладателя авторских прав) с пользователем, в котором автор -оговаривает права пользователя по отношению к программе. В отличие от -коммерческой лицензии, в лицензии Столлмана оговариваются те права, которые -пользователь получает по отношению к свободной программе: получать исходные -тексты программ, изменять их, распространять изменённые и неизменённые версии -(см. перечисленные выше критерии свободного ПО). Кроме того, в этой лицензии -оговаривается принципиальное для Столлмана условие распространения свободного -ПО: ни один пользователь не имеет права, сделав модифицированную версию -свободной программы, распространять её, не соблюдая всех принципов свободного -ПО, ограничивая тем самым права других пользователей по отношению к программе. -Иначе говоря, нельзя модификацию свободной программы сделать несвободной. - -Лицензия, содержащая такое условие, получила название «copyleft». Здесь игра -слов: по-английски авторское право называется «copyright», буквально -«копироватьправо», а «copyleft», соответственно, «копироватьлево». -Действительно, условие «copyleft» прямо противоположно по смыслу авторскому -праву: авторское право призвано ограничить пользователя в копировании и -распространении копий продукта, а «авторское лево», наоборот, строго запрещает -его ограничивать. Впоследствии лицензия Столлмана получила название -«Общественная лицензия GNU» (GPL, GNU Public License). - -В настоящее время помимо GPL известны и другие лицензии, под которыми может -распространяться свободное ПО. Самая распространённая из таких лицензий — BSD -License. Лицензия BSD отличается от GPL главным образом тем, что в ней -отсутствует условие «copyleft», т. е. на основании свободного ПО, -распространяемого под этой лицензией, можно производить несвободные -модификации. Однако лицензия BSD и другие лицензии до тех пор будут оставаться -лицензиями на свободное программное обеспечение, пока они соответствуют -условиям, оговорённым принципами свободного ПО, объявленными Фондом. - -[NOTE] -BSD — Berkeley Software Distribution, пакет совместимого с UNIX программного -обеспечения, разработанный в университете Беркли и распространявшийся свободно. - -=== Сообщество разработчиков и пользователей === - -Однако главное условие существования свободного ПО — не лицензия, а люди, -которые готовы делиться текстами своих программ и совершенствовать тексты -чужих. Свободное ПО унаследовало модель открытой научной разработки, а вместе с -ней — и специфическую организацию сообщества разработчиков и пользователей, в -некоторых отношениях напоминающую академическое сообщество. Чтобы лучше -продемонстрировать специфику этого сообщества, сравним социальные отношения, -сопровождающие использование свободного и патентованного ПО. - -У любого пользователя программного обеспечения непременно возникают вопросы, -когда он пытается применить его для решения своих задач. Традиционная -коммерческая модель разработки и использования программного обеспечения -основана на том, что исходные тексты программ являются коммерческой тайной -производителя, а пользователь получает готовый продукт — скомпилированную -программу. Такая программа является несвободной. Пользователь несвободной -(патентованной) программы платит за неё производителю, который взамен -предоставляет ему некоторые гарантии, одна из которых — отвечать на вопросы о -работе программы. Специально для этого производитель организует службу -поддержки, которая по телефону и по электронной почте отвечает на вопросы -пользователей. - -Пользователь свободно распространяемой программы не получает вместе с ней -никаких гарантий: автор сделал её исходный текст открытым для общества, но при -этом не брал на себя обязательств объяснять всем, как работает программа. -Поэтому получить ответ на свой вопрос пользователь может из двух источников: из -документации, а если её недостаточно — от более опытных пользователей. Хорошо, -если такие пользователи есть среди знакомых, а если нет? В этом случае их -всегда можно найти в списке рассылки в Internet, посвящённом данной программе. - -[NOTE] -В общественной лицензии GNU есть даже стандартная формулировка, закрепляющая -отсутствие гарантий: «Настоящая программа поставляется на условиях «как есть». -Если иное не указано в письменной форме, автор и/или иной правообладатель не -принимает на себя никаких гарантийных обязательств, как явно выраженных, так и -подразумеваемых, в отношении программы, в том числе подразумеваемую гарантию -товарного состояния при продаже и пригодности для использования в конкретных -целях, а также любые иные гарантии». Текст лицензии приводится в переводе Елены -Тяпкиной. - -Письмо, пришедшее на электронный адрес списка рассылки, будет отправлено всем -подписчикам списка, любой из них может ответить на него в списке, и ответ также -получат все подписчики и т. д. Так организуется нечто вроде виртуальной общей -`комнаты для разговоров`. В настоящее время сложилось неписанное правило, что -для каждой свободно распространяемой программы существует отдельный список -рассылки. Найти адрес этого списка и подписаться на него можно в Internet -(обычно на сайте, посвящённом данной программе). Любой пользователь свободной -программы может направить свой вопрос в список рассылки. Списки рассылки читают -разработчики программы и её активные пользователи, и обычно среди них находится -тот, кто `ответит на вопрос`. Так получается, что пользователи свободных -программ, в отсутствие централизованной службы поддержки, организуются в -сообщество для взаимопомощи. - -[NOTE] -Списки рассылки в Internet — наследники телеконференций сети Usenet, возникшей -до появления Internet. В Usenet существовали телеконференции буквально на любую -тему, и, конечно же, многие были посвящены программному обеспечению. - -[NOTE] -Задавший вопрос пользователь должен принимать в расчёт, что все подписчики -списка рассылки участвуют в нём добровольно, и никто их них не обязан отвечать -на какие-либо вопросы, поэтому предъявлять претензии на этот счёт бессмысленно -и невежливо. - -У пользователей программ вновь и вновь возникают одни и те же вопросы и -сложности. Постоянным читателям списков рассылки это особенно очевидно, -поскольку им приходится на эти вопросы отвечать не по одному разу. В таких -ситуациях у них нередко возникает инициатива записать ответы на самые -распространённые вопросы и открыть их для всеобщего обозрения. Так к свободной -программе появляется новая документация в жанре FAQ (Frequently Asked -Questions, ЧАсто задаваемые ВОпросы), представляющая собой список вопросов с -ответами. Пользователи патентованных программ тоже задают одни и те же вопросы, -только не в списке рассылки, а службе поддержки, в результате так же появляется -документация типа FAQ, которая, почему-то, редко выходит за пределы внутреннего -пользования производителя программы. - -В любой программе непременно имеются ошибки (bugs). Производитель патентованной -программы оплачивает работу отдела контроля качества, который занимается -поиском ошибок. Тем не менее, некоторые ошибки этот отдел пропускает, и они -достигают пользователя. Пользователь несвободной программы, столкнувшись с -ошибкой, не может выявить её причину (поскольку ему недоступны исходные тексты -программы), но, скорее всего, способен описать ошибку и условия, в которых она -происходит. Он может сообщить об ошибке производителю программы (обычно -посредством обращения всё в ту же службы поддержки), и если там решат, что -ошибка действительно в программе, а не в работе пользователя, о ней будет -сообщено разработчикам. В итоге пользователь может ожидать, что в следующей -версии программы ошибка будет исправлена. - -У свободно распространяемой программы обычно нет оплачиваемого отдела контроля -качества. Значит, пользователь может столкнуться с ещё большим количеством -ошибок, чем в патентованной программе. Тем актуальнее для него возможность -сообщить об ошибке разработчикам программы. Раньше в сопровождающей программу -документации было принято указывать электронный адрес, по которому разработчики -принимали сообщения об ошибках, bug report. Некоторые вводили стереотипную -форму для таких сообщений, чтобы облегчить и автоматизировать их обработку. Уже -это требует существенно более высокой связности сообщества во всём мире, -существенно большей, чем достаточно для закрытой разработки. - -Разработчики и контролёры-испытатели патентованного продукта могут ходить на -службу в один и тот же офис, и там обмениваться информацией или тратить -определённую долю рабочего времени на составление и анализ строгих отчётностей, -содержащих сообщения о ошибках и рапорты об устранении неисправностей. Такая -организация труда эффективна, если круг разработчиков невелик, а ввести общую -дисциплину относительно легко (например, угрожая рублём). Для открытого проекта -круг потенциальных разработчиков не ограничен ничем, поэтому эффективность -разработки в гораздо большей степени зависит от того, насколько просто всем -членам сообщества договариваться между собой, а также от «сознательности» -пользователей. Заметив ошибку в программе, сознательный пользователь не просто -исправит её самостоятельно (что не всегда ему по силам), а оформит внятное -сообщение об ошибке, а если исправление готово, приложит к сообщению и его. - -Простому и упорядоченному приёму и перенаправлению сообщений об ошибках служат -системы отслеживания ошибок (Bug Tracking System), самые известные из которых -разработаны участниками больших проектов для себя, а благодаря свободным -лицензиям используются повсеместно. Таковы GNUTS (разработанная в GNU), -Bugzilla (mozilla.org), JitterBug (проект Samba) или Debian BTS. Более ранние -версии ориентируются на электронную почту, более поздние включают в себя -WWW-интерфейс. Например, при помощи Bugzilla организуется сайт в Internet, на -котором пользователь может заполнить форму сообщения об ошибке. Каждое -сообщение имеет свой номер, по которому можно попасть на «персональную» -страницу данной ошибки, где отражаются все происходящие по её поводу события, -от первоначального сообщения (открытия) до исправления (закрытия). При каждом -изменении в состоянии ошибки Bugzilla рассылает всем заинтересованным лицам -(включая, естественно, сообщившего об ошибке и занимающихся данной программой -разработчиков) письма по электронной почте. Поскольку Bugzilla позволяет -оставлять комментарии и прикладывать файлы, она является полноценным средством -для общения пользователя с разработчиком по поводу ошибки в программе. - -Принципиальное преимущество пользователя свободной программы заключается в том, -что у него, в отличие от пользователей несвободных программ, всегда есть -возможность заглянуть в исходные тексты. Конечно, для многих пользователей -исходные тексты не более понятны, чем двоичные исполняемые файлы. Однако при -достаточном уровне познаний в программировании пользователь может установить -причину ошибки в программе и устранить её, исправив соответствующим образом -исходный текст. А если пользователь заинтересован в развитии программы, то с -его стороны будет разумно не только сообщить автору об ошибке, но и прислать -ему свои исправления к исходному тексту программы: автору останется только -применить эти исправления к тексту программы, если он найдёт их корректными и -уместными. Пересылать автору исправленный текст программы целиком непрактично: -он может быть очень большим (десятки тысяч строк), и автору будет нелегко -разобраться, что же изменено (а вдруг изменения сделаны неграмотно?). - -Чтобы облегчить и автоматизировать процесс внесения исправлений, Ларри Уолл -(Larry Wall) в 1984 году разработал утилиту patch («заплатка»), которая в -формализованном (но хорошо понятном человеку) виде описывает операции -редактирования, которые нужно произвести, чтобы получить новую версию текста. С -появлением этой утилиты пользователь, обнаруживший и исправивший ошибку в -программе, мог прислать автору небольшую заплатку, по которой автор мог понять, -какие изменения предлагаются, и автоматически «приложить» их к своему исходному -тексту. С появлением patch гораздо больше пользователей стало включаться в -разработку программ с доступным исходным текстом, немалую роль и здесь сыграла -сеть Usenet (см. об этом статью Тима ОРейли -http://tim.oreilly.com/articles/paradigmshift_0504.html). Файлы-заплатки с -исправлениями — обязательный атрибут сегодняшней разработки свободных программ. - -Однако почему ограничивать сферу применения patch исправлением ошибок? Если -пользователю программы не хватает в ней какой-то функции, то при должной -квалификации он вполне может запрограммировать её сам и включить в исходный -текст программы. Естественно, ему выгодно, чтобы его дополнение попало в -«главный», авторский вариант программы (его называют «upstream») и появлялось -во всех последующих версиях: можно точно так же оформить его в виде patch и -выслать автору. Этой возможности лишён пользователь несвободной программы, даже -если он достаточно квалифицирован. Единственный способ включить в программу -нужную ему функцию — обратиться к производителю (если программа патентованная) -с соответствующей просьбой, и надеяться, что производитель сочтёт предложенную -функцию действительно необходимой. - -Чем больше у свободной программы активных пользователей, готовых вносить -исправления и дополнения и делиться ими, тем надёжнее работает и быстрее -развивается программа. Причём такая свободная модель отслеживания и исправления -ошибок для программы, у которой тысячи активных пользователей, может оказаться -гораздо более эффективной, чем у любой патентованной программы: ни одна -компания не может себе позволить такой огромный штат сотрудников в отделе -контроля качества. Поэтому действительно популярная свободная программа может -оказаться гораздо надёжнее патентованных аналогов. - -Написать большую программу в одиночку довольно сложно и даже не всегда -возможно, особенно если автор занимается этим в свободное от работы время. -Большинство современных свободных программ пишется группой разработчиков. Даже -если начинал писать программу один человек, и она оказалась интересной, к -разработке могут присоединиться активные пользователи. Чтобы они могли не -только вносить отдельные исправления, но и вообще всю разработку вести -совместно, нужны специальные инструменты. Помимо patch, для организации -совместной разработки ПО применяются системы контроля версий. Функции системы -контроля версий состоят в том, чтобы организовать доступ к исходным текстам -программы для нескольких разработчиков и хранить историю всех изменений в -исходных текстах, позволяя объединять и отменять изменения и пр. Самая ранняя -свободная система контроля версий, RCS использовалась ещё на заре свободного ПО -абонентами сети Usenet, затем на смену ей пришла более развитая CVS, но сегодня -и она считается во многом устаревшей, и всё чаще заменяется Subversion, Arch и -другими. К слову, названные системы контроля версий сегодня активно -используются и разработчиками патентованного ПО для организации совместной -разработки. - -Нужно заметить, что преимущества свободной разработки для пользователя не -следует преувеличивать. Не все свободные программы в равной степени доступны -для изменения пользователям, и это совершенно не связано с лицензией на их -распространение. Важный фактор здесь — объём программы: если в ней десятки -тысяч строк (как, например, в OpenOffice.org), то даже квалифицированному -пользователю потребуется слишком много времени, чтобы разобраться, что к чему. -А если при этом ещё нет толковой документации... Рассчитывать же на то, что -разработчики ответят на все замечания и предложения пользователя немедленным -исправлением программы тоже нельзя, поскольку они не несут перед пользователем -никаких обязательств по качеству программы. В этом отношении пользователь -патентованной программы может быть даже в лучшем положении. - -Очень многие свойства сообщества разработчиков и пользователей свободных -программ проистекают из того, что все его участники обычно занимаются этой -программой из интереса или потому, что эта программа — необходимый для них -инструмент (например, зарабатывания денег). Время, потраченное ими на -программу, не оплачивается, поэтому нет никакой надежды, что обстоятельства не -переменятся и разработка не прекратится вовсе. Нередки случаи, когда разработка -программы начинается благодаря одному автору-энтузиасту, который привлекает -многих к участию в разработке, а потом энтузиазм лидера гаснет, а вместе с ним -затухает и разработка. К сожалению, сегодня существуют тысячи свободных -программ, так никогда и не достигших версии 1.0, хотя «выгорание» лидеров и не -единственная этому причина. Кроме того, программа может быть необходимой, но -«неинтересной», а потому не найдётся и свободных разработчиков. - -Место свободных программ на сегодняшнем рынке ПО очень значительно, и многие -коммерческие и государственные предприятия используют свободное ПО прямо или -опосредованно. Собственно, опосредованно все пользователи Internet задействуют, -например, свободную программу Bind, предоставляющую службу DNS. Многие -организации, особенно предоставляющие услуги через Internet, используют -свободный web-сервер Apache, от работы которого непосредственно зависит их -прибыль, не говоря уже о серверах на платформе Linux. Выгода использования -свободного ПО очевидна: за него не приходится платить, а если приходится — оно -стоит гораздо дешевле патентованных аналогов. Главный недостаток с точки зрения -коммерческого пользователя: разработчики свободных программ не несут никаких -обязательств по качеству программы, кроме моральных. Поэтому сегодня большие -корпорации, например, Intel или IBM, находят необходимым поддерживать проекты -по разработке свободного ПО, оплачивая сотрудников, которые работают в рамках -этих проектов. - -=== История Linux === - -[float] -==== GNU без Linux ==== - -К 1990 году в рамках проекта GNU были разработаны и постоянно развивались -свободные программы, составляющие основной инструментарий для разработки -программ на языке Си: текстовый редактор Emacs, компилятор языка Си gcc, -отладчик программ gdb, командная оболочка bash, библиотека важнейших функций -для программ на Си libc. Все эти программы были написаны для операционных -систем, похожих на UNIX. Это означает, что в них использовался стандартный для -UNIX механизм запроса ресурсов компьютера, необходимых программе — системные -вызовы, которые исполняются ядром операционной системы. При помощи системных -вызовов программы получают доступ к оперативной памяти, файловой системе, -устройствам ввода и вывода. Благодаря тому, что системные вызовы выглядели -более-менее стандартно во всех реализациях UNIX, программы GNU могли работать -(с минимальными изменениями или вообще без изменений) в любой UNIX-подобной -операционной системе. - -С помощью имевшихся инструментов GNU можно было бы писать программы на Си, -пользуясь только свободными программными продуктами, однако свободного -UNIX-совместимого ядра, на основе которого могли бы работать все эти -инструменты, не существовало. В такой ситуации разработчики GNU вынуждены были -использовать одну из патентованных реализаций UNIX, т. е. вынуждены были -следовать принятым в этих операционных системах архитектурным решениям и -технологиям и основывать на них свои собственные разработки. Идеал Столлмана о -научной разработке ПО, свободной от решений, движимых коммерческими целями, был -недоступен, пока в основе свободной разработки лежало патентованное -UNIX-совместимое ядро, исходные тексты которого оставались тайной для -разработчиков. - -[float] -==== Linux — ядро ==== - -В 1991 году Линус Торвальдс, финский студент, чрезвычайно увлёкся идеей -написать совместимое с UNIX ядро операционной системы для своего персонального -компьютера с процессором ставшей очень широко распространённой архитектуры -Intel 80386. Прототипом для будущего ядра стала операционная система MINIX: -совместимая с UNIX операционная система для персональных компьютеров, которая -загружалась с дискет и умещалась в очень ограниченной в те времена памяти -персонального компьютера. MINIX был создан Энди Танненбаумом в качестве учебной -операционной системы, демонстрирующей архитектуру и возможности UNIX, но -непригодной для полноценной работы с точки зрения программиста. Так же, MINIX -можно было использовать только в некоммерческих целях. Именно полноценное ядро -для своего ПК и хотел сделать Линус Торвальдс. Название для своего ядра он -соорудил из собственного имени, заменив последнюю букву и сделав его похожим на -анаграмму слова UNIX. - -Совместимость с UNIX в этот момент означала, что операционная система должна -поддерживать стандарт POSIX. POSIX — это функциональная модель совместимой с -UNIX операционной системы, в которой описано, как должна вести себя система в -той или иной ситуации, но не приводится никаких указаний, как это следует -реализовать программными средствами. POSIX описывал те свойства -UNIX-совместимых систем, которые были общими для разных реализаций UNIX на -момент создания этого стандарта. В частности, в POSIX описаны системные вызовы, -которые должна обрабатывать операционная система, совместимая с этим -стандартом. - -Важнейшую роль в развитии Linux сыграли глобальные компьютерные сети Usenet и -Internet. На самых ранних стадиях он обсуждал свою работу и возникающие -трудности с другими разработчиками в телеконференции comp.os.minix в сети -Usenet, посвящённой операционной системе MINIX. Ключевым решением Линуса стала -публикация исходных текстов ещё малоработоспособной первой версии ядра под -свободной лицензией GPL. Благодаря этому и получавшей всё большее -распространение сети Internet очень многие получили возможность самостоятельно -компилировать и тестировать это ядро, участвовать в обсуждении и исправлении -ошибок, и присылать исправления и дополнения к исходным текстам Линуса. Теперь -над ядром работал уже не один человек, разработка пошла быстрее и эффективнее. - -В 1992 году версия ядра Linux достигла 0.95, а в 1994 году вышла версия 1.0, -что свидетельствует о том, что разработчики наконец сочли, что ядро в целом -закончено и все ошибки (теоретически) исправлены. В настоящее время разработка -ядра Linux — дело уже гораздо большего сообщества, чем во времена до версии -0.1, изменилась и роль самого Линуса Торвальдса, который теперь не главный -разработчик, но главный авторитет, который традиционно оценивает исходные -тексты, которые должны быть включены в ядро и даёт своё добро на их включение. -Тем не менее, общая модель свободной разработки сообществом сохраняется. В -настоящее время параллельно всегда разрабатывается два варианта ядра. -Стабильная версия, считающаяся достаточно надёжной и пригодной для -пользователей, её номер заканчивается на чётное число, например, “2.4”. Номер -соответствующей экспериментальной версии ядра оканчивается на нечётное число — -“2.5”. Экспериментальная версия адресована в первую очередь разработчикам ядра, -тестирующим новые возможности. - -[float] -==== GNU и Linux ==== - -Однако как нельзя сделать операционную систему без ядра, так и ядро будет -бесполезно без утилит, которые использовали бы его возможности. Благодаря -проекту GNU Линус Торвальдс сразу имел возможность использовать в Linux -свободные утилиты: bash, компилятор gcc, tar, gzip и многие другие уже -известные и широко используемые приложения, которые могли работать с его -UNIX-совместимым ядром. Так Linux сразу попал в хорошее окружение и в сочетании -с утилитами GNU представлял собой очень интересную среду для разработчиков -программного обеспечения даже на самой ранней стадии своего развития. - -Принципиальным шагом вперёд было именно то, что из ядра Linux и утилит и -приложений GNU впервые стало возможно сделать полностью свободную операционную -систему, т. е. работать с компьютером и, более того, разрабатывать новое -программное обеспечение, пользуясь только свободным программным обеспечением. -Идеал полностью некоммерческой разработки Столлмана теперь мог быть реализован -в жизни. - -Однако появление теоретической возможности воплощения идеала не означало его -немедленной практической реализации. Совместимость Linux и утилит GNU была -обусловлена тем, что и то, и другое писалось с ориентацией на одни и те же -стандарты и практику. Однако, в рамках этой практики (множество различных -UNIX-систем) оставался большой простор для несовместимости и различных решений. -Поэтому на начальном этапе разработки ядра каждое заработавшее под Linux -приложение GNU было для Линуса очередным достижением: первыми стали bash и gcc. -Таким образом, сочетание GNU и Linux было возможностью создать свободную -операционную систему, но само по себе ещё не составляло такой системы, потому -что Linux и различные утилиты GNU оставались разрозненными программными -продуктами, которые писали разные люди, не всегда принимая в расчёт то, что -делают другие. Основное же качество системы — согласованность её компонентов. - -[float] -==== Возникновение дистрибутивов ==== - -После определённого периода разработки под Linux уже стабильно работал ряд -важнейших утилит GNU. Скомпилированное ядро Linux с небольшим комплектом -скомпилированных уже в Linux утилит GNU составляло набор инструментов для -разработчика программного обеспечения, желающего использовать свободную -операционную систему на своём персональном компьютере. В таком виде Linux уже -не только годился для разработки Linux, но и представлял собой операционную -систему, в которой можно было уже выполнять какие-то прикладные задачи. -Конечно, первое, чем можно было заниматься в Linux — писать программы на Си. - -Первоначально, чтобы получить компьютер с работающей системой Linux, -разработчики пользовались специальными комплектами дискет со скомпилированным -ядром Linux и утилитами: с этих дискет можно было загрузить Linux и работать в -нём. Однако это не слишком удобно, когда нужно работать в Linux постоянно, да и -объём дискет накладывал очень сильные ограничения на дальнейшее расширение -системы и включение новых утилит. - -Когда задача получить компьютер с постоянно работающей на нём системой Linux -стала востребованной и довольно распространённой, разработчики в хельсинкском и -техасском университетах создают собственные наборы дискет, с которых -скомпилированное ядро и основные утилиты можно записать на жёсткий диск, после -чего загружать операционную систему прямо с него. Эти наборы дискет — первые -прототипы современных дистрибутивов Linux — комплекты программного обеспечения, -на основе которых можно получить работающую операционную систему на своём -компьютере. Нужно отметить, что в дистрибутив Linux с самого начала входили -программные продукты GNU. На самом деле, всякий раз, когда говорится -«операционная система Linux», подразумевается «ядро Linux и утилиты GNU». Фонд -свободного ПО даже рекомендует называть это операционной системой GNU/Linux. - -Однако скопировать все нужные программы на жёсткий диск ещё недостаточно, чтобы -получить подходящую для нужд пользователя операционную среду (пусть даже это -очень профессиональный пользователь). Поэтому первые наборы дискет можно только -условно назвать дистрибутивами. Чтобы получить работающую операционную систему, -требуются какие-то специальные средства установки и настройки программного -обеспечения. Именно наличие таких средств и отличает современные дистрибутивы -Linux. Другое важнейшая задача дистрибутива — регулярное обновление. -Программное обеспечение, особенно свободное, — одна из самых быстро -развивающихся областей, поэтому мало один раз установить Linux, нужно ещё -регулярно его обновлять. Первым дистрибутивом в современном понимании, -получившим широкое распространение, стал Slackware, созданный Патриком -Фолькердингом (кстати, этот дистрибутив сохранился и до наших дней). Он был -широко известен пользователям Linux уже к 1994 году. - -Несмотря на то, что с появлением первых дистрибутивов установка Linux уже не -требует самостоятельной компиляции всех программ из исходных текстов, -использование Linux оставалось уделом разработчиков: пользователь этой -операционной системы в тот период её развития мог заниматься почти -исключительно программированием. По крайней мере, чтобы решать в ней другие -повседневные прикладные задачи (например, чтение электронной почты, написание -статей и т. п.), он должен был сначала некоторое время позаниматься -программированием и даже разработкой самой системы Linux, чтобы создать для -себя соответствующие прикладные программы или заставить их работать в Linux. - -Однако разработчики — тоже люди, которые пишут и электронные письма, и статьи, -и даже рисуют картинки. Всё программное обеспечение для Linux было открытым, -поэтому вскоре стало появляться всё больше прикладных программ для Linux, -которые использовались всё большим сообществом, отчего становились надёжнее и -получали всё новую функциональность. В конце концов возникает идея, что из -Linux и GNU-приложений для Linux целенаправленными усилиями небольшой группы -разработчиков можно делать целостные операционные системы, подходящие для очень -широкого круга пользователей и продавать эти системы пользователям за деньги -как аналог и альтернативу существующим патентованным операционным системам. - -Выгода операционной системы, целиком состоящей из свободного программного -обеспечения, очевидна — собирающие эту систему не должны никому платить за -входящие в неё программы. Более того, дальнейшая разработка и обновление -имеющихся программ ведётся сообществом разработчиков также совершенно -бесплатно, не нужно платить сотрудникам, которые занимались бы этим. В итоге -затраты фирмы, собирающей дистрибутив Linux для пользователя, ограничиваются -оплатой программистов, интегрирующих разрозненные приложения в систему и -пишущих программы для стандартизации процедур установки и настройки системы, -чтобы облегчить эти задачи неподготовленному пользователю, а также затратами на -само издание получившегося дистрибутива. Для конечного покупателя это означает -принципиальное снижение цены на операционную систему. - -Первой успешной компанией, работающей по такой схеме, стала RedHat, появившаяся -в 1995 году. RedHat адресовала свои разработки не только программистам -профессионалам, но и обыкновенным пользователям и системным администраторам, -для которых компьютер — в первую очередь офисное рабочее место или рабочий -сервер. Ориентируясь на уже существующие на рынке предложения для такого класса -пользователей, RedHat всегда уделял большое внимание разработке приложений с -графическим интерфейсом для выполнения типичных задач по настройке и -администрированию системы. Бизнес RedHat развивался довольно успешно, в 1999 -году эта компания акционировалась — сразу после выпуска акции росли в цене -очень энергично, однако потом ажиотаж улёгся. В настоящее время доля RedHat на -рынке серверов и рабочих станций Linux очень велика. Благодаря RedHat в -сообществе пользователей Linux очень широкое распространение получил формат -пакетов RPM. - -Практически одновременно с RedHat появился проект Debian. Его задача была -примерно той же — сделать целостный дистрибутив Linux и свободного программного -обеспечения GNU, однако этот проект был задуман как принципиально -некоммерческий, проводимый в жизнь сообществом разработчиков, нормы -взаимодействия в котором полностью соответствовали бы идеалам свободного ПО. -Сообщество разработчиков Debian — международное, участники которого -взаимодействуют через Internet, а нормы взаимодействия между ними определяются -специальными документами — полиси (policy). - -[NOTE] -Официальное название дистрибутива — Debian GNU/Linux. - -Сообщество разработчиков не извлекает никакой прибыли от продажи Debian, его -версии распространяются свободно, доступны в Интернет, могут распространяться и -на твёрдых носителях (CD, DVD), но и в этом случае их цена редко сильно -превышает стоимость носителя и наценку, окупающую затраты на издание. -Первоначально разработка Debian спонсировалась Фондом свободного программного -обеспечения. Адресатами дистрибутивов Debian всегда в первую очередь были -профессиональные пользователи, так или иначе связанные с академической -разработкой программного обеспечения, которые готовы читать документацию и -собственными руками организовать нужный профиль системы, соответствующий именно -их задачам. Ориентация на такую аудиторию предопределила некоторые тенденции -развития Debian: в нём никогда не было обилия «простых» графических средств -настройки среды, всевозможных мастеров, однако всегда уделялось много внимания -средствам последовательной и единообразной интеграции программного обеспечения -в единую систему. Именно в Debian появился менеджер пакетов (APT). В настоящее -время Debian — самый популярный дистрибутив Linux среди пользователей, -являющихся профессионалами в области информационных технологий. - -Всякий раз, когда свободное программное обеспечение оказывается востребованным, -немедленно возникает множество альтернативных решений — так произошло и с -дистрибутивами Linux. После 1995 года возникло (и продолжает возникать) -огромное количество коммерческих компаний и свободных сообществ, которые ставят -своей задачей подготовку и выпуск дистрибутивов Linux. У каждого из них — свои -особенности, своя целевая аудитория, свои приоритеты. К настоящему времени на -рынке дистрибутивов выделилось несколько лидеров, которые предлагают более или -менее универсальные решения и наиболее широко известны и используются. Помимо -уже названных RedHat и Debian следует назвать в ряду дистрибутивов, -ориентированных на рядового пользователя, немецкий SuSE и французский Mandrake, -среди адресованных специалистам — Gentoo. Но помимо «крупных» игроков на рынке -дистрибутивов есть гораздо большее количество менее распространённых -дистрибутивов. Теперь перед пользователем, желающим установить Linux, встаёт -вопрос выбора дистрибутива. Критерии выбора — и задачи, которые предполагается -решать с помощью Linux, и уровень подготовки пользователя, и технологии, и -предстоящие контакты с тем сообществом, которое занимается разработкой -дистрибутива. - -[float] -==== История Linux в России ==== - -Получилось так, что в международном сообществе разработчиков, начинавших и -продолжавших развивать Linux, все в той или иной степени могли объясниться -по-английски. Это и неудивительно, поскольку исторически английский оказался -языком компьютерной науки и операционной системы UNIX, глобальной сети -Internet, программирования. В международном сообществе разработчиков -программного обеспечения английский выполнял и выполняет роль, подобную латыни -в научном сообществе средневековой Европы. Но если Linux предполагается -использовать не только для программирования и общения с программистами, но и -для повседневных задач, необходима локализация — т. е. возможность общаться с -компьютером и при помощи компьютера и на других языках. - -Локализация — комплексный процесс, затрагивающий самые разные стороны системы. -Для полноценной поддержки того или иного языка в системе необходимо обеспечить -возможность ввода на этом языке (поддержка раскладок клавиатуры и кодировок), -вывода (экранных шрифтов), печати, а затем уже необходимо переводить интерфейс -различных приложений на данный язык, разрабатывать средства подготовки -электронных и бумажных публикаций на этом языке и т. д. В этой лекции мы кратко -рассмотрим только историю локализации Linux в России для русского языка, т. е. -русификации Linux. - -Первой компанией, поставившей своей целью выпуск дистрибутивов Linux для -русскоговорящих пользователей, была УрбанСофт, открытая в Петербурге в 1992 -году. Весь её бизнес состоял в выпуске и продаже CD-дисков с дистрибутивами -свободного программного обеспечения. В первую очередь это были дистрибутивы -RedHat, а также Debian, в которые включались разработанные силами УрбанСофт -пакеты для русификации. - -Несколько позже в Москве IPLabs Linux Team выпускает Linux Mandrake Russian -Edition — модифицированный (чтобы соответствовать нуждам русского пользователя) -вариант дистрибутива Mandrake Linux. Впоследствии эта команда начинает -выпускать дистрибутивы, которые отличаются от Mandrake уже не только наличием -пакетов для русификации, но и другими принципиальными возможностями. В конце -концов команда разработчиков создаёт фирму ALT Linux и начинает выпускать -дистрибутивы под маркой ALT Linux. - -Также появляется компания ASPLinux, целью которой является выпуск RedHat с -модификациями для поддержки русского языка, название продукта совпадает с -именем компании. - -Все перечисленные Российские производители дистрибутивов Linux существуют и по -сей день, и продолжают с большей или меньшей активностью выпускать -дистрибутивы. diff --git a/old-docs/howto_use_nut.txt b/old-docs/howto_use_nut.txt deleted file mode 100644 index 3849fb9..0000000 --- a/old-docs/howto_use_nut.txt +++ /dev/null @@ -1,279 +0,0 @@ -//// -Пакет: docs-howto_use_nut -RPM файл: docs-howto_use_nut-0.1-alt2.noarch.rpm -Аннотация: Использование nut в AltLinux Мастер 2.4 -Автор: Анатолий Базюкин -Лицензия: FDL -URL: http://heap.altlinux.org/kirill/howto_use_nut/html/Howto_use_UPS_nut.html -//// - -== Как использовать UPS с nut == - -Инструменты nut (Network UPS tools) - это демоны управления и мониторинга UPS, -которые могут быть использованы для различных UPS. Этот документ описывает, как -использовать nut пакет из AltLinux Мастер 2.4 на примере подключения Powerman -BackPro Plus по RS-232 для отдельной машины. - -=== Инсталляция пакета nut === - -В AltLinux M2.4 nut входит как три пакета "nut","nut-server" и "nut-driver". -Необходимо установить все. Их можно инсталлировать с помощью apt-get: - ----- -# apt-get install nut-server ----- - -=== Конфигурирование nut === - -Конфигурационные файлы Nut'а должны находятся в каталоге /etc/nut. При -установке nut этот каталог создается RPM пакетом и там должны находится -следующие файлы:. - -* ups.conf – настройки UPS-специфического драйвера -* upsd.conf - настройки для главного UPS демона -* upsd.users – файл контроля доступа для UPS демона -* upsmon.conf - настройки для UPS демона монитора -* upssched.conf - настройки для upssched демона - -Для запуска сервиса необходимо изменить некоторые установки в этих -конфигурационных файлах. Демон upssched не будет использоваться и upssched.conf -не редактируется. Переходим в каталог /etc/nut и смотрим, что мы имеем: - ----- -# ls -l -drwx--x--- 2 root upsmon certs -lrwxrwxrwx 1 root root cmdvartab -> ../../var/lib/nut/etc/nut/cmdvartab --rw-r--r-- 1 root root driver.list --rw-r----- 1 root upsdrv ups.conf -lrwxrwxrwx 1 root root upsd.conf -> ../../var/lib/nut/etc/nut/upsd.conf -lrwxrwxrwx 1 root root upsd.pem -> ../../var/lib/nut/etc/nut/upsd.pem -lrwxrwxrwx 1 root root upsd.users -> ../../var/lib/nut/etc/nut/upsd.users --rw-r----- 1 root upsmon upsmon.conf --rw-r----- 1 root upsmon upssched.conf ----- - - - обозначает удаленную незначимую информацию. - -Как видно из вывода часть файлов перенесена в chroot, поэтому смотрим, что -находится в /var/lib/nut/etc/nut/: - ----- --rw-r----- 1 root upsd cmdvartab --rw-r----- 1 root upsdrv ups.conf --rw-r----- 1 root upsd upsd.conf --rw-r----- 1 root upsd upsd.pem --rw-r----- 1 root upsd upsd.users --rw-r----- 1 root upsmon upsmon.conf ----- - -Выявлена проблема наличия двух файлов (upsmon.conf, ups.conf) в двух местах. -Править конфигурационные файлы необходимо в /etc/nut. - -[float] -==== Конфигурирование ups.conf ==== - -Настройки UPS-специфического драйвера должны определятся в ups.conf. Какие -драйверы поддерживают определенные типы UPS описано в файле -/etc/ups/driver-list. Powerman BackPro Plus не имеет собственного драйвера и -поэтому необходимо использовать драйвер genericups с указанием upstype. -Процедура подбора драйвера описана в man genericups. Там же смотрим и параметры -необходимые для настройки драйвера. - -Установки в нашем случае приведены ниже: - ----- -# -# To find out if your driver supports any extra settings, start it with -# with the -h option and/or read the driver's documentation. -[myups] - driver = genericups - port = /dev/ttyS0 - upstype = 4 ----- - -* myups – это произвольное имя UPS. Строка [myups] должна начинаться с - первой колонки! В противном случае драйвер не будет стартовать. -* Port – это com–порт к которому присоединен UPS. -* upstype - тип UPS в данном драйвере. -* Для некоторых UPS необходим параметр cable=. - -Запускаем драйвер для нашего оборудования: - ----- -#/etc/init.d/upsdrv start ----- - -Успешный старт будет выглядеть так: - ----- -Starting UPS drivers: [DONE] ----- - -Отсутствие сообщения говорит об ошибке и необходимо проверить установки в -ups.conf, возможно, нужны дополнительные установки для обнаружения UPS. - -[float] -==== Конфигурирование upsd.conf ==== - -Поскольку мы не будем использовать сетевые возможности, то нет необходимости -изменять upsd.conf. Параметры по умолчанию следующие: - ----- -ACL all 0.0.0.0/0 -ACL localhost 127.0.0.1/32 -ACCEPT localhost -REJECT all ----- - -Запускаем сетевой сервер: - ----- -#/etc/init.d/upsd start ----- - -Успешный старт будет выглядеть так: - ----- -Starting UPS information service: [DONE] ----- - -Если upsd сообщит, что не может связаться с UPS, это означает, что ups.conf -сконфигурирован неверно или выбран неверный драйвер устройства. - -Проверим, что UPS сообщает правильные данные о своем состоянии. - ----- -#upsc myups@localhost ups.status ----- - -Ответ должен быть: - ----- -OL ----- - -OL означает, что UPS работает от сети. Другие сообщения (OB – от батареи или LB -разряженная батарея) говорят о том, что конфигурирование ups.conf неверно. Если -выводится сообщение "access denied" это означает, что неверно сконфигурирован -upsd.conf. Правим файлы и выполняем reload соответствующих демонов. - -Посмотрим, какие данные отслеживаются для UPS выбранным драйвером: - ----- -#upsc myups@localhost -Вывод для genericups будет таким: -driver.name: genericups -driver.parameter.port: /dev/ttyS0 -driver.parameter.upstype: 4 -driver.version: 2.0.0 -driver.version.internal: 1.30 -ups.mfr: Generic -ups.model: Generic RUPS model -ups.status: OL ----- - -[float] -==== Конфигурирование upsd.users ==== - -upsd.users разрешает или запрещает доступ к upsd демону клиентам (upsmon -демону, upsc команде, ...). Необходимо позволить upsmon демону связываться с -upsd. Для этого добавляются 4 строчки: - ----- -# The matching MONITOR line in your upsmon.conf would look like this: -# -# MONITOR myups@myhost 1 monuser pass master (or slave) -[monuser] - password = KJSsaia1 - allowfrom = localhost - upsmon master ----- - -* [monuser] – произвольное название для доступа upsmon демона. - -* password = строка определяющая пароль. Этот пароль не используется - пользователями. Определяется только в конфигурационном файле. - -* allowfrom = строка определяющая ACL имя для разрешения доступа. Здесь - "localhost" не localhost как имя хоста, а ACL имя, определенное в - upsd.conf: ACL localhost 127.0.0.1/32 - -* upsmon master – это upsmon специфическая настройка. Если upsd будет - работать в master-mode (обычно это так) необходимо поставить "master" как - аргумент в этой строчке. - -Перезагрузим upsd: - ----- -#/etc/init.d/upsd reload ----- - -Если нет сообщения [DONE] для старта проверяем конфигурационные файлы. - -[float] -==== Конфигурирование upsmon.conf ==== - -upsmon.conf это установки для upsmon, UPS демона монитора. - ----- -# -# MONITOR myups@bigserver 1 monmaster blah master -# MONITOR su700@server.example.com 1 upsmon secretpass slave -MONITOR myups@localhost 1 monuser KJSsaia1 master -# -------------------------------------------------------------------------- -# MINSUPPLIES ----- - -Необходима только одна MONITOR строчка. Здесь определяется имя UPS ("myups"), -имя хоста на котором upsd выполнятся ("localhost"), название доступа -("monuser"), пароль ("KJSsaia1") и "master" или "slave" (обычно "master"). Эти -установки соответствуют установкам в upsd.users. Число "1" - значение мощности -и устанавливается равной 1. Запускаем монитор: - ----- -#/etc/init.d/upmon start -Starting UPS monotor service: [DONE] ----- - -Отсутствие сообщения говорит об ошибке и необходимо проверить установки в -upsmon.conf. - -[float] -==== Заключительная проверка ==== - -Просматриваем сообщения в syslog : - ----- -# grep ups /var/log/messages ----- - -Сообщения, связанные с UPS должны выглядеть примерно так: - ----- -server genericups[14471]: Startup successful -server upsdrvctl: Network UPS Tools - UPS driver controller 2.0.0 -server upsdrv: Starting UPS drivers: succeeded -server upsd[14504]: Connected to UPS [myups]: genericups-ttyS0 -server upsd: Network UPS Tools upsd 2.0.0 -server upsd: Synchronizing...done -server upsd: Connected to UPS [myups]: genericups-ttyS0 -server upsd: upsd startup succeeded -server upsd[14505]: Startup successful -server upsmon: UPS: myups@localhost (master) (power value 1) -server upsmon: Using power down flag file /etc/killpower -server upsmon: upsmon startup succeeded -server upsmon[14523]: Startup successful -server upsd[14505]: Connection from 127.0.0.1 -server upsd[14505]: Client monuser@127.0.0.1 logged into UPS [myups] ----- - -Любые сообщения об ошибках здесь связаны с ошибками конфигурационных файлов, -которые должны быть исправлены. - -=== Что необходимо дописать === - -* Конфигурирование ups.conf для случая более сложного, чем genericups. - Например, APC. -* Конфигурирование upsd.conf Управление по сети. -* Конфигурирование upssched.conf. -* Сообщения об проблемах с питанием по e-mail и т.д. diff --git a/old-docs/index.txt b/old-docs/index.txt deleted file mode 100644 index b726838..0000000 --- a/old-docs/index.txt +++ /dev/null @@ -1,45 +0,0 @@ -= Старая документация = - -include::cmc_communication_stand.txt[] - -include::console_setup.txt[] - -include::corpnet.txt[] - -include::dhcp.txt[] - -include::emacs_email.txt[] - -include::emacs_im.txt[] - -include::filesystems_use.txt[] - -include::finding.txt[] - -include::firewall.txt[] - -include::freesoft_history.txt[] - -include::howto_use_nut.txt[] - -include::install_ltsp.txt[] - -include::junior_user.txt[] - -include::network.txt[] - -include::openvz.txt[] - -include::quickstart_desktop.txt[] - -include::scheme.txt[] - -include::sshd.txt[] - -include::ve_management.txt[] - -include::ve_rationale.txt[] - -//20 - -include::zsh_intro.txt[] diff --git a/old-docs/install_ltsp.txt b/old-docs/install_ltsp.txt deleted file mode 100644 index 16315a6..0000000 --- a/old-docs/install_ltsp.txt +++ /dev/null @@ -1,109 +0,0 @@ -//// -Пакет: docs-install_ltsp -RPM файл: docs-install_ltsp-0.1.4-alt1.noarch.rpm -Аннотация: Руководство по установке Linux Terminal Server -Автор: Артём Золочевский -Лицензия: FDL -URL: http://heap.altlinux.org/alt-docs/modules/install_ltsp/ -//// - -== Линукс Терминал == - -[float] -=== Введение === - -Линукс Терминал — это технология организации терминального сервера, -позволяющая: - -* сэкономить средства на обновлении аппаратного обеспечения: теперь - быстродействие зависит от одной несколько более мощной системы, а - «морально устаревшие» компьютеры могут потребовать разве что более - современного монитора и новых клавиатуры с мышью; -* сохранить время и спокойствие при резервном копировании: теперь данные - пользователей собраны на одной системе (обычно с «зеркалом» из двух - дисков) и производить резервное копирование совсем не трудно; -* гибко распределять рабочие места: теперь можно работать, войдя в систему с - любого терминала; -* не терять время на администрирование нескольких клиентских ПК, а только - одного или нескольких терминальных серверов; -* удобно перейти к использованию Линукс, а следовательно — избавиться от - опасности вирусов. - -=== Установка Линукс Терминал === - -[WARNING] -Заранее ознакомьтесь с указанными ниже особенностями конфигурации сети и -продумайте, как именно будут подключены терминалы. Также рекомендуется -устанавливать терминальный сервер на программный или аппаратный RAID1 для -увеличения производительности работы и надёжности хранения данных всех его -пользователей. - -Процесс установки Линукс Терминал практически не отличается от установки -обычного дистрибутива, например Линукс Юниор. В качестве пользовательского -интерфейса в установленной системе используется графическая среда KDE. - -Не стоит удивляться тому, что в основу терминального сервера положен -дистрибутив, предназначенный для рабочих станций, так как получаемый сервер — -это сервер приложений, большинство из которых предназначено для использования -именно на рабочих станциях. - -Терминальный сервер готов обслуживать «тонкие клиенты» на коммутаторе или -кросс-кабеле, подключённом к сетевому интерфейсу с адресом 192.168.0.1/24, -сразу после установки и загрузки. - -=== Конфигурация сети === - -[float] -==== Физическая ==== - -Для протокола X11 и современых приложений рекомендуется 100Mbps (Fast Ethernet) -сеть на коммутаторах (switch): 10Mbps работает, но с уловимой на глаз -латентностью. При наличии существенного количества клиентов (примерно более -десятка) имеет смысл применение коммутатора с гигабитным портом для сервера -(соответственно с гигабитным вторым интерфейсом); на сегодня это широко -распространённое и недорогое оборудование, минимум один Gigabit Ethernet вы -найдёте встроенным в любую новую материнскую плату, пригодную для создания -терминал-сервера. - -[float] -==== Логическая ==== - -Внимание: предполагается размещение терминалов в сети 192.168.0.0/24. Если на -терминальном сервере имеется два сетевых интерфейса, один из которых подключён -к локальной сети, проще всего подключить терминальную сеть к другому -интерфейсу, назначив ему адрес 192.168.0.1. В программе установки именно этот -адрес по умолчанию и назначается второму интерфейсу (eth1), всё остальное из -необходимого также конфигурируется для использования соответствующей сети -класса C (адрес: 192.168.0.0; маска: 255.255.255.0; бродкаст: 192.168.0.255). - -=== Проблемы и их решения === - -[float] -==== PXE NIC ==== - -Если сетевая карта имеет PXE-стек, который определяется как Intel Boot Agent -4.0.19, его придётся заменить на более старый или более новый. Для набортных -сетевых интерфейсов это, как правило, означает обновление BIOS материнской -платы. - -[float] -==== AMD Geode ==== - -В силу наличия известной проблемы с видеодрайвером xorg-x11-drv-amd в версии -Xorg, входящей в состав данного дистрибутива Линукс, использование таких -терминалов сейчас затруднено. Дополнительная документация - -=== Дополнительная документация === - -Дополнительная документация доступна на сайте freesource.info Здесь можно -узнать подробности об устройстве терминал-сервера, настройке сети, установке -Линукс-Терминал и его тонкой настройке. - -Для ознакомления с различными способами применения терминального сервера, а -также для получения информации о решении типичных проблем (на английском -языке), можно воспользоваться следующими ссылками: - -* http://www.freesource.info/wiki/Dokumentacija/LTSP5 -* http://www.ltsp.org/twiki/bin/view/Ltsp/SuccessStories -* http://www.ltsp.org/twiki/bin/view/Ltsp/TroubleShooting - diff --git a/old-docs/junior_user.txt b/old-docs/junior_user.txt deleted file mode 100644 index 78ffda7..0000000 --- a/old-docs/junior_user.txt +++ /dev/null @@ -1,679 +0,0 @@ -//// -Пакет: docs-issue-junior_user -RPM файл: docs-issue-junior_user-0.3-alt1.noarch.rpm -Аннотация: Руководство пользователя ALT Linux 4.0 Junior -Автор: Артём Золочевский -Лицензия: FDL -URL: http://heap.altlinux.org/issues/junior_user/index.html -//// - -== Описание некоторых приложений из Школьного Юниора 4.0 == - -=== Cоздания и редактирования Интернет-приложений === - -[float] -==== Редактор Интернет-приложений Bluefish ==== - -Bluefish:: - редактор Интернет-приложений, пригодный для веб-дизайнеров и -программистов. Он поддерживает множество языков программирования и разметки; но -наиболее удобен, в первую очередь, для динамических и интерактивных веб-сайтов. -Bluefish является проектом разработчиков-приверженцев движения Open Source и -распространяется по лицензии GPL. - -Bluefish — настольное, однопользовательское приложение, занимающее на -жестком диске менее 200 мегабайт, базируется на 32-х разрядной вычислительной -архитектуре и поддерживает работу в режиме реальной многозадачности. - -Bluefish обеспечивает средства разработки, необходимые для создания портальных -Интернет-страниц, совместимых с большинством обозревателей, а также -предоставляет возможность для интуитивно понятной разработки веб-узлов. -Предоставляет возможность быстрого форматирования веб-страниц с помощью -инструментов таблиц стилей (CSS), возможность изменять макет и формат -веб-узлов. - -Bluefish обладает полным комплектом средств для создания веб-страниц и -интеграции данных на порталах и набором инструментов для работы с веб-частями -представленных списков, подключаемых веб-частей. - -Bluefish поддерживает режим интерактивного просмотра, при котором результаты -выполнения редактирования или изменений в форматировании документа доступны в -предварительном просмотре. - -Bluefish имеет дружественную пользователю систему представления полной -документации по работе с ней в режиме так называемой «помощи» (Help). - -Редактор Bluefish позволяет редактировать множество файлов одновременно, -использовать большое количество панелей инструментов и функций тонкой настройки -меню. В программу интегрированы инструменты для работы с изображениями и их -миниатюрами, можно открывать документы прямо из Интернета, а также создавать -файлы CSS, сценарии на языках PHP, HTML, Java, С, редактировать XML. -Предусматривается множество электронных помощников и возможность интеграции с -внешними программами для разработки веб-страниц (tidy, weblint, make, javac). - -Установка и обновление Bluefish осуществляется штатными средствами операционной -системы различными способами: с компактного диска формата CD, жесткого диска, в -том числе доступного в качестве разделяемого ресурса, через Интернет и рядом -других способов. - -[float] -==== Редактор Интернет-приложений Quanta Plus ==== - -Quanta Plus:: - настольное, однопользовательское приложение, занимающее на жестком -диске менее 200 мегабайт, базируется на 32-х разрядной вычислительной -архитектуре и поддерживает работу в режиме реальной многозадачности. - -Quanta Plus обеспечивает средства разработки, необходимые для создания -портальных Интернет-страниц, совместимых с большинством обозревателей, а также -предоставляет возможность для интуитивно понятной разработки веб-узлов. -Предоставляет возможность быстрого форматирования веб-страниц с помощью -инструментов таблиц стилей (CSS), возможность изменять макет и формат -веб-узлов. - -Quanta Plus обладает полным комплектом средств для создания веб-страниц и -интеграции данных на порталах и набором инструментов для работы с веб-частями -представленных списков, подключаемых веб-частей. - -Quanta Plus поддерживает режим интерактивного просмотра, при котором результаты -выполнения редактирования или изменений в форматировании документа доступны в -предварительном просмотре. - -Quanta Plus имеет дружественную пользователю систему представления полной -документации по работе с ней в режиме так называемой «помощи» (Help). - -Quanta Plus — главная составляющая пакета KDE kdewebdev (в него входит еще -несколько утилит для веб-мастера). Этот HTML-редактор обеспечивает стандартные -для программ этого класса возможности набора и редактирования HTML, такие, как -автоматический ввод основных тегов и их атрибутов, подсветка синтаксиса, -предварительный просмотр веб-страниц и пр. Достоинство Quanta Plus — развитые -средства обработки текста, в том числе поиск и замена (в том числе с -использованием регулярных выражений), а также проверка орфографии. Есть в этом -редакторе и специфические функции. Это развитые средства управления проектами и -(что самое главное) визуальный редактор, позволяющий выполнять разметку HTML -методами, привычными по работе с текстовыми процессорами. Кроме того, в -программу интегрирован файловый менеджер, который представляет собой -облегченный вариант файлового менеджера для KDE Konqueror. Для профессиональных -веб-мастеров функции Quanta Plus будут вполне достаточными: программа умеет -работать с языком разметки XML, стилевыми таблицами (CSS), сценариями PHP и -др., без чего представить хорошо сделанный сайт сложно. - -Установка и обновление Quanta Plus, как и Bluefish, осуществляется штатными -средствами операционной системы различными способами: с компактного диска -формата CD, жесткого диска, в том числе доступного в качестве разделяемого -ресурса, через Интернет и рядом других способов. - -=== Работа с электронной почтой === - -[float] -==== Почтовый клиент Claws-Mail ==== - -Claws Mail:: - легкая, быстрая программа для управления электронной почтой и чтения -новостных лент, написанная с использованием свободно распространяемой -графической библиотеки GTK+. Поддерживает протоколы POP3, APOP, IMAP, SMTP, -SMTP AUTH, NNTP, LDAP, использование нескольких учётных записей, проверку -языка, адресную книгу, SSL, GPG, фильтры, i18n и многое другое. Функционал -может расширяться с помощью внешних модулей. - -Claws Mail — настольное, однопользовательское приложение, занимающее на жестком -диске менее 3000 Мб (включая стандартный набор модулей расширения), основано на -32-х разрядной вычислительной архитектуре, поддерживает работу в режиме -реальной многозадачности. - -Claws Mail позволяет расставлять сообщения по приоритетам, создавать отдельные -папки для разных видов сообщений и осуществлять поиск по всем документам. - -Claws Mail предоставляет удобные средства редактирования текста, средства -проверки правописания, обеспечивает защиту от нежелательной почты. Программа -позволяет сохранять созданные документы в текстовых форматах, поддерживаемых -другими настольными приложениями. - -Claws Mail обеспечивает добавление цифровой подписи в документ и гарантирует -его подлинность, целостность и определенность происхождения. - -Claws Mail позволяет организовывать показ сообщений по обсуждениям и -предоставляет возможности дальнейшего расширения программы при помощи -подключаемых модулей. - -[float] -==== Почтовый клиент Mozilla Thunderbird ==== - -Mozilla Thunderbird:: -программа для работы с электронной почтой и группами новостей. Является -составной частью проекта Mozilla. Поддерживает протоколы: SMTP, POP3, IMAP, -NNTP, RSS. Thunderbird работает в Microsoft Windows, Mac OS X и GNU/Linux, -причём набор возможностей на всех платформах одинаков. - -Mozilla Thunderbird — настольное, однопользовательское приложение занимающее на -жестком диске менее 3000 Мб, основан на 32-х разрядной вычислительной -архитектуре, поддерживает работу в режиме реальной многозадачности. - -Mozilla Thunderbird позволяет расставлять сообщения по приоритетам, создавать -отдельные папки для разных видов сообщений и осуществлять поиск по всем -документам. - -Mozilla Thunderbird предоставляет удобные средства редактирования текста, -средства проверки правописания, обеспечивает защиту от нежелательной почты. -Программа позволяет сохранять созданные документы в текстовых форматах, -поддерживаемых другими настольными приложениями. - -Mozilla Thunderbird обеспечивает добавление цифровой подписи в документ и -гарантирует его подлинность, целостность и определенность происхождения. - -Mozilla Thunderbird позволяет организовывать показ сообщений по обсуждениям и -предоставляет возможности дальнейшего расширения программы при помощи -подключаемых модулей. - -Как и OpenOffice.org, Mozilla Thunderbird является многоплатформенным проектом, -и успешно запускается на ряде операционных систем, в частности GNU/Linux, -Windows, MacOS X. - -=== Программирование === - -[float] -==== Интегрированная среда разработки KDevelop ==== - -KDevelop:: -это интегрированная среда разработки (Integrated Development Environment – -IDE), инструмент написания приложений широкого круга применения. - -KDevelop представляет собой современную платформу для разработки программного -обеспечения с возможностью использования небольших независимых модулей для -расширения базовой функциональности среды. KDevelop не зависит от языка -программирования и не зависит от платформы, на которой он запускается, -поддерживая создание приложений KDE, GNOME, Qt, GTK+, wxWidgets, баз данных SQL -и консольных приложений). В поставку KDevelop входят десятки типовых проектов -для различных сред и платформ. - -KDevelop поддерживает большое количество языков программирования, включая C, -C\++, Perl, Python, PHP, Java, Fortran, Ruby, Ada, Pascal, SQL и Bash. -Поддерживаются такие системы сборки проектов, как GNU (automake), qmake и make -для собственных средств сборки проектов. - -KDevelop — однопользовательское средство разработки, занимающее на жестком -диске не более 1 Гб. - -KDevelop обеспечивает поддержку структурированного программирования, выделение -описания процедур и функций, строгую типизацию, поддержку -объектно-ориентированного программирования и проектирования. - -KDevelop имеет подсветку синтаксиса, встроенный отладчик, подсвечивает -ошибочный код, показывает сигнатуры функций и процедур, обеспечивает навигацию -по исходному коду с системой гиперссылок, поддержку рефакторинга, проектов и -групп проектов. Среда разработки может использовать любой компилятор командной -строки. Встроенный отладчик позволяет работать графически со всеми предствами -отладки, такими как точки останова и трассировки. Он так же может работать с -динамически подгружаемыми плагинами, в отличии от консольного gdb. - -KDevelop имеет редактор визуальных интерфейсов для создания приложений для -оконной среды Linux с использованием компонентной идеологии и WYSIWIG подхода, -также обеспечивается взаимная динамическая синхронизация визуального -представления приложения и его исходного кода. - -KDevelop имеет в своём составе библиотеку визуальных компонентов, а также -возможность подключать и использовать компоненты сторонних производителей, как -в исходных кодах, так и в скомпилированном виде. Среда позволяет разрабатывать -расширения и компоненты с использованием как собственных, так и сторонних -языковых средств. - -KDevelop обеспечивает возможность соединения и работы с реляционными базами -данных, включает в себя встроенный менеджер баз данных для администрирования и -разработки баз данных, включая выполнение запросов SQL. - -Все основные операции в KDevelop сопровождаются электронными помощниками для -облегчения создания приложений. Функция завершения кода (code completion) - -доступна для языков C и C++. Quick Open позволяет быстро перемещаться по -файлам. Также реализовано сворачивание блоков кода (folding). - -Система помощи KDevelop покрывает все аспекты языка и среды, с выделением -разделов быстрой помощи и подробных справочных материалов. - -[float] -==== Интегрированная среда для разработки на языке Object Pascal -- Lazarus ==== - -Lazarus:: -интегрированная среда для разработки на языке Object Pascal (компилятор Free -Pascal Compiler). - -Lazarus — однопользовательское средство разработки на языках Pascal и Object -Pascal, обеспечивающее поддержку структурированного программирования, выделение -описания процедур и функций, строгую типизацию, поддержку -объектно-ориентированного программирования и проектирования. - -Интегрированная среда Lazarus имеет подсветку синтаксиса, может использовать -встроенный или подключаемый отладчик, подсвечивает ошибочный код, показывает -сигнатуры функций и процедур, обеспечивает навигацию по исходному коду с -системой гиперссылок, имеет поддержку рефакторинга, проектов и групп проектов. -Также имеется компилятор командной строки. - -Интегрированная среда Lazarus имеет редактор визуальных интерфейсов для -создания приложений для графической среды Linux с использованием компонентной -идеологии и WYSIWIG подхода, обеспечивает взаимную динамическую синхронизацию -визуального представления приложения и его исходного кода. - -Интегрированная среда Lazarus имеет в своем составе библиотеку визуальных -компонентов Lazarus Component Library (LCL), а также возможность подключать и -использовать компоненты сторонних производителей, как в исходных кодах, так и в -скомпилированном виде. Среда позволяет разрабатывать расширения и компоненты с -использованием как собственных, так и сторонних языковых средств. - -Интегрированная среда Lazarus обеспечивает возможность соединения и работы с -реляционными базами данных, включает в себя встроенный менеджер баз данных для -администрирования и разработки баз данных, включая выполнение SQL-запросов. - -Интегрированная среда Lazarus имеет возможность включать в исходный код участки -на ассемблере. - -В Lazarus все основные операции сопровождаются электронными помощниками. - -Интегрированная среда Lazarus, имея собственный менеджер и формат проектов, -также поддерживает преобразование проектов Delphi. - -Интегрированная среда Lazarus работает в различных операционных системах -включая: GNU/Linux, Microsoft Windows, MacOS X и FreeBSD. - -Компиляция программ на Pascal в среде Lazarus обеспечивается Free Pascal -Compiler (FPC) Компилятор совместим с Borland Pascal 7 и Object Pascal – -Delphi, но при этом обладает рядом дополнительных возможностей, например, -поддерживает перегрузку операторов. FPC — кроссплатформенный инструмент, -поддерживающий огромное количество платформ. Среди них — AmigaOS, DOS, Linux, -*BSD, OS/2, MacOS(X) и Win32. - -Однако FPC — это не просто компилятор. Он имеет в своем составе великолепный -набор библиотек, одной из которых является FCL, включающая в себя компоненты, -совместимые с невизуальными компонентами VCL из Borland Delphi. Разработка -удобных в повторном использовании визуальных компонент является одной из целей -проекта Lazarus. - -[float] -==== Образовательная среда программирования -- KTurtle ==== - -KTurtle:: -(K от KDE; Turtle, англ. — черепашка) — образовательная среда программирования, -входящая в пакет образовательных программ KDE Edutainment Project. -Распространяется на условиях GNU General Public License. - -KTurtle предлагает простой способ изучения программирования, предназначенный -для детей. Язык программирования, использующийся в KTurtle, базируется на языке -высокого уровня Logo, и может использовать русские ключевые слова при написании -кода. - -KTurtle — однопользовательское средство разработки пригодное для обучению -основным понятиям программирования детей в возрасте от 7 лет, занимающее на -жестком диске менее 500 Мб. - -Графическая среда программы KTurtle позволяет наглядно обучать детей основным -конструкциям программирования, расширять набор команд за счёт создания -процедур, а наглядное воспроизведение работы программы обеспечивает присутствие -игрового момента. - -Наличие большого количества примеров кода на русском и английском языках, -руководства по установке и запуску а также описания встроенного языка -программирования на русском языке в электронном виде, обеспечивает методическую -помощь учителю. Система помощи покрывает все аспекты языка и среды. - -[float] -==== Интегрированная среда разработки -- Eclipse ==== - -Eclipse:: -свободное средство разработки для создания приложений, веб-приложений, программ -для мобильных устройств. - -Eclipse, в первую очередь, полноценная Java IDE, нацеленная на групповую -разработку, снабженная средствами для работы с системами контроля версий -(поддержка CVS входит в поставку Eclipse, активно развиваются несколько -вариантов модулей работы с SVN, существует поддержка VSS и других). Во многих -крупных организациях Eclipse — корпоративный стандарт для разработки -приложений. - -Второе назначение Eclipse — служить платформой для разработки новых расширений -(чем и завоевал популярность этот продукт: любой разработчик может расширить -возможности Eclipse своими модулями). Такими расширениями стали: C/C++ -Development Tools (CDT), разрабатываемые инженерами QNX совместно с IBM, -средства для разработки на COBOL, FORTRAN, PHP . Множество расширений дополняет -Eclipse средствами для работы с базами данных, серверами приложений и другие. - -Eclipse написана на Java, поэтому является платформо-независимым продуктом, за -исключением библиотеки SWT, которая разрабатывается для всех распространенных -платформ. Библиотека SWT используется вместо Swing и полностью зависит от -платформы выполнения (операционной системы), что обеспечивает быстроту и -натуральный внешний вид пользовательского интерфейса. - -Eclipse обеспечивает поддержку структурированного программирования, выделение -описания процедур и функций, строгую типизацию, поддержку -объектно-ориентированного программирования и проектирования. - -Редактор в Eclipse имеет подсветку синтаксиса. Платформа может использовать как -встроенный так и подключаемый отладчик, подсвечивать ошибочный код, показывать -сигнатуры функций и процедур, обеспечивать навигацию по исходному коду с -системой гиперссылок, поддержиевает рефакторинг, проектов и групп проектов. -Eclipse использует компилятор командной строки, устанавливающийся вместе с этой -платформой. - -*Архитектура:* - -Основой Eclipse является платформа расширенного клиента (RCP — от англ. rich -client platform). Ее составляют следующие компоненты: - -* Ядро платформы (загрузка Eclipse, запуск модулей); -* OSGi (стандартная среда поставки комплектов); -* SWT (портируемый инструментарий графических элементов); -* JFace (файловые буферы, работа с текстом, текстовые редакторы); -* Рабочая среда Eclipse (панели, редакторы, проекции, электронные помощники). - -Пользовательский интерфейс Eclipse пользуется промежуточным слоем графического -интерфейса, называемым JFace, который упрощает построение пользовательского -интерфейса, базирующегося на SWT. - -Гибкость Eclipse обеспечивается за счет подключаемых модулей, благодаря чему -возможна разработка не только на Java, но и на других языках, таких как C/C++, -Perl, Ruby, Python, PHP, ErLang и прочих языков. - -*Локализация* - -Существует языковой пакет для русификации Eclipse. Переведены на русский язык -как графический интерфейс, так и документация. - -*Возможности среды разработки (IDE)* - -_Помощник создания кода_ — выдает подсказки по коду (имеющимся переменным и -функциям), синтаксису, возможному завершению введенной строки и т.п. - -_Шаблоны_ — стенографический ввод текста, например после ввода слова for редактор -выдаст возможные варианты (шаблоны) этой конструкции — остается только выбрать -нужный. - -_Автоматический ввод_ — например, автоматический ввод закрывающей скобки, -кавычки при вводе открывающей и т.п. - -_Рефакторинг_ — преобразование исходного кода без изменения его -функциональности. Обычно используется при переименовании переменной, класса или -метода — Еclipse автоматически вносит необходимые изменения во все файлы -проекта. Кроме того, рефакторинг помогает при переносе класса из одного проекта -в другой — достаточно просто его переместить, и среда позаботится о том, чтобы -это было корректно. Eclipse поддерживает более десятка разновидностей -рефакторинга. - -_Гиперссылки_ — просмотр текста программы в режиме веб-сайта для того, чтобы, к -примеру, от переменной или вызова функции перейти к ее определению и т.п. - -_Быстрое исправление_ — синтаксическая ошибка отмечается сразу же в процессе -написания кода, при этом среда предлагает варианты исправления. - -_Поиск_ — множество вариантов поиска как в пределах одного файла, так и по -всему проекту (проектам) или множеству файлов. Как пример, языковый поиск -различает одноименные переменную, метод, или даже методы, отличающиеся набором -полей. - -_Альбомные_ страницы — способ написания и тестирования отрывков кода. - -_Набор экранов_ — создается набор специальным образом расположенных окон и -панелей меню под различные задачи: написание кода, отладка и т.п.. - -_Система помощи_ покрывает все аспекты языка и среды, с выделением разделов -быстрой помощи и подробных справочных материалов как по самой среде, так и по -подключенным к среде расширениям с возможностью поиска. - -=== Аналитические вычисления === - -[float] -==== Компьютерная алгебра -- Maxima ==== - -Maxima:: -свободная система компьютерной алгебры, написана на языке Lisp. - -Maxima имеет широчайший набор средств для проведения аналитических вычислений, -численных вычислений и построения графиков. По набору возможностей система -близка к таким коммерческим системам как Maple и Mathematica. В то же время она -обладает высочайшей степенью переносимости. Это единственная из существующих -систем аналитических вычислений, которая может работать на всех основных -современных операционных системах на компьютерах, начиная от самых мощных -вплоть до наладонных компьютеров. - -Имеет несколько графических интерфейсов пользователя: XMaxima (включен в -поставку во многих ОС), wxMaxima и т. д. Может работать в режиме командной -строки (используя псевдографику для отображения метематических записей и -графиков). - -Maxima предназначена для того, чтобы преобразовывать алгебраические выражения: -упрощать, приводить подобные, раскрывать скобки или, наоборот, группировать -подобные члены, вычислять производные, пределы и интегралы, решать системы -алгебраических и дифференциальных уравнений, производить вычисления с -матрицами, упрощать и преобразовывать тригонометрические выражения, производить -численные вычисления с любой заданной точностью. - -Maxima имеет средства для построения 2D и 3D графиков функций, возможность -пакетной обработки файлов сценариев без наличия графического интерфейса. - -Maxima совместно с графической оболочкой wxMaxima позволяет записывать формулы -в режиме WYSIWYG, подготавливать и исполнять сценарии на языке среды с -автоматической проверкой синтаксиса. - -Справочное руководство Maxima описывает все встроенные функции системы. -Руководство интегрировано в программу в виде справочника, оснащённого -средствами поиска. - -Обновление программы производится штатными средствами ОС. - -[float] -==== Численные и технические вычисления -- Scilab ==== - -Scilab:: -программа для решения задач численных и технических вычислений, являющаяся -аналогом программ, входящих в MatLab, и имеющая схожий с ним язык -программирования (в составе имеется утилита, позволяющая конвертировать -документы из MatLab в Scilab). Программа доступна для различных операционных -систем, включая Microsoft Windows и Linux. Имеется возможность расширения -возможностей программы внешними программами и модулями, написанными на разных -языках программирования. - -Scilab позволяет работать с элементарными и большим числом специальных функций -(Бесслея, Неймана, интегральные функции), имеет мощные средства работы с -матрицами, полиномами (в том числе и символьно), производить численные -вычисления (например численное интегрирование) и решение задач линейной -алгебры, оптимизации и симуляции, мощные статистические функции, а также -средство для построения и работы с графиками. В состав пакета также входит -Scicos — инструмент для редактирования блочных диаграмм и симуляции (аналог -simulink в пакете MatLab). Имеется возможность совместной работы Scilab с -программой LabVIEW. - -В Scilab имеется возможность пакетной обработки файлов сценариев без наличия -графического интерфейса, а наличие встроенного редактора, позволяет -подготавливать и исполнять сценарии на языке среды, с автоматической проверкой -синтаксиса. - -В Scilab система помощи покрывает все аспекты языка и среды, также имеются -справочные материалы по используемым функциям. - -=== Обработки и монтаж аудио-записей === - -[float] -==== Редактор звуковых файлов -- Audacity ==== - -Audacity:: -бесплатный, кросс-платформенный редактор звуковых файлов. Программа выпущена и -распространяется на условиях GNU GPL. Графический интерфейс сделан с помощью -библиотеки wxWidgets. Работает под GNU/Linux, Mac OS X, Microsoft Windows и -другими операционными системами. - -Audacity — однопользовательское, прикладное ПО, занимающее не более 1 GB -свободного пространства на жестком диске. - -Далее описываются возможности Audacity. - -*Запись* - -Audacity может записывать звук извне с микрофона, встроенного в ОС микшера или -канала Line In, к которому можно подключить кассетный магнитофон, проигрыватель -грампластинок или минидисков. При использовании некоторых звуковых карт можно -записывать и потоковый звук. Доступны: - -* Запись с микрофона, линейного входа или других источников; -* Запись с одновременным прослушиванием имеющихся дорожек; -* Запись до 16 каналов одновременно (необходима многоканальная звуковая карта); -* Индикаторы громкости до, во время и после - записи. - -*Импорт и экспорт* - -Вы можете импортировать звуковые файлы в проект Audacity, изменить их, -объединить с другими файлами или новыми записями, экспортировать результат в -файлы нескольких форматов. Поддерживаются: - -* Импорт и экспорт файлов в форматах WAV, AIFF, AU, MP3, FLAC и Ogg Vorbis; -* Импорт звука в MPEG (включая файлы MP2 и MP3) при помощи libmad; -* Создание файлов WAV и AIFF, которые можно записать на звуковой компакт-диск; -* Импорт и экспорт файлов всех форматов, поддерживаемых библиотекой libsndfile; -* Открытие raw-файлов (файлов без заголовков) при помощи команды «Импортировать - raw-файл». - -*Редактирование* - -* Базовые операции вырезания, копирования, вставки и удаления; -* Неограниченная история изменения, по которой можно отменить и повторить - действие; -* Очень быстрое изменение больших файлов; -* Изменение и сведение неограниченного числа дорожек; -* Использование «карандаша» для редактирования отдельных точек сэмплов; -* Плавное изменение громкости при помощи инструмента редактирования огибающей. - -*Эффекты* - -* Изменение темпа с сохранением высоты тона, изменение высоты тона с - сохранением темпа; -* Удаление статического шума, гула, шипения и других постоянных шумовых - дефектовзаписи; -* Воспроизведение множества дорожек одновременно; -* Изменение частотных характеристик при помощи эквалайзера, FFT-фильтра и - эффекта усиления баса; -* Подстройка громкости при помощи компрессора, эффекта усиления и или нормализации; -* Другие встроенные эффекты: -** Эхо -** Фазер -** Wahwah -** Разворот - -*Качество звука* - -* Запись и редактирование 16/24/32-битных (32бит — с плавающей точкой) звуковых - данных в файлы разных форматов. -* Частота дискретизации до 96 кГц; -* Преобразования частот дискретизации и битовой глубины производятся с - использованием качественных алгоритмов ресэмплинга и дитеринга; -* Сведение дорожек с разными качественными характеристиками с автоматическим - преобразованием до характеристик проекта в режиме реального времени. - -*Дополнительные модули (Plug-Ins):* - -* Модули системы обработки звука LADSPA; Audacity включает несколько - LADSPA-модулей; -* Использование VST-модулей под Windows и Mac при помощи скачиваемого отдельно - модуля VST Enabler; -* Создание своих эффектов на простом встроенном языке Nyquist. - -*Анализ* - -* Спектрографический режим отображения дорожек; -* Команда «Нарисовать график спектра» для детального анализа частотных - характеристик. - -=== Cжатие и архивирование файлов === - -[float] -==== Архиватор Xarchiver ==== - -Xarchiver:: -графический пользовательский интерфейс для различных консольных архиваторов в -системах GNU/Linux, работающий под управлением любой графической среды. - -Xarchiver — однопользовательское прикладное ПО, занимающее не более 4 Мбайт -свободного места на жестком диске и базирующаяся на 32-х разрядной -вычислительной архитектуре, поддерживает работу в режиме реальной -многозадачности. - -Xarchiver умеет создавать следующие типы архивов: arj, tar, tar.bz2, tar.gz, -zip, 7z. Для zip и 7z умеет создавать и самораспаковывающиеся архивы. - -Xarchiver умеет распаковывать следующие типы архивов: arj, tar, tar.bz2, -tar.gz, zip, 7z, rar. - -Xarchiver предоставляет удобные средства для добавления/удаления -файлов/каталогов в архив; навигации по содержимому архива; переименования, -извлечения файлов из архива. - -Xarchiver обеспечивает добавление пароля на архивы, поддерживающие данную -функциональную возможность (arj, zip, rar и 7z), и проверку их целостности. - -Xarchiver поддерживает режим просмотра содержимого и свойств файлов, -находящихся в архиве; возможность запуска при помощи других программ файлов -непосредственно из архива без необходимости ручного их разархивирования. - -[float] -==== Архиватор Ark ==== - -Ark:: -графический пользовательский интерфейс для различных консольных архиваторов в -системах GNU/Linux, работающий под управлением любой графической среды. - -Ark— однопользовательское прикладное ПО, занимающее не более 4 Мбайт свободного -места на жестком диске и базирующаяся на 32-х разрядной вычислительной -архитектуре, поддерживает работу в режиме реальной многозадачности. - -Ark умеет создавать следующие типы архивов: arj, tar, tar.bz2, tar.gz, zip, 7z. - -Ark умеет распаковывать следующие типы архивов: arj, tar, tar.bz2, tar.gz, zip, -7z, rar. - -Ark предоставляет удобные средства для добавления/удаления файлов/каталогов в -архив; навигации по содержимому архива; переименования, извлечения файлов из -архива. - -Ark обеспечивает добавление пароля на архивы, поддерживающие данную -функциональную возможность (arj, zip, rar и 7z), и проверку их целостности. - -Ark поддерживает режим просмотра содержимого и свойств файлов, находящихся в -архиве; возможность запуска при помощи других программ файлов непосредственно -из архива без необходимости ручного их разархивирования. - -[float] -=== Защита от вирусов и других видов вредоносных программ === - -[float] -==== Антивирусный пакет -- Clam AntiVirus ==== - -Clam AntiVirus:: -это антивирусный набор с открытым исходным кодом (GPL) для UNIX, -предназначенный, прежде всего, для сканирования электронной почты на почтовых -шлюзах. Он предоставляет некоторое количество утилит, включая гибкий и -масштабируемый многопоточный демон, сканер командной строки и продвинутый -инструмент для автоматических обновлений баз данных. Ядром набора является -антивирусный механизм, доступный в форме разделяемой библиотеки. - -Clam AntiVirus — многопользовательское прикладное ПО, базирующееся на 32-х -разрядной вычислительной архитектуре, поддерживает работу в режиме реальной -многозадачности занимает не более 12 Мбайт на жестком диске - -Основные возможности: - -* сканер командной строки; -* быстрый, многопоточный демон с поддержкой сканирования при доступе; -* milter-интерфейс для sendmail и взаимодействие с Postfix; -* - продвинутая программа обновления баз данных с поддержкой скриптовых обновлений и цифровых подписей; -* C-библиотека вирусного сканера; -* сканирование при доступе (Linux® и FreeBSD®); -* вирусная база данных, обновляемая несколько раз в день; -* встроенная поддержка различных архивных форматов, включая Zip, RAR, Tar, GZip, BZip2, OLE2, Cabinet, CHM, BinHex, SIS и другие; -* встроенная поддержка почти всех форматов почтовых файлов; -* встроенная поддержка выполняемых файлов ELF и Portable Executable, сжатых UPX, FSG, Petite, NsPack, wwpack32, MEW, Upack и замаскированных SUE, Y0da Cryptor и другими; -* встроенная поддержка общераспространённых форматов документов, включая файлы Microsoft Office и MacOffice, HTML, RTF и PDF. - -KlamAV - графический интерфейс для антивируса ClamAV, написанный для KDE. -Включает: сканирование в режиме доступа, сканирование по запросу, обновление -базы через Интернет, управление карантином, скачивание обновлений, сканирование -почты для почтовых программ, автоматическую установку, поддержку различных -языков для элементов интерфейса. Язык интерфейса KlamAV выбирается -автоматически исходя из настроенных предпочтений пользователя ОС. - - diff --git a/old-docs/network.txt b/old-docs/network.txt deleted file mode 100644 index eb6825e..0000000 --- a/old-docs/network.txt +++ /dev/null @@ -1,220 +0,0 @@ -//// -Пакет: docs-network -RPM файл: docs-network-0.2-alt1.1.noarch.rpm -Аннотация: Описание настройки сетевых подключений. -Автор: Артём Золочевский -Лицензия: FDL -URL: http://docs.altlinux.org/current/modules/network/index.html -//// - -== Настройка сети в ALT Linux == - -[float] -=== Введение === - -В современном мире трудно встретить одиноко стоящий компьютер, не связанный с -другими тем или иным способом. Локальная сеть в пределах одной квартиры — уже -не редкость. И даже если вы просто время от времени выходите в Интернет, то на -время вашего сеанса работы с Интернетом вы становитесь участником огромной сети -компьютеров. - -В системе Linux полностью реализован протокол TCP/IP (Transport Control -Protocol/Internet Protocol), являющийся наиболее успешным средством объединения -компьютеров в единую сеть. Имея компьютер с системой Linux и адаптером Ethernet -(сетевой картой), можно подключить его к локальной сети или (при наличии -соответствующего подключения) к сети Интернет. - -=== Основные понятия === - -Прежде чем настраивать сетевые подключения, необходимо ознакомиться со -значением параметров, используемых при настройке сети: - -IP-адрес:: -Это уникальный адрес компьютера в формате четырёх трёхзначных десятичных -чисел, разделённых точками, например, 192.168.0.22. Как правило, каждый сетевой -интерфейс (сетевая карта вашего компьютера) имеет не менее одного IP-адреса. - -*Пример*: 192.168.0.22 - -[note] -Даже если ваш компьютер не укомплектован отдельной сетевой картой, у него -имеется внутренний виртуальный сетевой интерфейс с IP-адресом 127.0.0.1. - -Сетевая маска (netmask):: -Маска определяет, какая часть IP-адреса соответствует номеру локальной -(под)сети (subnetwork number), а какая — номеру компьютера в сети. Большинство -локальных сетей используют маску 255.255.255.0. - - -*Пример*: 255.255.255.0 - -Таким образом, при IP-адресе сетевого интерфейса 192.168.0.22 и маске -255.255.255.0: - -* 192.168.0.0 — соответствует адресу сети. -* 22 — соответствует номеру компьютера в сети. - -Адрес маршрутизатора (gateway address):: -Это IP-адрес компьютера, который является «шлюзом» во внешний мир (т. е. к -компьютерам вне локальной сети). Другими словами, если вы обращаетесь за -пределы вашей локальной сети (например, к Интернету), то этот компьютер сможет -предоставить вам такую возможность. Конкретный адрес знает тот, что -проектировал сеть. Например, если ваш IP-адрес в локальной сети 192.168.0.22, -то в роли шлюза может выступать компьютер с IP-адресом 192.168.0.1. - -*Пример*: 192.168.0.1 - -Адрес сервера имён (name server address):: -В большинстве компьютерных сетей имеется сервер, который преобразует имя -компьютера в IP-адрес (Domain Name Server, сокращённо DNS). Сервер -устанавливает соответствие доменного имени, отражающего административную -принадлежность компьютера, и IP-адреса, отражающего место компьютера в сети -Интернет. Любое обращение по сети с использованием доменного имени требует -преобразования его в IP-адрес. Адрес DNS-сервера должен сообщить администратор -сети или провайдер, предоставляющий доступ в Интернет. - -[NOTE] -Указанные выше параметры не всегда необходимо указывать вручную. В сети может -использоваться технология их автоматической настройки DHCP (Dynamic Host -Configuration Protocol). В этом случае всё, что нужно — это физически -подсоединить кабель к сетевой карте и указать, что сетевой интерфейс должен -получать настройки автоматически. В любом случае, для правильной настройки сети -проконсультируйтесь со своим системным администратором и получите от него, если -необходимо, конкретные данные. - -Более подробно про организацию адресации в TCP/IP можно прочесть по адресу -http://citforum.ru/nets/tcp/ adres_inter.shtml. - -=== Настройка сети в ALT Linux === - -Для комфортабельной настройки сети предлагается два способа: - -* Центр управления системой -** Этот способ настройки рекомендуется в том случае, если компьютер не входит в -локальную сеть либо входит в одну и ту же локальную сеть (параметры сети не -меняются). - -Типичный случай — обыкновенный настольный компьютер. - -* NetworkManager -** Этот способ настройки рекомендуется, если ваш компьютер постоянно -меняет своё сетевое окружение (параметры сети всё время разные). - -Типичный случай — переносной компьютер (notebook), подключаемый по -необходимости к разным локальным сетям. - -[IMPORTANT] -Не смешивайте два указанных способа настройки. При определённых условиях это -может привести к неработоспособности сетевых подключений. - -[TIP] -Если для настройки сети вы выбрали Центр управления системой, то рекомендуем -выключить через Центр управления системой службу NetworkManager: Система → -Системные службы → Запускать при загрузке системы - -[float] -==== Центр управления системой ==== - -Данный способ рекомендуется пользователям настольных компьютеров. - -Центр управления системой содержит модуль для настройки сетевых подключений. -Здесь вы сможете задать как глобальные параметры сети (адрес сервера DNS, имя -компьютера), так и настройки конкретного сетевого интерфейса. Поддерживается -настройка беспроводных сетей (wifi) и подключение к Интернет (PPTP, PPPoE). - -За инструкцией по настройке обращайтесь непосредственно к справке Центра -управления системой. - -Запустить Центр управления системой можно из системного меню либо командой acc. -При запуске необходимо ввести пароль администратора (root). - -[float] -==== Настройка при помощи NetworkManager ==== - -Данный способ рекомендуется пользователям переносных компьютеров (notebook). - -NetworkManager — ещё один способ настроить сеть, не прибегая к непосредственной -правке конфигурационных файлов. Этот тип настройки особенно удобен для -настройки портативных компьютеров и применяется на них по умолчанию. - -После запуска NetworkManager доступен как апплет, находящийся в системном -лотке. Изменить настройки вы можете, нажав правой кнопкой мыши на значке и -выбрав "Изменить соединения...". - -[float] -==== Ручная настройка (etcnet) ==== - -[IMPORTANT] -Данный раздел рассчитан на квалифицированных пользователей. - -Если настройка сети, выполненная при помощи графических инструментов, вас -почему-либо не устраивает или неработоспособна, вы можете настроить работу с -сетью, вручную проделав необходимые операции. Стоит иметь в виду, что утилиты, -работающие с сетевыми настройками, такие как ifconfig, ip или route, изменяют -их на время, до перезагрузки системы. Для постоянной настройки сетевых -подключений необходимо изменять соответствующие конфигурационные файлы. - -[WARNING] -Для изменения конфигурационных файлов вам потребуются полномочия администратора -(root). Ошибки при правке конфигурационных файлов могут привести к -неработоспособности сети! - -Система, обеспечивающая настройку сетевых подключений, носит название etcnet. -Настройки, относящиеся к каждому сетевому интерфейсу, хранятся в отдельных -подкаталогах каталога /etc/net/. Например, файлы настройки сетевой карты eth0 -можно найти в каталоге /etc/net/eth0/. - -О значении конкретные директив, указываемых в конфигурационных файлах, -необходимо справляться в документации etcnet. - -Полную документацию cо множеством примеров готовых конфигурационных файлов -можно найти в каталоге /usr/share/doc/etcnet-version/ или на домашней -странице проекта http://etcnet.org/. - -[TIP] -version — версия установленного пакета etcnet. Т. е. путь к каталогу с -документацией будет выглядеть примерно так: /usr/share/doc/etcnet-0.9.7/. - -Для того чтобы настройки в файлах интерфейсов вступили в силу, выполните -команду service network restart. - -=== Примеры настроек === - -Ниже приводятся примеры настроек сети. В примерах используется Центр управления -системой. - -*Пример 1. Подключение компьютера к существующей локальной сети* - -По умолчанию ALT Linux пытается получить настройки автоматически, т. е. -действует настройка "Использовать DHCP". - -Если в вашей сети нет DHCP-сервера, то все параметры необходимо ввести -самостоятельно. Как минимум, указываются IP-адрес и сетевая маска. Если в сети -используется DNS-сервер, то введите и его IP-адрес. Указание шлюза может быть -важным для соединения с сетью Интернет (если такая возможность предоставляется -в вашей локальной сети). - -*Пример 2. Подключение компьютера к сети Интернет через PPTP (VPN)* - -В примере используется Центр управления системой. Предполагается, что -соединение с сетью осуществляется через обычную сетевую карту компьютера. - -* Открыть Центр управления системой. Выбрать Сеть → PPTP-соединения; -* Создать новое соединение (кнопка "Создать"); -* Указать имя или адрес сервера, имя и пароль (выдаются провайдером); -* В случае нескольких сетевых интерфейсов выбрать в выпадающем списке тот, -который будет использоваться для соединения с сервером. - -Для запуска и остановки соединения использовать соответствующие кнопки. Можно -выбрать возможность запуска при старте системы (пункт "Запускать при -загрузке"). - -*Пример 3. Подключение компьютера к сети Интернет через PPPoE* - -* Открыть Центр управления системой. Выбрать Сеть → PPPoE-соединения; -* Создать новое соединение (кнопка "Создать соединение"); -* Выбрать в выпадающем списке интерфейс, который будет использоваться для -соединения с сервером; -* Ввести имя и пароль (выдаются провайдером). - -Можно выбрать использование шифрования (MPPE), отметив соответствующий пункт. diff --git a/old-docs/openvz.txt b/old-docs/openvz.txt deleted file mode 100644 index 8ee998a..0000000 --- a/old-docs/openvz.txt +++ /dev/null @@ -1,267 +0,0 @@ -//// -Пакет: docs-openvz_basics -RPM файл: docs-openvz_basics-0.1-alt2.noarch.rpm -Аннотация: Краткое руководство по организации инфраструктуры сервера с - использованием технологии виртуализации (OpenVZ) -Автор: Кирилл Маслинский -Лицензия: FDL -URL: http://heap.altlinux.org/modules/openvz_basics/index.html -//// - -== Краткое введение в OpenVZ == - -[float] -=== Введение === - -[NOTE] -Текст отчасти основан на http://ru.wikipedia.org/wiki/OpenVZ - -Различные технологии виртуализации позволяют запускать на одном сервере -несколько в той или иной степени независимых экземпляров операционной системы -(или даже разных операционных систем). Системы виртуализации различаюются как -степенью изоляции выполняющихся операционных систем, так и другими -особенностями и ограничениями. В дистрибутивах ALT Linux в качестве технологии -виртуализации используется OpenVZ. - -OpenVZ является реализацией виртуализации на уровне операционной системы -(подобно, например, технологии jail, доступной в ОС FreeBSD). Все запущенные с -её помощью экземпляры операционной системы (далее виртуальные контейнеры) -используют один общий экземпляр ядра Linux. Это способствует повышению -производительности по сравнению с технологиями, основанными на полной -виртуализации оборудования, а также даёт администратору основной системы -дополнительные возможности по контролю и управлению виртуальными контейнерами. - -Минусом этой технологии является невозможность использования в разных -виртуальных контейнерах операционных систем, не основанных на ядре Linux, а -также разных версий ядра. - -Система OpenVZ использует модифицированное ядро, обеспечивающее виртуализацию, -изоляцию, управление ресурсами, сохранение состояний виртуальных серверов. - -=== Виртуализация и изоляция === - -Каждый виртуальный сервер выглядит с точки зрения его пользователя или администратора практически неотличимо от обычного физического сервера. Каждый виртуальный сервер имеет свои собственные: - -Файлы:: -Системные библиотеки, приложения, виртуализованные файловые системы /proc и /sys, виртуализованные блокировки и т. п. - -Пользователи и группы:: -Свои собственные пользователи и группы, включая root. - -Дерево процессов:: -Виртуальный контейнер имеет доступ только к своим собственным процессам -(начиная с init). Идентификаторы процессов (PID) также виртуализованы, поэтому -PID программы init равняется 1, как ему и следует быть. - -Сеть:: -Виртуальное сетевое устройство (venet) обеспечивает наличие виртуальной -сети в пределах физического сервера. Каждый виртуальный контейнер может иметь -свой набор правил фильтрации пакетов. - -Устройства:: -При необходимости администратор физичесого сервера может давать виртуальным -контейнерам доступ к реальным устройствам, например, сетевым адаптерам, портам, -разделам диска и т. д. - -Объекты IPC:: -Разделяемая память, семафоры, сообщения. - -=== Управление ресурсами === - -Ядро OpenVZ обеспечивает ограничение ресурсов каждого виртуального контейнера -так, чтобы исключить для него возможность помешать работе других виртуальных -контейнеров. - -Основными компонентами управления ресурсами в OpenVZ являются: двухуровневая -дисковая квота, специальный планировщик процессора, ограничения (user -beancounters) и дополнительные полномочия (capabilities). Все эти ресурсы могут -быть изменены во время работы виртуального сервера без перезагрузки. - -[float] -==== Использование диска ==== - -Администратор физического сервера может установить для виртуальных серверов -дисковые квоты, в терминах дискового пространства и количества индексных узлов -(i-nodes), число которых примерно равно количеству файлов. Это верхний уровень -дисковой квоты. - -В дополнение к этому, администратор виртуального контейнера может использовать -обычные средства управления дисковыми квотами внутри своего контейнера. - -Работая внутри контейнера, можно определить объем доступного ему дискового -пространства, выполнив следующие команды: - -*Пример 1.* Определение объема дискового пространства в контейнере - ----- -# echo "simfs / simfs rw 0 0" >>/etc/mtab -$ df -h ----- - -Одной из не всегда очевидных проблем при планировании ресурсов является -дисковый ввод/вывод. При создании нагруженного сервера с обширным -вводом/выводом в различных контейнерах следует помимо общей практики -использования RAID1+ для повышения надёжности множества сервисов на одной -системе по возможности применять разнесение потоков данных по различным -физическим дискам - -[NOTE] -Подробную информацию на эту тему можно найти в Multi-Disk HOWTO (его можно -найти в Интернет или в пакете howto-html-en). - -Например, практически возможно использование одного физического сервера как -терминального (LTSP) и для сборки программных пакетов (hasher) при условии, что -терминал-сервер и пакетные базы размещены на программном RAID1, а сборка -ведётся на отдельном SCSI-диске; иначе даже существенный объём RAM (например, -4Gb) не поможет избежать заметного взаимного влияния контейнеров при дисковых -операциях. - -[float] -==== Планировщик процессора ==== - - -Планировщик процессора в OpenVZ также двухуровневый. На первом уровне -планировщик на основании значения параметра cpuunits решает, какому -виртуальному серверу дать квант процессорного времени. На втором уровне -стандартный планировщик Linux решает, какому процессу выбранного виртуального -сервера дать квант времени, основываясь на стандартных приоритетах процесса в -Linux и т. п. - -Администратор физического сервера может устанавливать количество процессорного -времени, выделяемого каждому виртуальному серверу, как на основании системы -весов (cpuunits), так и задавая явные пределы (cpulimit). - -=== Ограничения === - -OpenVZ предоставляет для каждого виртуального контейнера набор счётчиков, -ограничений и гарантий. Имеется набор из примерно 20 параметров, которые -выбраны таким образом, чтобы никакой виртуальный контейнер не мог злоупотребить -каким-либо ресурсом, и таким образом помешать работе других виртуальных -контейнеров на этом же физическом сервере. Смысл порогового и максимального -значений может различаться в зависимости от параметра. - -По умолчанию для виртуального контейнера устанавливаются достаточно низкие -значения ограничителей, поэтому в ряде случаев может оказаться, что выделяемых -ресурсов недостаточно для нормального функционирования процесса в контейнере. В -случае, если работа процесса завершается ошибкой выделения памяти, ошибкой -создания процесса или открытия файла, следует снять показания счётчиков -виртуального контейнера: - -*Пример 2.* Снятие показаний user_beancounters - ----- -# cat /proc/user_beancounters >~/user_beancounters.`date "+%Y%m%d-%H%M"` ----- - -Затем повторить операцию, которая привела к ошибке, и снова снять показания -счётчиков. Затем их нужно сравнить и выяснить, какой из счётчиков failcnt -увеличил значение — соответствующий лимит нужно будет увеличить. Краткое -пояснение смысла разных лимитов приведено ниже, более подробную информацию -можно найти в man vzctl. Нужно также принимать во внимание, что некоторые -лимиты установлены в блоках (обычно 512 байт), некоторые — в страницах памяти -(4 Кб на x86 архитектуре), некоторые в байтах и других натуральных величинах. - -[float] -==== Память ==== - -kmemsize:: -Количество памяти, используемое ядром. Этот параметр связан со значением -параметра numproc Каждый процесс потребляет некоторое количество памяти ядра: -30–50 килобайт, как минимум 16. Важно иметь достаточно большой зазор между -пороговым и максимальным значениями, чтобы не вынуждать ядро завершать -процессы, выполняющиеся в виртуальном окружении. - -lockedpages:: -Количество страниц памяти, заблокированной при помощи mlock. - -privvmpages:: -Объем памяти, размещаемой процессами. Память, разделяемая между разными -процессами, не включается в это значение. - -shmsize:: -Объем памяти, доступный для межпроцессного взаимодействия через разделяемую -память. Установка порогового значения, отличающегося от максимального, не имеет -смысла. - -physpages:: -Объём физической памяти, используемое виртуальным контейнером. Используется -только для учёта, пороговое значение должно быть выставленно в 0. - -vmguarpages:: -Гарантированный размер доступной памяти в страницах. Имеет смысл изменять -только пороговое значение. - -oomguarpages:: -Пока использование памяти в страницах не превышает заданного порогового -значения, процессы не будут принудительно завершены из-за недостка памяти даже -при её реальной нехватке. - -[float] -==== Процессы и файлы ==== - -numproc:: -Количество процессов и обеспечиваемых ядром потоков. Установка порогового -значения, отличающегося от максимального, не имеет смысла. - -numflock:: -Максимальное количество файловых блокировок. Рекомендуется оставлять зазор -между пороговым и максимальным значениями. - -numpty:: -Количество псевдотерминалов. Не может превышать 255. Установка порогового -значения, отличающегося от максимального, не имеет смысла. - -numsiginfo:: -Количество структур siginfo. Установка порогового значения, отличающегося от -максимального, не имеет смысла. - -dcachesize:: -Максимальный размер кешей файловой системы (в байтах). Максимальное значение -должно быть больше порогового. - -numfile:: -Максимальное количество открытых файлов. Установка порогового значения, -отличающегося от максимального, не имеет смысла. - -[float] -==== Сеть ==== - -numtcpsock:: -Максимальное количество сокетов протокола TCP. Установка порогового значения, -отличающегося от максимального, не имеет смысла. - -tcpsndbuf:: -Максимальный размер буферов для данных, отправляемых по протоколу TCP. -Пороговое значение не должно быть меньше 64 Кб, а разница между ним и -максимальным значением не должна быть меньше значения numtcpsock, умноженного -на 2,5. - -tcprcvbuf:: -Максимальный размер буферов для данных, получаемых через протокол TCP. -Пороговое значение не должно быть меньше 64 Кб, а разница между ним и -максимальным значением не должна быть меньше значения numtcpsock, умноженного -на 2,5. - -othersockbuf:: -Максимальный размер прочих (не TCP) буферов отправки. Увеличение лимита -ускоряет связь через локальные сокеты. - -dgramrcvbuf:: -Максимальный размер прочих (не TCP) буферов получения. Установка порогового -значения, отличающегося от максимального, не имеет смысла. - -numothersock:: -Максимальное количество не-TCP сокетов (локальных, UDP и других). Установка -порогового значения, отличающегося от максимального, не имеет смысла. - -numiptent:: -Макисмальное количество записей в таблицах фильтрации сетевых пакетов -(iptables). - -=== Дополнительная информация === - -* Официальный сайт проекта http://openvz.org -* Вики разработчиков и пользователей OpenVZ http://wiki.openvz.org -* Форум проекта http://forum.openvz.org -* Рекомендации по настройке OpenVZ в ALT Linux - http://www.freesource.info/wiki/AltLinux/Dokumentacija/OpenVZ diff --git a/old-docs/quickstart_desktop.txt b/old-docs/quickstart_desktop.txt deleted file mode 100644 index 9c23a36..0000000 --- a/old-docs/quickstart_desktop.txt +++ /dev/null @@ -1,65 +0,0 @@ -//// -Пакет: docs-quickstart_desktop_sb -RPM файл: docs-quickstart_desktop_sb-0.2-alt1.noarch.rpm -Аннотация: Быстрый старт для начинающих. -Автор: Артём Золочевский -Лицензия: FDL -URL: http://heap.altlinux.org/modules/quickstart/index.html -//// - -== Быстрый старт == - -В этом разделе содержится список задач, часто встающих перед пользователем ALT -Linux после успешной установки системы. - -=== Что делать, если... === - -*«Увидеть» другие компьютеры в сети* - -* Меню «Система — Сетевые ресурсы» -* smb:/ в строке «Адрес» программы konqueror. - -*Печатать на принтер* - -Настройка принтера в Linux сводится к настройке служюы печати CUPS. Для этого -есть несколько путей: - -Mеню «Настройка — Настройка печати». Это стандартный web-интерфейс настройки -CUPS - -Меню «Система печати — Добавить принтер». - -Информацию о том, насколько хорошо поддерживается ваш принтер, можно найти по -адресу http://linuxprinting.org. - -*Соединиться с мобильным телефоном или другим устройством по bluetooth* - -Для настройки соединения с bluetooth-устройством воспользуйтесь программой -kbluetooth: меню «Настройка — Bluetooth Server (kbluetooth)». После её запуска -в области уведомлений панели задач появится значок bluetooth. При нажатии на -него открывается список обнаруженных bluetooth-устройств, с которыми можно -связаться. - -*Отправить компьютер в «спящий» режим* - -Воспользуйтесь программой KPowersave. При запущенной программе в области -уведомлений отображается значок (электрическая вилка). Нажатие правой кнопкой -мыши открывает меню, в котором доступны различные функции, в том числе -«Уснуть». - -*У меня есть вопросы по устройству X.* - -Поддерживается ли оно в Linux? Как это узнать? Где взять драйвер? На диске -производителя устройства есть драйвер для Linux. Как его установить? - -Не спешите искать драйверы на прилагаемых дисках или на сайте производителя -конкретного оборудования. Ознакомьтесь с главой Работа с оборудованием в Linux. - -Интересной особенностью работы некоторых беспроводных карт (WLAN) является то, -что для них могут использоваться win-драйвера. Для настройки таких карт нужно -установить ndiswrapper и настроить его в соответвии с документацией. - -*Подходящей программы под Linux нет, а под Windows есть. Что делать?* - -Попробуйте запустить win-приложение, используя WINE. Подробности содержатся в -разделе «WINE: среда для запуска win-приложений на платформе Unix». diff --git a/old-docs/scheme.txt b/old-docs/scheme.txt deleted file mode 100644 index 2a4f7af..0000000 --- a/old-docs/scheme.txt +++ /dev/null @@ -1,222 +0,0 @@ -//// -Пакет: docs-scheme_article1 -RPM файл: docs-scheme_article1-0.1-alt2.noarch.rpm -Аннотация: Вводная статья про язык scheme, ориентированная на - школьников (старшеклассников). -Автор: Станислав Иевлев -Лицензия: FDL -URL: http://heap.altlinux.org/kirill/scheme_article_1/doc/ -//// - -== Ваш новый язык -- Scheme == - -=== Знакомство с грамматикой === - -Вы хорошо знаете русский, возможно, неплохо уже говорите по-английски, в школе -вас научили несколько необычному языку математики. - -Предлагаю вам выучить ещё один — LISP. Точнее, один из его самых интересных -диалектов — Scheme (правильно произносится название как «ским», однако можно -говорить и проще — «схема») - - -Начнём с того, что ознакомимся с несколько необычным порядком слов этого языка: -«действие объект объект ...». Хотя почему необычным? Вот несколько фраз на -русском языке, организованных по тому же принципу: - -«Сумма трёх и пяти» - -«Произведение пяти, шести и семи» - -Каждая законченная фраза на этом языке должна быть окружена парой круглых скобок. - -Запишем сказанное выше на Scheme: - ----- -(+ 3 5) -(* 5 6 7) ----- - -Можно записать выражения и посложнее: - -(+ 2 3 (+ 5 6) ) - «Сумма двух, трёх и суммы пяти и шести." - -Просто, не правда ли? - -Давайте двигаться дальше. Фраза "(* 3 5)" — хороша, а "(* width height)" лучше. Выражение "(* 2 3.1415926 5)" — интригующе, а -"(* 2 pi radius)" гораздо более осмысленно. Здесь width, height — переменные, а 3,5 — их текущее значение. - -Переменная задаётся следующей конструкцией языка: -(define имя «первоначальное значение») - -Пример: - ----- -(define width 3) -(define height 7) -(* 2 (+ width height)) ----- - -Прочитаем записанное по русски: «Положим ширина — это три, высота — это 7, -подсчитаем произведение двух и суммы ширины и высоты (например, периметр -прямоугольника)». Результат такого вычисления в нашем случае будет 20. - -Продолжим совершенствовать конструкции. Допустим, нам требуется подсчитать -сумму квадратов двух чисел. Это можно сделать например так: - ----- -(define a 3) -(define b 4) -(+ (* a a) (* b b)) ----- - -Не правда ли, что-то режет глаз? Cлишком громоздко — так мы никогда не говорим. -Если бы у нас был в языке глагол который, означал бы «квадрат числа», то -последнее выражение звучало бы: - ----- -(+ (square a) (square b)) ----- - -Согласитесь, что так гораздо лучше. - -Есть задача — есть её решение. Мы можем объявить новое слово-функцию, назвать -её square. Функция будет принимать в качестве параметра число и возвращать его -квадрат. Делается это следующим образом: - ----- -(define (square x) (* x x)) ----- - -Общий формат: - -(define (название параметр параметр...) тело функции) - -Функция возвращает последнее вычисленное значение. Это означает, что следующая функция square2: - ----- -(define (square2 x) (+ x x) (* x x)) ----- - -вернёт тот же результат, что и square, только попутно сделает ещё одно ненужное дело — удвоение числа. - -Перепишем пример с суммой квадратов чисел заново: - ----- -(define a 3) -(define b 4) -(define (square x) (* x x)) -(+ (square a) (square b)) ----- - -Нам не хватало слов в языке — мы их добавили. Вообще, когда вы пишете программу на LISP, вы описываете не алгоритм, а сначала создаёте язык, а потом на нём формулируете исходную задачу. Несколько точнее — вы «подгоняете» данный вам Scheme язык до тех пор, пока он не станет совпадать с языком, на котором задача формулируется легко. - -Сразу пример. Пусть перед нами стоит задача сделать программу, которая спрашивает имя пользователя, а потом выводит ему приветствие. - -Scheme предоставляет нам несколько готовых «глаголов»: - -* read — для чтения имени -* display — для того чтобы рисовать что-то на экране -* newline — для того чтобы рисовать на экране «перевод строки» - -Мы бы хотели иметь такие «глаголы»: - -* hello — для приветствия с одним параметром — именем пользователя -* username — для получения имени пользователя, без параметров. - -На таком языке наша задача выглядела бы следующим образом: - ----- -(hello (username)) ----- - -Дело за малым — определить hello и username. Нет проблем. Вот полный текст -программы. - ----- -(define (hello name) - (display «Hello ") - (display name) - (display "!") - (newline)) -(define (username) - (write «Enter your name:") - (read)) -(hello (username)) ----- - -LISP — полноценный функциональный язык, а поэтому функции — полноправные члены -этого языка, независимо от того, определили вы их сами, или они уже были в -языке «готовые». В частности, их можно передавать в качестве параметров в -другие функции, а там уже делать с ними всё, что потребуется. - -Например, функцию «модуль числа», можно определить так: - ----- -(define (abs x) - (if (positive? x ) - x - (- x))) ----- - -«Если аргумент положителен — возвращается x, иначе минус x». А можно и так: - ----- -(define (abs x) - ((if (positive? x) + -) x)) ----- - -«Если аргумент положителен, то плюс, иначе минус x». Здесь в результате -исполнения выражения if возвращается функция + или -, которая затем применяется -к аргументу x. Кстати, обратите внимание на новую конструкцию if — полагаю, что -её назначение вам сразу ясно. Сначала проверяется первый аргумент, если он -истинен, то исполняется второй аргумент, иначе третий. Общий формат следующий: -(if условие «действие, если условие выполняется» «действие в противном случае») - -=== Где посмотреть и попробовать === - -В теории всё хорошо, а где немного попрактиковаться? В мире можно найти много -прекрасно разработанных сред для работы со Scheme. К сожалению, большинство -документации по Scheme на английском языке, но можно найти и отличные введения -на русском — язык-то простой. - -Вот названия нескольких самых распространённых реализаций: - -Plt Scheme(http://www.plt-scheme.org/) — одна из самых полных реализаций, -включает в себя удобную обучающую среду Dr.Scheme. Есть версии для платформ -Windows,Linux, Mac OS. - -Bigloo (http://www-sop.inria.fr/mimosa/fp/Bigloo/) — тоже достаточно полная -реализация. Доступна для платформ Windows, Linux. - -LispMe (http://www.lispme.de/index.html) — версия для карманных компьютеров с -операционной системой Palm OS. - -Также ещё посмотрите Gambit-C (http://www.iro.umontreal.ca/~gambit/) — один из -самых быстрых компиляторов Scheme. - -Все перечисленные реализации Scheme — это интерпретаторы. Запускате -интерпретатор — и можно вести с ним диалог на Scheme: в ответ на его -приглашение вводите конструкции на Scheme, а он будет возвращать результаты -вычислений. - ----- -Wecome to MzScheme version 208, Copyright (c) 2004 PLT Scheme, Inc. ->1 -1 ->(+ 1 2) -3 ->(define a 3) ->(+ a a) -6 -> ----- - -Попробуйте «проиграть» все вышеперечисленные примеры. Думаю, вам понравится! - -=== Кот в мешке === - -Простота Scheme обманчива. На самом деле — это один из самых мощных на -сегодняшний день языков программирования. На основе этого языка можно изучить -все известные стили и методы программирования. С частью этих приёмов мы -познакомимся с вами в следующих статьях этой серии. diff --git a/old-docs/sshd.txt b/old-docs/sshd.txt deleted file mode 100644 index dc2a6df..0000000 --- a/old-docs/sshd.txt +++ /dev/null @@ -1,186 +0,0 @@ -//// -Пакет: docs-sshd -RPM файл: docs-sshd-0.1.1-alt1.noarch.rpm -Аннотация: Описание возможностей и принципов удалённого администрирования - при помощи OpenSSH - реализации технологии SSH -Автор: Артём Золочевский -Лицензия: FDL -URL: http://heap.altlinux.org/modules/sshd/index.html -//// - -== Удалённый доступ и удалённое администрирование (OpenSSH) == - -[float] -=== Введение === - -Одна из самых распространённых задач, возникающих при работе в сети, — -удалённый доступ к другим компьютерам, в том числе их удалённое -администрирование. Технология SSH (Secure Shell) призвана предоставить -возможность безопасного способа управления удалённой системой. Построенная по -клиент-серверной модели, она позволяет при помощи ssh клиента подключаться к -ssh серверу, предоставляя командную оболочку для работы с удалённой системой. - -SSH реализует соединение с удалённым компьютером, защищающее от: - -* прослушивания данных, передаваемых по этому соединению; -* манипулирования данными на пути от клиента к серверу; -* подмены клиента или сервера путём манипулирования IP-адресами, DNS или -маршрутизацией. - -В дополнение к отличным характеристикам в области обеспечения безопасного -клиент-серверного соединения, SSH обладает следующими возможностями: - -* Сжатие передаваемых данных. -* Туннелирование каналов внутри установленного соединения, в том числе -соединений с X-сервером, что позволяет запускать графические приложения на -удалённой машине. -* Широкая распространённость: существуют реализации SSH для самых различных -аппаратных платформ и операционных систем. - -OpenSSH — это включённая в дистрибутивы ALT Linux реализация SSH. Она -представлена следующими пакетами: - -* openssh-clients — клиентская часть (утилита ssh, sftp и др.). -* openssh-server — серверная часть (сервер sshd, sftp-server). -* openssh — утилиты, необходимые для работы как клиентской, так и серверной -части. - -Пакет openssh-server в ALT Linux 4.0 Server устанавливается по умолчанию, -позволяя непосредственно после установки системы воспользоваться возможностью -удалённого администрирования. - -В простейшем виде сеанс работы будет выглядеть следующим образом. Запускается -ssh клиент (ssh) с указанием имени пользователя на удалённой системе (если оно -отличается от локального) и имени машины (либо IP-адреса). На удалённой машине, -естественно, должна быть настроена и работать серверная часть — sshd. - -*Пример 1.* Использование ssh - ----- -$ ssh user@hostname ----- - -После этого sshd предоставляет командную оболочку для работы на удалённой -системе. Ваш компьютер становится удалённым терминалом другого компьютера. - -=== Аутентификация === - -Прежде чем начать удалённый сеанс работы, необходимо пройти процедуру -аутентификации, аналогичную той, что происходит при непосредственной работе с -физическим терминалом Linux-системы. Утилита sshd поддерживает различные -способы аутентификации, наиболее часто используются два из них: аутентификация -по паролю и аутентификация по ключу. - -Параметры, относящиеся к способу аутентификации, а так же все прочие настройки -sshd указываются в конфигурационном файле /etc/openssh/sshd_config. Для -вступления в силу изменений, вносимых с конфигурационный файл, каждый раз после -правки файла необходимо выполнять команду - -*Пример 2.* Перезапуск sshd - ----- -# service sshd reload ----- - -[float] -==== Аутентификация по паролю ==== - -Аутентификации по паролю включается добавлением строки PasswordAuthentication -yes в файл etc/openssh/sshd_config. Хотя пароль в этом случае и не передаётся -по сети в открытом виде, всё же существует опасность подбора пароля. Поэтому не -следует выбирать слишком простые пароли. - -[float] -==== Аутентификация по ключу ==== - -Аутентификация по ключу включается строкой - -*Пример 3.* Настройка аутентификации по ключу - ----- -PubkeyAuthentication yes ----- - -в файле /etc/openssh/sshd_config. При использовании этой схемы аутентификации -будет использоваться асимметричное шифрование, следовательно, необходимо -сгенерировать пару ключей: секретный и публичный. - -[NOTE] -Более подробно о технологии асимметричного шифрования можно узнать на -http://www.intuit.ru/department/security/networksec/7/ и -http://www.mgpu.ru/crypto/2.1.htm. - -Для генерации пары ключей на компьютере пользователя необходимо выполнить $ -ssh-keygen с необходимыми параметрами, например: - -*Пример 4.* Генерация пары ключей - ----- -$ ssh-keygen -t dsa ----- - -На вопрос о файле для сохранения ключа нажать Enter (принять вариант по -умолчанию). Будет задан вопрос, следует ли создать пароль к ключу. Поскольку -ключи рекомендуется создавать с паролем, нужно указать свой пароль. - -После генерации ключей образуются 2 файла: \~/.ssh/id_dsa — секретный ключ, и -~/.ssh/id_dsa.pub — публичный. Его предстоит поместить на удалённый сервер. - -Следующим шагом содержимое файла id_dsa.pub необходимо добавить в файл -~/.ssh/authorized_keys2 на удалённой машине. Если под этой учётной записью -будет входить один пользователь, файл id_dsa.pub можно просто скопировать, -назвав его authorized_keys2. Также можно воспользоваться утилитой ssh-copy-id: - -*Пример 5.* Настройка доступа по ключу - ----- -$ ssh-copy-id username@hostname ----- - -Обратите внимание, что для выполнения этой операции должна работать -аутентификация по паролю. В дальнейшем её можно будет отключить. - -После указанных действий можно использовать аутентификацию по ключу. В процессе -такой аутентификации запрашивается не пароль удалённого пользователя, а пароль -на ваш ключ, что делает ssh сессию ещё более безопасной. Безопасность - -При настройке sshd следует весьма щепетильно отнестись к вопросам безопасности. -SSH — очень важная часть системы. Она является незаменимым помощником любого -администратора Linux, предоставляя ему доступ к командной оболочке удалённой -системы. Но как раз по этой же причине данная служба может стать и источником -бед. - -Далее приводятся лишь некоторые рекомендации, призванные обезопасить вашу -систему от несанкционированного доступа. - -По возможности следует использовать способ аутентификации по ключу как наиболее -безопасный. Если вы все же по каким-либо причинам используется аутентификация -по паролю, то следует тщательнейшим образом отнестись к выбору паролей. В -вопросах выбора паролей надо руководствоваться теми же соображениями что и при -выборе паролей при регистрации пользователей. - -В качестве дополнительных мер, можно явно указать список пользователей, которым -разрешена либо запрещена удалённая работа. За это отвечают параметры AllowUsers -и DenyUsers в /etc/openssh/sshd_config. - -Наконец, можно осложнить жизнь потенциальному злоумышленнику, отключив -возможность удалённой регистрации в системе для суперпользователя (root). Для -этого в /etc/openssh/sshd_config нужно добавить строку PermitRootLogin no. - -Как и в случае с любыми потенциально опасными службами, следует постоянно -следить за обновлениями безопасности, связанными с данными пакетами. -Администратор системы, заботящийся о безопасности, должен непременно -устанавливать обновления штатным способом: - -*Пример 6.* Обновления по безопасности - ----- -# apt-get update -# apt-get upgrade ----- - -За более детальной информацией по настройке sshd следует обращаться к -руководству sshd_config(5). Настройка клиентской части подробно описана в -ssh_config(5). - - diff --git a/old-docs/ve_management.txt b/old-docs/ve_management.txt deleted file mode 100644 index 71cc294..0000000 --- a/old-docs/ve_management.txt +++ /dev/null @@ -1,61 +0,0 @@ -//// -Пакет: docs-ve_management -RPM файл: docs-ve_management-0.1-alt2.noarch.rpm -Аннотация: Описание управления виртуальными серверами при - помогщи веб-интерфейса -Автор: Кирилл Маслинский -Лицензия: FDL -URL: http://heap.altlinux.org/modules/ve_management/index.html -//// - -== Развёртывание виртуальных серверов == - -Web-интерфейс управления виртуальными серверами доступен по адресу -https://server-name:8080/index.scm/ovz-ve. Вы можете просмотреть список -доступных виртуальных серверов, запустить, остановить или перезапустить -выбранные. Для запущенных виртуальных серверов можно изменить настройки -виртуального контейнера (ссылка «Настроить контейнер») или настроить сервисы, -выполняющиеся внутри контейнера (ссылка «Настроить службы»). Также имеется -возможность создания нового виртуального контейнера. - -Виртуальный контейнер создаётся на основе шаблона, который, в свою очередь, -создаётся на основе профиля. - -Профиль представляет собой описание конфигурации и составляющих частей -виртуального сервера. Главной составляющей профиля является список пакетов, -которые будут установлены в шаблон, создаваемый на основе этого профиля. Для -создания работоспособного контейнера в список пакетов обязательно нужно -включать пакеты basesystem и sysklogd. Чтобы в созданном контейнере была -возможность управлять параметрами системы через web-инетрфейс, аналогично -поставляемым ALT стандартным контейнерам, в профиль следует включить пакет -alterator-fbi. - -Интерфейс управления профилями позволяет просмотреть, изменить или удалить -существующие профили, а также создавать новые. - -Шаблон представляет собой образ файловой системы виртуального сервера. Он -создаётся на основе профиля и используется для создания экземпляров виртуальных -серверов. - -Интерфейс управления шаблонами позволяет удалять существующие шаблоны и -создавать новые. Для создания шаблона надо выбрать для него имя и профиль, на -основе которого он будет создан. - -Одновременное создание двух шаблонов невозможно. - -[float] -=== Обновление виртуальных серверов === - -Обновление виртуальных серверов рекомендуется производить только из -официального источника обновлений дистрибутива. - -Обновление виртуальных серверов может производиться при помощи apt. В каждом -виртуальном сервере доступны web-интерфейсы для управления источниками -обновлений («Система->Источники обновлений») и обновления -(«Система->Обновления»). - -В случае, когда на сервере или в сети работает значительное число виртуальных -серверов, рекомендуется создать специальный контейнер, содержащий squid, -настроенный на кэширование обновлений и настроить контейнеры на обновление -через него или же обеспечить зеркалирование обновлений с сайта ALT Linux и -производить обновление из локального зеркала. diff --git a/old-docs/ve_rationale.txt b/old-docs/ve_rationale.txt deleted file mode 100644 index 5b391f4..0000000 --- a/old-docs/ve_rationale.txt +++ /dev/null @@ -1,336 +0,0 @@ -//// -Пакет: docs-ve_rationale -RPM файл: docs-ve_rationale-0.1-alt2.noarch.rpm -Аннотация: Информация о возможностях виртуализации применительно - к администрированию сервера -Автор: Кирилл Маслинский -Лицензия: FDL -URL: http://heap.altlinux.org/modules/ve_rationale/index.html -//// - -== Инфраструктура сервера: виртуальные контейнеры == - -[float] -=== Введение === - -[TIP] -Огромное спасибо Петру Савельеву () за терпеливые и подробные консультации по -виртуализации и системному администрированию. - -В дистрибутивах ALT Linux администратору сервера рекомендуется размещать -системные службы (сервисы) в изолированных окружениях, виртуальных контейнерах. -В данном документе рассмотрены задачи, решению которых способствует -виртуализация сервисов, а также некоторые технологические ограничения, которые -следует принимать во внимание, планируя инфраструктуру сервера с использованием -виртуальных контейнеров. - -=== Виртуализация и администрирование === - -[float] -==== Серверы и сервисы ==== - -Под сервером обычно понимается отдельный (обычно мощный) компьютер, -специализированный под выполнение задач по обслуживанию абонентов -(предоставление сервисов). Количество таких сервисов, одновременно выполняемых -в рамках одного сервера, ограничено сверху вычислительными возможностями -оборудования, пропускной способностью канала для запросов клиентов и т. п. На -практике количество сервисов на одном сервере обычно больше одного, как из -экономических соображений (невыгодно позволять простаивать дорогому серверному -оборудованию), так и из технологических (зачастую сервисы бывает удобно -аггрегировать на одном узле, т. к. они могут работать взаимосвязанно, например, -с одними и теми же данными). - -С развитием технологий постоянно нарастающие мощности компьютерного -оборудования намного опережают рост запросов к ресурсам со стороны программ. В -результате всё выше поднимается верхняя граница по числу возможных сервисов на -одном сервере, и все более невыгодно становится держать сервер только для -одного сервиса — ресурсы простаивают. - -[float] -==== Виртуализация в операционных системах ==== - -Виртуализация в операционных системах понимается широко и разнообразно. Если -пробовать выделить общее, то речь всегда идёт о запуске в той или иной степени -полноценной операционной системы (далее ОС), работающей в рамках другой ОС (или -в гипервизоре: специализированной ОС, которая только и умеет, что обеспечивать -работу других ОС внутри себя). Такую виртуализованную ОС называют чаще всего -гостевая ОС (а также виртуальное окружение и др.), а ОС, внутри которой -выполняется гостевая, — хост-системой (также аппаратный узел, Hardware Node). -Виртуальное окружение, внутри которого выполняется программа, обычно неотличимо -для нее от невиртуализованной ОС. Здесь мы не будем подробно рассматривать -разные технологии виртуализации, для этого лучше обращаться к специальным -источникам. - -[NOTE] -См. например хорошую вводную статью (на английском языке) -http://www-128.ibm.com/developerworks/linux/library/l-linuxvirt/?ca=dgr-lnxw01Virtual-Linux. - -В контексте системного администрирования наиболее существенны два свойства -любой технологии виртуализации. Первое состоит в том, что виртуализация вводит -промежуточный уровень между оборудованием (аппаратным обеспечением) и -программным обеспечением. Использование этого уровня даёт администратору -возможность гибко управлять распределением аппаратных ресурсов между -параллельно выполняющимися программами. Второе — помещение программ в -виртуальное окружение довольно надёжно изолирует их от всех прочих программ, -исполняющихся на этом же физическом оборудовании вне данного окружения. Тем -самым радикально снижается вероятность побочного влияния работы одних программ -на работу других, в том числе снижается вероятность атак, построенных на -подобных побочных взаимодействиях. - -[float] -==== Виртуализация сервисов ==== - -Традиционный подход к размещению сервисов состоит в том, что на одном -физическом сервере работает одна операционная система, в рамках которой -выполняются несколько системных служб, предоставляющих те или иные сервисы. - -У нескольких задач, выполняющихся в рамках одной ОС (иначе говоря, в -разделяемой среде), всегда есть возможности для взаимодействия, поскольку ОС -именно для организации такого взаимодействия и предназначена. Кроме того, в -разделяемой среде задачи совместно пользуются общими интерфейсами (файловая -система, структуры ядра...) и в конечном итоге общими аппаратными ресурсами, -что открывает дорогу побочным взаимодействиям. В случае независимых сервисов -подобное взаимодействие равнозначно помехам и нарушению работы. - -В UNIX-системах, при разработке которых многозадачность являлась одним из -важнейших приоритетов, уже присутствует комплекс средств для решения задач -изоляции и контроля. К подобным средствам относятся, например, системный вызов -chroot(), обеспечивающий изоляцию на уровне файловой системы, во FreeBSD -существует также технология jail, дополнительно к этому ограничивающая доступ к -структурам ядра. В последних версиях ядра Linux реализована поддержка -аппаратной паравиртуализации (kvm, применимо в том случае, если ее поддерживает -процессор). Однако стандартные средства UNIX-систем не решают всех проблем -совместного размещения сервисов. - -Проще говоря, в разделяемой среде работает логика: «кто успел, тот и съел». -Поэтому в ситуации, когда критически важна работа нескольких сервисов, в -особенности требовательных к аппаратным ресурсам, работа в рамках одной -разделяемой среды (ОС) может быть нежелательна. - -Путь разрешения обозначенных проблем — использовать средства виртуализации, -чтобы исключить возможности побочного взаимодействия и получить дополнительную -к средствам ОС точку контроля за потреблением аппаратных ресурсов. Так, в -последнее время нормой постепенно становится размещение нескольких сервисов в -рамках одного сервера не в одной и той же ОС, а в отдельных виртуальных -окружениях. Далее мы будем называть такое виртуальное окружение с работающей в -нём системной службой виртуальным контейнером. - -С точки зрения задачи виртуализации сервисов не принципиально, какая конкретно -технология виртуализации выбрана для создания контейнера. При большой -вычислительной нагрузке это вряд ли может быть виртуальная машина, эмулирующая -все оборудование компьютера, но вполне может использоваться одна из систем с -гипервизором. Для UNIX-систем может быть весьма удобно применять одну из -технологий виртуализации на уровне ОС, доводящих средства изоляции и контроля -UNIX до уровня, достаточного для организации полноценных виртуальных окружений. -К таким технологиям относятся OpenVZ (широко применяемый в ALT Linux) и -VServer. - -=== Высокая надёжность и гарантированное обслуживание === - -Во многих областях обслуживания абонентов критически важно обеспечивать -постоянную работу сервиса, минимизировать простои из-за неполадок или -управляться с большим потоком запросов, чтобы они не приводили к нарушению -работы сервиса. Системы, обладающие техническими характеристиками для -выполнения этих условий, называют системами высокой надёжности (high -availability systems). Помещение сервиса в виртуальный контейнер можно -использовать для повышения надёжности его работы. - -[float] -==== Ограничение ресурсов ==== - -Аппаратные ресурсы, доступные виртуальным контейнерам, должны быть всегда -меньше аппаратных ресурсов всей системы. - -Бывают ситуации, особенно при работе под большой нагрузкой, когда затребованные -сервисом ресурсы настолько велики, что могут привести к неработопособности -самой операционной системы. Средствами виртуального окружения можно ограничить -верхний предел ресурсов системы, выделяемых сервису в рамках виртуального -контейнера. - -Т. е. технология виртуализации применяется в данном случае как средство -контроля ресурсов, потребляемых отдельной задачей, и обеспечивает непревышение -этих ресурсов (поскольку задача не имеет прямого доступа к оборудованию). Эту -задачу большинство средств виртуализации решает весьма надёжно. - -Такой подход повышает надёжность системы, поскольку гарантирует операционную -систему от неработоспособности по причине превышения ресурсов со стороны -сервиса. Однако этот метод, естественно, не может гарантировать от сбоев самого -сервиса, вызванных, например, большим потоком запросов. - -Помещение сервиса в виртуальный контейнер позволяет минимизировать время -простоя даже в ситуации сбоя виртуального контейнера из-за превышения ресурсов, -поскольку потребуется только восстановить виртуальный контекст, что в среднем -быстрее, чем перезагрузка всего сервера. - -Таким образом, даже в случае размещения на сервере только одного сервиса, -оправдано его помещение в виртуальный контейнер. - -[float] -==== Гарантированные ресурсы ==== - -Аппаратные ресурсы, доступные виртуальному контейнеру, должны быть -гарантированно больше некоторого минимального значения. - -В ряде случаев необходимо предоставить клиентам сервиса некоторые гарантии -качества обслуживанияш (QoS, quality of service). Примером такой ситуации может -служить телефонный разговор: после соединения клиент получает гарантию, что во -время разговора не закончатся ресурсы канала связи и разговор не прервётся. -Другой пример, уже из области системного администрирования: весьма желательно -гарантировать, что даже при максимальной нагрузке на сервере (в том числе в -ситуации DoS-атак), у сервиса SSH будет достаточно ресурсов, чтобы обеспечить -удалённый вход на сервер системного администратора, который мог бы принять -срочные меры. - -Чтобы обеспечить качество обслуживания для сервиса, администратору необходимо -гарантировать достаточный объем аппаратных ресурсов для этого сервиса, т. е. -исключить ситуации сбоя сервиса из-за физической нехватки ресурсов в системе. - -И здесь можно использовать виртуализацию сервисов. Если сервис работает в -виртуальном контейнере, то гарантия минимального уровня ресурсов сводится к -тому, что процессы, выполняемые вне данного контейнера, в сумме не затребуют -больше ресурсов, чем разность между объемом ресурсов системы и ресурсами -данного контейнера. - -Так, если в системе параллельно выполняется несколько сервисов, каждый из -которых помещён в отдельном виртуальном контейнере, то задача администратора — -ограничить ресурсы каждого контейнера таким образом, чтобы сумма выделенных им -ресурсов не превышала всех ресурсов системы, и при этом выделенные каждому -сервису ресурсы были достаточны для его нормальной работы. - -В случае, если сервисы не помещены в виртуальные контейнеры, добиться -гарантированной нижней границы доступных ресурсов можно только в том случае, -если на одном физическом сервере выполняется только один сервис. В противном -случае работает правило «кто первый встал, того и тапки», т. е. любой из -сервисов может в какой-то момент занять большой объём свободных ресурсов, так -что оставшегося не хватит другому сервису для нормальной работы. - -Иначе говоря, в разделяемой среде невозможно гарантировать отдельному сервису -нижнюю границу доступных ресурсов, и, следовательно, невозможно дать гарантии -клиентам по качеству обслуживания. - -=== Изоляция ergo защищённость === - -default deny:: -Важнейший принцип информационной безопасности: всякое взаимодействие, которое -не является заведомо необходимым, должно быть по умолчанию запрещено. - -Сервис, принимающий запросы от внешних клиентов, является одним из классических -источников для разного рода уязвимостей в безопасности системы. Зачастую -несанкционированный доступ к ОС осуществляется именно через эксплуатацию -уязвимостей некоторого сервиса. Если подвергшийся атаке сервис помещён в -виртуальный контейнер, последствия взлома могут быть значительно менее -разрушительными, чем в случае, когда сервис выполняется непосредственно в -операционной системе сервера. В последнем случае ОС сервера может быть взломана -через один из сервисов, а под удар подставляются все выполняющиеся сервисы. - -В случае виртуализованного сервиса, взломщик может получить доступ только в -рамках виртуального контейнера, так что даже если на сервере параллельно -выполняются другие сервисы (в других виртуальных контейнерах), то их работе -данный инцидент угрожать не будет. Попытки взломщика исчерпать все физические -ресурсы приведут только к исчерпанию ресурсов данного контейнера. Таким -образом, взломщик не сможет затруднить удалённый доступ администратора на -сервер, исчерпав все доступные ресурсы. Кроме того, изнутри контейнера у -взломщика нет возможности перезаписать загрузчик сервера и получить какой-либо -прямой контроль над оборудованием. - -При подобном инциденте администратор может просто целиком уничтожить -скомпрометированный виртуальный контекст и восстановить его и данные из -резервной копии, не перезагружая сервер и не останавливая работу прочих -выполняющихся на нём сервисов. - -[float] -==== Программные и аппаратные средства ограничения ресурсов ==== - -Из предыдущих разделов становится понятно, что при использовании виртуальных -контейнеров на сервере работоспособность как виртуализованных сервисов, так и -основной ОС сервера весьма существенно зависит от надёжности работы механизмов -ограничения и изоляции, заложенных в технологии виртуализации. - -Такие механизмы ограничения могут быть двух родов: аппаратные и программные. -Если используется платформа, поддерживающая виртуализацию на аппаратном уровне, -то алгоритмы изоляции контекстов реализованы непосредственно в оборудовании, -подвести здесь может только ошибка в микросхеме. Во всех остальных технологиях -виртуализации механизмы ограничения реализованы так или иначе программно, и, -как показывает практика, в программных реализациях ошибки встречаются. - -Производители программного обеспечения, выполняющего те или иные серверные -функции (т. е. предоставляющие некоторый сервис), могут встраивать в свои -продукты собственные средства контроля ресурсов, предоставляющие примерно ту же -функциональность, что и ограничение средствами виртуального контейнера. Однако -как в любой программной реализации в этих механизмах возможны ошибки, дающие -возможность при определённых условиях обходить установленные ограничения. - -Однако вероятность ошибок в механизмах ограничения тем выше, чем больше разных -механизмов использовано в системе. Поэтому в случае размещения на сервере -нескольких виртуальных контейнеров с сервисами правильнее использовать один -общий механизм контроля, предоставляемый средством виртуализации. Кроме того, -если используется стандартное для дистрибутива средство виртуализации (OpenVZ в -случае ALT Linux), то возможные ошибки, критичные для безопасности, будут -быстрее обнаружены и исправлены. - -=== Защита интерфейса управления === - -При организации сервера с использованием виртуализованных сервисов критически -важной точкой для безопасности системы становится интерфейс управления самими -виртуальными контейнерами. Доступ к этому интерфейсу должен быть наиболее -обстоятельно защищён. - -Возможные варианты защиты доступа к интерфейсу управления: - -* запретить удалённый доступ по сети, разрешить только доступ с локальной -консоли (виртуальная консоль, последовательный порт); -* физически изолировать сетевое подключение для интерфейса управления -(отдельный сетевой адаптер); -* логически изолировать сетевое подключение для интерфейса управления -(отдельный VLAN-интерфейс); -* использовать защищённые сетевые соединения для удалённого доступа к -интерфейсу управления (защищённый туннель ipsec, openvpn, pptp или -ssh-туннели). - -=== Консолидация серверов === - -Консолидация сервисов на одном сервере ведет к экономии на затратах на -обслуживание оборудования. - -Выше уже говорилось о том, что современное оборудование позволяет одновременно -выполнять значительно больше одного сервиса на одном сервере. При использовании -некоторых технологий виртуализации вычислительных ресурсов сегодня хватает на -организацию множества виртуальных контекстов на сервере, даже с учётом -дополнительных вычислительных расходов на виртуализацию. Технологии -виртуализации на уровне операционной системы (для UNIX-систем) позволяют -одновременно эксплуатировать сотни виртуальных контекстов на одном достаточно -мощном сервере. - -Типичная сфера применения подобных решений — хостинг-провайдеры: при -использовании виртуальных контекстов каждому клиенту можно выдать независимое -окружение с правами суперпользователя, предоставив администрирование внутри -контекста на его полное усмотрение. - -Выгоды от малой и до массовой консолидации сервисов на одном сервере в первую -очередь лежат в сфере снижения затрат на приобретение, размещение и -обслуживание оборудования. Традиционно подобная консолидация сдерживалась -соображениями безопасности и качества обслуживания, которые также -обеспечиваются средствами виртуальных контейнеров. - -=== Динамическое перераспределение ресурсов === - -Виртуализация сервисов даёт возможность простого и безущербного внедрения, -перемещения и выведения из строя любого из сервисов без ущерба общей -инфраструктуре и без простоя. - -Еще одна неочевидная, но немаловажная выгода, представляемая помещением -сервисов в виртуальные контейнеры происходит от того, что виртуальные -контексты, с одной стороны, самодостаточны, а с другой — отчуждаемы от -оборудования. Благодаря этому, администратор имеет возможность манипулировать -виртуальными контейнерами как целостными объектами, в том числе переносить с -одного сервера на другой. Так, для большинства технологий виртуализации есть -средства для «заморозки» контейнера в текущем состоянии, с возможностью -последующей разморозки, в том числе на другом сервере, при том что выполняемые -внутри контейнера процессы даже не заметят происшедшей перемены. - -Такие возможности позволяют даже в процессе работы мигрировать виртуализованные -сервисы, например, по разным узлам сети, гибко перераспределяя вычислительную -нагрузку, в том числе среди узлов кластера. Кроме того, можно уничтожить -ставший ненужным виртуальный контейнер, при этом не возникнет необходимости -продавать высвободившийся сервер: просто остальные контейнеры смогут разделить -высвобившиеся мощности. diff --git a/old-docs/zsh_intro.txt b/old-docs/zsh_intro.txt deleted file mode 100644 index 9bbbdb1..0000000 --- a/old-docs/zsh_intro.txt +++ /dev/null @@ -1,368 +0,0 @@ -//// -Пакет: docs-zsh_intro -RPM файл: docs-zsh_intro-0.1.1-alt1.noarch.rpm -Аннотация: Небольшой обзор командного процессора Zsh -Автор: Алексей Отт -Лицензия: FDL -URL: http://alexott.net/ru/index.html -//// - -== Командный процессор Zsh == - -[float] -=== Введение === - -В этой статье предполагается, что читатель уже имеет навыки работы с одним из -распространенных командных процессоров UNIX, и поэтому сосредоточимся на -отличительных возможностях Zsh. - -Zsh — командный процессор UNIX, который может использоваться как в качестве -командного процессора для скриптов, так и в качестве интерактивной оболочки. -Zsh обладает множеством возможностей, среди которых — настраиваемый механизм -дополнений (completions), редактирование командной строки, механизм сохранения -историй, встроенное исправление неправильных команд. - -По возможностям Zsh наибольшее сходство имеет с Ksh, но при этом еще обладает -множеством расширений. - -Свежие версии Zsh доступны с сервера www.zsh.org и его зеркал. Кроме этого, Zsh -часто включают в состав популярных дистрибутивов Linux и других вариантов UNIX. - -=== Запуск === - -Обычно Zsh указывают в качестве интерактивной оболочки для входа в систему. Но, кроме этого, Zsh можно запускать и отдельно, с разными ключами, определяющими его поведение. Например, ключ -r заставляет Zsh работать в «ограниченном» (restricted) режиме, ключ -c указывает откуда читать команды для выполнения, а ключ -i заставляет работать в интерактивном режиме. - -При работе в «ограниченном» режиме запрещается выполнять некоторые действия: изменять каталог, запускать программы с помощью команды exec, перенаправлять вывод в файлы, изменять значение переменных среды, используемых при запуске программ, а также запускать программы, используя их абсолютные имена. - -При запуске Zsh старается эмулировать sh или Ksh в зависимости от того, под каким именем его запустили. В режиме эмуляции не исполняются обычные скрипты инициализации и завершения работы Zsh. Для инициализации используются файлы /etc/profile и $HOME/.profile - -[float] -==== Файлы, используемые при запуске ==== - -При запуске Zsh читается некоторое количество файлов, содержащих команды инициализации. В первую очередь читается файл /etc/zshenv, затем читается файл $ZDOTDIR/.zshenv. Затем, если запускаемый процесс используется для входа в систему, то читаются файлы /etc/zprofile и $ZDOTDIR/.zprofile. Затем, если оболочка является интерактивной, читаются файлы /etc/zshrc и $ZDOTDIR/.zshrc. И наконец, если процесс используется для входа в систему, то читаются файлы /etc/zlogin и $ZDOTDIR/.zlogin. - -Когда происходит выход из оболочки, использовавшейся для входа в систему, то читаются файлы $ZDOTDIR/.zlogout и затем /etc/zlogout. - -Если переменная ZDOTDIR не установлена, то вместо нее используется значение переменной HOME. Файл /etc/zshenv читается при запуске любого процесса Zsh, поэтому он должен быть настолько малым, насколько это возможно. - -Все перечисленные файлы могут быть откомпилированы с помощью команд zcompile, что позволяет их загружать быстрее. Откомпилированные файлы имеют расширение .zwc, и загружаются в том случае, если они новее исходного файла. - -=== Грамматика команд === - -Грамматика команд по большей части совпадает с грамматикой других командных процессоров семейства bourne shell, хотя имеются различные расширения, специфические для данного командного процессора. Схожесть грамматики позволяет быстро перейти к работе с использованием Zsh, и осваивать новые возможности уже в процессе его эксплуатации. - -=== Перенаправление вывода === - -Zsh поддерживает такое же перенаправление вывода как и Bash, но кроме этого он поддерживает множество расширений. Некоторые расширения работают только если заданы соответствующие настройки. Например, если не задана опция CLOBBER, то использование команды > для существующего файла приведет к возникновению ошибки и невыполнению команды. На этот случай, для практически всех команд существуют их модификации, которые не зависят от настроек. Например, для команды > существуют ее модификации >! и >|. - -Для одновременного перенаправления стандартного вывода и стандартного потока сообщений об ошибках определены дополнительные команды >&, &>, >>&, &>> и их модификации со знаками | и ! (например, &>|). Эти команды соответственно переписывают и дополняют информацию в указанных файлах, а также позволяют избавиться от неуклюжих конструкций вида 1>FNAME 2>&1. - -Zsh также позволяет перенаправлять информацию в более чем в один файл, аналогично использованию команды tee (это доступно только если определена переменная MULTIOS, что обычно указано по умолчанию). Кроме этого можно одновременно использовать перенаправление и конвейеры. Например, команда date >foo | cat запишет дату в файл foo и выведет ее в стандартный поток вывода. - -Если установлена переменная MULTIOS, то имя файла, указанное в качестве того, куда надо будет перенаправлять информацию, подвергается раскрытию шаблонов (globbing). Таким образом можно использовать команду - - : > * - -для усечения всех файлов в текущем каталоге. - -Множественное перенаправление также работает и при вводе информации, позволяя заменять конструкции вида - - cat foo fubar | sort - -на конструкции - - sort Установка программ*. Для облегчения поиска доступные -для установки программы разделены на группы, выводимые в левой части окна -программы. Справа расположен список самих программ с указанием их текущего -состояния: - -** зелёная метка — пакет уже установлен; -** белая — пакет не установлен. -+ -Объяснение всех обозначений можно увидеть, отметив пункт *Показать статистику*. -+ -Для начала установки двойным щелчком мыши отметьте неустановленный пакет в -правой половине окна и нажмите *Применить*. При необходимости менеджер пакетов -попросит вставить установочный диск. diff --git a/packages/acc/alterator-pkg-add-repo.txt b/packages/acc/alterator-pkg-add-repo.txt deleted file mode 100644 index 68d1ec4..0000000 --- a/packages/acc/alterator-pkg-add-repo.txt +++ /dev/null @@ -1,12 +0,0 @@ -Для выбора репозитория, совместимого с вашим дистрибутивом, рекомендуем -использовать Центр управления системой (модуль *Программное обеспечение -> -Источники для установки ПО*). Для указания конкретного репозитория в выпадающем -списке отметьте один из предлагаемых вариантов и нажмите кнопку *Изменить*. Если -сомневаетесь, то выбирайте +ftp://ftp.altlinux.org/+. К предложенному списку вы можете -самостоятельно добавить любые репозитории, нажав на кнопку *Дополнительно...*. - -После добавления репозиториев обновите информацию о них. - -- Центр управления системой: -+ -Модуль: *Программное обеспечение -> Установка программ -> Обновить*. diff --git a/packages/apt-get.txt b/packages/apt-get.txt deleted file mode 100644 index 623315d..0000000 --- a/packages/apt-get.txt +++ /dev/null @@ -1,375 +0,0 @@ - -[[INSTALLING_PACKAGES_ADVANCED]] -= Установка пакетов для опытных пользователей = -//// -Установка дополнительного ПО возможна не только при использовании описанных -выше графических приложений. Опытные пользователи могут использовать для -установки пакетов утилиты командной строки. - -== Введение: пакеты, зависимости и репозитории == -//// -== Введение == - -В современных системах на базе Linux существует огромное число общих ресурсов: -разделяемых библиотек, содержащих стандартные функции, исполняемые файлы, -сценарии и стандартные утилиты и т.д. Этими общими ресурсами пользуются сразу -несколько программ. Удаление или изменение версии одного из составляющих -систему компонентов может повлечь неработоспособность других, связанных с ним -компонентов, или может привести к выводу из строя всей системы. В контексте -системного администрирования проблемы такого рода называют нарушением -_целостности системы_. Задача администратора -- обеспечить наличие в системе -согласованных версий всех необходимых программных компонентов (обеспечение -целостности системы). - -Для установки, удаления и обновления программ, а также поддержания целостности -системы в Linux в первую очередь стали использоваться программы _менеджеры -пакетов_ (например, такие, как rpm). С точки зрения менеджера пакетов -программное обеспечение представляет собой набор компонентов -- программных -_пакетов_. Пакеты содержат в себе набор исполняемых программ и вспомогательных -файлов, необходимых для корректной работы программного обеспечения. Менеджеры -пакетов облегчают установку программ: они позволяют проверить наличие -необходимого для работы устанавливаемой программы компонента подходящей версии -непосредственно в момент установки. Менеджеры пакетов производят необходимые -процедуры для регистрации программы во всех операционных средах пользователя: -сразу после установки программа становится доступна пользователю из командной -строки и появляется, если это было предусмотрено, в меню приложений всех -графических оболочек. - -Часто компоненты, используемые различными программами, выделяют в отдельные -пакеты и помечают, что для работы ПО, предоставляемого пакетом A, необходимо -установить пакет B. В таком случае говорят, что пакет A _зависит_ от пакета B -или между пакетами A и B существует _зависимость_ - -Отслеживание зависимостей между такими пакетами представляет собой важную -задачу для любого дистрибутива. Некоторые компоненты пакетов могут быть -взаимозаменяемыми, т.е. может обнаружиться несколько пакетов, предлагающих -затребованный ресурс. - -Ещё более сложной является задача контроля целостности и непротиворечивости -установленного в системе ПО. Представим, что некие программы A и B требуют -наличия в системе компонентов C версии 1.0. Обновление версии пакета A, -требующее обновления компонентов C до новой версии (например, до версии -2.0, использующей новый интерфейс доступа), влечёт за собой обязательное -обновление и программы B. - -На практике менеджеры пакетов оказались неспособны эффективно устранить -нарушения целостности системы и предотвратить все коллизии при установке или -удалении программ. Особенно остро этот недостаток сказался на обновлении -систем из централизованного репозитория, в котором пакеты непрерывно -обновляются, дробятся на более мелкие и т.п. Именно этот недостаток -стимулировал создание систем управления программными пакетами и поддержания -целостности ОС. - -Для автоматизации и контроля описанных выше процессов стала применяться -Усовершенствованная система управления программными пакетами APT (от англ. -Advanced Packaging Tool). Автоматизация и контроль достигаются путём создания -одного или нескольких внешних репозиториев. В них хранятся доступные для -установки пакеты программ. - -В распоряжении APT находятся две базы данных: одна описывает установленные в -системе пакеты, вторая -- внешний репозиторий. APT отслеживает целостность -установленной системы и, в случае обнаружения противоречий в зависимостях -пакетов, разрешает конфликты, находит пути их корректного устранения, -руководствуясь сведениями из внешних репозиториев. - -Система APT состоит из нескольких утилит. Чаще всего используется утилита -управления пакетами `apt-get`. Она автоматически определяет зависимости между -пакетами и строго следит за её соблюдением при выполнении любой из следующих -операций: установка, удаление или обновление пакетов. - -== Источники программ (репозитории) == - -Отличие репозиториев, с которыми работает APT, от простого набора пакетов -- -наличие метаинформации. В ней содержится индекс находящихся в репозитории -пакетов и сведения о них. Поэтому, чтобы получить всю информацию о репозитории, -APT достаточно получить его индексы. - -APT может пользоваться любым количеством репозиториев одновременно, формируя -единую информационную базу обо всех содержащихся в них пакетах. При установке -пакетов APT обращает внимание только на название пакета, его версию и -зависимости. Для АРТ не имеет значения расположение пакета в том или ином -репозитории. - -[IMPORTANT] -Для одновременного подключения нескольких репозиториев необходимо отслеживать -их совместимость друг с другом, т.е. их пакетная база должна отражать один -определённый этап разработки. Совместное использование репозиториев, относящихся -к разным дистрибутивам, или смешивание стабильного репозитория с нестабильной -веткой разработки (Sisyphus) может привести к различными неожиданностям и -трудностям при обновлении пакетов. - -APT осуществляет взаимодействие с репозиториями при помощи различных протоколов -доступа. Наиболее популярные -- HTTP и FTP. - -Для того чтобы APT мог использовать тот или иной репозиторий, информацию о нём -необходимо поместить в файл `/etc/apt/sources.list`, либо в любой файл `.list` -(например, `mysources.list`) в каталоге `/etc/apt/sources.list.d/`. Описания -репозиториев заносятся в эти файлы в следующем виде: - ------------------------------------------- -rpm [подпись] метод:путь база название -rpm-src [подпись] метод:путь база название ------------------------------------------- - -rpm или rpm-src:: -Тип репозитория (скомпилированные программы или исходные тексты). - -[подпись]:: -Необязательная строка-указатель на электронную подпись разработчиков. Наличие -этого поля подразумевает, что каждый пакет из данного репозитория должен быть -подписан соответствующей электронной подписью. Подписи описываются в файле -`/etc/apt/vendor.list`. - -Метод -- способ доступа к репозиторию: ftp, http, file, rsh, ssh, cdrom, copy. - -Путь -- путь к репозиторию в терминах выбранного метода. - -База -- относительный путь к базе данных репозитория. - -Название -- название репозитория. - -Для добавления в `sources.list` репозитория на компакт-диске в APT -предусмотрена специальная утилита -- `apt-cdrom`. Чтобы добавить запись о -репозитории на компакт-диске, достаточно вставить диск в привод и выполнить -команду `apt-cdrom add`. После этого в `sources.list` появится запись о -подключённом диске примерно такого вида: - -------------------------------------------------------------------------- -rpm cdrom:[ALT Linux 7.0.0 Centaurus (Pholus) x86_64]/ ALTLinux main -------------------------------------------------------------------------- - -После того как отредактирован список репозиториев в `sources.list`, необходимо -обновить локальную базу данных APT о доступных пакетах. Это делается командой -`apt-get update`. - -Если в `sources.list` присутствует репозиторий, содержимое которого может -изменяться (например, постоянно разрабатываемый репозиторий или репозиторий -обновлений по безопасности), то прежде чем работать с APT, необходимо -синхронизировать локальную базу данных с удалённым сервером командой `apt-get -update`. Локальная база данных создаётся заново при каждом изменении в -репозитории: добавлении, удалении или переименовании пакета. - -При установке определённого пакета APT производит поиск самой новой версии -этого пакета во всех известных ему репозиториях вне зависимости от способа -доступа к ним. Так, если в репозитории, доступном в сети Интернет, обнаружена -более новая в сравнении с компакт-диском версия программы, то APT начнёт загружать -соответствующий пакет из сети Интернет. Поэтому, если подключение к сети Интернет -отсутствует или ограничено низкой пропускной способностью канала или высокой -стоимостью, то следует закомментировать строчки (добавить в начало строки символ #) в `/etc/apt/sources.list`, -относящиеся к ресурсам в сети Интернет. - -== Репозитории ALT Linux == - -Все дистрибутивы ALT Linux выпускаются на основе репозитория Sisyphus команды -ALT Linux Team (http://www.altlinux.org/ALT_Linux_Team). -Sisyphus не является самостоятельным дистрибутивом. Sisyphus -- репозиторий, -отражающий текущее состояние разработки, поэтому он может содержать -нестабильные версии пакетов. На базе этого проекта выпускаются отдельные -протестированные «срезы» -- дистрибутивы. - -В отличие от Sisyphus, ежедневно обновляемого разработчиками, такие срезы -являются «замороженными» -- разработка в них не ведётся, а сами срезы -сохраняются в целях обеспечения целостности среды дистрибутива. - -Непосредственно после установки дистрибутива ALT Linux в -`/etc/apt/sources.list`, а также в файлах `/etc/apt/sources.list.d/*.list` -обычно указывается несколько репозиториев: - -- репозиторий с установочного диска дистрибутива; -- интернет-репозиторий, совместимый с установленным дистрибутивом. - -== Добавление репозиториев с использованием терминала == - -//О работе с терминалом вы можете почитать в ССЫЛКЕ НА НЕ СОЗДАННЫЙ ФАЙЛ - -=== apt-repo === - -include::apt-repo/apt-repo.txt[] - -=== Добавление репозиториев вручную === - -include::manually/manually-add-repo.txt[] - -[NOTE] -О добавлении или удалении репозиториев с использованием графических приложений -вы можете почитать в <> - -== Поиск пакетов == - -Если вы не знаете точного названия пакета, то для его поиска можно -воспользоваться утилитой `apt-cache`. Данная утилита позволяет искать пакет не -только по имени, но и по его описанию. - -Команда `apt-cache search _подстрока_` позволяет найти все пакеты, в именах или -описании которых присутствует указанная подстрока. Например: - ----------------------------------------------------------------------------- -$ apt-cache search dictionary -stardict-wn - GCIDE - The Collaborative International Dictionary of English -firefox-ru - Russian (RU) Language Pack for Firefox -gnome-dictionary-applet - GNOME panel applet for gnome-dictionary -gnome-utils - Utilities for the GNOME 2.0 desktop -libgdict - GNOME Dictionary Library. -stardict-mueller7 - V.K. Mueller English-Russian Dictionary, 7 Edition: stardict format -stardict-slovnyk_be-en - Dictionary: Slovnyk Belarusian-English -stardict-slovnyk_be-ru - Dictionary: Slovnyk Belarusian-Russian -stardict-slovnyk_be-uk - Dictionary: Slovnyk Belarusian-Ukrainian -stardict-slovnyk_cs-ru - Dictionary: Slovnyk Czech-Russian -stardict-slovnyk_en-be - Dictionary: Slovnyk English-Belarusian -stardict-slovnyk_en-ru - Dictionary: Slovnyk English-Russian -stardict-slovnyk_en-uk - Dictionary: Slovnyk English-Ukrainian -stardict-slovnyk_es-ru - Dictionary: Slovnyk Spanish-Russian -stardict-slovnyk_ru-be - Dictionary: Slovnyk Russian-Belarusian -stardict-slovnyk_ru-cs - Dictionary: Slovnyk Russian-Czech -stardict-slovnyk_ru-en - Dictionary: Slovnyk Russian-English -stardict-slovnyk_ru-es - Dictionary: Slovnyk Russian-Spanish -stardict-slovnyk_ru-uk - Dictionary: Slovnyk Russian-Ukrainian -stardict-slovnyk_uk-be - Dictionary: Slovnyk Ukrainian-Belarusian -stardict-slovnyk_uk-en - Dictionary: Slovnyk Ukrainian-English -stardict-slovnyk_uk-ru - Dictionary: Slovnyk Ukrainian-Russian -words - A dictionary of English words for the /usr/share/dict directory ----------------------------------------------------------------------------- - -Для того чтобы подробнее узнать информацию о найденном пакете и получить его -подробное описание, воспользуйтесь командой `apt-cache show`: - ----------------------------- -$ apt-cache show stardict-mueller7 -Package: stardict-mueller7 -Section: Text tools -Installed Size: 3095255 -Maintainer: Anton V. Boyarshinov -Version: 1.0-alt7 -Pre-Depends: rpmlib(PayloadIsLzma) -Depends: stardict (>= 2.4.2) -Provides: stardict-mueller7 (= 1.0-alt7) -Architecture: noarch -Size: 3135276 -MD5Sum: ea95c67ca323350b454fbc26533c3548 -Filename: stardict-mueller7-1.0-alt7.noarch.rpm -Description: V.K. Mueller English-Russian Dictionary, 7 Edition: stardict format - Electronic version of V.K. Mueller English-Russian Dictionary, 7 Edition - in stardict format. You can use it with stardict client. ----------------------------- - -При поиске с помощью `apt-cache` можно использовать русскую подстроку. В этом -случае будут найдены пакеты, имеющие описание на русском языке. К -сожалению, описание на русском языке в настоящее время есть не у всех пакетов, -но наиболее актуальные описания переведены. - -== Установка или обновление пакета == - -Установка пакета с помощью APT выполняется командой: - ----------------------------- -# apt-get install имя_пакета ----------------------------- - -[IMPORTANT] -Для установки пакетов требуются привилегии администратора. - -`apt-get` позволяет устанавливать в систему пакеты, требующие для работы -наличие других, пока ещё не установленных пакетов. В этом случае он определяет, -какие пакеты необходимо установить. `apt-get` устанавливает их, пользуясь всеми -доступными репозиториями. - -Установка пакета `stardict-mueller7` командой `apt-get install -stardict-mueller7` приведёт к следующему диалогу с APT: - ------------------------------------ -# apt-get install stardict-mueller7 -Чтение списков пакетов... Завершено -Построение дерева зависимостей... Завершено -Следующие НОВЫЕ пакеты будут установлены: - stardict-mueller7 -0 будет обновлено, 1 новых установлено, 0 пакетов будет удалено и 0 не будет обновлено. -Необходимо получить 0B/3135kB архивов. -После распаковки потребуется дополнительно 3095kB дискового пространства. -Совершаем изменения... -Preparing... ####################### [100%] -1: stardict-mueller7 ####################### [100%] -Running /usr/lib/rpm/posttrans-filetriggers -Завершено. ------------------------------------ - -Команда `apt-get install _имя_пакета_` используется также и для обновления уже -установленного пакета или группы пакетов. В этом случае `apt-get` дополнительно -проверяет, есть ли обновлённая, в сравнении с -установленной в системе, версия пакета в репозитории. - -При помощи APT можно установить и отдельный rpm-пакет, не входящий в состав -репозиториев (например, полученный из сети Интернет). Для этого достаточно -выполнить команду `apt-get install /путь/к/файлу.rpm`. При этом APT проведёт -стандартную процедуру проверки зависимостей и конфликтов с уже установленными -пакетами. - -Иногда в результате операций с пакетами без использования APT целостность -системы нарушается, и `apt-get` отказывается выполнять операции установки, -удаления или обновления. В этом случае необходимо повторить операцию, задав -опцию `-f`, заставляющую `apt-get` исправить нарушенные зависимости, удалить -или заменить конфликтующие пакеты. В этом случае необходимо внимательно следить -за сообщениями, выводимыми `apt-get`. Любые действия в этом режиме обязательно -требуют подтверждения со стороны пользователя. - -== Удаление установленного пакета == - -Для удаления пакета используется команда `apt-get remove имя_пакета`. Для -того чтобы не нарушать целостность системы, будут удалены и все пакеты, -зависящие от удаляемого. В случае удаления пакета, который относится к базовым -компонентам системы, `apt-get` потребует дополнительное подтверждение с целью -предотвращения возможной случайной ошибки. - -[IMPORTANT] -Для удаления пакетов требуются привилегии администратора. - -При попытке с помощью `apt-get` удалить базовый компонент системы, вы увидите -следующий запрос на подтверждение операции: - ----------------------------- -# apt-get remove filesystem -Чтение списков пакетов... Завершено -Построение дерева зависимостей... Завершено -Следующие пакеты будут УДАЛЕНЫ: - ... -ВНИМАНИЕ: Будут удалены важные для работы системы пакеты -Обычно этого делать не следует. Вы должны точно понимать возможные последствия! - ... -0 будет обновлено, 0 новых установлено, 2648 пакетов будет удалено и 0 не будет обновлено. -Необходимо получить 0B архивов. -После распаковки будет освобождено 8994MB дискового пространства. -Вы делаете нечто потенциально опасное! -Введите фразу 'Yes, do as I say!' чтобы продолжить. ----------------------------- - -Каждую ситуацию, в которой APT выдаёт такой запрос, необходимо рассматривать -отдельно. Вероятность того, что после выполнения этой команды система окажется -неработоспособной, очень велика. - -== Обновление всех установленных пакетов == - -Для обновления всех установленных пакетов используется команда `apt-get -dist-upgrade`. Она позволяет обновить только те установленные пакеты, для которых в -репозиториях, перечисленных в `/etc/apt/sources.list`, имеются новые версии. - -//// -Никакие другие пакеты при этой операции из системы удалены не будут. Этот -способ полезен при работе со стабильными пакетами приложений, относительно -которых известно, что они при смене версии изменяются несущественно. - -Иногда происходит изменение в наименовании пакетов или изменение их -зависимостей. Такие ситуации не обрабатываются командой `apt-get upgrade`, в -результате чего происходит нарушение целостности системы: появляются -неудовлетворённые зависимости. Например, переименование пакета `MySQL-shared`, -содержащего динамически загружаемые библиотеки для работы с СУБД MySQL, в -`libMySQL` (отражающая общую тенденцию к наименованию библиотек в дистрибутиве) -не приводит к тому, что установка обновлённой версии `libMySQL` требует -удаления старой версии `MySQL-shared`. Для разрешения этой проблемы существует -режим обновления в масштабе дистрибутива -- `apt-get dist-upgrade`. -//// - -В случае обновления всего дистрибутива APT проведёт сравнение системы с -репозиторием и удалит устаревшие пакеты, установит новые версии присутствующих -в системе пакетов, отследит ситуации с переименованиями пакетов или изменения -зависимостей между старыми и новыми версиями программ. Всё, что потребуется -поставить (или удалить) дополнительно к уже имеющемуся в системе, будет указано -в отчёте `apt-get`, которым APT предварит само обновление. diff --git a/packages/apt-repo/apt-repo.txt b/packages/apt-repo/apt-repo.txt deleted file mode 100644 index 4438a8e..0000000 --- a/packages/apt-repo/apt-repo.txt +++ /dev/null @@ -1,9 +0,0 @@ -Вы можете воспользоваться скриптом `apt-repo`. Для этого вам потребуется -запустить терминал и вводить команды в него. -Необходимы права администратора для выполнения большинства команд. - -** Глянуть список активных репозиториев можно командой `apt-repo list` -** Для добавления репозитория в список активных репозиториев используйте `apt-repo add репозиторий` -** Для удаления или выключения репозитория используйте `apt-repo rm репозиторий` -** Для обновления информации о репозиториях выполните `apt-repo update` -** Для более подробной справки используйте `man apt-repo` или `apt-repo --help` diff --git a/packages/index.txt b/packages/index.txt deleted file mode 100644 index 4ef9d45..0000000 --- a/packages/index.txt +++ /dev/null @@ -1,58 +0,0 @@ -= Установка дополнительного программного обеспечения на рабочую станцию = - -== Введение == -После установки ALT Linux, при первом запуске, вам доступен тот или иной набор -программного обеспечения. Количество предустановленных программ зависит -от набора программ конкретного дистрибутива или от выбора, сделанного вами при -установке системы. Если вы не обнаружили в своей системе интересующие вас -программы, то вы имеете возможность доустановить их из разных источников. - -Дополнительное программное обеспечение может находиться на установочном диске -и/или в специальных банках программ (репозиториях), расположенных в сети -Интернет и/или в локальной сети. Программы, размещённые в указанных источниках, -имеют вид подготовленных для установки пакетов. - -[[INSTALL_PACKAGES_FROM_DVD_GUI]] -== Установка дополнительного ПО с установочного диска == - -Для установки дополнительного ПО вы можете использовать: - -=== Центр управления системой === - -include::acc/alterator-packages-install.txt[] - -=== Synaptic === - -include::synaptic/synaptic-install.txt[] - -[WARNING] -Не используйте одновременно два менеджера пакетов, так как это может -привести к их некорректной работе. - -[[ADDING_REPOSITORIES]] -== Добавление репозиториев == - -Эта информация может пригодиться вам для установки дополнительного ПО -из внешних репозиториев. - -=== Центр управления системой === - -include::acc/alterator-pkg-add-repo.txt[] - -=== Synaptic === - -include::synaptic/synaptic-add-repo.txt[] - -[IMPORTANT] -После выбора и добавления репозиториев необходимо получить сведения -о находящихся в них пакетах. В противном случае, список доступных для установки -программ будет не актуален. - -Непосредственная установка пакетов из добавленных репозиториев ничем не -отличается от описанной выше в <>. -// Обновление ПО -[NOTE] -Есть и другие способы работы с репозиториями и пакетами. Некоторые из них описаны в -<> - -include::apt-get.txt[] diff --git a/packages/manually/manually-add-repo.txt b/packages/manually/manually-add-repo.txt deleted file mode 100644 index d0d7f3f..0000000 --- a/packages/manually/manually-add-repo.txt +++ /dev/null @@ -1,25 +0,0 @@ -Вы можете отредактировать в любом текстовом редакторе файлы из папки -`/etc/apt/sources.list.d/`. Необходимы права администратора для изменения -этих файлов. В файле alt.list может содержаться такая информация: - -------------------------------------------------------------------------------- -# ftp.altlinux.org (ALT Linux, Moscow) - -# ALT Linux Platform 7 -#rpm [p7] ftp://ftp.altlinux.org/pub/distributions/ALTLinux/p7/branch x86_64 classic -#rpm [p7] ftp://ftp.altlinux.org/pub/distributions/ALTLinux/p7/branch x86_64-i586 classic -#rpm [p7] ftp://ftp.altlinux.org/pub/distributions/ALTLinux/p7/branch noarch classic - -rpm [p7] http://ftp.altlinux.org/pub/distributions/ALTLinux/p7/branch x86_64 classic -rpm [p7] http://ftp.altlinux.org/pub/distributions/ALTLinux/p7/branch x86_64-i586 classic -rpm [p7] http://ftp.altlinux.org/pub/distributions/ALTLinux/p7/branch noarch classic -------------------------------------------------------------------------------- -По сути, каждая строчка соответствует некому репозиторию. В примере из текста -выше видно, что перед 3 строчками нету решётки. Именно эти строчки и будут -выбранными репозиториями. Если вы не хотите пользоваться этими репозиториями, -просто допишите решётку перед ними. Если вы хотите использовать другие репозитории, -то вы можете дописать их вниз этого или любого другого файла. - -После добавления репозиториев обновите информацию о них: -Запустите терминал и выполните команду `apt-get update` или `apt-repo update`. -Необходимы права администратора для выполнения этих команд. diff --git a/packages/synaptic/synaptic-add-repo.txt b/packages/synaptic/synaptic-add-repo.txt deleted file mode 100644 index 7426f82..0000000 --- a/packages/synaptic/synaptic-add-repo.txt +++ /dev/null @@ -1,15 +0,0 @@ -//application path -Программа Synaptic также может использоваться для выбора репозитория, -совместимого с вашим дистрибутивом. Для указания конкретного репозитория в меню -*Параметры -> Репозитории* отметьте один из предлагаемых вариантов и нажмите -кнопку *OK*. Если вы сомневаетесь, то выбирайте строки, содержащие -`ftp://ftp.altlinux.org/`. К предложенному списку вы можете самостоятельно -добавить любые репозитории, нажав на кнопку *Создать* и введя необходимые -данные. - -//application path -После добавления репозиториев обновите информацию о них. - -- Программа управления пакетами Synaptic: -+ -Меню: *Правка -> Получить сведения о пакетаx*. diff --git a/packages/synaptic/synaptic-install.txt b/packages/synaptic/synaptic-install.txt deleted file mode 100644 index cc7cca9..0000000 --- a/packages/synaptic/synaptic-install.txt +++ /dev/null @@ -1,15 +0,0 @@ -//application path -* Программа управления пакетами Synaptic -+ -Программа управления пакетами Synaptic находится в -*Меню запуска приложений -> Настройки -> Управление пакетами -> Менеджер пакетов (Synaptic)*. -Для облегчения поиска доступные для установки программы разделены на группы, -выводимые в левой части окна программы. Справа расположен список самих программ -с указанием их текущего состояния: - -** зелёная метка — пакет уже установлен; -** белая — пакет не установлен. -+ -Для начала установки двойным щелчком мыши отметьте неустановленный пакет в -правой половине окна и нажмите *Применить*. При необходимости, менеджер пакетов -попросит вставить установочный диск. diff --git a/publican.cfg b/publican.cfg new file mode 100644 index 0000000..6f7774c --- /dev/null +++ b/publican.cfg @@ -0,0 +1,15 @@ +# Config::Simple 4.59 +# Tue Feb 18 13:31:38 2014 + +xml_lang: "ru-RU" +type: Book +brand: common +toc_section_depth: 1 + +# can be moved to brand package +prod_url: "http://www.altlinux.ru/products/7th-platform/" +doc_url: "http://docs.altlinux.org/" + +mainfile: docs +product: "ALT Linux branch master" +docname: Documentation diff --git a/rescue/index.txt b/rescue/index.txt deleted file mode 100644 index 5559689..0000000 --- a/rescue/index.txt +++ /dev/null @@ -1,89 +0,0 @@ -== Первая помощь == - -[IMPORTANT] -В случае возникновения каких-либо неприятностей не паникуйте, а спокойно -разберитесь в сложившейся ситуации. Linux не так уж просто довести до полной -неработоспособности и утраты ценных данных. Поспешные действия -отчаявшегося пользователя могут привести к плачевным результатам. Помните, что -решение есть и оно обязательно найдётся! - -=== Проблемы при установке системы === - -Если в системе не произошла настройка какого-либо компонента после стадии -установки пакетов, не отчаивайтесь, доведите установку до конца, загрузитесь в -систему и попытайтесь в спокойной обстановке повторить настройку. - -В случае возникновения проблем с установкой, вы можете вручную задать необходимые -параметры в строке *Параметры загрузки* меню начального загрузчика: - -* xdriver -- графический установщик предпринимает попытку автоматического - подбора драйвера видеокарты, но иногда это ему не удаётся. Данным параметром - можно отключить «искусственный интеллект» и явно указать нужный вариант - драйвера; -* instdebug -- если будет присутствовать этот параметр, то перед запуском и - после завершения работы графического установщика будет запущена оболочка - shell. Это очень полезное средство для выявления причин отсутствия запуска графической - части программы установки. Последовательность работы внутренних - сценариев следующая: install2 -> xinit -> alterator-install2 -> - alterator-wizard. При необходимости можно вручную загрузить Xorg (команда - `xinit`) и в открывшемся окне терминала запустить `alterator-install2` (или - `alterator-wizard`) вручную. - -Если вы вообще не смогли установить систему (не произошла или не завершилась -стадия установки пакетов), то сначала попробуйте повторить попытку в режиме -*Установка в безопасном режиме*. Возможно, у вас какое-то новое или -нестандартное оборудование, но может оказаться, что оно отлично настраивается -со старыми драйверами. В любом случае, вы всегда можете сообщить о своих -проблемах нам: - -* в списки рассылки (http://lists.altlinux.org/); - -* в службу технической поддержки (http://www.altlinux.ru/support); - -* на форум (http://forum.altlinux.org/) - -Если вы хотите получить точный ответ, то -сообщите, пожалуйста, подробный состав вашего оборудования и подробное описание -возникшей проблемы. - -=== Проблемы с загрузкой системы === - -Если не загружается ни одна из установленных операционных систем, то значит есть -проблема в начальном загрузчике. Такие проблемы могут возникнуть после -установки системы, в случае если загрузчик все-таки не установлен или установлен с ошибкой. При -установке или переустановке Windows на вашем компьютере загрузчик Linux будет -перезаписан в принудительном порядке, и станет невозможно запускать Linux. - -Повреждение или перезапись загрузчика никак не затрагивает остальные данные на -жёстком диске, поэтому в такой ситуации очень легко вернуть работоспособность: -для этого достаточно восстановить загрузчик. - -Если у вас исчез загрузчик другой операционной системы или другого -производителя, то внимательно почитайте соответствующее официальное руководство -на предмет его восстановления. Но в большинстве случаев вам это не потребуется, -так как загрузчик, входящий в состав ALT Linux, поддерживает загрузку -большинства известных операционных систем. - -Для восстановления загрузчика достаточно любым доступным способом загрузить -Linux и получить доступ к тому жёсткому диску, на котором находится -повреждённый загрузчик. Для этого проще всего воспользоваться -_восстановительным режимом_, который предусмотрен на установочном диске -дистрибутива (пункт *Восстановление системы*). - -Загрузка восстановительного режима заканчивается приглашением командной строки: -`[root@localhost /]#`. Начиная с этого момента система готова к вводу команд. - -В большинстве случаев для восстановления загрузчика можно просто воспользоваться -командой - ------- -fixmbr ------- - -без параметров. Программа попытается переустановить загрузчик в автоматическом -режиме. - -=== Полезные ссылки === - -Если у вас что-то не получается, вы всегда можете поискать решение на ресурсах -указанных в разделе <>. diff --git a/ru-RU/Author_Group.xml b/ru-RU/Author_Group.xml new file mode 100644 index 0000000..9608d84 --- /dev/null +++ b/ru-RU/Author_Group.xml @@ -0,0 +1,17 @@ + + +%BOOK_ENTITIES; +]> + + + Enter your first name here. + Enter your surname here. + + Enter your organisation's name here. + Enter your organisational division here. + + Enter your email address here. + + + diff --git a/ru-RU/Book_Info.xml b/ru-RU/Book_Info.xml new file mode 100644 index 0000000..e094d7b --- /dev/null +++ b/ru-RU/Book_Info.xml @@ -0,0 +1,47 @@ + + +%BOOK_ENTITIES; +]> + + + Документация + + ALT Linux &DISTRO; + 7.0 + апрель, 2014 + + + + Добро пожаловать в документацию дистрибутива &DISTRO;. Данное + руководство предназначено как для начинающих, так и для опытных + пользователей. Руководство описывает подготовку системы для + установки, процесс установки дистрибутива, а также процедуру + настройки и использования системы. + Названия компаниий и продуктов, встречающихся в руководстве, могут + являться торговыми знаками соответствующих компаниий. + Данное руководство соответствует текущему состоянию сведений, но + какие-либо окончательные правки могли не попасть в него. В случае + обнаружения ошибок и неточностей в руководство вносятся изменения. + Актуальная версия руководства в формате HTML со всеми текущими + изменениями и дополнениями размещена на сайте с документацией + компании ALT Linux . + + + + + + + diff --git a/ru-RU/Preface.xml b/ru-RU/Preface.xml new file mode 100644 index 0000000..6ee26f5 --- /dev/null +++ b/ru-RU/Preface.xml @@ -0,0 +1,13 @@ + + +%BOOK_ENTITIES; +]> + + Preface + + + + + + diff --git a/ru-RU/Revision_History.xml b/ru-RU/Revision_History.xml new file mode 100644 index 0000000..ce540b3 --- /dev/null +++ b/ru-RU/Revision_History.xml @@ -0,0 +1,27 @@ + + +%BOOK_ENTITIES; +]> + + История переиздания + + + + 0.0-0 + Tue Feb 18 2014 + + Alt + Docs Team + Enter your email address here. + + + + Initial creation by publican + + + + + + + diff --git a/ru-RU/admin-basics/driver-saga--chapter.xml b/ru-RU/admin-basics/driver-saga--chapter.xml new file mode 100644 index 0000000..1e71153 --- /dev/null +++ b/ru-RU/admin-basics/driver-saga--chapter.xml @@ -0,0 +1,363 @@ + + + + +Работа с оборудованием в Linux. «Сага о Драйверах» + + Когда компьютеры назывались «электронно-вычислительными машинами», они + были размерами в среднем с кухонный гарнитур и занимались почти исключительно + вычислениями. Ввод и вывод данных воспринимался пользователями + ЭВМ — учёными-математиками — как нечто необходимое, но к + работе ЭВМ имеющее лишь косвенное отношение. Учёного было + довольно просто обучить, чтобы он составлял программы и оформлял входные данные + для расчётов одним каким-нибудь способом, например, при помощи перфокарт. + Подключение к компьютеру какого-нибудь другого устройства было делом + трудоёмким, так как требовало усилий и электронщика, и программиста. Да и нужно + это было нечасто. + + Нынешний компьютер — игрушка не учёного, а любого рядового обывателя. Это бытовой прибор. + Мало того, компьютер — это «самый умный» бытовой прибор: если имеется какой-нибудь другой + бытовой прибор (скажем, кофеварка), прогрессивный обыватель тут же задумывается, нельзя ли + обучить компьютер управлять этим прибором (скажем, варить кофе за минуту до приезда хозяина). В + идеале получается «электронный дом», в котором работу любого оборудования можно контролировать, + не вставая из-за рабочего места или даже не садясь за него, — посредством сети Интернет. + + Самое поверхностное суждение об оборудовании и компьютере — что для подключения прибора + нужна волшебная субстанция по имени «драйвер». Есть драйвер — компьютер оборудование «видит», + нет драйвера — «не видит». + + Это суждение во многом неверно. + +

Что такое «оборудование»? + + Что и как можно подключить к компьютеру? Во-первых, на поверхности его корпуса обычно + наблюдается множество разнообразных отверстий и разъёмов, очевидно, предназначенных для + того, чтобы туда что-то подключали. Уже подключены: клавиатура, мышь, монитор, возможно, + принтер, наушники или колонки. Много отверстий остаётся неиспользованными, но и аппаратуры + в «электронном доме» ещё много — от КПК до той же кофеварки (если на ней есть + соответствующий разъём). + + Во-вторых, внутри компьютера имеются специальные разъёмы для подключения + к ним плат расширения: устройств, выглядящих + не как бытовой прибор, а скорее как деталь самого компьютера. Таковы + видеоадаптеры, сетевые адаптеры, «внутренние» модемы и т. п. Эти устройства — + главный источник «Саги о Драйверах», потому что их много, и создатели каждого + такого устройства желают сохранить его устройство втайне от конкурентов, + прилагая к ним вместо документации ту самую волшебную субстанцию с пометкой + «нажмите кнопку «Пуск» и попытайтесь расслабиться: от вас уже ничего не + зависит». + + В-третьих, ещё глубже внутри компьютера есть какие-то устройства, которые нельзя ни + отключить, ни подключить, однако они используются при работе, имеют какое-то название и на + разных компьютерах могут весьма отличаться. Например, звуковые подсистемы могут быть + интегрированными, а могут быть выполненными в виде платы расширения, отличаясь редкостным + разнообразием моделей и однообразием функций (разъём для микрофона, разъём(ы) для колонок, + линейный вход, … что-то ещё?). Или устройство, к которому подключаются жёсткие диски: оно + может быть рассчитано на 1 диск, 2, 4, иногда — более, иметь разные дополнительные свойства + и тоже требовать «драйвера» — по крайней мере, поддержки со стороны системы. + + Что точно отличает один прибор от другого — это внешний вид разъёма, с + помощью которого они подключаются к компьютеру. Очевидно, приборами, + подключёнными к разъёмам разного типа, машина управляет существенно по-разному. + Более того, разъёмы настолько различны, что соединительный кабель одного типа + просто не влезет в разъём другого. Но всё равно это не решает проблемы + идентификации: например, мышь, подключённая к разъёму (порту) + USB, отлично работает, а с цифровой фотокамерой как-то + спроста не получается. Опять «драйвер» нужен? + + Можно добавить, что некоторое оборудование вообще не нуждается в том, чтобы машине + объявляли о его существовании: так, что бы ни подключалось к аналоговому звуковому входу, + работать оно будет одинаково, компьютер не отличит колонки от наушников, да и отсутствия их + не заметит. Словом, наружное наблюдение не даёт достаточно информации о том, как работать с + оборудованием. На помощь должна прийти документация, но если в ней опять встретится слово + «драйвер», оно может означать что угодно: слишком оно неопределённое. + +
+ + +
Как распознаётся оборудование? + + Попробуем внести определённость. Какую информацию относительно подключаемого прибора + получает компьютер, и как он её получает? + + Очевидно, «с той стороны» каждого разъёма (допустим, + USB, в который мы воткнули flash-диск) имеется какое-то + оборудование, которое позволяет им пользоваться (как и USB-мышкой, USB- + принтером и т.п.). Это оборудование: + + + определяет тип подключённого устройства; + + + управляет им (может, например, выключить или включить); + + + передаёт на это устройство данные и/или принимает их оттуда. + + + + + Такое оборудование называется шиной + (bus). Этимология этого слова, что русского, что английского, загадочна и + восходит к доисторическим временам, когда компьютеры назывались + «ЭВМ». + + Шин в компьютере несколько (по количеству различных типов разъёмов). Есть совсем + «глупые» шины — например, порт последовательного ввода-вывода (к нему подключаются мыши и + прочая аппаратура «старого образца»). Глупость их в том, что информацию о типе + подключённого оборудования приходится задавать вручную: либо заранее, либо с помощью + наводящих вопросов пользователю. + + Есть шины весьма «умные», способные опросить и понять множество + характеристик подключённого устройства. Такова, например, шина + PCI — наиболее распространённое на сегодня оборудование для + подключения плат расширения. Любопытный пользователь может посмотреть список + устройств, подключённых к шине PCI с помощью команды + lspci (от «list PCI», команда из пакета + pciutils): + [tmpuser@arnor tmpuser]$ lspci +0000:00:00.0 Host bridge: VIA Technologies, Inc. VT8377 [KT400/KT600 AGP] Host Bridge (rev 80) +0000:00:01.0 PCI bridge: VIA Technologies, Inc. VT8237 PCI Bridge +0000:00:0f.0 RAID bus controller: VIA Technologies, Inc. VIA VT6420 SATA RAID Controller (rev 80) +0000:00:0f.1 IDE interface: VIA Technologies, Inc. VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE (rev 06) +0000:00:10.0 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 81) +0000:00:10.1 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 81) +0000:00:10.2 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 81) +0000:00:10.3 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 81) +0000:00:10.4 USB Controller: VIA Technologies, Inc. USB 2.0 (rev 86) +0000:00:11.0 ISA bridge: VIA Technologies, Inc. VT8237 ISA bridge [KT600/K8T800/K8T890 South] +0000:00:11.5 Multimedia audio controller: VIA Technologies, Inc. VT8233/A/8235/8237 AC97 Audio Controller (rev 60) +0000:00:12.0 Ethernet controller: VIA Technologies, Inc. VT6102 [Rhine-II] (rev 78) +0000:01:00.0 VGA compatible controller: ATI Technologies Inc Radeon R100 QD [Radeon 7200] + + + Из устройств на иллюстрации только одно — видеокарта Radeon 72002 — в + действительности является платой расширения, все остальные интегрированы в + системную плату (бывает и по- другому). Тип устройства — «Multimedia audio + controller», «Ethernet controller», «VGA compatible controller» и т.п. — лишь + небольшая часть информации, которую шине рассказали о себе подключённые к ней + устройства. + + + К шине PCI в качестве устройства подключена другая + шина — USB, служащая для подсоединения внешних устройств. + Она тоже довольно «умная», а ещё отличается тем, что устройства подключаются к + ней и отключаются от неё довольно часто. Существует команда + lsusb (из пакета, естественно, usbutils), + но ею, как и lspci, приходится пользоваться нечасто (она + даже убрана в каталог /usr/sbin): + [tmpuser@arnor tmpuser]$ /usr/sbin/lsusb +Bus 005 Device 001: ID 0000:0000 +Bus 004 Device 001: ID 0000:0000 +Bus 003 Device 001: ID 0000:0000 +Bus 002 Device 002: ID 046d:c00c Logitech, Inc. Optical Wheel Mouse +Bus 002 Device 001: ID 0000:0000 +Bus 001 Device 003: ID 08ec:0012 M-Systems Flash Disk Pioneers +Bus 001 Device 001: ID 0000:0000 + + + + Пример показывает пять USB-шин (это совпадает с данными + lspci), к первой из которых подключён flash-диск, а ко + второй — мышь. Как правило, устройство определяется шиной, после чего + специально обученная системная программа производит все действия, необходимые + для того, чтобы этим устройством можно было воспользоваться. Например, для + flash-диска потребовалось дополнительно загрузить модуль ядра + usb_storage, и смонтировать содержимое диска в каталог + /media/usbdisk. + + Специальный каталог /sys отражает + представление системы о присоединённых к ней устройствах. В частности, все + найденные на шинах устройства перечислены в виде подкаталогов /sys/bus/шина/devices. + Если устройство установлено, а «умная шина», наподобие PCI + или USB, его не заметила — скорее всего, неполадка + аппаратная (несовместимое или неисправное устройство, таракан в разъёме и + т.п.). + + Бывает и так: устройство (видеокарта, модем, кофеварка) на шине появилось, а + воспользоваться им не удаётся. Видимо, чего-то не хватает… драйвера? + +
+ + +
Что такое «драйвер» и где он находится? + + В самом деле, чего может не хватать, если устройство распозналось, марка + устройства известна и как передавать данные по шине — тоже известно? Не хватает + главного: сведений о том, какие данные надо передавать, чтобы добиться от + устройства желаемого эффекта. Что передать по шине USB, + чтобы кофеварка выключилась? Какие байты записать в последовательный порт + модема, чтобы он повесил трубку? Что сделать с видеокартой, чтобы всё было + быстро и непременно 3d!? + + Это вот «какие данные» — и есть «драйвер». Драйвер может быть где угодно, на любом + уровне системы: от модуля ядра до пользовательской программы и даже её конфигурационного + файла. + + Типичные варианты: + + + + Драйвер — модуль ядра , + подсказывающий шине, как правильно обращаться с устройством. Это, как правило, + относится к PCI-устройствам и стандартным USB-устройствам. Подключается к ядру + командой modprobe + (или + insmod). Распознанные и классифицированные устройства (те, + для которых есть драйвер- модуль ядра) отображаются в виде подкаталогов + /sys/class/класс_устройства/ + . + + + + Драйвер видеокарты — модуль графической подсистемы + X11 (X.Org). Подгружается + при старте графической оболочки, достаточно лишь указать его в настройках + X.Org (с помощью конфигуратора или вручную в файле + /etc/X11/xorg.conf). Часто требуется и специальный модуль + ядра (возможно, несколько), организующий доступ к видеопамяти. + + + + Драйверы принтера и модема — описание характеристик для, соответственно, подсистемы + печати и программы-«звонилки». Что с ними делать дальше, расскажет документация. + + + + Драйвер — прикладная программа или дополнение (plug-in) к ней (например, + драйвер сканера — дополнение утилиты sane, а с некоторыми + цифровыми проигрывателями звука «iRiver» можно + взаимодействовать с помощью утилиты ifp из пакета + ifp-line). Здесь главное — название программы, а драйвер, скорее + всего, уже включён в дистрибутив. + + + + + В последнем случае нет никакой зримой информации о том, что устройством действительно + можно пользоваться — до тех пор, пока не запущена соответствующая прикладная программа с + соответствующими настройками (особенно это касается «глупых» шин, наподобие + последовательного порта). И в любом случае, самостоятельная установка «драйвера» должна + сопровождаться вдумчивым чтением документации к нему. + +
+ + +
Опять «устройство»? + + В документации Linux термин «устройство» (device) часто используется не в + значении «прибор», а в значении «элемент каталога + /dev». Что это такое? + + Прибор подключается к машине, как правило, для того чтобы передавать на него какие-то + данные и/или получать их оттуда. Если задача компьютера — управлять внешним устройством, + это всё равно можно рассматривать как передачу управляющих данных и приём диагностических. + Во многих случаях передачу данных проще всего вести в синхронном (поточном) режиме, точно + так же, как это делается при работе с файлом: открыть файл — записать данные — закрыть файл + или открыть — прочитать — закрыть. Если бы можно было представить внутренность прибора в + виде файла, работа с ним пошла бы легче. Это означало бы, что система знает, как и куда + передавать данные, а дело пользовательской программы — эти данные понимать. + + В большинстве случаев именно так и устроено в Linux. После того, как + система распознала внешнее устройство, а служба hotplug, при необходимости, + загрузила соответствующий модуль ядра, в каталоге /dev заводится новый «файл», содержимое которого + отражает содержимое подключённого устройства, не занимая при этом места на + жёстком диске. Такой файл называется файлом-дыркой, его можно представить как + отверстие в файловой системе, через которое видно не содержимое жёсткого диска, + а данные, попадающие туда с «другой стороны» — со стороны подключённого + внешнего устройства. Например, гибкий диск в дисководе представляется в виде + файла-дырки /dev/fd0, (от floppy disk + 0), а мышь — в виде /dev/mouse (строго + говоря /dev/mouse — это обычно + символьная ссылка на актуальный файл- дырку — скажем /dev/psaux, порт PS/2). + + В документации вместо «файл-дырка» чаще всего пишут просто «устройство» (device), а + устройство-прибор — «внешним устройством». Если соответствующего устройства в каталоге + /dev/ нет, значит, в цепочке его распознавания есть слабое звено. + + Стоит напомнить, что файл-дырка, однако, не обязан существовать и + непременно соответствовать одному внешнему устройству. Устройства, подключаемые + ко второму последовательному порту, например, всегда видны как /dev/ttyS1 (а к первому — как ttyS0). Фактически, ttyS — это файл-дырка шины, настолько простой, что + дальнейшее выяснение типа устройства перекладывается на программу + пользователя. + + Другой пример — это работа с аппаратурой по шине USB. + USB-шин в системе зарегистрировано несколько, и к каждому можно подключить одно + или несколько устройств. Для них, независимо от типа устройства, заводятся + файлы-дырки вида usbdev.шина.номер, где каждому новому подключённому устройству + просто выдаётся очередной номер. Некоторые звуковые проигрыватели и цифровые + фотокамеры распознаются как flash-диски; тогда в дополнение к нетипизированному + файлу-дырке создаётся одна или даже несколько дисковых (допустим, само дисковое + устройство /dev/sda и единственный раздел с файловой системой на нём /dev/sda1, который и монтируется в /media/usbdisk). Другие фотокамеры умеют больше, + чем обычный диск: например, транслировать изображение и/или звук. И для них + существуют специальные утилиты, например, gphoto2. В этом случае никакого + дополнительного файла-дырки, за исключением + /dev/usbdev.шина.номер + , не создаётся, и о типе подключённого аппарата догадывается сама + gphoto2. + +
+ + +
Кто виноват и что делать? + + Итак, новый подключённый к компьютеру прибор не распознался «сам собой», и программы, + которые должны были с ним работать, не работают. + + Неполадки могут быть аппаратными (проверяется в /sys/bus или с помощью lspci, + как сказано выше). + + Hotplug или другая программа автораспознавания может не знать про + конкретный подключённый прибор (придётся в режиме суперпользователя вручную + загрузить модуль с помощью modprobe, а чтобы не делать этого + каждый раз —  отредактировать /etc/modules.conf). + + Возможно, внешнее устройство распозналось и модуль для него есть, но + служба udevd, которая заводит файлы-дырки в + /dev, выбрала другое название или вовсе + не завела нужного устройства (надо проанализировать содержимое /dev и, возможно, настроить + udev или саму прикладную программу). + + Ваше устройство может быть слишком новым, а дистрибутив Linux может оказаться слишком + старым. В этом случае рекомендуется обновить части системы, содержащие «драйвер» (в + зависимости от ситуации — модуль ядра, само ядро, графическую оболочку или её библиотеку, + прикладную программу и т.п.). + + Стоит проверить, что сказано о вашем устройстве в сетевых информационных + ресурсах (здесь поможет lspci или подобные ей утилиты, а + также ). Вполне вероятно, там посоветуют + загрузить некий заранее собранный модуль ядра (назовут его, конечно, + «драйвером») либо подскажут, какую именно программу следует + использовать. + + Наконец, ваше устройство может просто не поддерживаться. Печально, но факт: некоторые + производители аппаратуры настолько дорожат своими мелкими секретами, что не только не + документируют устройство своих устройств, но тщательно скрывают его. Как следствие, Linux- + сообщество не в состоянии быстро обеспечить поддержку таинственного прибора. Производители + предпочитают писать «драйверы» (хорошие ли, плохие) за свои деньги, а некоторые + ограничиваются только одной, самой распространённой на сегодня, пользовательской + программной платформой. И это пока, к сожалению, не Linux. + + Сказанное выше означает, что после каждого обновления системы устройство, ранее + распознававшееся с трудом или вовсе не распознававшееся, может преспокойно заработать, + особенно если это устройство относительно новое. Кроме того, стоит со всем вниманием + относиться к ситуации, когда производитель прибора не просто анонсирует совместимость с + Linux, а предлагает «драйверы» собственного изготовления. И последнее: если вы не в силах + справиться с «драйвером» в одиночку, обращайтесь к Linux-сообществу! Вы или получите + решение задачи, или в очередной раз подтвердите, что её стоит решать — и тем самым + приблизите решение. + +
+ \ No newline at end of file diff --git a/ru-RU/admin-basics/index.xml b/ru-RU/admin-basics/index.xml new file mode 100644 index 0000000..770af0f --- /dev/null +++ b/ru-RU/admin-basics/index.xml @@ -0,0 +1,11 @@ + + + +Основы администрирования Linux + + + + + + \ No newline at end of file diff --git a/ru-RU/admin-basics/os-principles--chapter.xml b/ru-RU/admin-basics/os-principles--chapter.xml new file mode 100644 index 0000000..b39cd5d --- /dev/null +++ b/ru-RU/admin-basics/os-principles--chapter.xml @@ -0,0 +1,810 @@ + + + +Общие принципы работы <acronym>ОС</acronym> + +
Процессы и файлы + + ОС &DISTRO; является многопользовательской + интегрированной системой. Это значит, что она разработана в расчете на + одновременную работу нескольких пользователей. + + Пользователь может либо сам работать в системе, выполняя некоторую последовательность + команд, либо от его имени могут выполняться прикладные процессы. + + Пользователь взаимодействует с системой через командный интерпретатор, + который представляет собой, как было сказано выше, прикладную программу, + которая принимает от пользователя команды или набор команд и транслирует их в + системные вызовы к ядру системы. Интерпретатор позволяет пользователю + просматривать файлы, передвигаться по дереву файловой системы, запускать + прикладные процессы. Все командные интерпретаторы UNIX имеют + развитый командный язык и позволяют писать достаточно сложные программы, + упрощающие процесс администрирования системы и работы с ней. + +
Процессы функционирования <acronym>ОС</acronym> + + Все программы, которые выполняются в текущий момент времени, называются + процессами. Процессы можно разделить на два основных класса: системные процессы и + пользовательские процессы. + + Системные процессы — программы, решающие внутренние задачи + ОС, например, организацию виртуальной памяти на диске или + предоставляющие пользователям те или иные сервисы (процессы-службы). + + Пользовательские процессы — процессы, запускаемые пользователем из + командного интерпретатора для решения задач пользователя или управления + системными процессами. Linux изначально разрабатывался как многозадачная + система. Он использует технологии, опробованные и отработанные другими + реализациями UNIX, которые существовали ранее. + + Фоновый режим работы процесса — режим, когда программа может работать без + взаимодействия с пользователем. В случае необходимости интерактивной работы с + пользователем (в общем случае) процесс будет «остановлен» ядром и работа его + продолжается только после переведения его в «нормальный» режим работы. + +
+ + +
Файловая система <acronym>ОС</acronym> + + В ОС использована файловая система Linux, которая, в + отличие от файловых систем DOS и + Windows(™), является единым деревом. Корень этого + дерева — каталог, называемый root (рут) и обозначаемый /. Части дерева файловой системы могут физически + располагаться в разных разделах разных дисков или вообще на других компьютерах + — для пользователя это прозрачно. Процесс присоединения файловой системы + раздела к дереву называется монтированием, удаление — размонтированием. + Например, файловая система CD-ROM в изделии монтируется по умолчанию в каталог + /media/cdrom (путь в изделии + обозначается с использованием /, а не + \, как в DOS/Windows). Текущий каталог + обозначается ./. + + Файловая система изделия содержит каталоги первого уровня: + + + + /bin — командные оболочки (shell), + основные утилиты; + + + + /boot — содержит ядро системы; + + + + /dev — псевдофайлы устройств, + позволяющие работать с ними напрямую; + + + + /etc — файлы конфигурации; + + + + /home — личные каталоги + пользователей; + + + + /lib — системные библиотеки, + модули ядра; + + + + /media — каталоги для монтирования + файловых систем сменных устройств; + + + + /mnt  — каталоги для монтирования + файловых систем сменных устройств и внешних файловых систем; + + + + /proc — файловая система на + виртуальном устройстве, её файлы содержат информацию о текущем состоянии + системы; + + + + /root — личный каталог + администратора системы; + + + + /sbin — системные утилиты; + + + + /sys — файловая система, + содержащая информациюо текущем состоянии системы; + + + + /usr — программы и библиотеки, + доступные пользователю; + + + + /var — рабочие файлы программ, + очереди, журналы; + + + + /tmp — временные файлы. + + + + +
+ + +
Организация файловой структуры + + Система домашних каталогов пользователей помогает организовывать безопасную работу + пользователей в многопользовательской системе. Вне своего домашнего каталога + пользователь обладает минимальными правами (обычно чтение и выполнение файлов) и не + может нанести ущерб системе, например, удалив или изменив файл. + + Кроме файлов, созданных пользователем, в его домашнем каталоге обычно содержатся + персональные конфигурационные файлы некоторых программ. + + Маршрут (путь) — это последовательность имён каталогов, представляющая собой путь + в файловой системе к данному файлу, где каждое следующее имя отделяется от предыдущего + наклонной чертой (слешем). Если название маршрута начинается со слеша, то путь в + искомый файл начинается от корневого каталога всего дерева системы. В обратном случае, + если название маршрута начинается непосредственно с имени файла, то путь к искомому + файлу должен начаться от текущего каталога (рабочего каталога). + + Имя файла может содержать любые символы за исключением косой черты + (/). Однако следует избегать применения в + именах файлов большинства знаков препинания и непечатаемых символов. При выборе + имен файлов рекомендуем ограничиться следующими символам: + + + строчные и ПРОПИСНЫЕ буквы. Следует обратить внимание на то, что + регистр всегда имеет значение; + + + символ подчеркивания (_); + + + точка (.). + + + + + Для удобства работы точку можно использовать для отделения имени файла от + расширения файла. Данная возможность может быть необходима пользователям или некоторым + программам, но не имеет значение для shell. + +
+ + +
Иерархическая организация файловой системы + + Каталог /: + + + + /boot — место, где хранятся файлы, + необходимые для загрузки ядра системы; + + + + /lib — место, где располагаются + файлы динамических библиотек, необходимых для работы большей части приложений, + и подгружаемые модули ядра; + + + + /bin — минимальный набор программ, + необходимых для работы в системе; + + + + /sbin — набор программ для + административной работы с системой (программы, необходимые только + суперпользователю); + + + + /home — место, где располагаются + домашние каталоги пользователей; + + + + /etc — в данном каталоге обычно + хранятся общесистемные конфигурационные файлы для большинства программ в + системе; + + + + + /etc/rc?.d, + /etc/init.d, + /etc/rc.boot, + /etc/rc.d — директории, где + расположены командные файлы, выполняемые при запуске системы или при смене её + режима работы; + + + + /etc/passwd — база данных пользователей, в которой + содержится информация об имени пользователя, его настоящем имени, личном + каталоге, его зашифрованный пароль и другие данные; + + + + /etc/shadow — теневая база данных пользователей. При + этом информация из файла /etc/passwd перемещается в + /etc/shadow, который недоступен для чтения всем, кроме + пользователя root. В случае использования альтернативной схемы управления + теневыми паролями (TCB), все теневые пароли для каждого + пользователя располагаются в директории /etc/tcb/имя + пользователя/shadow; + + + + /dev — в этом каталоге находятся + файлы устройств. Файлы в /dev создаются + сервисом udev; + + + + /usr — обычно файловая система + /usr достаточно большая по объему, так + как все программы установлены именно здесь. Вся информация в каталоге /usr помещается туда во время установки системы. + Отдельно устанавливаемые пакеты программ и другие файлы размещаются в + каталоге. + + + + /tmp — временный каталог, + необходимый некоторым приложениям. + + + + /proc — файловая система /proc является виртуальной, и в действительности + она не существует на диске. Ядро создает её в памяти компьютера. Система + /proc предоставляет информацию о + системе. + + + + + + + Некоторые подкаталоги системы /usr рассмотрены ниже: + + + + /usr/bin — практически все + команды, хотя некоторые находятся в /bin + или в /usr/local/bin; + + + + /usr/sbin — команды, используемые + при администрировании системы и не предназначенные для размещения в файловой + системе root; + + + + /usr/local — место, где + рекомендуется размещать файлы, установленные без использования пакетных + менеджеров, внутренняя организация каталогов практически такая же, как и + корневого каталога; + + + + /usr/man — каталог, где хранятся + файлы справочного руководства man; + + + + /usr/share — каталог для + размещения общедоступных файлов большей части приложений. + + + + + + + Каталог /var: + + + + /var/log — место, где хранятся + файлы аудита работы системы и приложений; + + + + + /var/spool — каталог для хранения + файлов, находящихся в очереди на обработку для того или иного процесса (очередь + на печать, отправку почты и т.д.). + + + + +
+ + +
Имена дисков и разделов + + Все физические устройства вашего компьютера отображаются в каталог + /dev файловой системы изделия (об этом — + ниже). Диски (в том числе + IDE/SATA/SCSI жёсткие + диски, USB-диски) имеют имена: + + + /dev/sda — первый диск; + + + /dev/sdb — второй диск; + + + и т.д. + + + + + + + Диски обозначаются /dev/sdX, где + X — a, b, c, d, e, … в зависимости от порядкового + номера диска на шине. + + Раздел диска обозначается числом после его имени. Например, /dev/sdb4 — четвертый раздел второго + диска. + +
+ + +
Разделы, необходимые для работы <acronym>ОС</acronym> + + Для работы ОС необходимо создать на жестком диске + (дисках) по крайней мере два раздела: корневой (то есть тот, который будет + содержать каталог /) и раздел подкачки + (swap). Размер последнего, как правило, составляет от однократной до двукратной + величины оперативной памяти компьютера. Если у вас много свободного места на + диске, то можно создать отдельные разделы для каталогов + /usr, + /home, + /var. + +
+ + +
Утилиты для работы с файловой системой + + mkfs — создание файловой системы. В действительности + это программа-оболочка, вызывающая для каждого конкретного типа файловых систем + свою программу. Например, для файловой системы ext4 будет вызвана mkfs.ext4. + + fsck — используется для проверки и восстановления, + если это возможно, целостности файловых систем. + + df — формирует отчет о доступном и использованном + дисковом пространстве на файловых системах. Без аргументов, df выдает отчет по + доступному и использованному пространству для всех файловых систем (всех + типов), которые смонтированы в данный момент. В противном случае, + df на каждый файл, заданный как аргумент, выдается отчет по + файловой системе, которая его содержит. + + du — формирует отчет об использовании дискового + пространства заданными файлами, а также каждым каталогом иерархии подкаталогов + каждого указанного каталога. Здесь под использованным дисковым пространством + понимается пространство, используемое для всей иерархии подкаталогов указанного + каталога. Запущенная без аргументов, команда du выдает отчет + о дисковом пространстве для текущего каталога. + + Часто используемые утилиты: + + + + mount — монтирование файловых систем; + + + + umount — размонтирование файловых систем; + + + + find — поиск файлов в директориях; + + + + which — поиск файла, который будет запущен при + выполнении данной команды; + + + + cd — смена текущего каталога/директории; + + + + pwd — показ текущего каталога/директории; + + + + mkdir — создание каталога; + + + + ls — выдача информации о файлах или каталогах; + + + + cp — копирование файлов; + + + + mv — перемещение/переименование файлов; + + + + cat — вывод содержимого заданных файлов на стандартный + вывод; + + + + more — программа постраничного просмотра + файлов; + + + + ln — создание ссылок (альтернативных имен) для + файлов; + + + + file — определение типа файла; + + + + chmod — изменение прав доступа к файлам; + + + + chown — смена прав владения (пользовательских и + групповых) для файлов; + + + + umask — установка маски прав доступа для вновь + создаваемых файлов; + + + + chattr — изменение атрибутов файлов; + + + + lsattr — просмотр атрибутов файлов. + + + + + +
+ +
+ + +
Работа с наиболее часто используемыми компонентами + +
Командные оболочки (интерпретаторы) + + Как было сказано выше, для управления ОС используется + командные интерпретаторы (shell). + + Зайдя в систему, Вы увидите приглашение — строку, содержащую символ + «$» (далее этот символ будет обозначать + командную строку). Программа ожидает ваших команд. Роль командного + интерпретатора — передавать ваши команды операционной системе. По своим + функциям он соответствует command.com в + DOS, но несравненно мощнее. При помощи командных + интерпретаторов можно писать небольшие программы — сценарии (скрипты). В Linux + доступны следующие командные оболочки: + + + bash — самая распространенная оболочка под linux. Она + ведет историю команд и предоставляет возможность их редактирования; + + + pdksh — клон korn shell, хорошо известной оболочки в + UNIX™ системах. + + + + + Оболочкой по умолчанию является «Bash» (Bourne Again + Shell). Чтобы проверить, какая оболочка используется в данный момент выполните + команду: + + echo $SHELL + + У каждой оболочки свой синтаксис. Мы рекомендуем Вам использовать Bash. В + дальнейшем мы будем строить свои примеры с использованием этой оболочки. + +
+ + +
Командная оболочка Bash + + В bash имеется несколько приемов для работы со строкой + команд. Например, используя клавиатуру, вы можете: + + + + + Ctrl + A +  — перейти на начало строки; + + + + + Ctrl + U +  — удалить текущую строку; + + + + + Ctrl + C +  — остановить текущую задачу. + + + + + + Вы можете использовать «;» для того, + чтобы ввести несколько команд одной строкой. Клавиши Стрелка + вверx и Стрелка вниз, позволяют вам перемещаться по + истории команд. Для того чтобы найти конкретную команду в списке набранных, не + пролистывая всю историю, наберите + + Ctrl + R + . + + + Команды, присутствующие в истории, отображаются в списке пронумерованными. Для + того чтобы запустить конкретную команду наберите: + ! номер команды + + + Если вы введете: + !! + запустится последняя из набранных команд. + + Иногда имена программ и команд слишком длинны. К счастью, Bash сам может + завершать имена. + + Нажав клавишу Tab, вы можете завершить имя команды, + программы или каталога. Например, предположим, что вы хотите использовать + программу декомпрессии bunzip2. Для этого наберите: + bu + затем нажмите Tab. Если ничего не происходит, то, вероятно, + существует несколько возможных вариантов завершения команды. + + Нажав клавишу Tab еще раз, вы получите список имён, + начинающихся с «bu». + + Например, у вас есть: + $ bu +buildhash builtin bunzip2 + + + Наберите: n (bunzip —  это единственное + имя, третьей буквой которого является «n»), а + затем нажмите клавишу табуляции. Оболочка дополнит имя, и вам остается лишь + нажать Enter, чтобы запустить команду. + + Заметим, что программу, вызываемую из командной строки, Bash ищет в каталогах, + определяемых в системной переменной PATH. По умолчанию в этот перечень каталогов не + входит текущий каталог, обозначаемый ./ (точка слеш) (если только вы не выбрали один из + двух самых слабых уровней защиты, см. об этом ниже), поэтому, для запуска программы + prog из текущего каталога, надо дать команду: ./prog. + +
+ + +
Базовые команды оболочки Bash + + Все команды, приведенные ниже, могут быть запущены в режиме консоли. Для + получения более подробной информации используйте команду + man. Пример: man ls + +
Команда <command>su</command> + + Позволяет вам получить права администратора. Когда вы набираете + su, оболочка запрашивает у вас пароль суперпользователя + (root). Введите пароль и нажмите Enter: теперь вы получили + привилегии суперпользователя. Чтобы вернуться к правам вашего пользовательского + бюджета, наберите exit.
+ + +
Команда <command>cd</command> + + Позволяет сменить каталог. Она работает как с абсолютными, так и с + относительными путями. Предположим, что Вы находитесь в своем домашнем каталоге + и хотите перейти в его подкаталог docs. + Для этого введите относительный путь: + cd docs + + + Чтобы перейти в каталог /usr/bin, + наберите (абсолютный путь): + cd /usr/bin/ + + + Некоторые варианты команды: + + cd .. + + позволяет вам сделать текущим родительский каталог (обратите внимание на пробел + между cd и ..); + + cd - + + позволяет вам вернуться в предыдущий каталог. Команда cd без + параметров переводит вас в ваш домашний каталог. + +
+ +
Команда ls + + ls (list) выдает список файлов в текущем каталоге. Две основные опции: + + +  — просмотр всех файлов, включая скрытые; + + +  — отображение более подробной информации. + + + + +
+ +
Команда <command>rm</command> + + Эта команда используется для удаления файлов. + + Удалив файл, вы не сможете его восстановить! + + Синтаксис: + rm [параметры] имя_файла + + У данной программы существует ряд параметров. Самые часто используемые: +  — запрос на удаление файла,  — + рекурсивное удаление (т.е. удаление, включая подкаталоги и скрытые + файлы). + + Пример: + + rm -i ~/html/*.html + + удаляет все файлы html в вашем каталоге + html. + +
+ +
Команды <command>mkdir</command> и <command>rmdir</command> + + Команда mkdir позволяет создать каталог, тогда как + rmdir удаляет каталог, при условии, что он пуст. + + Синтаксис: + + mkdir имя_каталога + rmdir имя_каталога + + + Команда rmdir часто заменяется командой rm + , которая позволяет вам удалять каталоги, даже + если они не пусты. + +
+ + +
Команда <command>less</command> + + less позволяет вам постранично просматривать текст. + + Синтаксис: + less имя_файла + + Крайне полезно просмотреть файл перед тем, как его редактировать. Для выхода + нажмите q. + +
+ + +
Команда <command>grep</command> + + Данная команда имеет много опций и предоставляет возможность поиска символьной + строки в файле. + + Синтаксис: + grep шаблон_поиска файл + +
+ + +
Команда <command>ps</command> + + Отображает список текущих процессов. Колонка команд указывает имя + процесса, колонка PID (идентификатор процесса) — номер + процесса (этот номер используется для операций с процессом, например, чтобы + завершить его командой kill). + + Синтаксис: + ps аргументы + + Аргумент u предоставляет вам больше информации, ax позволяет вам просмотреть те + процессы, которые не принадлежат вам (такие, как те, что были запущены во время + процесса загрузки.). + +
+ +
Команда <command>kill</command> + + Если программа перестала отвечать или зависла, используйте данную команду, чтобы + её завершить. + + Синтаксис: + + kill PID_номер + + Иногда необходимо будет использовать команду kill с + параметром (kill -9 PID_номер), когда обычная команда + kill не дает желательного эффекта. Номер + PID выясняется при помощи команды + ps. + +
+ +
+ +
+ +
Использование многозадачности + + &DISTRO; — это многозадачная система. Продемонстрируем на двух примерах, + как это можно использовать. + + Первый пример — запуск программы в фоновом режиме. Для того чтобы это + сделать, вам нужно лишь набрать «&» после + имени программы. После этого оболочка дает вам возможность запускать другие + приложения. Будьте осторожны, так как некоторые программы интерактивны и их + запуск в фоновом режиме бессмысленен. Подобные программы просто остановятся, + будучи запущенными в фоновом режиме. Для того чтобы вернуть их в обычный режим, + наберите: fg имя_программы + + Второй метод представляет собой запуск нескольких независимых сеансов. В + консоли нажмите Alt и одну из клавиш, находящихся в интервале + от F1 до F6. На экране появится новое + приглашение системы, и вы сможете открыть новый сеанс. Этот метод также + позволяет вам работать на другой консоли, если консоль, которую вы использовали + до этого, не отвечает или вам необходимо остановить зависшую программу. + +
+ +
\ No newline at end of file diff --git a/ru-RU/admin-basics/sumode--chapter.xml b/ru-RU/admin-basics/sumode--chapter.xml new file mode 100644 index 0000000..33dd33f --- /dev/null +++ b/ru-RU/admin-basics/sumode--chapter.xml @@ -0,0 +1,101 @@ + + + + +Режим суперпользователя + +
Какие бывают пользователи? + + Linux — система многопользовательская, а потому пользователь — ключевое понятие для + организации всей системы доступа в Linux. Файлы всех пользователей в Linux хранятся + раздельно, у каждого пользователя есть собственный домашний каталог, в котором он может + хранить свои данные. Доступ других пользователей к домашнему каталогу пользователя может + быть ограничен. + + Суперпользователь в Linux — это выделенный пользователь системы, на которого не + распространяются ограничения прав доступа. Именно суперпользователь имеет возможность + произвольно изменять владельца и группу файла. Ему открыт доступ на чтение и запись к + любому файлу или каталогу системы. + + Среди учётных записей Linux всегда есть учётная запись суперпользователя + — root. Поэтому вместо «суперпользователь» часто говорят + «root». Множество системных файлов принадлежат root, + множество файлов только ему доступны для чтения или записи. Пароль этой учётной + записи — одна из самых больших драгоценностей системы. Именно с её помощью + системные администраторы выполняют самую ответственную работу. + +
+ + +
Для чего может понадобится режим суперпользователя? + + Системные утилиты, например, такие как Центр управления + системой или Программа управления пакетами + Synaptic требуют для своей работы привилегий суперпользователя, + потому что они вносят изменения в системные файлы. При их запуске выводится + диалоговое окно с запросом пароля системного администратора. + +
+ + +
Как получить права суперпользователя? + + Для опытных пользователей, умеющих работать с командной строкой, существует два + различных способа получить права суперпользователя. + + Первый — это зарегистрироваться в системе под именем + root. + + Второй способ — воспользоваться специальной утилитой + su (shell of user), которая позволяет выполнить одну или + несколько команд от лица другого пользователя. По умолчанию эта утилита + выполняет команду sh от пользователя root, то есть запускает командный интерпретатор. Отличие + от предыдущего способа в том, что всегда известно, кто именно запускал + su, а значит, ясно, кто выполнил определённое + административное действие. + + В некоторых случаях удобнее использовать не su, а + утилиту sudo, которая позволяет выполнять только заранее + заданные команды. + + + Для того чтобы воспользоваться командами su и + sudo, необходимо быть членом группы + wheel. Пользователь, созданный при установке системы, по + умолчанию уже включён в эту группу. + + +
+ + +
Как перейти в режим суперпользователя? + + Для перехода в режим суперпользователя наберите в терминале команду + su . + + Если воспользоваться командой su без ключа, то + происходит вызов командного интерпретатора с правами root. При этом значение переменных окружения, в + частности $PATH, остаётся таким же, как у пользователя: в + переменной $PATH не окажется каталогов /sbin, /usr/sbin, без указания полного имени будут + недоступны команды route, shutdown, + mkswap и другие. Более того, переменная + $HOME будет указывать на каталог пользователя, все + программы, запущенные в режиме суперпользователя, сохранят свои настройки с + правами root в каталоге пользователя, что в + дальнейшем может вызвать проблемы. + + Чтобы избежать этого, следует использовать su + . В этом режиме su запустит + командный интерпретатор в качестве login shell, и он будет вести себя в + точности так, как если бы в системе зарегистрировался + root. + +
+ +
+ diff --git a/ru-RU/desktop-environment/index.xml b/ru-RU/desktop-environment/index.xml new file mode 100644 index 0000000..135de73 --- /dev/null +++ b/ru-RU/desktop-environment/index.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/ru-RU/desktop-environment/xfce/index.xml b/ru-RU/desktop-environment/xfce/index.xml new file mode 100644 index 0000000..c4f1776 --- /dev/null +++ b/ru-RU/desktop-environment/xfce/index.xml @@ -0,0 +1,24 @@ + + + + + Обзор Xfce 4 + + + + Xfce — это настольная рабочая среда, + обеспечивающая пользователю комфортную работу с компьютером в графическом + режиме. Xfce позволяет просто и быстро запускать + приложения, оставаясь при этом очень нетребовательным к ресурсам. Таким + образом, будучи внешне привлекательным и простым в использовании, + Xfce может эффективно использоваться даже на + относительно скромном оборудовании. + + + + + + + + \ No newline at end of file diff --git a/ru-RU/desktop-environment/xfce/running-applications.xml b/ru-RU/desktop-environment/xfce/running-applications.xml new file mode 100644 index 0000000..f970af7 --- /dev/null +++ b/ru-RU/desktop-environment/xfce/running-applications.xml @@ -0,0 +1,22 @@ + + + + + Запуск приложений + + В левой части панели рабочего стола Xfce + находится меню запуска приложений. Через Меню Xfce + осуществляется запуск всех приложений, установленных на ваш компьютер. + + Меню запуска приложений состоит из нескольких разделов: + + поиск; + ссылки на часто используемые программы; + настройки; + все приложения; + справка и действия. + + + + \ No newline at end of file diff --git a/ru-RU/desktop-environment/xfce/settings-manager.xml b/ru-RU/desktop-environment/xfce/settings-manager.xml new file mode 100644 index 0000000..5b2ecad --- /dev/null +++ b/ru-RU/desktop-environment/xfce/settings-manager.xml @@ -0,0 +1,188 @@ + + + + + Диспетчер настроек + + Диспетчер настроек находится в Меню + Xfce в разделе Настройки. В диспетчере + настроек объединены настройки различных компонентов + Xfce. Они позволяют настроить + Xfce под свои нужды. Все приложения, входящие в + состав диспетчера настроек, сопровождаются руководством пользователя. Каждое + руководство содержит назначение, возможности и способы использования программы. + Руководство вызывается из меню Справка в запущенном + приложении. + + + + + + + + Окно диспетчера настроек + + + + + + Внешний вид + + Настройка пользовательского интерфейса предполагает выбор его общего + стиля из списка имеющихся в системе стилей, переопределение системного шрифта + для всех элементов интерфейса (кроме заголовка окон, шрифт для которых + определяется в модуле Диспетчер окон), выбор внешнего вида + значков, настройки стиля отображения текста и значков рабочего стола. + + + + Дисплей + + Модуль параметров дисплея поддерживает RandR + 1.2 — автоматически определяет дисплеи и позволяет пользователям + выбирать предпочтительные разрешение, частоту обновления и ориентацию + дисплея. + + + Специальные возможности + + Модуль специальных возможностей содержит настройки конфигурирования клавиатуры и мыши, + настройки скорости срабатывания клавиш, чувствительность мыши и скорость повторного нажатия + клавиш. С помощью этой настройки можно задать такие опции клавиатуры, как залипающие, медленные + и повторяющиеся клавиши. + + + Календарь + + Orage — небольшой и удобный в использовании + календарь. Параметры его настройки позволяют задать часовой пояс, стиль окна + календаря и выбор содержания информации в нём. + + + Клавиатура + + Модуль располагает настройками поведения клавиатуры. Эта функция позволяет задать режим + настройки ввода и курсора, горячие клавиши для запуска приложений и раскладку + клавиатуры. + + + Менеджер питания + + Менеджер питания содержит общие параметры управления + электропитанием. С помощью этого модуля пользователь может менять настройки + DPMS. + + + Мышь + + Модуль Мышь содержит настройки курсора и режим его + работы (левша/правша), настройки параметров обратной связи (ускорение и порог) + и параметров двойного щелчка (время и расстояние), содержит выбор темы курсора: + его размер и изображение. + + + Диспетчер окон + + Модуль Диспетчер окон содержит основные настройки + поведения окон. С помощью этой настройки пользователь может изменять стиль и + фокус окон, задавать разнообразные дополнительные опции поведения окон. Здесь + же находятся настройки сочетания горячих клавиш. + + + Диспетчер окон (дополнительно) + + Диспетчер окон (дополнительно) содержит + дополнительные настройки поведения окон. В функции модуля входит: переключение + окон, их размещение и их эффекты, настройка клавиши захвата окон и способы их + перемещения, управление способами переключения рабочих + мест. + + + Оповещения + + В этом диалоговом окне можно настроить параметры отображения оповещений на вашем + экране. + + + Панель + + Настройка панели позволяет выбрать размер, внешний вид, стиль и + расположение панели. Также позволяет добавлять или удалять панели с рабочего + стола. В параметрах этой настройки пользователь может добавлять на панель + новые, несущие различную по содержанию информацию, + элементы. + + + Предпочитаемые приложения + + В диалоговом окне предпочитаемых приложений можно задать веб-браузер, почтовую программу, + файловый менеджер и эмулятор терминала, используемые по умолчанию. + + + Рабочие места + + Настройка рабочих мест позволяет задать, изменить количество рабочих мест и дать им + собственные имена. Здесь же можно задать поля — области экрана, в которых невозможно размещать + окна. + + + Рабочий стол + + Настройка рабочего стола содержит определение его цвета и стиля, а также установку обоев. + Можно отредактировать главное меню, закрепить вызов главного меню, список столов и открытых на + них приложений за правой и средней кнопками мыши. + + + Сеансы и запуск + + Данная функция позволяет настроить параметры запуска рабочего стола и + заставки. С помощью этого компонента пользователь может настроить автозапуск + предпочитаемых приложений. + + + Съёмные устройства и носители данных + + Данная функция позволяет настроить управление томами: накопителями, + камерами, принтерами, устройствами ввода информации. Наличие в системе + поддержки HAL и установки пакета thunar- + volman-plugin расширяют возможности пользователя в использовании + данной настройки. + + + Файловый менеджер + + Файловый менеджер Thunar — одна из основных + программ повседневного использования. Настройки файлового менеджера + Thunar очень разнообразны. У него простой и + интуитивный интерфейс, не содержащий бесполезных или вносящих путаницу + элементов. Thunar быстро запускается, быстро + открывает папки и быстро реагирует на действия + пользователя. + + + Хранитель экрана + + Хранитель экрана — программа гашения экрана при + простое компьютера, созданная для снижения непроизводительного износа + оборудования, а также несущая энергосберегающие функции и функции безопасности, + при условии присутствия в программе блокировки рабочей консоли + паролем. + + + Редактор настроек + + Редактор настроек — программа, которая позволяет + изменять различные настройки каналов. + + + Редактор типов MIME + + Редактор типов MIME — программа, c помощью которой + вы можете задавать разные приложения по умолчанию для открытия файлов разных + форматов. + + Новые инструменты Xfce находятся в постоянной разработке см. + . + + \ No newline at end of file diff --git a/ru-RU/desktop-environment/xfce/xfce4-desktop.xml b/ru-RU/desktop-environment/xfce/xfce4-desktop.xml new file mode 100644 index 0000000..a7b2634 --- /dev/null +++ b/ru-RU/desktop-environment/xfce/xfce4-desktop.xml @@ -0,0 +1,128 @@ + + + + + Рабочий стол <productname>Xfce 4</productname> + + + + + + + + Рабочий стол Xfce 4 + + + + + На рабочем столе Xfce 4 есть две особых области. Сверху вниз: + + + Область рабочего стола (рабочая область в центре, занимающая большую + часть экрана); + + + Панель Xfce (полоса в самом низу). + + + + +
+ Область рабочего стола + + Значки рабочего стола предоставляют доступ к вашей домашней директории + /home/<имя + пользователя>. На область рабочего стола можно + перетащить файлы и создать ярлыки программ с помощью меню правой кнопки + мыши. + + При двойном щелчке по значку Домашний каталог + запустится файловый менеджер с открытым домашним каталогом. При таком же + действии по отношению к значку Корзина запустится файловый + менеджер с открытой корзиной. В корзине расположены удалённые файлы. Чтобы + удалить файлы навсегда, щёлкните правой кнопкой мыши на корзине и выберите + Очистить корзину. + + Щелчок правой кнопкой мыши на свободной области рабочего стола открывает + контекстное меню рабочего стола, где вы можете, например, настроить фон + рабочего стола (пункт Настройка рабочего + стола…). + +
+ +
+ Панель Xfce + + Панель Xfce расположена в нижней части экрана. Панель Xfce универсальна: она может + содержать значки загрузчика, панели задач, переключатель окон или любое другое сочетание; и + её можно удобно настроить. Для того чтобы увидеть возможные варианты настройки, необходимо + щелчком правой кнопки мыши вызвать контекстное меню и переместить, удалить или изменить + содержание вашей панели по форме и существу. + + Панель Xfce имеет как вертикальный, так и горизонтальный режимы отображения, + возможность автоматического скрытия с экрана, легко настраиваемые, всплывающие меню и + ярлыки запуска приложений. Панель Xfce поддерживает прозрачность. + + На левой части панели расположены: + + + + основное меню — Меню Xfce, обеспечивающее доступ ко + всем графическим приложениями и изменениям настроек; + + + + кнопка Скрыть окна и показать рабочий стол, + которая позволяет свернуть все открытые окна для быстрого доступа к рабочему + столу; + + + + значёк запуска веб-браузера; + + + + переключатель рабочих мест, позволяющий переходить между доступными + рабочими столами с помощью мыши. + + + + + + + На правой части панели находятся: + + + + системный лоток, обеспечивающий доступ к настройке сети; программы обмена + сообщениями размещают в нём значки уведомлений; + + + + регулятор громкости для звуковой карты; + + + + часы; + + + + меню Переход, предоставляющее быстрый доступ к папкам, + документам и съёмным носителям; + + + + кнопка Завершения сеанса…, позволяющая выполнить + выход из системы, блокировку экрана и другие системные действия. + + + + + + В центральной части панели расположена область списка задач, в которой отображаются + запущенные приложения. + +
+ +
\ No newline at end of file diff --git a/ru-RU/desktop-software/e-mail-section-thunderbird.xml b/ru-RU/desktop-software/e-mail-section-thunderbird.xml new file mode 100644 index 0000000..f77c6a2 --- /dev/null +++ b/ru-RU/desktop-software/e-mail-section-thunderbird.xml @@ -0,0 +1,121 @@ + + + +
Thunderbird + + Mozilla Thunderbird — мощный почтовый клиент, + позволяющий максимально эффективно работать с электронной почтой. + Mozilla Thunderbird позволяет работать с электронной + корреспонденцией через протоколы POP, + SMTP и IMAP, участвовать в конференциях + Usenet, а также осуществлять подписку на новостные ленты + RSS. + +
Функции Thunderbird + + + + Настройка интерфейса (изменение расположения окон, наличие и отсутствие + кнопок на панели инструментов, изменение их размера и т.д.); + + + + Отображение любого форматирования HTML, обеспечивающее кроссплатформенную + совместимость; + + + + Выбор режимов показа и компоновки учётных записей и почтовых папок; + + + + Поддержка смены тем и установки расширений. + + + + + + + + + + Почтовый клиентMozilla Thunderbird + + + +
+ +
Первоначальная настройка Thunderbird + + При первом запуске почтового клиента + Thunderbird будет автоматически запущен мастер + Добро пожаловать в Thunderbird. С его помощью можно + получить новый адрес электронной почты (если у вас ещё нет адреса). Если у вас + уже есть адрес электронной почты и вы хотите настроить + Thunderbird на работу с ним, то следует перейти к + мастеру Настройка учётной записи почты щёлкнув по кнопке + Пропустить это и использовать мою существующую + почту. + + Мастер создания учётной записи запросит: + + + ваше имя; + адрес электронной почты; + пароль. + + + + Далее, на основании введённой информации, мастер определяет протокол + доступа (IMAP или POP3) и адреса серверов + входящих и исходящих сообщений. Вы можете принять предложенные настройки, если + они верны, нажав на кнопку Готово, или указать + правильные настройки, воспользовавшись кнопкой Настройка + вручную. Добавить дополнительную учётную запись можно также при + помощи мастера Добро пожаловать в Thunderbird. Вызвать его + можно выбрав в левой части окна программы одну из существующих учётных записей, + затем нажав кнопку Создать учётную запись в открывшемся + в правой части окна списке. + + Если вы имеете почтовый ящик на сервисе Gmail, то вся настройка происходит + автоматически — вам необходимо ввести только имя учётной записи и пароль. + + В случае наличия нескольких учётных записей вы можете выбирать метод их + компоновки на панели почтовых папок. По умолчанию происходит создание единой группы + папок, но есть возможность переключиться на раздельное отображение каждой учётной + записи. + +
+ +
Использование почтового клиента + + Для составления письма нажмите Создать. В + открывшемся окне Создание сообщения введите адрес + получателя, тему и текст письма. Для проверки ошибок в тексте выберите кнопку + Орфография. + + + + + + + + Создание сообщения в Mozilla Thunderbird + + + + + В виде вложения к письму можно пересылать электронные документы, + изображения, архивы и т.п. Для того чтобы добавить вложение, нажмите + Вложить и выберите нужный файл в открывшемся окне. + Закончив составление письма, нажмите Отправить. + + Более подробную информацию об использовании и настройке + Thunderbird смотрите + СправкаО + Thunderbird или при помощи клавиши + F1. + +
+
\ No newline at end of file diff --git a/ru-RU/desktop-software/e-mail.xml b/ru-RU/desktop-software/e-mail.xml new file mode 100644 index 0000000..ab31bea --- /dev/null +++ b/ru-RU/desktop-software/e-mail.xml @@ -0,0 +1,71 @@ + + + +Электронная почта + + Для работы с электронной почтой применяются специализированные программы — почтовые + клиенты, предоставляющие пользователю гибкие и эффективные возможности работы с + электронной корреспонденцией: различные средства сортировки сообщений, выбор шаблонов из + готового набора, проверку орфографии по мере набора текста и другие полезные + функции. + + Современные пользователи предпочитают работать с электронной почтой через веб- + интерфейс, используя браузер. Подручных средств, предоставляемых популярными почтовыми + сервисами, для повседневных почтовых нужд пользователя практически достаточно, но + использование специально предназначенных программ даёт некоторые преимущества: + + + + возможность одновременной работы с несколькими учётными записями; + + + + гибкие правила сортировки почты; + + + + обеспечение ограниченного доступа к отдельным папкам или учётным записям; + + + + наличие антиспам-систем и систем фильтрации рекламы; + + + + экономия входящего трафика. + + + + + + + + Для Linux создано большое количество почтовых клиентов. Все они обладают своими + особенностями и, как правило, имеют всё необходимое для успешной работы с электронной + почтой: сортировку и фильтрацию сообщений, поддержку различных кодировок сообщений, + возможность работы со списками рассылки и т.п. + + Выбор почтового клиента зависит от ваших личных предпочтений. Для первоначальной + настройки любого из них вам потребуются следующие данные: + + + адрес электронной почты; + пароль для доступа к ящику электронной почты; + имена серверов входящей и исходящей почты; + тип сервера входящей почты (IMAP или POP3). + + + + Адрес и порт для доступа к SMTP и + POP3 серверам необходимо выяснить у провайдера электронной + почты или у администратора вашей сети (в случае использования почтового сервера + локальной сети). + + + + + + + \ No newline at end of file diff --git a/ru-RU/desktop-software/file-manager-section-thunar.xml b/ru-RU/desktop-software/file-manager-section-thunar.xml new file mode 100644 index 0000000..3037f58 --- /dev/null +++ b/ru-RU/desktop-software/file-manager-section-thunar.xml @@ -0,0 +1,46 @@ + + + + +
Обзор файлового менеджера <application>Thunar</application> + + Thunar — это новый, современный файловый + менеджер для рабочей среды Xfce. + Thunar отличается быстротой работы и простотой + использования. Он быстро запускается и открывает папки. Файловый менеджер + Thunar является точкой доступа как к вашим файлам, + так и к приложениям. Используя файловый менеджер, вы можете: + + + создавать папки и документы; + просматривать ваши файлы и папки; + управлять вашими файлами и папками; + настраивать и выполнять особые действия; + получать доступ к съёмным носителям. + + + + + + + + + + Файловый менеджер Thunar + + + + + Окно файлового менеджера состоит из боковой панели слева, основной области справа и + панели адреса, расположенной над основной областью. На боковой панели размещены закладки на + различные папки вашей системы. Основная область отображает содержимое текущей папки. Панель + адреса всегда показывает путь к текущей папке. + + За более подробным описанием основных функций и возможностей обращайтесь + к руководству по Thunar, доступному на сайте + производителя (). Удобная ссылка на руководство + есть в меню Справка + Содержание. + +
\ No newline at end of file diff --git a/ru-RU/desktop-software/file-manager.xml b/ru-RU/desktop-software/file-manager.xml new file mode 100644 index 0000000..c29162c --- /dev/null +++ b/ru-RU/desktop-software/file-manager.xml @@ -0,0 +1,22 @@ + + + +Файловые менеджеры + + Файловые менеджеры предоставляют интерфейс пользователя для работы с + файловой системой и файлами. Файловые менеджеры позволяют выполнять наиболее + частые операции над файлами — создание, открытие/проигрывание/просмотр, + редактирование, перемещение, переименование, копирование, удаление, изменение + атрибутов и свойств, поиск файлов и назначение прав. Помимо основных функций, + многие файловые менеджеры включают ряд дополнительных возможностей, например, + таких как работа с сетью (через FTP, NFS + и т.п.), резервное копирование, управление принтерами и прочее. + + + + + + + \ No newline at end of file diff --git a/ru-RU/desktop-software/graphics-section-gimp.xml b/ru-RU/desktop-software/graphics-section-gimp.xml new file mode 100644 index 0000000..aa28ec9 --- /dev/null +++ b/ru-RU/desktop-software/graphics-section-gimp.xml @@ -0,0 +1,116 @@ + + + +
<application>GIMP</application> + + GIMP (GNU Image Manipulation Program) — + графический редактор, предназначенный для работы с растровой графикой. Одной из + сильных сторон GIMP является его доступность для + многих операционных систем. + + GIMP пригоден для решения множества задач по + изменению изображений. Типичные задачи, которые можно решать при помощи + GIMP, включают в себя создание графики и логотипов, + масштабирование и кадрирование фотографий, раскраску изображений, + комбинирование изображений с использованием слоёв, ретуширование и + преобразование изображений в различные форматы. + +
Функциональность <application>GIMP</application> + + При запуске GIMP на экране открывается ряд + окон. Главное окно содержит меню основных функций, панель инструментов и + области, в которых отображаются текущие значения основного и фонового цветов, + формы кисти, текущего градиента. Окна изображения соответствуют отдельным + открытым графическим файлам (или слоям в них). + + Основная функциональность, доступная через Инструменты + в главном окне, достаточно традиционна для программ этого класса. Она включает: + + + + выделение области изображения (прямоугольной, эллиптической или + произвольной формы). Последовательно выделяемые области могут образовывать + пересечения, объединения или вычитания; + + + + выделение связной области с заданием параметров связности; + + + + перемещение, заливку выделенных областей; + + + + кадрирование (обрезку) изображения; + + + + изменение масштаба отображения на экране; + + + + вращение, масштабирование, искривление и зеркальное отображение + изображения; + + + + ввод текста; + + + + выбор текущего цвета (Пипетка); + + + + заливку области сплошным цветом или градиентом; + + + + рисование — Карандаш или + Кисть произвольной формы; + + + + очистку (Ластик). + + + + + В базовую функциональность GIMP входит также + возможность захвата изображения со сканера и с экрана. + +
+ +
Фильтрация и синтез изображений + + Основной приём автоматизированной обработки изображений — фильтрация их целиком + либо выделенных в них областей. Большая часть упомянутых внешних модулей реализует + именно функцию фильтрации. Среди наиболее важных в практической обработке изображений + фильтров имеются: + + + + + изменение цвета, насыщенности, яркости и контраста изображения; + + + + удаление «шума»; + + + + повышение резкости и размывание, выделение краёв. + + + + + + Значительное количество фильтров имитирует различные «эффекты»: от просмотра + изображения через волнистое стекло до растягивания в сферическую или цилиндрическую + форму. + +
+ +
\ No newline at end of file diff --git a/ru-RU/desktop-software/graphics.xml b/ru-RU/desktop-software/graphics.xml new file mode 100644 index 0000000..2c57feb --- /dev/null +++ b/ru-RU/desktop-software/graphics.xml @@ -0,0 +1,18 @@ + + + +Графика + + &DISTRO; предлагает приложения для работы c + растровой и векторной графикой. Ваш выбор зависит как от личных предпочтений, + так и от задач, которые вы собираетесь решать, будь то простой просмотр + графических файлов или, например, создание профессиональных макетов. + + + + + + + \ No newline at end of file diff --git a/ru-RU/desktop-software/index.xml b/ru-RU/desktop-software/index.xml new file mode 100644 index 0000000..0800c5d --- /dev/null +++ b/ru-RU/desktop-software/index.xml @@ -0,0 +1,32 @@ + + + + + Обзор приложений + + + Linux содержит огромное число приложений + (программ) для выполнения всех повседневных задач. При этом важно понимать, что + для выполнения одного и того же действия могут быть использованы разные + приложения. Например, для написания простых текстов доступен целый ряд + текстовых редакторов с разным набором возможностей. Со временем вы сами сможете + выбрать наиболее удобные для вас приложения. + + Набор программ с диска покрывает обычные потребности. Если же + определённая программа отсутствует в системе, то вы можете доустановить её с + диска или из огромного банка программного обеспечения ALT + Linux. + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru-RU/desktop-software/instant-messaging-section-pidgin.xml b/ru-RU/desktop-software/instant-messaging-section-pidgin.xml new file mode 100644 index 0000000..41b8c40 --- /dev/null +++ b/ru-RU/desktop-software/instant-messaging-section-pidgin.xml @@ -0,0 +1,106 @@ + + + +
Pidgin + + Pidgin — мультипротокольная программа-клиент + для мгновенного обмена сообщениями, позволяющая одновременно подключиться к + нескольким сетям. Поддерживает наиболее популярные протоколы: + AIM, + Bonjour, + Facebook (XMPP), + Gadu-Gadu, + Google-общение, + GroupWise, + ICQ, + IRC, + MSN, + MXit, + MySpaceIM, + SIMPLE, + Sametime, + XMPP, + Yahoo, + Yahoo JAPAN и + Zephyr. + + + + + + + + Окно программы Pidgin + + + + +
Функции Pidgin + + + Поддержка особенностей различных сетей (статус-сообщения, + значки друзей, уведомление о наборе текста…); + Шифрованный чат; + Возможность установки модулей расширения; + Возможность «метаконтактов»; + Запись протокола событий; + Поддержка вкладок в окне разговора; + Одновременное подключение к нескольким аккаунтам; + Слежение за пользователями; + Многоязычный интерфейс. + +
+ +
Первоначальная настройка + + После запуска Pidgin необходимо произвести его + первоначальную настройку. При первом запуске Pidgin + из меню Уч.записиУправление + учётными записями необходимо запустить диалоговое + окно мастера создания учётной записи и создать учётную запись + пользователя. + + Из списка поддерживаемых служб выберите ту, которую собираетесь + использовать. Возможно, вы уже решили, какую службу IM + будете использовать (потому что вы уже пользовались ею, либо потому что ею + пользуются ваши друзья). Если вы ещё не остановили свой выбор на какой-то + определённой службе IM, то выберите службу, основанную на + открытых стандартах, например jabber. + + + + + + + + Добавление учётной записи в Pidgin + + + + + + Если вы ещё не зарегистрированы ни в одной службе мгновенных сообщений, то + предварительно необходимо создать аккаунт на соответствующем веб-сайте. + + + После настройки учётной записи добавьте в список контактов ваших + собеседников (кнопка Добавить собеседника…) и, при + условии, что нужный вам собеседник подключён к службе мгновенных сообщений, + можете начинать общение. + + + Вы можете использовать Pidgin для общения в + социальных сетях. Например, вы можете почитать о том, как настроить + Pidgin для + Facebook. + + + За дополнительной информацией по использованию + Pidgin можно обратиться к справке, вызываемой из + меню ПомощьПомощь в + сети. + +
+ +
\ No newline at end of file diff --git a/ru-RU/desktop-software/instant-messaging.xml b/ru-RU/desktop-software/instant-messaging.xml new file mode 100644 index 0000000..0085615 --- /dev/null +++ b/ru-RU/desktop-software/instant-messaging.xml @@ -0,0 +1,54 @@ + + + + + Обмен мгновенными сообщениями + + Для обмена сообщениями в режиме реального времени через Интернет необходима + специализированная клиентская программа, передающая текстовые сообщения, а также файлы + различных типов. Система мгновенного обмена сообщениями является одним из самых доступных и + востребованных средств общения в Интернете. Преимущества инструментов мгновенного обмена + информацией: + + + Скорость — мгновенные сообщения позволяют собеседникам общаться со скоростью нажатия на + кнопку, без необходимости открывать письма и ждать ответа; + + + Удобство — программы обмена мгновенными сообщениями включают широкий набор коммуникативных + и производственных функций. + + + + + Большинство современных программ мгновенного обмена сообщениями позволяют видеть, + подключены ли в данный момент абоненты, занесённые в список контактов. Сообщения появляются на + мониторе собеседника только после окончания редактирования и отправки. В список основных + функций служб мгновенных сообщений входят: + + чат (видеочат, текстовый и голосовой); + VoIP сервисы: звонки на компьютер, звонки на стационарные и + мобильные телефоны; + возможность отправки SMS; + передача файлов; + инструменты для совместной работы в режиме реального времени; + возможность общаться в чате непосредственно на веб-странице; + напоминания и оповещения; + хранение истории общения по каждому контакту; + индикация о сетевом статусе занесённых в список контактов + пользователей (в сети, нет на месте и т.д.). + + + + Существуют клиентские программы, позволяющие подключаться одновременно к нескольким сетям. + Они поддерживают наиболее популярные протоколы, что избавляет вас от необходимости + устанавливать отдельный IM-клиент для каждой сети. + + + + + + + \ No newline at end of file diff --git a/ru-RU/desktop-software/multimedia-section-audacious.xml b/ru-RU/desktop-software/multimedia-section-audacious.xml new file mode 100644 index 0000000..1de5036 --- /dev/null +++ b/ru-RU/desktop-software/multimedia-section-audacious.xml @@ -0,0 +1,52 @@ + + + +
Audacious + + Audacious — это свободный универсальный аудио + проигрыватель, работающий с большинством форматов музыкальных файлов. В набор + входят плагины для воспроизведения форматов MP3, Ogg Vorbis, FLAC и Monkey’s + Audio. + + Audacious имеет многоязычный, очень удобный + интерфейс, выполненный по подобию популярного Winamp + для Windows. + + Широкий набор возможностей в Audacious + достигается благодаря проигрыванию самых популярных звуковых форматов, а также + поддержке дополнений и модулей. Обычно самые полезные модули поставляются + вместе с проигрывателем. В этот набор входят модули для воспроизведения + звуковых форматов: Audio CD, MPEG (mp3), Ogg Vorbis, WMA, AAC, FLAC, ALAC, + WAVE, а также Midi, Musepack (mpc), Wavpack. + + Audacious полностью поддерживает графические + оболочки для Winamp 2, + а также графические оболочки в произвольном формате. Присутствует модуль для + , поддержка LIRC, различные эффекты, + такие как «удаление голоса», конвертор частоты семплирования, эффекты + визуализации, компрессор и т.д. + + Кроме того, в последних версиях программы следует отметить следующие важные дополнения + к основным функциям: + + + + + частичная поддержка GTK+ 3.0; + + + вывод звука с помощью SDL; + + быстрый поиск; + + новая визуализация; + + реорганизация диалога настроек; + + показ обложек в главном окне. + + + + +
diff --git a/ru-RU/desktop-software/multimedia.xml b/ru-RU/desktop-software/multimedia.xml new file mode 100644 index 0000000..5b7514c --- /dev/null +++ b/ru-RU/desktop-software/multimedia.xml @@ -0,0 +1,16 @@ + + + +Мультимедиа + + Для работы с мультимедиа файлами (музыка, видео и т.п.) вы можете воспользоваться + предназначенными для этого приложениями. + + + + + + + \ No newline at end of file diff --git a/ru-RU/desktop-software/office-applications-section-libreoffice.xml b/ru-RU/desktop-software/office-applications-section-libreoffice.xml new file mode 100644 index 0000000..0f6bfcf --- /dev/null +++ b/ru-RU/desktop-software/office-applications-section-libreoffice.xml @@ -0,0 +1,90 @@ + + + +
LibreOffice + + + + + + + + LibreOffice + + + + + LibreOffice — пакет программ для работы с + офисными документами. Кроме стандартных для + LibreOffice форматов хранения данных, вы можете + успешно открывать и сохранять документы, созданные в других популярных офисных + пакетах. + + <application>Текстовый процессор</application> + + Текстовый процессор (LibreOffice Writer) + позволяет проектировать и создавать текстовые документы, содержащие + изображения, таблицы или графики. Вы можете сохранять документы в различных + форматах, включая стандартизированный формат OpenDocument format (ODF), формат Microsoft Word (DOC, DOCX) + или HTML. Кроме того, вы можете без труда + экспортировать ваш документ в формате переносимого документа (PDF). Текстовый процессор поддерживает и другие + форматы. + + + + <application>Электронные таблицы</application> + + Электронная таблица (LibreOffice Calc) + предназначена для работы с электронными таблицами. Инструментарий электронных + таблиц включает мощные математические функции, позволяющие вести сложные + статистические, финансовые и прочие расчёты. + + + + <application>Презентация</application> + + Презентация (LibreOffice Impress) позволяет + создавать профессиональные слайд-шоу, которые могут включать диаграммы, + рисованные объекты, текст, мультимедиа и множество других элементов. При + необходимости можно даже импортировать и изменять презентации + Microsoft PowerPoint. Для того чтобы сделать + экранные презентации более эффектными, можно использовать такие средства, как + анимация, мультимедиа и переходы между слайдами. + + + + <application>Редактор рисунков</application> + + Редактор рисунков (LibreOffice Draw) позволяет + создавать рисунки различной сложности и экспортировать их с использованием + нескольких общепринятых форматов изображений. Кроме того, можно вставлять в + рисунки таблицы, диаграммы, формулы и другие элементы, созданные в программах + LibreOffice. + + + + <application>Базы данных</application> + + Базы данных (LibreOffice Base) поддерживает + некоторые обычные файловые форматы баз данных, например, BASE. Кроме того, + можно использовать LibreOffice Base для подключения + к внешним реляционным базам данных, например, к базам данных + MySQL или Oracle. В базе + LibreOffice Base невозможно изменить структуру базы + данных или редактировать, вставлять и удалять записи для ниже перечисленных + типов баз данных (они доступны только для чтения): + + + файлы электронной таблицы; + текстовые файлы; + данные адресной книги. + + + + + +
\ No newline at end of file diff --git a/ru-RU/desktop-software/office-applications.xml b/ru-RU/desktop-software/office-applications.xml new file mode 100644 index 0000000..315e9d1 --- /dev/null +++ b/ru-RU/desktop-software/office-applications.xml @@ -0,0 +1,16 @@ + + + +Офисные приложения + + Офисными приложениями традиционно называют пакет программ для работы с + текстами, таблицами и презентациями. + + + + + + + \ No newline at end of file diff --git a/ru-RU/desktop-software/other-applications-section-brasero.xml b/ru-RU/desktop-software/other-applications-section-brasero.xml new file mode 100644 index 0000000..0bab69a --- /dev/null +++ b/ru-RU/desktop-software/other-applications-section-brasero.xml @@ -0,0 +1,103 @@ + + + +
Запись дисков: <application>Brasero</application> + + Brasero — программа для записи CD и DVD-дисков + в &DISTRO;, которая также служит и для работы с + образами дисков. Программа обладает максимально упрощённым и удобным + интерфейсом, что позволяет пользователю быстро и легко создавать CD/DVD + диски. + + Возможности работы с дисками, содержащими различные данные: + + + + изменение содержимого дисков и их форматирование; + + + + автоматическая фильтрация нежелательных файлов (скрытые файлы, «битые», + рекурсивные ссылки и подобные ненужные объекты не попадают на диск при + записи); + + + + поддержка мультисессий; + + + + поддержка Joliet, Drag-and-Drop, копирование и вставка из + Nautilus и других программ; + + + + поддержка и создание образов iso и cue; + + + + возможность прожига CD/DVD диска с данными на лету. + + + + + + + Особенности работы с Audio CD: + + + + возможность записи и изменения информации, заключённой в CD-TEXT; + + + + поддержка всех форматов GStreamer (ogg, flac, mp3, и т.д.); + + функция поиска звуковых файлов внутри выбранных папок; + + добавление и изменение участков тишины между треками; + + возможность прожига Audio-CD на лету. + + + + + + Особенности копирования CD/DVD дисков: + + + возможность копирования CD/DVD на жёсткий диск; + + поддержка односессионных DVD с данными; + + поддержка CD любого типа; + + копирование CD/DVD дисков на лету. + + + + + + Дополнительно: + + + возможность сохранять и загружать проекты; + + прожиг образов CD/DVD; + + + предварительный просмотр звуковых, а также фото и видео файлов; + + + + определение подключённых устройств (благодаря HAL); + + + использование файлов по сети; + + отображение списков проигрывания и их содержимого. + + + +
\ No newline at end of file diff --git a/ru-RU/desktop-software/other-applications-section-medit.xml b/ru-RU/desktop-software/other-applications-section-medit.xml new file mode 100644 index 0000000..754f5db --- /dev/null +++ b/ru-RU/desktop-software/other-applications-section-medit.xml @@ -0,0 +1,51 @@ + + + +
Текстовый редактор <application>Medit</application> + + Medit — мощный и одновременно лёгкий текстовый + редактор. Интерфейс текстового редактора Medit + позволяет удобно работать с несколькими файлами одновременно. + + Одной из сильных сторон Medit является его + доступность для многих операционных систем. Medit + имеет удобную систему расширения функциональности редактора с помощью модулей. + Medit поддерживает основные языки программирования и + языки разметки. + + Основные возможности Medit: + + + + использование вкладок; + + поддержка различных кодировок; + + + подсветки синтаксиса для ряда языков программирования и разметки; + + + нумерация строк; + + подсветка текущей строки; + + функции поиска и замены текста; + + переход к указанной пользователем строке; + + настраиваемые цвета и шрифты, используемые редактором; + + печать с возможностью предпросмотра; + + подсветка соответствующих открывающих и закрывающих скобок; + + + автоматическое сохранение резервных копий файлов перед изменением; + + + поддержка дополнительных модулей. + + + +
\ No newline at end of file diff --git a/ru-RU/desktop-software/other-applications-section-system-monitor.xml b/ru-RU/desktop-software/other-applications-section-system-monitor.xml new file mode 100644 index 0000000..b344930 --- /dev/null +++ b/ru-RU/desktop-software/other-applications-section-system-monitor.xml @@ -0,0 +1,76 @@ + + + +
<application>Системный монитор</application> + + Приложение Системный монитор отображает + основную информацию о системе и системных процессах. + +
Запуск приложения + + Есть несколько способов запустить + Системный монитор: + + + + Через панель Xfce. Для этого вам следует + щелкнуть по значку SL на панели + Xfce, которая расположена внизу экрана. Затем + выберите пункт меню Система + Системный монитор. + + + + Комбинацией клавиш. Последовательное нажатие + + Ctrl + Alt + Delete + + запустит Системный монитор. + + + Вы не должны нажимать клавиши по очереди. Необходимо зажать три клавиши + одновременно. + + + + + + + Из командной строки. Для запуска приложения из командной строки + выполните команду gnome-system-monitor. + + + + +
+ +
Применение приложения + + Вы можете использовать приложения для различных целей, например: + + + + для просмотра основных сведений об оборудовании компьютера и + установленном программном обеспечении; + + + для просмотра активных процессов; + + для просмотра используемых системных ресурсов. + + + + Для более подробной информации о приложении воспользуйтесь встроенной + справкой. Для этого, после запуска приложения либо перейдите в пункт меню + + Справка + Содержание + , + либо нажмите клавишу F1. + +
+ +
\ No newline at end of file diff --git a/ru-RU/desktop-software/other-applications.xml b/ru-RU/desktop-software/other-applications.xml new file mode 100644 index 0000000..b79cb24 --- /dev/null +++ b/ru-RU/desktop-software/other-applications.xml @@ -0,0 +1,23 @@ + + + +Прочие приложения + + + + + + + + + + + + + + + diff --git a/ru-RU/desktop-software/web-navigation-section-firefox.xml b/ru-RU/desktop-software/web-navigation-section-firefox.xml new file mode 100644 index 0000000..3218621 --- /dev/null +++ b/ru-RU/desktop-software/web-navigation-section-firefox.xml @@ -0,0 +1,73 @@ + + + +
Mozilla Firefox + + Программа Mozilla Firefox — веб-браузер, + поддерживающий большинство современных веб-технологий и интернет-протоколов. + Браузер Mozilla Firefox предлагает пользователю + логичный интерфейс и возможность полностью контролировать свою работу в + Интернете. + + + + + + + + Веб-браузер Mozilla Firefox + + + + + Веб-браузер Mozilla Firefox предоставляет + широкие возможности настройки: пользователь может устанавливать дополнительные + темы, изменяющие внешний вид программы, и расширения, добавляющие новую + функциональность. + + + Просмотр веб-страниц + + Для того чтобы открыть интернет-страницу, введите её адрес в адресную + строку браузера и нажмите Enter. Если вы хотите открыть + ссылку на следующую страницу в новой вкладке, то нажмите на ней средней кнопкой + (колесом) мыши. Возможно настроить одновременный просмотр нескольких страниц в + разных вкладках одного окна. + + Быстрый доступ к любимым сайтам + + Для быстрого доступа к часто посещаемым веб-страницам создайте ссылки на + Панели закладок. Управление закладками и их редактирование + осуществляется в рамках диалогового окна + Библиотека. + + Помощь при поиске + + Панель навигации помогает пользователю искать: + + + + интеллектуальная строка ввода адреса предоставляет окно-подсказку с историей + ранее открытых сайтов; + + + строка поиска предлагает пользователю функцию поиска по мере набора + текста. + + + + + + + Загрузка файлов из Интернета + + Веб-браузер Mozilla Firefox работает как + полнофункциональный FTP-клиент. Процесс загрузки найденных в + Интернете файлов на жёсткий диск компьютера отображается в диалоговом окне + менеджера загрузок. В меню веб-браузера Правка + Настройки можно указать папку для + сохранения файлов или выбрать возможность назначать папку при сохранении + файлов. + +
\ No newline at end of file diff --git a/ru-RU/desktop-software/web-navigation.xml b/ru-RU/desktop-software/web-navigation.xml new file mode 100644 index 0000000..bd27436 --- /dev/null +++ b/ru-RU/desktop-software/web-navigation.xml @@ -0,0 +1,37 @@ + + + +Веб-навигация + + Веб-браузеры — комплексные программы для обработки и отображения + HTML-страниц по протоколу HTTP и + HTTPS (открытие страниц сайтов, блогов и т.д.). Основное + назначение веб- браузера — предоставление интерфейса между веб-сайтом и его + посетителем. В базовые функции современных веб-браузеров входят: + + + навигация и просмотр веб-ресурсов; + показ оглавлений FTP-серверов и скачивание файлов; + поддержка скриптовых языков. + + + + Основные принципы работы с веб-браузером неизменны. Программа предоставляет + пользователю адресную строку, в которую вносится адрес необходимого вам сайта. Для более + быстрого доступа адреса часто посещаемых сайтов добавляются в закладки. Для перехода к + предыдущей/следующей просмотренной веб-странице, как правило, предусмотрены специальные + кнопки на панели инструментов. + + Возможно, по опыту работы в других операционных системах вы уже знакомы с определённым + браузером. Определить, какой браузер лучше, практически невозможно. Эту задачу каждый + пользователь решает сам, ориентируясь на свои личные предпочтения. В любом случае + рассмотрите основные предложения и выберите наиболее удобный для вас веб-навигатор. + + + + + + + \ No newline at end of file diff --git a/ru-RU/docbook-samples/index.xml b/ru-RU/docbook-samples/index.xml new file mode 100644 index 0000000..080e940 --- /dev/null +++ b/ru-RU/docbook-samples/index.xml @@ -0,0 +1,204 @@ + + + + + + Sample Part + + Короткое описание содержания части. + + + + Имя главы + + Абзац + + Абзац + номер + два + +
+ Примеры выделения текста + + Моноширинный жирный шрифт + + +
+ + Чтобы просмотреть содежимое файла my_next_bestselling_novel + в текущем каталоге, в строке приглашения оболочки введите + cat my_next_bestselling_novel + и нажмите Enter для выполнения этой команды. + + + + Нажмите Enter для исполнения команды. + + + + Нажмите CtrlAltF2 + Для переключения в виртуальный терминал. + +
+ + + Пропорциональный жирный + + + + Моноширинный жирный курсив или + пропорциональный жирный курсив + + +
+ + Для подключения к удаленной машине с помощью SSH в строке приглашения выполните + ssh имя_пользователя@имя_домена. + Скажем, имя удаленной машины – example.com, а ваше + имя пользователя – john, тогда команда будет выглядеть так: + ssh john@example.com. + + + Команда mount -o remount файловая_система + повторно подключит заданную файловую систему. Например, для /home + команда будет выглядеть так: mount -o remount /home. + + + Чтобы просмотреть версию установленного пакета, выполните команду rpm -q + пакет. Результат команды будет представлен в формате + пакет-версия-выпуск. + +
+
+ + + +
+ Соглашения по выделению текста + + Вывод экрана и листинг исходного кода будут отделены от окружающего текста. + + + Для отображения текста, который вы увидите на экране, используется моноширинный шрифт: + + +books Desktop documentation drafts mss photos stuff svn +books_tests Desktop1 downloads images notes scripts svgs + + Для отображения содержимого исходного кода используется моноширинный шрифт: + + + package org.jboss.book.jca.ex1; + + import javax.naming.InitialContext; + + public class ExClient + { + public static void main(String args[]) + throws Exception + { + InitialContext iniCtx = new InitialContext(); + Object ref = iniCtx.lookup("EchoBean"); + EchoHome home = (EchoHome) ref; + Echo echo = home.create(); + + System.out.println("Created Echo"); + + System.out.println("Echo.echo('Hello') = " + echo.echo("Hello")); + } + } + + + + Для элементов меню следует использовать тэги menuchoice guimenu guimenuitem + + Files + Exit Emacs + . Нажмите кнопку Записать + +
+ +
+ Примечания и предупреждения + + Чтобы привлечь внимание читателя к важной информации, используются три стиля. + + + + + Примечания обычно содержат дополнительную информацию. Если вы их проигнорируете, + это не критично, но вы можете пропустить совет, который, возможно, поможет сэкономить + время при выполнении задания. + + + + + + На информацию, отмеченную как важную, следует обратить особое внимание. Она может + включать изменения настроек текущего сеанса или, например, перечень служб, + которые нужно запустить, прежде чем обновления вступят в силу. Ознакомление + с важной информацией значительно облегчит вашу работу. + + + + + + Не стоит игнорировать предупреждения, так как они содержат важную информацию, которая позволит избежать потери данных. + + + + + Можно менять заголовок + + Если сильно захочется заголовок меняется + + + +
+ +
+ Списки + + + + И раз + + + И два + + + И три + + + Ёлочка гори! + + + + + + Нумерованный список + + + Строка номер два + + + Строка номер три + + + Последняя строка + + + + + Подсвеченная ссылка + + + + Не подсвеченная ссылка http://www.altlinux.ru/ + + +
+ +
+
\ No newline at end of file diff --git a/ru-RU/docs.ent b/ru-RU/docs.ent new file mode 100644 index 0000000..8858e8f --- /dev/null +++ b/ru-RU/docs.ent @@ -0,0 +1,2 @@ + + diff --git a/ru-RU/docs.xml b/ru-RU/docs.xml new file mode 100644 index 0000000..bc0740f --- /dev/null +++ b/ru-RU/docs.xml @@ -0,0 +1,31 @@ + + +%BOOK_ENTITIES; +]> + + + + + + + + + + + + + + + + + + + diff --git a/system-management/acc/images/alterator-not-browser-login.png b/ru-RU/images/alterator-not-browser-login.png similarity index 100% rename from system-management/acc/images/alterator-not-browser-login.png rename to ru-RU/images/alterator-not-browser-login.png diff --git a/system-management/acc/images/alterator-not-browser.png b/ru-RU/images/alterator-not-browser.png similarity index 100% rename from system-management/acc/images/alterator-not-browser.png rename to ru-RU/images/alterator-not-browser.png diff --git a/admin-basics/terminal/basic/images/FreeDOS-Linux.dia.png b/ru-RU/images/boot-live.png similarity index 100% rename from admin-basics/terminal/basic/images/FreeDOS-Linux.dia.png rename to ru-RU/images/boot-live.png diff --git a/install-guide/images/datetime-0.png b/ru-RU/images/datetime-0.png similarity index 100% rename from install-guide/images/datetime-0.png rename to ru-RU/images/datetime-0.png diff --git a/install-guide/images/datetime-1.png b/ru-RU/images/datetime-1.png similarity index 100% rename from install-guide/images/datetime-1.png rename to ru-RU/images/datetime-1.png diff --git a/desktop-xfce/images/desktop-xfce.png b/ru-RU/images/desktop-xfce.png similarity index 100% rename from desktop-xfce/images/desktop-xfce.png rename to ru-RU/images/desktop-xfce.png diff --git a/system-start/images/dm.png b/ru-RU/images/dm.png similarity index 100% rename from system-start/images/dm.png rename to ru-RU/images/dm.png diff --git a/desktop-software/internet/web/firefox/images/firefox.png b/ru-RU/images/firefox.png similarity index 100% rename from desktop-software/internet/web/firefox/images/firefox.png rename to ru-RU/images/firefox.png diff --git a/install-guide/images/grub.png b/ru-RU/images/grub.png similarity index 100% rename from install-guide/images/grub.png rename to ru-RU/images/grub.png diff --git a/admin-basics/terminal/basic/images/IPTables.dia.png b/ru-RU/images/hello.png similarity index 100% rename from admin-basics/terminal/basic/images/IPTables.dia.png rename to ru-RU/images/hello.png diff --git a/ru-RU/images/icon.svg b/ru-RU/images/icon.svg new file mode 100644 index 0000000..b2f16d0 --- /dev/null +++ b/ru-RU/images/icon.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/install-guide/images/installer-network.png b/ru-RU/images/installer-network.png similarity index 100% rename from install-guide/images/installer-network.png rename to ru-RU/images/installer-network.png diff --git a/desktop-software/office/libreoffice/images/libreoffice.png b/ru-RU/images/libreoffice.png similarity index 100% rename from desktop-software/office/libreoffice/images/libreoffice.png rename to ru-RU/images/libreoffice.png diff --git a/install-guide/images/license.png b/ru-RU/images/license.png similarity index 100% rename from install-guide/images/license.png rename to ru-RU/images/license.png diff --git a/admin-basics/terminal/basic/images/PC-Sh-Term-User.dia.png b/ru-RU/images/live-system.png similarity index 100% rename from admin-basics/terminal/basic/images/PC-Sh-Term-User.dia.png rename to ru-RU/images/live-system.png diff --git a/install-guide/images/luks-create-partition.png b/ru-RU/images/luks-create-partition.png similarity index 100% rename from install-guide/images/luks-create-partition.png rename to ru-RU/images/luks-create-partition.png diff --git a/system-start/images/luks-enter-password.png b/ru-RU/images/luks-enter-password.png similarity index 100% rename from system-start/images/luks-enter-password.png rename to ru-RU/images/luks-enter-password.png diff --git a/install-guide/images/luks-set-password.png b/ru-RU/images/luks-set-password.png similarity index 100% rename from install-guide/images/luks-set-password.png rename to ru-RU/images/luks-set-password.png diff --git a/install-guide/images/lvm-create-logical-volume.png b/ru-RU/images/lvm-create-logical-volume.png similarity index 100% rename from install-guide/images/lvm-create-logical-volume.png rename to ru-RU/images/lvm-create-logical-volume.png diff --git a/install-guide/images/lvm-create-volume-group.png b/ru-RU/images/lvm-create-volume-group.png similarity index 100% rename from install-guide/images/lvm-create-volume-group.png rename to ru-RU/images/lvm-create-volume-group.png diff --git a/system-management/network/images/nm-applet-LMB.png b/ru-RU/images/nm-applet-LMB.png similarity index 100% rename from system-management/network/images/nm-applet-LMB.png rename to ru-RU/images/nm-applet-LMB.png diff --git a/system-management/network/images/nm-applet-RMB.png b/ru-RU/images/nm-applet-RMB.png similarity index 100% rename from system-management/network/images/nm-applet-RMB.png rename to ru-RU/images/nm-applet-RMB.png diff --git a/system-management/network/images/nm-applet-help.png b/ru-RU/images/nm-applet-help.png similarity index 100% rename from system-management/network/images/nm-applet-help.png rename to ru-RU/images/nm-applet-help.png diff --git a/system-management/network/images/nm-applet-pass.png b/ru-RU/images/nm-applet-pass.png similarity index 100% rename from system-management/network/images/nm-applet-pass.png rename to ru-RU/images/nm-applet-pass.png diff --git a/desktop-software/internet/im/pidgin/images/pidgin-settings.png b/ru-RU/images/pidgin-settings.png similarity index 100% rename from desktop-software/internet/im/pidgin/images/pidgin-settings.png rename to ru-RU/images/pidgin-settings.png diff --git a/desktop-software/internet/im/pidgin/images/pidgin.png b/ru-RU/images/pidgin.png similarity index 100% rename from desktop-software/internet/im/pidgin/images/pidgin.png rename to ru-RU/images/pidgin.png diff --git a/admin-basics/terminal/basic/images/PC-Term-User.dia.png b/ru-RU/images/pkg-0.png similarity index 100% rename from admin-basics/terminal/basic/images/PC-Term-User.dia.png rename to ru-RU/images/pkg-0.png diff --git a/install-guide/images/pkg.png b/ru-RU/images/pkg.png similarity index 100% rename from install-guide/images/pkg.png rename to ru-RU/images/pkg.png diff --git a/admin-basics/terminal/basic/images/dir-tree.tex.png b/ru-RU/images/prepare-hdd.png similarity index 100% rename from admin-basics/terminal/basic/images/dir-tree.tex.png rename to ru-RU/images/prepare-hdd.png diff --git a/install-guide/images/raid-create-partition.png b/ru-RU/images/raid-create-partition.png similarity index 100% rename from install-guide/images/raid-create-partition.png rename to ru-RU/images/raid-create-partition.png diff --git a/install-guide/images/raid-select-members.png b/ru-RU/images/raid-select-members.png similarity index 100% rename from install-guide/images/raid-select-members.png rename to ru-RU/images/raid-select-members.png diff --git a/install-guide/images/release-notes.png b/ru-RU/images/release-notes.png similarity index 100% rename from install-guide/images/release-notes.png rename to ru-RU/images/release-notes.png diff --git a/admin-basics/terminal/basic/images/focus.ppm.bz2.png b/ru-RU/images/set-language.png similarity index 100% rename from admin-basics/terminal/basic/images/focus.ppm.bz2.png rename to ru-RU/images/set-language.png diff --git a/admin-basics/terminal/basic/images/kde-start.ppm.bz2.png b/ru-RU/images/small_cd-writer.png similarity index 100% rename from admin-basics/terminal/basic/images/kde-start.ppm.bz2.png rename to ru-RU/images/small_cd-writer.png diff --git a/system-start/images/system-boot.png b/ru-RU/images/system-boot.png similarity index 100% rename from system-start/images/system-boot.png rename to ru-RU/images/system-boot.png diff --git a/desktop-software/file-manager/thunar/images/thunar.png b/ru-RU/images/thunar.png similarity index 100% rename from desktop-software/file-manager/thunar/images/thunar.png rename to ru-RU/images/thunar.png diff --git a/desktop-software/internet/mail/thunderbird/images/thunderbird-message.png b/ru-RU/images/thunderbird-message.png similarity index 100% rename from desktop-software/internet/mail/thunderbird/images/thunderbird-message.png rename to ru-RU/images/thunderbird-message.png diff --git a/desktop-software/internet/mail/thunderbird/images/thunderbird.png b/ru-RU/images/thunderbird.png similarity index 100% rename from desktop-software/internet/mail/thunderbird/images/thunderbird.png rename to ru-RU/images/thunderbird.png diff --git a/install-guide/images/users-add.png b/ru-RU/images/users-add.png similarity index 100% rename from install-guide/images/users-add.png rename to ru-RU/images/users-add.png diff --git a/install-guide/images/users-root.png b/ru-RU/images/users-root.png similarity index 100% rename from install-guide/images/users-root.png rename to ru-RU/images/users-root.png diff --git a/desktop-xfce/images/xfce-setting-manager.png b/ru-RU/images/xfce-setting-manager.png similarity index 100% rename from desktop-xfce/images/xfce-setting-manager.png rename to ru-RU/images/xfce-setting-manager.png diff --git a/ru-RU/install-distro/backup-before-install.xml b/ru-RU/install-distro/backup-before-install.xml new file mode 100644 index 0000000..f427b8e --- /dev/null +++ b/ru-RU/install-distro/backup-before-install.xml @@ -0,0 +1,41 @@ + + + + + Сохранение данных и меры предосторожности + + Если вы хотите установить ALT Linux и при этом сохранить уже установленную на вашем + компьютере операционную систему (например, другую версию GNU/Linux или Microsoft + Windows), вам нужно обязательно позаботиться о подготовке компьютера к установке второй + системы и о сохранении ценных для вас данных. + + Если у вас нет загрузочного диска для уже установленной системы, создайте его. В + случае прерванной установки ALT Linux или неправильной настройки загрузчика, вы можете + потерять возможность загрузиться в вашу предыдущую ОС. + + Если на диске, выбранном для установки ALT Linux, не осталось свободного раздела, то + программа установки должна будет изменить размер существующего раздела. От этой операции + могут пострадать ваши данные, поэтому предварительно надо сделать следующие + действия. + + + + Выполнить проверку раздела, который вы собираетесь уменьшать. Для этого воспользуйтесь + соответствующим программным обеспечением (далее — ПО), входящим в состав уже установленной + ОС. Программа установки ALT Linux может обнаружить некоторые очевидные ошибки при изменении + размера раздела, но специализированное ПО предустановленной ОС справится с этой задачей + лучше. + + + + Выполнить дефрагментацию уменьшаемого раздела в целях повышения уровня безопасности + данных. Это действие не является обязательным, но мы настоятельно рекомендуем его + произвести: изменение размера раздела пройдёт легче и быстрее. + + + + Полной гарантией от проблем, связанных с потерей данных, является резервное + копирование! + + \ No newline at end of file diff --git a/ru-RU/install-distro/boot-disk.xml b/ru-RU/install-distro/boot-disk.xml new file mode 100644 index 0000000..f63acd8 --- /dev/null +++ b/ru-RU/install-distro/boot-disk.xml @@ -0,0 +1,215 @@ + + + + + Подготовка установочного диска + + Наиболее частый способ установки операционной системы на компьютер представляет собой + установку с установочного DVD-диска. В этой главе описываются различные способы записи + дистрибутива ALT Linux на DVD-диск. + + Начиная с Шестой платформы установочные образы ALT Linux являются гибридными, что + позволяет производить установку записав такой образ на USB Flash. Об записи установочного + образа на USB Flash также рассказано в этой главе. + + +
+ Запись образа ISO дистрибутива на DVD +
+ Запись образа диска под операционной системой MS Windows + + Файл ISO-образа диска — это файл специального формата, подготовленный для записи + на диск. Для записи ISO-образа под операционной системой MS Windows используйте + специальные программы: SCDWriter, Nero BurningROM и другие. Рекомендуем для записи + использовать новые диски от известных производителей, таких как: Verbatim, Mirex, + Memorex. Записанный на плохой диск образ может вызвать неразрешимые проблемы при + установке. + +
+ Запись образа диска с помощью Small CD-Writer + + Весь процесс записи установочного диска при помощи Small CD-Writer состоит из + следующих шагов: + + + + скачайте архив программы Small CD-Writer + ; + + + распакуйте скачанный архив в любую директорию; + + + вставьте чистый диск в привод; + + + войдите в распакованную папку и запустите программу SCDWriter.exe; + + + откройте пункт меню + + Диск + Записать ISO-образ на диск + + и, в появившемся окне, укажите путь к образу диска; + + + нажмите кнопку Записать. + + + + + + + + + + Окно программы Small CD-Writer + + + + +
+ +
+ Запись образа диска с помощью <application>Nero BurningROM</application> + + Весь процесс записи установочного диска при помощи Small CD-Writer состоит из + следующих шагов: + + + если у вас не установлена эта программа, скачайте её с сайта производителя + и установите; + + + запустите программу и выберите в списке устройств необходимый для записи + CD/DVD дисковод; + + + щёлкните по кнопке Открыть проект в главном окне. В появившемся окне выберите + необходимый ISO-образ для записи и нажмите кнопку Открыть; + + + в окне Запись проекта (Записать образ) настройте необходимые параметры; + + + приступайте к записи ISO-образа на диск, щёлкнув по кнопке Запись (Burn). + + + +
+
+ +
+ Запись образа диска под операционной системой Linux + + Для записи ISO-образов можно использовать множество утилит и программ с + графическим или текстовым интерфейсом. Наиболее удобно использовать программы K3b или + Brasero, которые поставляются в комплекте любого дистрибутива операционной системы + Linux. + +
+ Запись образа диска с помощью K3b + Весь процесс записи установочного диска при помощи K3b состоит из следующих шагов: + + + + если программа k3b отсутствует, установите её в систему, используя стандартные + для вашего дистрибутива инструменты установки программ; + + + запустите программу. При правильных настройках программа сообщит об отсутствии + проблем с системой и предложит перейти к записи на диск; + + + в меню главного окна Сервис (Service) выберите пункт Записать образ DVD (Burn + DVD image); + + + в появившемся окне Записать образ DVD (Burn DVD image) нажмите на кнопку Выбор + файла для записи. Откроется диалог, в котором необходимо выбрать ISO-образ для + записи и после выбора нажать кнопку ОК; + + + если вы всё сделали правильно, программа покажет информацию о ISO-файле и + начнёт вычислять контрольную сумму. Эта операция может занять несколько минут. Вы + можете сравнить полученную контрольную сумму с MD5SUM суммой на странице + дистрибутива; + + + если числа не сходятся, то значит вы выбрали для записи не тот файл или + скачанный вами ISO-образ был испорчен во время передачи данных по сети; + + + если цифры сходятся, вставьте диск для записи в дисковод. Дождитесь активации + кнопки Начать (Start); + + + нажмите на кнопку Начать (Start). + + + +
+
+
+ +
+ Запись установочного образа на USB Flash + + Как и при записи DVD-диска вам потребуется ISO-образ установочного диска. + +
+ В операционной системе Windows + + Весь процесс записи установочного диска на USB Flash при помощи Image Writer + состоит из следующих шагов: + + + скачайте архив с программой Image Writer + ; + + + распакуйте архив c Image Writer в каталог, не содержащий кириллических + символов; + + + вставьте USB Flash в USB-разъем (объём USB Flash должен быть не менее размера + установочного образа); + + + запустите файл .exe; + + + в появившимся окне укажите ссылку на образ и выбрать устройство (USB + Flash); + + + нажмите кнопку Write. + + + +
+ +
+ В операционной системе Linux + + Для записи установочного образа можно воспользоваться утилитой командной строки + dd. Выполните с правами пользователя root следующие команды: + +dd if=alt.iso of=/dev/sdX bs=1M +sync + + + + Здесь alt.iso — ISO-образ диска, а /dev/sdX — usb-устройство. Просмотреть список + доступных можно командой lsblk или (если такой команды нет): blkid. + + + Будьте внимательны при указании имени usb-устройства — запись образа по ошибке на + свой жёсткий диск приведёт к почти гарантированной потере данных на нём! + + +
+
+
\ No newline at end of file diff --git a/ru-RU/install-distro/index.xml b/ru-RU/install-distro/index.xml new file mode 100644 index 0000000..a217f7d --- /dev/null +++ b/ru-RU/install-distro/index.xml @@ -0,0 +1,30 @@ + + + + + Установка дистрибутива + + + В этой части рассматривается процесс установки дистрибутива. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru-RU/install-distro/install-add-root.xml b/ru-RU/install-distro/install-add-root.xml new file mode 100644 index 0000000..b59d86f --- /dev/null +++ b/ru-RU/install-distro/install-add-root.xml @@ -0,0 +1,55 @@ + + + + + Администратор системы + + Linux — это многопользовательская система. На практике это означает, что + для работы в системе необходимо зарегистрироваться, т.е. + дать понять системе, кто именно находится за монитором и клавиатурой. Наиболее + распространённый способ регистрации на сегодняшний день — использование + системных имён (login name) и паролей + (password). Это надёжное средство подтверждения того, что с системой работает + тот, кто нужно. Пользователям рекомендуется создавать достаточно сложные, не + слишком короткие пароли и хранить их в секрете. + + При наборе пароля вместо символов на экране высвечиваются звёздочки. + Чтобы избежать опечатки при вводе пароля, его предлагается ввести дважды. Можно + воспользоваться автоматическим созданием пароля, выбрав Создать + автоматически. Вам будет предложен случайно сгенерированный и + достаточно надёжный вариант пароля. Можно принять автоматически сгенерированный + пароль (не забудьте при этом запомнить пароль!) или запросить другой вариант + пароля при помощи кнопки Сгенерировать. + + + + + + + + Администратор системы + + + + + В любой системе Linux всегда присутствует один специальный пользователь — + администратор системы, он же + суперпользователь. Для него зарезервировано стандартное + системное имя — root. + + Администратор системы отличается от всех прочих пользователей тем, что + ему позволено производить любые, в том числе самые + разрушительные изменения в системе. Поэтому выбор пароля администратора системы + — очень важный момент для безопасности. Любой, кто сможет + ввести его правильно (узнать или подобрать), получит неограниченный доступ к + системе. Даже ваши собственные неосторожные действия от имени root могут иметь + катастрофические последствия для всей системы. + + Стоит запомнить пароль root — его нужно будет вводить для + получения права изменять настройки системы с помощью стандартных средств + настройки ALT Linux. Более подробную информацию о режиме суперпользователя вы + можете прочитать в главе . + + \ No newline at end of file diff --git a/ru-RU/install-distro/install-add-user.xml b/ru-RU/install-distro/install-add-user.xml new file mode 100644 index 0000000..fecafe4 --- /dev/null +++ b/ru-RU/install-distro/install-add-user.xml @@ -0,0 +1,41 @@ + + + + + Системный пользователь + + + + + + + + Системный пользователь + + + + + Помимо администратора (root) в систему необходимо добавить по меньшей + мере одного обычного системного пользователя. Работа от + имени администратора системы считается опасной, поэтому повседневную работу в + Linux следует выполнять от имени ограниченного в полномочиях системного + пользователя. + + При добавлении системного пользователя предлагается ввести имя учётной записи + пользователя. Имя учётной записи всегда представляет собой одно слово, состоящее только из + строчных латинских букв (заглавные запрещены), цифр и символа подчёркивания «_» (причём цифра и + символ «_» не могут стоять в начале слова). + + Для того чтобы исключить опечатки, пароль пользователя вводится дважды. Пароль + пользователя можно создать автоматически, по аналогии с автоматическим созданием пароля + суперпользователя. + + В процессе установки предлагается создать только одну учётную запись системного + пользователя — от его имени можно выполнять задачи, не требующие привилегий + суперпользователя. + + Учётные записи для всех прочих пользователей системы можно будет создать в любой момент + после установки операционной системы. + + \ No newline at end of file diff --git a/ru-RU/install-distro/install-datetime.xml b/ru-RU/install-distro/install-datetime.xml new file mode 100644 index 0000000..9e9f5b3 --- /dev/null +++ b/ru-RU/install-distro/install-datetime.xml @@ -0,0 +1,59 @@ + + + + + Дата и время + + + + + + + + Дата и время (выбор часового пояса) + + + + + Для корректной установки даты и времени достаточно правильно указать часовой пояс и + выставить желаемые значения для даты и времени. + + Для установки часового пояса в соответствующих списках выберите страну, а затем регион. + Поиск по списку можно ускорить, набирая на клавиатуре первые буквы искомого слова. + + Обратите внимание на отметку Хранить время в BIOS по Гринвичу. + Если Linux — единственная + установленная операционная система, то поставьте эту отметку. Если Linux устанавливается как + вторая система, то эту отметку необходимо снять. Если этого не сделать, то время и дата в уже + установленной операционной системе могут отображаться неверно. + + Проверьте, верно ли отображаются дата и время в графе Текущее время, + и, при необходимости, выставьте правильные значения (кнопка + Изменить…). + + + + + + + + Дата и время + + + + + Если ваш компьютер подключён к локальной сети или к сети Интернет, можно включить функцию + синхронизации системных часов с удалённым сервером времени (NTP). Это позволит вашему + компьютеру автоматически подводить часы так, чтобы время было максимально точным. Для этого + достаточно отметить пункт Получать точное время с NTP-сервера + и указать предпочитаемый NTP-сервер. В большинстве случаев вас устроит сервер + pool.ntp.org. + + Если выбрана опция Получать точное время с NTP-сервера, + то ваш компьютер может и сам быть + сервером точного времени. Например, использоваться как сервер точного времени машинами вашей + локальной сети. Для активации этой возможности отметьте + Работать как NTP-сервер. + + \ No newline at end of file diff --git a/ru-RU/install-distro/install-grub.xml b/ru-RU/install-distro/install-grub.xml new file mode 100644 index 0000000..889ba81 --- /dev/null +++ b/ru-RU/install-distro/install-grub.xml @@ -0,0 +1,37 @@ + + + + + Установка загрузчика + + + + + + + + Установка загрузчика + + + + + Загрузчик Linux — это программа, которая позволяет загружать Linux и другие операционные + системы. Если на вашем компьютере будет установлен только Linux, то здесь не нужно ничего + изменять, просто нажмите Далее. + + Если же вы планируете использовать и другие операционные системы, уже установленные на + этом компьютере, тогда имеет значение на каком жёстком диске или в каком разделе будет + расположен загрузчик. В большинстве случаев программа установки сама правильно подберёт + расположение загрузчика. Вы можете указать расположение самостоятельно, либо вовсе не + устанавливать предлагаемый загрузчик, если, к примеру, вы уже используете какой-то сторонний + загрузчик. + + + При установке на EFI выберите в качестве устройства + для установки «EFI». Рекомендуется выбрать + автоматическое разбиения на этапе разметки диска для создания необходимых + разделов для загрузки с EFI. + + + \ No newline at end of file diff --git a/ru-RU/install-distro/install-license.xml b/ru-RU/install-distro/install-license.xml new file mode 100644 index 0000000..fc51928 --- /dev/null +++ b/ru-RU/install-distro/install-license.xml @@ -0,0 +1,39 @@ + + + + + Лицензионный договор + + + + + + + + Лицензионный договор + + + + + Перед продолжением установки следует внимательно прочитать условия лицензии. В лицензии + говорится о ваших правах. В частности, за вами закрепляются права на: + + + эксплуатацию программ на любом количестве компьютеров и в любых целях; + + + распространение программ (сопровождая их копией авторского договора); + + + получение исходных текстов программ. + + + + + Если вы приобрели дистрибутив, то данное лицензионное соглашение прилагается в печатном + виде к вашей копии дистрибутива. Лицензия относится ко всему дистрибутиву ALT Linux. Если вы + согласны с условиями лицензии, отметьте пункт Да, я согласен с условиями + и нажмите Далее. + + \ No newline at end of file diff --git a/ru-RU/install-distro/install-load-from-boot-disk.xml b/ru-RU/install-distro/install-load-from-boot-disk.xml new file mode 100644 index 0000000..21cca66 --- /dev/null +++ b/ru-RU/install-distro/install-load-from-boot-disk.xml @@ -0,0 +1,45 @@ + + + + + Начало установки: загрузка системы + + Для того чтобы начать установку, необходимо загрузиться с DVD-диска, на котором записан + дистрибутив. В этом случае может потребоваться включить в BIOS опцию загрузки с CD/DVD-привода. + Способ входа в меню BIOS и расположение конкретных настроек определяется + производителем используемого оборудования. + + + + В большинстве случаев способ входа в BIOS отображается на вашем мониторе непосредственно + после включения компьютера. За информацией о расположении настроек можно обратиться к + документации на ваше оборудование. + + + После загрузки компьютера с установочного диска выводится меню, в котором вы можете + выбрать возможные варианты загрузки системы, а так же запустить уже установленную на жёстком + диске ОС или выполнить проверку памяти. + + + + + + + + Загрузка + + + + + + + Мышь на этом этапе установки не поддерживается. Для выбора опций установки и различных + вариантов необходимо использовать клавиатуру. + + + Для начала процесса установки клавишами перемещения курсора вверx и вниз необходимо + выбрать пункт меню Установка или + Установка в безопасном режиме, а затем нажать Enter. + + \ No newline at end of file diff --git a/ru-RU/install-distro/install-luks-set-password.xml b/ru-RU/install-distro/install-luks-set-password.xml new file mode 100644 index 0000000..3e9e4ed --- /dev/null +++ b/ru-RU/install-distro/install-luks-set-password.xml @@ -0,0 +1,34 @@ + + + + + Установка пароля на шифрованные разделы + + + Если вы не создавали шифруемые разделы, то этот шаг пропускается автоматически. В этом + случае сразу переходите к главе . + + + + + + + + + Установка пароля на LUKS-разделы + + + + + На этом этапе требуется ввести пароль для шифруемых разделов. Этот пароль потребуется + вводить для того, чтобы получать доступ к информации на данных разделах. + + Например, если вы зашифровали + /home, + то во время загрузки системы будет + необходимо ввести пароль для этого раздела, иначе вы не сможете получить доступ + в систему под своим именем пользователя. + + \ No newline at end of file diff --git a/ru-RU/install-distro/install-network.xml b/ru-RU/install-distro/install-network.xml new file mode 100644 index 0000000..b290f99 --- /dev/null +++ b/ru-RU/install-distro/install-network.xml @@ -0,0 +1,25 @@ + + + + + Настройка сети + + + + + + + + Настройка сети + + + + + На этом этапе необходимо задать параметры настройки сети: IP-адреса сетевых интерфейсов, + DNS-сервер, шлюз и т.п. Конкретные значения будут зависеть от используемого вами сетевого + окружения. Ручного введения настроек можно избежать при наличии в вашей сети настроенного + DHCP-сервера. В этом случае все необходимые сетевые настройки будут получены + автоматически. + + \ No newline at end of file diff --git a/ru-RU/install-distro/install-order.xml b/ru-RU/install-distro/install-order.xml new file mode 100644 index 0000000..5fa44f3 --- /dev/null +++ b/ru-RU/install-distro/install-order.xml @@ -0,0 +1,76 @@ + + + + + Последовательность установки + + Процесс установки разделён на шаги. Каждый шаг посвящён настройке или установке + определённого свойства системы. Шаги нужно проходить последовательно. Переход к следующему + шагу происходит по нажатию кнопки Далее. При помощи кнопки Назад, при необходимости, можно + вернуться к уже пройденному шагу и изменить настройки. Однако возможность перехода к + предыдущему шагу ограничена теми шагами, в которых нет зависимости от данных, введённых + ранее. + + Если по каким-то причинам возникла необходимость прекратить установку, нажмите кнопку + перезагрузки (reset) на вашем компьютере. Важно помнить, что совершенно безопасно прекращать + установку можно только до шага «Подготовка диска», + поскольку до этого момента не производится + никаких изменений на жёстком диске. Если прервать установку между шагами + «Подготовка диска» и + «Установка загрузчика», то, + вероятно, после этого с жёсткого диска не сможет загрузиться ни + одна из установленных систем. + + Каждый шаг сопровождается краткой справкой, которую можно вызвать, щёлкнув кнопку Справка + или нажав F1. + + Во время установки системы выполняются следующие шаги: + + + ; + + + ; + + + ; + + + ; + + + ; + + + ; + + + ; + + + ; + + + ; + + + ; + + + . + + + + \ No newline at end of file diff --git a/ru-RU/install-distro/install-prepare-hdd.xml b/ru-RU/install-distro/install-prepare-hdd.xml new file mode 100644 index 0000000..48ce611 --- /dev/null +++ b/ru-RU/install-distro/install-prepare-hdd.xml @@ -0,0 +1,283 @@ + + + + + Подготовка диска + + + + + + + + Подготовка диска + + + + + Переход к этому шагу может занять некоторое время. Время ожидания зависит от + производительности компьютера, объёма жёсткого диска, количества разделов на нём и + т.п. + + На этом этапе подготавливается площадка для установки ALT Linux, в первую очередь — + выделяется свободное место на диске. + +
+ Выбор профиля разбиения диска + + В списке разделов перечислены уже существующие на жёстких дисках разделы (в том числе + здесь могут оказаться съёмные flash-диски, подключённые к компьютеру в момент установки). + Ниже перечислены доступные профили разбиения диска. + + Профиль — это шаблон распределения места на диске для установки Linux. Можно выбрать + один из профилей: + + + Использовать неразмеченное пространство; + + + Удалить все разделы и создать разделы автоматически; + + + Подготовить разделы вручную. + + + + + Первые два профиля предполагают автоматическое разбиение диска. +
+ +
+ Автоматические профили разбиения диска + + + Будьте внимательны при использовании автоматических профилей разбиения + дисков. Соответствующие изменения на диске происходят сразу же по нажатию кнопки + Далее. + + + Если при применении одного из профилей автоматического разбиения диска доступного + места на диске окажется недостаточно, то на монитор будет выведено сообщение об ошибке: + Невозможно создать все разделы, недостаточно места на диске. + + Если данное сообщение появилось после попытки применить профиль + Использовать неразмеченное пространство, то вы можете + полностью очистить место на диске, применив профиль + Удалить все разделы и создать разделы автоматически. + + Если сообщение о недостатке места на диске появляется и при применении профиля + Удалить все разделы и создать разделы автоматически, то это + связано с недостаточным для использования автоматических методов разметки объёмом + всего диска. В этом случае вы можете воспользоваться методом ручной разметки: профиль + Подготовить разделы вручную. + + + Будьте осторожны при применении профиля Удалить все разделы и создать + разделы автоматически! В этом случае будут удалены все данные со всех дисков + (включая внешние flash-диски) без возможности восстановления. Рекомендуется использовать + эту возможность при полной уверенности в том, что диски не содержат + никаких ценных данных. + + +
+ +
+ Ручной профиль разбиения диска + + При необходимости освободить часть дискового пространства следует воспользоваться + профилем разбиения вручную. Вы сможете удалить некоторые из существующих разделов или + содержащиеся в них файловые системы. После этого можно создать необходимые разделы + самостоятельно или вернуться к шагу выбора профиля и применить один из автоматических + профилей. Выбор этой возможности требует знаний об устройстве диска и технологиях его + разметки. + + По нажатию Далее будет произведена запись новой + таблицы разделов на диск и форматирование разделов. Только что созданные на + диске программой установки разделы пока не содержат данных и поэтому + форматируются без предупреждения. Уже существовавшие, но изменённые разделы, + которые будут отформатированы, помечаются специальным значком в колонке + Файловая система слева от названия. Если вы уверены в том, + что подготовка диска завершена, подтвердите переход к следующему шагу нажатием + кнопки Далее. + + Не следует форматировать разделы с теми данными, которые вы хотите + сохранить, например, со старыми пользовательскими данными + (/home) или с другими операционными + системами. Отформатировать можно любые разделы, которые вы хотите «очистить» + (т.е. удалить все данные). + + + Не уменьшайте NTFS-раздел с установленной Microsoft Windows + Vista/Windows 7 средствами программы + установки. В противном случае вы не сможете загрузить Microsoft + Windows Vista/Windows 7 после + установки ALT Linux. Для выделения места под + установку ALT Linux воспользуйтесь средствами, + предоставляемыми самой Microsoft Windows + Vista/Windows 7: Управление + дискамиСжать. + + +
+ +
+ Дополнительные возможности разбиения диска + + Ручной профиль разбиения диска позволяет установить ОС на программный RAID-массив, + разместить разделы в томах LVM и использовать шифрование на разделах. Данные возможности + требуют от пользователя понимания принципов функционирования указанных технологий. + +
+ Создание программного RAID-массива + + + Обратите внимание, что для создания программного RAID-массива потребуется минимум + два жёстких диска. + + + Программа установки поддерживает создание программных RAID-массивов следующих + типов: + + RAID 1; + RAID 0; + RAID 4/5/6; + RAID 10. + + + + Процесс подготовки к установке на RAID условно можно разбить на следующие шаги: + + создание разделов на жёстких дисках; + создание RAID-массивов на разделах жёсткого диска; + создание файловых систем на RAID-массиве. + + + + + + + + + + Создание разделов для RAID-массива + + + + + При создании разделов на жёстких дисках для последующего включения их в + RAID-массивы следует указать Тип раздела для них равным + Linux RAID. + + + При создании разделов следует учесть, что объём результирующего массива может + зависеть от размера, включённых в него разделов жёсткого диска. Например, при создании + RAID 1, результирующий размер массива будет равен размеру минимального + участника. + + + После создания разделов на дисках можно переходить к организации самих + RAID- массивов. Для этого в списке следует выбрать пункт + RAID, после чего нажать кнопку Создать + RAID. + + Далее мастер предложит выбрать тип массива и указать его участников. + + + + + + + + Выбор участников RAID-массива + + + + + После создания RAID-массивов их можно использовать как обычные разделы на жёстких + дисках, то есть, на них можно создавать файловые системы или же, например, включать их + в LVM-тома. + +
+ +
+ Создание LVM-томов + + Процесс подготовки к установке на LVM условно можно разбить на следующие шаги: + + создание группы томов LVM; + создание томов LVM; + создание файловых систем на томах LVM. + + + + + + + + + + Создание группы томов LVM + + + + + + Для создания группы томов LVM может потребоваться предварительно удалить таблицу + разделов с жёсткого диска. + + + Для создания группы томов LVM в списке следует выбрать пункт + LVM, после чего нажать кнопку Создать группу + томов. + + + + + + + + Создание тома + + + + + После создания группы томов LVM её можно использовать как обычный жёсткий + диск, то есть внутри группы томов можно создавать тома (аналог раздела на + физическом жёстком диске) и файловые системы внутри томов. + +
+ +
+ Создание шифрованных разделов + + Программа установки позволяет создавать шифрованные разделы. + + + + + + + + Создание шифрованного раздела + + + + + Процесс создания шифрованного раздела ничем не отличается от процесса + создания обычного раздела и инициируется нажатием на кнопку Создать + шифруемый раздел. + + После создания шифрованного раздела мастер, как и при создании обычного раздела, + предложит создать на нём файловую систему и при необходимости потребует указать точку + монтирования. + + + Вы не сможете установить загрузчик на зашифрованный раздел. + + +
+ +
+ +
\ No newline at end of file diff --git a/ru-RU/install-distro/install-release-notes.xml b/ru-RU/install-distro/install-release-notes.xml new file mode 100644 index 0000000..1fcf552 --- /dev/null +++ b/ru-RU/install-distro/install-release-notes.xml @@ -0,0 +1,25 @@ + + + + + Завершение установки + + + + + + + + Завершение установки + + + + + На экране последнего шага установки отображается информация о завершении установки. Эта + информация может содержать важные замечания по использованию дистрибутива. + + После нажатия кнопки Завершить автоматически + начнется перезагрузка системы. + + diff --git a/ru-RU/install-distro/install-set-language.xml b/ru-RU/install-distro/install-set-language.xml new file mode 100644 index 0000000..4cfcaca --- /dev/null +++ b/ru-RU/install-distro/install-set-language.xml @@ -0,0 +1,35 @@ + + + + + Язык + + + + + + + + Язык + + + + + + Установка &DISTRO; начинается с выбора основного языка — языка интерфейса программы + установки и устанавливаемой системы. В списке, помимо доступных языков региона (выбранного на + этапе начальной загрузки), указан и английский язык. + + На этом же этапе выбирается вариант переключения раскладки клавиатуры. Раскладка + клавиатуры — это привязка букв, цифр и специальных символов к клавишам на клавиатуре. Помимо + ввода символов на основном языке, в любой системе Linux необходимо иметь возможность вводить + латинские символы (имена команд, файлов и т.п.). Для этого обычно используется стандартная + английская раскладка клавиатуры. Переключение между раскладками осуществляется при помощи + специально зарезервированных для этого клавиш. Вы можете выбрать один из предлагаемых + вариантов. + + Если выбранный основной язык имеет всего одну раскладку (например, при выборе английского + языка в качестве основного), эта единственная раскладка будет принята автоматически. + + diff --git a/ru-RU/install-distro/install-system.xml b/ru-RU/install-distro/install-system.xml new file mode 100644 index 0000000..9ad81c6 --- /dev/null +++ b/ru-RU/install-distro/install-system.xml @@ -0,0 +1,64 @@ + + + + + Установка системы + +
+ Дополнительные приложения + + + + + + + + Выбор групп приложений + + + + + На этом шаге вы можете выбрать список необходимых вам программ для + установки. + + Выбрав необходимые группы, следует нажать Далее, + после чего начнётся установка пакетов. + +
+ +
+ Установка пакетов + + + + + + + + Установка системы + + + + + На этом этапе происходит установка набора программ, необходимых для работы + системы. + + Установка происходит автоматически в два этапа: + + получение пакетов; + установка пакетов. + + + + Получение пакетов осуществляется из источника, выбранного на этапе + начальной загрузки. При сетевой установке (по протоколу FTP или HTTP) время + выполнения этого шага будет зависеть от скорости соединения и может быть + значительно большим в сравнении с установкой с лазерного диска. + + Время ожидания окончания процесса установки программ можно посвятить + чтению руководства. + +
+ +
\ No newline at end of file diff --git a/ru-RU/install-distro/starting-os.xml b/ru-RU/install-distro/starting-os.xml new file mode 100644 index 0000000..700d14a --- /dev/null +++ b/ru-RU/install-distro/starting-os.xml @@ -0,0 +1,121 @@ + + + + + Обзор &DISTRO_RU; + +
+ Загрузка системы + + + + + + + + Загрузка системы + + + + + После включения компьютера на экране появляется меню, в котором перечислены + возможные варианты загрузки операционных систем. + + + При первом старте, в условиях установки нескольких ОС на один компьютер, возможно + отсутствие в загрузочном меню пункта/пунктов с другой/другими операционными системами, они + будут добавлены в список при последующей перезагрузке. Все перечисленные в меню после + перезагрузки варианты могут быть загружены загрузчиком Linux. + + + Стрелками клавиатуры Вверx и Вниз + выберите нужную операционную систему. Дополнительно к основным вариантам + запуска ОС из этого меню можно загрузить Linux в безопасном режиме или + запустить проверку памяти. + + Загрузка операционной системы по умолчанию (первая в списке) начинается + автоматически после небольшого времени ожидания (обычно несколько секунд). + Нажав клавишу Enter, можно начать загрузку немедленно. + + Нажатием клавиши E можно вызвать редактор параметров + текущего пункта загрузки. Если система настроена правильно, то редактировать их + нет необходимости. + + Загрузка операционной системы может занять некоторое время, в зависимости + от производительности компьютера. Основные этапы загрузки операционной системы + — загрузка ядра, подключение (монтирование) файловых систем, запуск системных + служб — периодически могут дополняться проверкой файловых систем на наличие + ошибок. В этом случае время ожидания может быть занять больше времени, чем + обычно. Подробную информацию о шагах загрузки можно получить, нажав клавишу + Esc. + +
+ +
+ Получение доступа к зашифрованным разделам + + + + + + + + Запрос ввода пароля для LUKS-раздела + + + + + В случае, если вы создали шифрованный раздел, вам потребуется вводить + пароль при обращении к этому разделу. + + Например, если вы зашифровали домашний раздел /home, то для того, чтобы войти в систему под + своим именем пользователя, вам потребуется ввести пароль этого раздела и затем + нажать Enter. + + + Если вы не успеете ввести пароль за отведенный промежуток времени, то + загрузка системы завершится ошибкой. В этом случае вам следует перезагрузить + систему. Для этого нажмите два раза Enter, а затем + последовательно зажмите клавиши Ctrl + AltDelete. + + +
+ +
+ Вход в систему + + + + + + + + Регистрация в системе + + + + + Для регистрации в системе необходимо выбрать из списка созданное вами в + процессе установки системы имя системного пользователя, ввести пароль и нажать + Enter. После непродолжительного времени ожидания запустится + графическая оболочка операционной системы. + + Добавлять новых пользователей или удалять существующих можно после загрузки системы с + помощью стандартных средств управления пользователями. + + Если систему устанавливали не вы, то имя системного пользователя и его пароль вам + должен сообщить системный администратор, отвечающий за настройку данного компьютера. + + + Поскольку работа в системе с использованием учётной записи + администратора системы небезопасна, вход в систему в + графическом режиме для суперпользователя root запрещён. Попытка + зарегистрироваться в системе будет прервана сообщением об ошибке. + + +
+ +
\ No newline at end of file diff --git a/ru-RU/install-packages/index.xml b/ru-RU/install-packages/index.xml new file mode 100644 index 0000000..5683cd7 --- /dev/null +++ b/ru-RU/install-packages/index.xml @@ -0,0 +1,29 @@ + + + +Установка дополнительного программного обеспечения + + + После установки &DISTRO;, при первом запуске, + вам доступен тот или иной набор программного обеспечения. Количество + предустановленных программ зависит от набора программ конкретного дистрибутива + или от выбора, сделанного вами при установке системы. Если вы не обнаружили в + своей системе интересующие вас программы, то вы имеете возможность доустановить + их из разных источников. + + Дополнительное программное обеспечение может находиться на установочном + диске и/или в специальных банках программ (репозиториях), расположенных в сети + Интернет и/или в локальной сети. Программы, размещённые в указанных источниках, + имеют вид подготовленных для установки пакетов. + + + + + + + + + + + diff --git a/ru-RU/install-packages/install-from-cd.xml b/ru-RU/install-packages/install-from-cd.xml new file mode 100644 index 0000000..d601f71 --- /dev/null +++ b/ru-RU/install-packages/install-from-cd.xml @@ -0,0 +1,82 @@ + + + + +Установка дополнительного ПО с установочного диска + +
Введение + + Для установки дополнительного ПО вы можете использовать + Центр управления системой либо программу управления + пакетами Synaptic. + + + + Не используйте одновременно два менеджера пакетов, так как это может привести к их + некорректной работе. + + +
+ +
<application>Центр управления системой</application> + + + + Центр управления системой + содержит модуль установки дополнительных пакетов: + + Программное обеспечение + Установка программ + . + Для облегчения поиска доступные для установки программы разделены на группы, + выводимые в левой части окна программы. Справа расположен список самих программ + с указанием их текущего состояния: + + + зелёная метка — пакет уже установлен; + белая — пакет не установлен. + + + Объяснение всех обозначений можно увидеть, отметив пункт Показать + статистику. + + Для начала установки двойным щелчком мыши отметьте неустановленный пакет в + правой половине окна и нажмите Применить. При + необходимости менеджер пакетов попросит вставить установочный диск. + + + +
+ +
Программа управления пакетами <application>Synaptic</application> + + + + Программа управления пакетами Synaptic + находится в + + Меню Xfce + Настройки + Программа управления пакетами Synaptic + . + + Для облегчения поиска доступные для установки программы разделены на группы, выводимые в + левой части окна программы. Справа расположен список самих программ с указанием их текущего + состояния: + + + + зелёная метка — пакет уже установлен; + белая — пакет не установлен. + + + Для начала установки двойным щелчком мыши отметьте неустановленный пакет в + правой половине окна и нажмите Применить. При + необходимости, менеджер пакетов попросит вставить установочный диск. + + + +
+ +
diff --git a/ru-RU/install-packages/install-from-external-repo.xml b/ru-RU/install-packages/install-from-external-repo.xml new file mode 100644 index 0000000..2eeba89 --- /dev/null +++ b/ru-RU/install-packages/install-from-external-repo.xml @@ -0,0 +1,66 @@ + + + +Добавление репозиториев + + Эта информация может пригодиться вам для установки дополнительного + программного обеспечения из внешних репозиториев. + +
Центр управления системой + + Для выбора репозитория, совместимого с вашим дистрибутивом, рекомендуем + использовать Центр управления системой + (меню + + Программное обеспечение + Источники для установки ПО + ). + Для указания конкретного репозитория в выпадающем списке отметьте один из + предлагаемых вариантов и нажмите кнопку Изменить. Если + сомневаетесь, то выбирайте ftp://ftp.altlinux.org/. К + предложенному списку вы можете самостоятельно добавить любые репозитории, нажав + на кнопку Дополнительно…. + + После добавления репозиториев обновите информацию о них: + Центр управления системой: + + Программное обеспечение + Установка программ + + кнопка Обновить. +
+ +
Программа управления пакетами Synaptic + + Программа Synaptic также может использоваться + для выбора репозитория, совместимого с вашим дистрибутивом. Для указания + конкретного репозитория в меню + + Параметры + Репозитории отметьте + + один из предлагаемых вариантов и нажмите кнопку OK. Если + вы сомневаетесь, то выбирайте строки, содержащие ftp://ftp.altlinux.org/. К + предложенному списку вы можете самостоятельно добавить любые репозитории, нажав + на кнопку Создать и введя необходимые данные. + + После добавления репозиториев обновите информацию о них: программа + управления пакетами Synaptic: + + Правка + Получить сведения о пакетаx + . + + + После выбора и добавления репозиториев необходимо получить сведения о + находящихся в них пакетах. В противном случае, список доступных для установки + программ будет не актуален. + + Непосредственная установка пакетов из добавленных репозиториев ничем не + отличается от описанной выше в главе «». + +
+ +
diff --git a/ru-RU/support/index.xml b/ru-RU/support/index.xml new file mode 100644 index 0000000..078734c --- /dev/null +++ b/ru-RU/support/index.xml @@ -0,0 +1,10 @@ + + + +Техническая поддержка продуктов ALT Linux + + + + + \ No newline at end of file diff --git a/ru-RU/support/support-free.xml b/ru-RU/support/support-free.xml new file mode 100644 index 0000000..53c754b --- /dev/null +++ b/ru-RU/support/support-free.xml @@ -0,0 +1,81 @@ + + + +Пользователям нашей продукции + + Вне зависимости от того, скачали вы или же приобрели наш дистрибутив, задавать + вопросы или обсуждать их с сообществом пользователей дистрибутивов ALT Linux вы можете на + форуме или в списках рассылки. + + Помощь сообщества: + + + + Форум: + + + + Списки рассылки: + + + + ALT Linux Wiki: + + + + Сообщить об ошибке: + + + + Планета: + + + + Репозиторий: + + + + Сборочная среда: + + + + + + Ресурсы компании ALT Linux: + + + + Сайт компании: + + + + Интернет-магазин: + + + + Техническая поддержка: + + + + Контакты: + + + + Загрузить: + + + + Торренты: + + + + + + Форум и списки рассылки читают опытные пользователи, профессиональные системные + администраторы и разработчики ALT Linux. Сообщество пользователей и специалистов окажет + содействие в поиске ответа на ваш вопрос или посоветует выход из сложной ситуации. При + обращении к данному виду помощи у вас нет гарантии на полноту и своевременность ответа, но + мы стараемся не оставлять без ответа вопросы, задаваемые в списках. + + \ No newline at end of file diff --git a/ru-RU/support/support-paid.xml b/ru-RU/support/support-paid.xml new file mode 100644 index 0000000..ffdade5 --- /dev/null +++ b/ru-RU/support/support-paid.xml @@ -0,0 +1,14 @@ + + + +Покупателям нашей продукции + + Право на получение консультационной и технической поддержки вы приобретаете при покупке + большинства продуктов торговой марки ALT Linux. Сроки и объём помощи указаны в талоне + технической поддержки, приложенном к вашему диску. Техническая поддержка дистрибутива может + быть расширена в зависимости от потребностей пользователя. + + Условия технической поддержки можно найти на интернет-сайте + . + \ No newline at end of file diff --git a/ru-RU/system-management/acc.xml b/ru-RU/system-management/acc.xml new file mode 100644 index 0000000..7e6edd0 --- /dev/null +++ b/ru-RU/system-management/acc.xml @@ -0,0 +1,92 @@ + + + +Центр управления системой + +
Описание + + Для управления настройками установленной системы вы можете + воспользоваться Центром управления системой. + Центр управления системой представляет собой удобный + интерфейс для выполнения наиболее востребованных административных задач: + добавление и удаление пользователей, настройка сетевых подключений, просмотр + информации о состоянии системы и т.п. + + Центр управления системой состоит из + нескольких независимых диалогов-модулей. Каждый модуль отвечает за настройку + определённой функции или свойства системы. + +
+ + +
Применение центра управления системой + + Вы можете использовать центр управления системой для разных целей, например: + + Настройки Даты и времени; + Настройки Раскладок клавиатуры; + Настройки Брандмауэра; + Изменения Разрешения экрана; + Установка Загрузчика Grub; + + Изменения пароля Администратора системы + (root); + + + Создания, удаления и редактирования учётных записей + Пользователей. + + + + + Вы всегда можете воспользоваться кнопкой Справка. + Все модули центра управления системой имеют справочную информацию. + +
+ + +
+ + Запуск <application>Центра управления системой</application> в графической среде + + + Центр управления системой можно запустить следующими способами: + + + + в графической среде Xfce + + Меню Xfce + Настройки + Центр управления системой + ; + + + + из командной строки: командой acc. + + + + + + При запуске необходимо ввести пароль администратора системы (root). + + + + + + + + После успешного входа можно приступать к настройке системы. + + + + + + + +
+
\ No newline at end of file diff --git a/ru-RU/system-management/index.xml b/ru-RU/system-management/index.xml new file mode 100644 index 0000000..aed72a7 --- /dev/null +++ b/ru-RU/system-management/index.xml @@ -0,0 +1,19 @@ + + + +Настройка системы + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ru-RU/system-management/network-configuration.xml b/ru-RU/system-management/network-configuration.xml new file mode 100644 index 0000000..d2d14cf --- /dev/null +++ b/ru-RU/system-management/network-configuration.xml @@ -0,0 +1,76 @@ + + + +Настройка сети + +
<application>NetworkManager</application> + + NetworkManager позволяет подключаться к + различным типам сетей: проводные, беспроводные, мобильные, VPN и DSL, а также + сохранять эти подключения для быстрого доступа к сети. Например, если вы + подключались к сети в каком-либо интернет-кафе, то можно сохранить настройки + этого подключения и в следующее посещение этого кафе подключиться + автоматически. + + Для управления настройками сети в &DISTRO; используется программа + NetworkManager. + + + + + + + + + Меню NetworkManger + при нажатии левой кнопки мыши + + + + + При нажатии левой кнопкой мыши на значок + NetworkManager, вы увидите меню, в котором можно + выбрать одну из доступных Wi-Fi сетей и подключиться к ней. Из этого меню так + же можно отключить активное Wi-Fi соединение. + + + + + + + + + + Меню NetworkManger + при нажатии правой кнопки мыши + + + + + При нажатии правой кнопкой мыши на значок + NetworkManager, вы увидите меню, из которого можно + получить доступ к изменению некоторых настроек. Вы можете узнать версию + программы, глянуть сведения о соединении, можете изменить соединения (например, + удалить Wi-Fi сеть, чтобы не подключаться к ней автоматически). + + + + + + + + + + Запрос пароля от NetworkManger + + + + + Обратите внимание, что при работе с + NetworkManager вам потребуется вводить пароль вашей + учетной записи. + + +
+
\ No newline at end of file diff --git a/ru-RU/system-management/printer.xml b/ru-RU/system-management/printer.xml new file mode 100644 index 0000000..f74fad5 --- /dev/null +++ b/ru-RU/system-management/printer.xml @@ -0,0 +1,79 @@ + + + +Установка принтера в &DISTRO; + + Перед началом установки убедитесь в том, что в случае локального подключения принтер + присоединён к соответствующему порту компьютера и включён, а в случае сетевого подключения + принтер корректно сконфигурирован для работы в сети. + +
Последовательность установки + + Для подключения принтера в Меню Xfce выберите + + + Настройки + Центр управления системой + . + + В диалоговом окне введите пароль системного администратора root и нажмите + OK. + + В диалоге Центр управления системой в модуле + Система выберите Настройка печати. + + После запуска программы в диалоговом окне Настройка печати + нажмите кнопку Добавить. + + + + Вы можете запустить Настройку печати через командную + строку, для этого выполните команду + system-config-printer. + + + + Если вы получаете ошибку «Служба печати + недоступна.», тогда запустите терминал, и выполните команду + /etc/init.d/cups restart от имени системного администратора root. После + выполнения команды вернитесь к Настройка печати и нажмите + кнопку Обновить. + + + Определите устройство из предложенных на этапе Выберите + устройство в списке Устройства. Не забудьте + удостовериться, что тип соединения указан корректно. Нажмите + Вперед, когда будете готовы перейти к следующему + шагу. + + Назначив драйвер из перечисленных на следующем этапе Выберите + драйвер, нажмите Вперёд. Вы можете выбрать + рекомендуемый системой драйвер или задать предпочтительный: выбрать принтер из + базы данных, предоставить PDD-файл или найти драйвер принтера для + загрузки. + + Выберите модель драйвера на этапе Выберите драйвер в + списке Модели и драйвер в списке + Драйверы и нажмите Вперёд. + + В окне Опишите принтер, в строке Имя + принтера, при желании, измените имя вашего принтера. + + После нажатия Применить установка принтера завершена. + + Далее вам будет предложена проверка печати. После проверки откроется диалог, в + котором, при желании, вы можете настроить дополнительные параметры принтера: разрешение, + размер используемой по умолчанию бумаги, а также задать принтер по умолчанию. + + Изменить настройки добавленного принтера вы можете в любой момент, выбрав + в программе нужный принтер, затем в меню + + Принтер + Свойства + . + +
+ +
diff --git a/ru-RU/whatis/index.xml b/ru-RU/whatis/index.xml new file mode 100644 index 0000000..8b7dcbe --- /dev/null +++ b/ru-RU/whatis/index.xml @@ -0,0 +1,17 @@ + + + + + Что такое &DISTRO;? + + + В этой части рассматривается что такое Linux, ALT Linux и &DISTRO;. + + + + + + + + \ No newline at end of file diff --git a/ru-RU/whatis/whatis-alt.xml b/ru-RU/whatis/whatis-alt.xml new file mode 100644 index 0000000..ca2ee97 --- /dev/null +++ b/ru-RU/whatis/whatis-alt.xml @@ -0,0 +1,112 @@ + + + + Что такое ALT Linux +
+ ALT Linux Team и проект ALT + + Команда ALT Linux () — это + интернациональное сообщество, насчитывающее более 200 разработчиков свободных программ из + России, Белоруссии, Украины, Казахстана, Эстонии и Израиля. Большинство из них не является + сотрудниками OOO «Альт Линукс». Компания «Альт Линукс» координирует этот проект, + осуществляет внедрение и поддержку решений. + + Целью проекта ALT является разработка и поддержка широкого спектра решений на основе + свободных программ, отличающихся высокой степенью надёжности и защиты, простотой и + доступностью обновления, простым и логичным интерфейсом, качественной интернационализацией + и локализацией (особое внимание уделяется поддержке русского языка). Все собственные + разработки ALT Linux Team распространяются под свободными лицензиями. Проект ALT — участник + разработки и распространения свободных программ. В его команде есть и разработчики основных + компонентов Linux. Разработки команды ALT входят во все дистрибутивы ALT Linux. + +
+ +
+ Сизиф + + Sisyphus () — наш ежедневно обновляемый банк + программ (часто называемый репозиторий). На его основе создаются все дистрибутивы ALT Linux. + Поддерживаемая ALT Linux Team целостность Sisyphus, оригинальная технология сборки + программ, утилита apt-get и её графическая оболочка + synaptic позволяют пользователям + легко обновлять свои системы и быть в курсе актуальных новостей мира свободных программ. + + Обратите внимание на то, что ежедневно изменяющийся репозиторий содержит самое новое + программное обеспечение со всеми его преимуществами и недостатками (иногда ещё + неизвестными). Поэтому, перед обновлением вашей системы из Sisyphus, мы советуем взвесить + преимущества новых возможностей, реализованных в последних версиях программ, и вероятность + возникновения неожиданностей в работе с ними + (). + + Разработка Sisyphus полностью доступна. У нас нет секретных изменений кода и закрытого + тестирования с подписками о неразглашении. То, что мы сделали сегодня, завтра вы найдёте в + сети. По сравнению с другими аналогичными банками программ (Debian unstable, Mandriva + Cooker, PLD, Fedora), в Sisyphus есть немало самобытного. Особое внимание уделяется защите + системы, локализации на русский язык, полноте и корректности зависимостей. + + Название Sisyphus (Сизиф) заимствовано из греческой мифологии. C кропотливым Сизифом, + непрерывно закатывающим в гору камни, команду ALT Linux Team объединяет постоянная работа + над усовершенствованием технологий, заложенных в репозиторий. + + Sisyphus, в первую очередь, — открытая лаборатория решений. Если вам это интересно, + если вы хотите дополнить Sisyphus новыми решениями, если вы считаете, что можете собрать + какую-то программу лучше — присоединяйтесь к проекту ALT + (). +
+ +
+ Что такое седьмая платформа + + Как уже говорилось ранее, Sisyphus является часто обновляемым репозиторием, скорее + предназначенным для разработчиков. Решением для тех пользователей, которым стабильность и + предсказуемость работы системы важнее расширенной функциональности (а это в первую очередь + начинающие и корпоративные пользователи), являются стабильные дистрибутивы ALT Linux, + периодически выпускаемые на основе Sisyphus. Такие стабильные дистрибутивы ALT Linux + базируются на стабильном срезе репозитория Sisyphus. Эти срезы называются + платформами. + + Шестая платформа (p6) была создана в мае 2011 года и её поддержка продлится до конца + августа 2013. + + Седьмая платформа (p7) была создана в апреле 2013 года и её поддержка продлится до + конца августа 2015. + +
+ Основные новшества в седьмой платформе + + + + Большинство модулей Центра управления системой получили поддержку + IPv6 + + + + Для 64-битных систем реализована возможность установки и загрузки в системах + с UEFI + + + + Добавлена возможность установки на шифрованные разделы + + + В дистрибутивах для рабочих станция осуществлён переход на новую системы + инициализации systemd + + +
+ +
+ +
+ Дистрибутивы ALT Linux + + Дистрибутив Linux — это не просто собранные вместе операционная система и набор + приложений. Это интегрированная рабочая среда, предназначенная для решения различных задач + пользователей. ALT Linux выпускает специализированные и универсальные дистрибутивы, + ориентированные как на опытных, так и на начинающих пользователей. Более подробную + информацию о дистрибутивах можно найти на сайте ALT Linux + (). + +
+
\ No newline at end of file diff --git a/ru-RU/whatis/whatis-linux.xml b/ru-RU/whatis/whatis-linux.xml new file mode 100644 index 0000000..abf9684 --- /dev/null +++ b/ru-RU/whatis/whatis-linux.xml @@ -0,0 +1,127 @@ + + + + + Что такое Linux +
+ Свободные программы + Операционная система (далее — ОС) Linux — ядро, основные компоненты системы и + большинство её пользовательских приложений — свободные программы. + Свободные программы можно: + + + + запускать на любом количестве компьютеров; + + + распространять бесплатно или за деньги без каких-либо ограничений; + + + получать исходные тексты этих программ и вносить в них любые изменения. + + + + Свобода программ обеспечила их широкое использование и интерес к ним со стороны + тысяч разработчиков. Основные программы для Linux выходят под лицензией GNU + General Public License (далее — GPL). Лицензия GNU не только + гарантирует свободу, но и защищает её. Она допускает дальнейшее распространение + программ только под той же лицензией, поэтому исходный код ядра Linux, компиляторов, + библиотеки glibc, пользовательских графических оболочек не может быть использован + для создания приложений с закрытым кодом. В этом принципиальное отличие Linux от + свободных ОС семейства BSD (FreeBSD, NetBSD, OpenBSD), фрагменты которых вошли в + Microsoft Windows и даже стали основой OS X. Linux включает в себя многие разработки + BSD, но его компиляторы и системные библиотеки разработаны в рамках проекта GNU + (). +
+
+ Разработка Linux + В отличие от распространённых несвободных ОС, Linux не имеет географического + центра разработки. Нет фирмы, которая владела бы этой ОС, нет и единого + координационного центра. Программы для Linux — результат работы тысяч проектов. + Большинство из них объединяет программистов из разных стран, связанных друг с + другом только перепиской. Лишь некоторые проекты централизованы и сосредоточены в + фирмах. Создать свой проект или присоединиться к уже существующему может любой + программист, и, в случае успеха, результаты этой работы станут известны миллионам + пользователей. Пользователи принимают участие в тестировании свободных программ, + общаются с разработчиками напрямую. Это позволяет за короткий срок добавлять в + программное обеспечение новые возможности, оперативно находить ошибки и исправлять + их. + + Именно гибкая и динамичная система разработки, невозможная для проектов с закрытым + кодом, определяет исключительную экономическую эффективность Linux. Низкая стоимость + свободных разработок, отлаженные механизмы тестирования и распространения, привлечение + независимых специалистов, обладающих индивидуальным, самостоятельным видением проблем, + защита исходного текста программ лицензией GPL — всё это стало причиной успеха + свободных программ. + + Такая высокая эффективность разработки не могла не заинтересовать крупные фирмы. + Они стали создавать свои свободные проекты, основывающиеся на тех же принципах. Так + появились Mozilla, LibreOffice, свободный клон Interbase, SAP DB. IBM способствовала + переносу Linux на свои мейнфреймы. + + Открытый код программ значительно снизил себестоимость разработки закрытых + систем для Linux и позволил снизить цену решения для пользователя. Вот почему + Linux стала платформой, часто рекомендуемой для таких продуктов, как Oracle, + DB2, Informix, Sybase, SAP ERP, Lotus Domino. + +
+ +
+ Защищённость + + ОС Linux унаследовала от UNIX надёжность и отличную систему защиты. Система + разграничения доступа к файлам позволяет не бояться вирусов. Но всё же, программ без + ошибок не бывает, и Linux не исключение. Благодаря открытости исходного кода программ, + аудит системы может осуществить любой специалист без подписок о неразглашении и без + необходимости работы в стенах нанявшей его компании. Сообщества разработчиков и + пользователей свободных программ создали множество механизмов оповещения об ошибках и + их исправления. Сообщить об ошибке и принять участие в её исправлении независимому + программисту или пользователю так же просто, как специалисту фирмы-разработчика или + автору проекта. Благодаря этому ошибки защиты эффективно выявляются и быстро + исправляются. + +
+
+ Дистрибутивы Linux + + Большинство пользователей для установки Linux используют дистрибутивы. Дистрибутив + — это не просто набор программ, а готовое решение для выполнения различных задач + пользователя, обладающее идентичностью установки, управления, обновления, а также + едиными системами настройки и поддержки. + +
+
+ Новичку + + Linux — самостоятельная операционная система. Все операционные системы разные: + Linux — не Windows, не OS X и не FreeBSD. В Linux свои правила, их необходимо изучить и + к ним необходимо привыкнуть. Терпение и настойчивость в изучении Linux обернётся + значительным повышением эффективности и безопасности вашей работы. То, что сегодня + кажется странным и непривычным, завтра понравится и станет нормой. + + Не стесняйтесь задавать вопросы, ведь самый простой способ найти ответ —  совет + опытного специалиста. Взаимопомощь и общение — традиция в мире Linux. Всегда можно + обратиться за помощью к сообществу пользователей и разработчиков Linux. Большинство + вопросов повторяются, поэтому для начала стоит поискать ответ на свой вопрос в + документации, затем в сети Интернет. Если вы не нашли ответа в перечисленных + источниках, не стесняйтесь, пишите на форум или в списки рассылки так, как писали бы + своим друзьям, и вам обязательно помогут. + + Для дистрибутивов ALT Linux вы можете воспользоваться ресурсами: + + + + + Форум: + + + Списки рассылки: + + + ALT Linux Wiki: + + + +
+
diff --git a/ru-RU/whatis/whatis-simply.xml b/ru-RU/whatis/whatis-simply.xml new file mode 100644 index 0000000..75b4bf7 --- /dev/null +++ b/ru-RU/whatis/whatis-simply.xml @@ -0,0 +1,59 @@ + + + + Что такое &DISTRO; + + &DISTRO; (&DISTRO_RU;) — это простая в установке и удобная в работе операционная + система, дающая возможность пользователю решать все повседневные задачи, не опасаясь вирусов и + не затрачивая время на поиск необходимых программ в сети Интернет и на полках магазинов. + &DISTRO; — это операционная система для каждого из вас. Она легка в использовании, не + требовательна к ресурсам вашего компьютера, функциональна и надёжна. + + Проект &DISTRO; — адаптированная для обычного пользователя операционная система Linux. + Под «обычным пользователем» понимается человек, не владеющий тонкостями настройки и + использования системы. Идея проекта &DISTRO; — заинтересовать пользователя свободным + программным обеспечением, показав комфорт и удобство в работе с ним. + + В комплект &DISTRO; включено более 30 полностью русифицированных программ, + ориентированных на решение большинства потребностей пользователя. К комплекту приложен широкий + спектр драйверов устройств, что значительно упрощает работу с дополнительным + оборудованием. + + С &DISTRO; вы приобретаете простоту в освоении, продуктивность в использовании и + оперативную поддержку команды разработчиков. Основателем и первым разработчиком дистрибутива + &DISTRO; является Денис Корявов. В настоящее время проект развивается инициативной группой + компании ALT Linux. + + Мы стараемся ориентироваться прежде всего на вас: выбирать самые лучшие программы, + отвечать на любые вопросы по работе системы, писать самые подробные инструкции, в максимально + короткие сроки исправлять ошибки и совершенствовать &DISTRO; в сторону ещё большего + удобства и функциональности. + +
+ &DISTRO; LiveCD + + Важной особенностью &DISTRO; является то, что у вас есть возможность загрузиться с + диска &DISTRO; в режиме LiveCD. Таким образом вы загружаете операционную систему, не + требующую для своего функционирования установки на жёсткий диск. + + Если вы выбрали загрузку системы &DISTRO; в режиме LiveCD, то работа + осуществляется непосредственно с DVD диска, не затрагивая установленную на жёстком диске + ОС. Режим LiveCD позволяет быстро начать работу с компьютером, избегая длительного процесса + установки ОС в постоянную память. + + В режиме LiveCD вы можете пользоваться Интернетом и электронной почтой, просматривать + изображения и даже редактировать их, создавать и редактировать документы с помощью + приложений, входящих в состав &DISTRO;. + + + Для того чтобы не потерять выполненную работу во время сеанса работы в режиме LiveCD + при необходимости выключения или перезапуска компьютера, сохраните её на жёстком диске или + flash-накопителе. + + + Доступ к файлам на жёстком диске компьютера во время сеанса работы в режиме LiveCD + можно получить через файловый менеджер. + +
+
\ No newline at end of file diff --git a/school-software/index.txt b/school-software/index.txt deleted file mode 100644 index 032dd03..0000000 --- a/school-software/index.txt +++ /dev/null @@ -1,30 +0,0 @@ -= Электронные образовательные ресурсы = - -== Введение == - -В современном образовательном процессе базовый курс информатики преследует -две цели: общеобразовательную и прагматическую. Общеобразовательная цель -заключается в освоении учащимися фундаментальных понятий современной информатики. -Прагматическая -- в получении практических навыков работы с аппаратными и -программными средствами современных ЭВМ. - -Но применение компьютера в школе не ограничивается программированным и прикладным обучением. -Cпецифические и предметные учебные программы: интеллектуальные обучающие системы -(далее -- ИОС), учебные среды, микромиры и моделирование становятся интересной -и перспективной областью педагогической теории и практики. - -Обеспечение возможности осознанного усвоения содержания, внутренней логики и -структуры учебного материала посредством электронных учебных пособий, электронных -учебников, учебно-игровых, контролирующих средств и тренажёров создаёт условия -для формирования и индивидуальной коррекции предметных -знаний и умений посредством реализации различных электронных методик. - -include::integration/index_server.txt[] - -include::integration/index_client.txt[] - -include::moodle/index.txt[] - -include::trainingsoft/index.txt[] - -include::programming/index.txt[] diff --git a/school-software/integration/index_client.txt b/school-software/integration/index_client.txt deleted file mode 100644 index 3aae2b0..0000000 --- a/school-software/integration/index_client.txt +++ /dev/null @@ -1,29 +0,0 @@ -== Веб службы == - -Если ваш (DISTRO) используется в связке с корректно -настроеным Альт Линукс 7.0 Школьный Сервер, тогда вам -должен быть предоставлен доступ к следующим службам: - -[options="autowidth",cols="2"] -|==== -|Адрес -|Название службы - -|https://<сервер>/ -|HTTP-сервер Apache - -|https://<сервер>/wiki/ -|Вики на базе MediaWiki - -|https://<сервер>/moodle/ -|Система управления обучением Moodle - -|https://<сервер>/owncloud/ -|Веб-хранилище файлов Owncloud - -|https://<сервер>/Apps/WebObjects/Rujel/ -|Электронный журнал РУЖЭЛЬ - -|https://<сервер>/cgi-bin/sp/sp.cgi -|Школьный портал -|==== diff --git a/school-software/integration/index_server.txt b/school-software/integration/index_server.txt deleted file mode 100644 index 479fc64..0000000 --- a/school-software/integration/index_server.txt +++ /dev/null @@ -1,47 +0,0 @@ -== Веб службы == - -Вместе с (DISTRO) устанавливаются полезные веб службы, доступ к которым могут -получать все члены вашей сети. Некоторые службы, например MediaWiki, готовы к -использованию сразу после установки дистрибутива, тем не менее, в целях -безопасности рекомендуется сменить все стандартные пароли. - -В таблице ниже перечислена некоторая информация о службах, которая может -пригодиться для их настройки. - -[options="autowidth",cols="3"] -|==== -|Адрес -|Служба -|Примечания - -|https://<сервер>/ -|http://www.apache.org/[Страница информации о дистрибутиве и -документация в интернете] -|http://forum.altlinux.org/index.php/topic,29114.0.html[См. -также лабораторные работы по настройке Apache] - -|https://<сервер>/wiki/ -|http://www.mediawiki.org/[Вики на базе MediaWiki] -|Администратор: `WikiSysop`, пароль: `пароль -пользователя root` (домен local) - -|https://<сервер>/moodle/ -|http://www.moodle.org/[Система управления обучением Moodle] -|Администратор: `admin`, пароль: `пароль -пользователя root` -В Moodle может потребоваться сменить имя хоста для доступа -извне. - -|https://<сервер>/owncloud/ -|http://owncloud.org/[Веб-хранилище файлов Owncloud] -|Администратор: `root`, пароль: `пароль пользователя root` - -|https://<сервер>/Apps/WebObjects/Rujel/ -|http://www.rujel.net[Электронный журнал РУЖЭЛЬ] -|Для запуска экземпляров приложения потребуется -предварительная настройка - -|https://<сервер>/cgi-bin/sp/sp.cgi -|http://spcms.ru/[Школьный портал] -|Вход по умолчанию: `admin`, пароль: `smenimenya`. *Не забудьте сменить пароль!* -|==== diff --git a/school-software/moodle/images/admin.png b/school-software/moodle/images/admin.png deleted file mode 100644 index b4534efa8d10cce2d46405f85d5d538bb5ab8799..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4386 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

NiyFZQF1(zz6@f(RPCieFvgtAS8~+# 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 C%@S<@ diff --git a/school-software/moodle/images/card.png b/school-software/moodle/images/card.png deleted file mode 100644 index ce02c063f74b3941f82c6694103ea341325b01d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12344 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 JFui=|e*rkX$7%oo diff --git a/school-software/moodle/images/correspondence.png b/school-software/moodle/images/correspondence.png deleted file mode 100644 index 44ffdc70abeaad55a2ffe4cc0673ca94f2b0fdbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23531 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 O+v6MXkIEfK&-^cA#?Q0> diff --git a/school-software/moodle/images/course-add.png b/school-software/moodle/images/course-add.png deleted file mode 100644 index 8313290235afae99abb3d7ce7b013407b929765d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8353 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 diff --git a/school-software/moodle/images/course-category.png b/school-software/moodle/images/course-category.png deleted file mode 100644 index 18bc69b76025a78fbf3b64e35f7162badf58a2dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16950 zcmd_R2|Seh|2KTeIZ=l=ZG<>ZS|ut`G)8GTP9e$842o=-$dVam6j7;EP83;6A&jw4 zmN8D7BH4|7lC0AhjF~ZJyT8}e`QP{d{{Q~Z|Gr=M^Sqwt^?JT9F%TgDvtA9^1g5Jaqn_ld9Ke`fd0r$HQn;I^vVw7)$g)f9K$2dU*$ z>@$PlWeWD_o6rwT^aKq$IXz5oE(13UT0>2Nqq~gsW6bS8PsvI@o%;2VqV$9L(Vsv^ zz-`^HUEe>PIr4wH)1zH3pI=>5L0uN}3kp|A&uU;6&Kj=em1pUpiVgB_m@WS8UTe10 zUJ&t%^lOh$_j+M7S}dFx(#K5hm2Qi|NQ~-uV=#p20_`sUsaQS_*Xl< zUnp@9{;f1K$Zt=o(nQxsO?9*qhDGy3Dc>Jn)$su@e`;-;^aRk!nkSt6sZ>ov>38jw8eAErft_g zR#3YhT0rP#YV7MoF zvS=@VHq5wVVXNHBoSWuxN>KxPy0aQw#xnRQk1nEXQku2Jo(KDMy7N`Lv9}9Q2{US3 zEOuyBx2mDXPw-Bv>lkJW&Nx{t)#73$i8L@q3y{35^!z#ewVC*}=F;sM)g=XZzlUoX zMhniS7Md4Mj;ghVp6)pnl5C{&8~hbC^kQfJjreuFMUJzb0V30V?@5k`rd7+D>QkGt z1?~@Ql{A~{&!21$bL-~F!}}Wq^+ZpWTi0w{P3#Og$|x)lA8mHDPePH=J>rut=AAE4 zL#rs2!@Qtr&Ot@&M*A?tDy)Wd)O$`a-`&1;t-5+AqoU#3FZy+}Lbi6)Y;0}#?bAv! z@h5B&INhwd@J#qB(6Q#RW~y+km7w`*W(dc_bIad0JDM$Q2t0RnJ^X#lZL5D~_q}`7 z#}#vqw%+0Fo(%qR_`7t?|9m;zD`weV;?L_7rckQzxgcol#n8*r5(DE@Z+k~+&q5wK zyB9V{zx#h=W&Pi`M*rVB)47`Il?nqthS8oTowU&8yB~vPPxBI;j5@U@8Xn&0g&cT? zEdxJ>bmme-&ZUhFU*~F;Lmr4XtPJ(rPgdd0!*G-!@-(wDmBmFmWlRrY_`e^eHlSI2iY7gX zwzp{ByIZTNjS*%RM55tw3R8X+Ri0E#N@XUVlwi#kh{UIRCiwXpBu>9LyRmivEA#dp zQDA?Ppi*Fah47YGsNpIkZ62S5P5)kYiXhz8;$;{$&MpvEHR6~>KXeYmPDH6 z!&#=I+seCkj>#R$kGewEYTGkK zT~w>sI{9p4lBID`YdNQ8l~F%0uYgNqY`oqyz5Bq<*LbuGN#w@j4V4{R_QXwn?6Sa2 zru)~fhLzrmVRk*-twY(8QdKVDG@^km) z4_DXEYZk0HSzmyr+hYh_)3)bMn?>~B9^m!a5*_=RYK99mLq75}RJCSoUmq!4k}cgi z>caXx7O(9@(qEe#veD{Kk*8iV*CeAtq#7}b)$Cz}jUX2rp1oL#CbZ!&x0-@ytM~Te z?V~qx{RgK9h?bOLlkIB35ZueX$~B^Ef08Xm6lzf!De9F>jw{}6Sz1sMx;?B5L%|{H zV>9Wt)n*>b6!GuDZfH_$P?j5Y;>kd|ZbTY&n2wC+oER!ACI#a}MLgcyLyTW4ZZ(5p zMz`j0CGjW*Ww@Z`xK&>31?GCn1yVtHqV0jqdgF%0{Qn;A&N=OJyF7AjB1>r`R%@{G z#A=1uM_t9^uR9oXAyJQhO4XOlr}7C0-!U%H7?p0L*o~phoIR?IXAfE}G1O{CM86!% zqHVuLU8G#%%}{ViL0>^YIbI=p`Kdi<1<$C<6gV*0?_Jo?womcl(00a_*oN6iN=Fi^ zmCEqm*C?y%I860eh|E|v>i-%XC5-~N>Teq@^uSpGn%cZz}b(k6O>TC(dn!xkmPBajX(#fD(Srb^F0I zR5v-2>iItR<7VHf(?~Rb?VWmhyNuGccj_Cf`KcYwxu;X<62LdK>fHH@wq=K*<>5a% zcNWqt-k0rkjg%9B?N~%sR<5>TdSrD{bl}7%tMtP!1v48>jWESn*4CsS#OB=}3cghs zdd)s1euIx*d{asy6 zW7|@*eatKSEtE2lbkV#s_e&y;Z?G!L*q(xxKtNa#&u#W6`Mug1ila(`9Faun%KCG#siA zGM*M_KnDCT2;a08pS^L)UuL~`U;a>L=zidt^9eEaNl!>2b*s0t*s*Yo;GB|R$ia5w z4)$rFAjl}rA(nYIiL!87!gwTYem}3F+#LIY-SYO)-t(UxA6WCMS)VGLZ`Mz^xG>qC zb3DnxT^E9SAJ(%oMjNy6HG(lJk8(cqKzPx#3&!ng+OKPHgB3Q-D0~}#CT&{5B*Q;mt%-+0A7y;kIAMG~e)r z@wBsoK7X`1Vh8;~HEKc@O4haNG;E&F+^zi;;aj#d4ig=~QOfo5uq*6lRJzEs*@=l9 zth`^Ew;%SBIs4<@)`RSYPGaW1xulWRUAL}twcGpin13H5HIpJl1qEB7lDW0}UREtj zt2=P1P5W*pZl-!76Spf)R&JHX{)^fBOZ=34y{cbk;(5k51(ym%=xXX~|K6c8@8%Re zSC^!SnZfEy6QAbEvf68@GqoG%cYeZTg<~@+NaTT#qhqEI7>4w_L6CV)=@QD&^1jkF z?rn^QS=86}EzJbMK;xZ_rt4pgx1<|A_tU-W$9t}in0u3KGj8#MC=|DgABI#Phv$Zd z$xwPO4cGIsQ4wnJcjk7SKrSAVuk4Ri!p|j+$r&>HV^dV$RPc7*u(+zI)>gs2#Ec(6 z;JDu+=ia8LqFK243OOSKg;8u$n(YfY$Uy9Z6u!rGRPdr6J>pM0W<~9ZTeG!ZF!bQc zNx|s0<%UEK%|9|JBZ_EeSKp|RoSm!V{qt54*T7HT@k|zH=EKto1?W_jgKVI!`I-r( zyuXc>>+jCK@%PCJ481;Dz*W?28?2-6E;$gnCrwuVQX?x7OaG9pYx(-jCrEEIF- zZA>obGIP9>+u$=e!)$wTCA>8=c`JrPAw}cK7KUM~6G9l=;e(FFZq*@Uf66NzoNbU* zI;i~WL-JOe@%GhcNObLwCJ)pdVnQyNo1$1~$eizGlX^KRt*7B!fK66Zh>y?MU0<7n zbCslxW*V;sFvjWH6}c@w^-%$7B&1b&(Jm`hwS@3D>xKm0gH}y=2a={saO6Zr#P9(jdzt+t7pCR*{3RM&)9BWEi>%w%tr4Es z==x}J3B$31!YSSgwF&fJHM--H(m1Ppy*%2dG!2=}M@6fy^&BX1rVR4g6RpUFQ}Wse z#h3Aq=clqK5Iur=!AvcyUU2wf2HY+vMy}5=l}>*muII5?^wPpqr}n|6$($s!rODY= zrDWnjLyolbbg=}zepKFkMpM{I2gPg4A;a`ixs&&cC~sOs=$@te62H!cg(lYKQaP*g zzQAHPGs!1gX^bu4pAxk@K; zbLaWHqbxhSk@C*b`e}wO6EsF)YK|1f-Zf<_rh5N;;HZpMEqAOxVWqkw^NN*%&!0gOrM_UB-AomO}iRFCD) zfAP{R>GCIL?#VdkEKb#NHriLoEpuM~Y9Um!>x~3CM35wy8S26F3|4LN@AXf~#FPzP zYITpGjBX@uAC-zY^XES2v!cO$7X$#v?pB8Vi&HoH`t+kl_GZ1P0Y{!9V!PK#IRMm~ zzaRzn)$s>qAyo|ak5mg-2%0|^%4tC!b&G#nRsV2842~6}qS-AvD@JY`7o$nthn-wp z+yad(oKQiA9fonoHd*>t_RRaG{kXfi&JLu6yWY+z-i4`!G&Ud5f$~SG zg5JjPnZb(fakZ@B(zERG0v>+;hoj+f>rIT0fJ<~`XZx_ntUAv0IiK`labankVy~ z-8gijD{x%quox0!y{`8l4JHA`j(mn4gqyI9w=arGP5iNhO~Y7#`Cn zjyVtrH!YqJquf$|SIDqXfDAl^SEDWvAx3E<3j0FB`6z7_SFfO8#2uYEj$CR_!Y||~ z&%hytMKO*`MdSHnspwUn;nF5rmMmofmvSpb0Q)r&*ox^KFdMoTKSkWpA}meKq)LW) znUUkYr3C?$;1&MIPHOx~jPA!&A8Jmmq<9jk1DsGn6nP9tD#$#{fossDC7Df7GV3K| zhjFA#ApYXClnI1s^}ZQ{;kJxRqVq*JWm?1{nD1!4`XX&D&2JlW=^lly8C6OFek^BN zfK4r`xw4f-b|bN6Vm>^`jZ}Ih{A5Vf+)H2Tnbz6~c6TVG1ym}JPpGIcI1a6kxH038 z&V!qs%42(eauDx!o3Y*dyH_kBPrKvh_;Dt?R#9hZD9AQCo+5tAObOF$GC@M8u30Na zCU>xN({Xce#+rIrfFi&=Apmjb?-O}^rcBF~?|gwBLYcvkEe=+)FgQM{QqHh_Q_{it z_nVU9E`BEpm6~KZ*Ni)z*;RpkFo$sPCHDJ=-``WN=Mc{}IxIJ$i@Bv|8}D2**vsxFneorb zZ?%r%)dp~0@;g#9FMs*4mHk_uL%>k_7Asd?;ghJVX^Pe*chwz$xs{VmU;Z{Y*;}8o z5UUk;st~dGS%vC^H}5RA^XMEd-?Zw(K40_B{?^LaNB_nqFzBGR(b*q3MEvdRx4!c8 zt(l4=vm>t)l(d5MRAkc@9Cs9(8;U+DbsjBi~Tx|?#Vj1;jlbFEb(GL z^`bz`V@oPFnp8OOQ5#J{C)=J_5dBDveokH&*RpKO0pl2|jZnhiPR8SL8pXW3XR#d+ z#JsO#6;OHb4`&AM!$K%U^RWE!J0Cx406=fg*=k)Brj$mC+N>1%^!f8+XUBx9(7trO za)3etuItuARn^e66e1#DmCKEPPJhz4q!{{+vtOn`=cbGmW3Im?k9no#<T+rpbT8Mb-}P^hEQ%ds$ zSijAVM3vWyU?Ti`OtWuXIh2QMtI${Bn67o2Xz<~LOtfYpC2bbkakGn~{NSd%*Cwpj z(}y~DX_CLwl$l??N3W`VU!6mLti2iMOE62xvq_l!PE>leWI@zVNx7rRVM{bOgDS}7;3#@J^U z@8=d0l*@po@JnkY(H!-UOY!*DgG1`OnpcM0T$UEjY_3%5-Zyhc<3Pw)Ff9zqe$0GA zEg&(2V(GF)sK0WL7z(4gN7zS)0v+!LaM~}8p0maB@cS|sA`0`fu6EIo>=w(iKyQGV z&3-pp8#!J6k)fk+$7)CQ4Zcp1YEM+KX zc8Gsp12pdMQWo&w;es|WL9^941wg>Ut;BZ97G^e^6(Zjqd$x50)Movi=@`0||0=&l zCdOKNnua&ESWb&^vQC`w@Jl?!;TKOozu?k71<%Op_CGq6)o$y&=yqw&^Gow_1_UG* zkU;PW#E}%hbBL&7RO>{ZpL~lCYUZrgK=q~0T;-X1T;rXV^ul2r`(W}Io3``B{hiIR4_ngN(3Uud-_~rlOzZIn1onPhn+shZAIzWc zxDO1GZCj*ypDn0wht|lZ8Cu;xnEe6Q@g{q-zY#c)o9$;bDird!nGK|66?W(5I_#2z z+AJy4D{s}hFrOrR%F-I1XV~jQ9`jxPl`h1d$dv{`z{jX-4b}zp=J77QF&V4!N4&>= zh7LAo&DY?1cIxd@(~c`CY4Zi#bgJXD*=+f*@62E zh=`$l#Ybu(38PI9V4|~P1W+89=Nw*?avTi4eA;FAi<`rAqa}exKq3#^EgZanFVk?} zn@{oX&(r?uXd6)7O>@>*d0}j{re{5rEmv;>22i_VSy7`VZtA(1_FWUKdG(zy_2T$W zyNb^biYC8PoVBlh1gQ8~U}eC5hW5u#a9bG|GdGvP(m;wAI*0Tn6c&R0vGlAxO$~bZ z)73QXM1)`2x3?<1Z`)BpZG2{P7`A?Zv*1EPH7f>GTQ^6z6i+U4u&CvFG)AN>Wa8TQ zdK*FbTFY$FgOS=wsliGqj>Y~kDaEN#3j7jM>gHzSETFN3__r}W5-G(|@(hOC-1wN6 zM<=G_=hp_4cl{_S0af z52=R_$fix+JFXe|_1^Iye3V4QqZ1?|ik$03-J#)}+)2(b9t&;Wj3@WbfX=>CJbMajuhVna4KY|AE8!E*v zdaTl9QkZ`ee>qgMDSvxkHp0)yrS%3^bJNkJLbD)IPe3ms47i5=`x@5&Y#1!Qs1|s3 zcC~Dp>c=AjE{Fjb`e&Jz7Qsf@^yIA;@*_fiqZV3_IzX4;hgBmd+g!$QVKA{tSXG%z z(cG%K`6$8}q#SlKWrz)VNU03cd{z`D&dp@B5hGBnxfxnk>Kn*S;?2yeA|l*Y>-fuludZ%Qu>Q;>*Q&?auZ?plbOQ zh>{ItoN1_k_E7o6*AK4It-e`wrm_{K=Ax9#xFqSrZbZlPf+V#;7pld>upP!l(AaoP zc-=7d*wJrOt68?4Y7YaMQ^_`;J{D=LX5QFZ&#io&U~yT%1fFG2Mc>C%j1`-c=a73tX1bDrD9;sxxZyg#NYGM|bV zXX*z=JN(|4<9SrN$1~r5cnC`lQn&aYc?d6eDpV$7! zU9_{~3svi%O-+9e1=x*he=D7TNY zDK5lryWHfR%@Uyab8~x8M$LyGW`2rITRd<{BGOuFt8h?(vVW=Hb26W!wxjv38-P=C z?)kUAFDEil=6r4~c}n}5q_`~pGw4geHkY5+lj zXRuP6WQ9fMA^yS{*_gRa-_N0z;(76^4Wx>eraNL}+$l@r>6WWssbk!zARw1iRJ`mB zj4!Dh^nKdfRJOrA1dD&2h2^K723cTL@8-Em+fqJ(03$FusaRoeD><|N|Ts_ z)qZyJ5p>Gg#_<+=76LMmmlBtT7%%hkXh9D#@>F>wJJ*VsEhS~AlDz>(h*U0*yrkI> z*S7N9Q>l3hu5w@5g&}yWzYC3WS=|LS=t%t@NMRc{`-Y5F+7?UAwy%KYx2@in9to|% zwHc-dHvo5r>cKh4e>88p;??A32wy;|hJ1OK3H+%Ob>d*Aqg)yI)9;H_cE1IpP|PYM%=yBRR6*kbozCqiT)Z{;rK z!;|$-is>G51=-qZp4)1QYbZ0=Xu6(m$(&jJ?$7~`m$vHb2V{$GS4m2KUHfylfx43T;bF3WFvOlVon0|8&eo z_aXLMX)0=(fcVZFv^7Ac<@4XMl++}U{eXH^|5buR7GfMaWwE_qU1xMONPWjZs{Rg| zAK#jjUw{(ra^zxb5SZ8*N%mMgWth{SR7RR8Ywg6MRYadi(@V^AXK+4Y>Izey?~YZK zO`H-hCLp6`{}$sq+$d6>p#9iH$`gjxUS6jD6)Mla> z-2v5}dhk`7*KMStTAQp_N7M`~ff?QR?lh$qadGQUXELONU+d@vU5H(s%7iskbtA|n; zVd8`^gv!qw7-1QAniyVf=3Y*X-cDm%IMK_Sx>_igzl6-q{if*lgE!Ey8nLO?Y`_k_ z`y!vm$FM{6ms-L7Q~N7etYaJJ?|g6o(WeOuQbe!KR#AEiiRZS}By2wc0*DD|Fx*3<t;7eQ!4+# z*cc5qgJQg{s=d61Cv2x*i1i~YR>u~fr?4LE-p(6WO%+X6X2u$QR;rb=wB_4UX0Cwj z%XQtAzF&kR!j6Ogb!x>~1X3%vuO+M^+H1b+%cil9sjHPBCiSpxoL~kSHH1>~W*rCC zD=|fGdjK&4TLU6b+@|9`KCnkH*}i6LPmNrQWBq+OlXhTRmWJRJV$xcouJ409ge&|# z6o*!281Cx9A-9aB3IO2}^_0`ohm~q5;je4RfA&q-w60Zk|IQEkh=>wD1XAPfyP z@7;U+PTcH5=T>VCgxae$Hc`v~kp7wF4geDjODwiZ8M6S%K4*uB2~X&uyjjQg?)>Gd z-t>=|;*(8tg$2hylvJt2CLEHz9(;i6&G}2$gj&^JB_3s7;h!~|?t$<3(o8!N9 zlL)H0`c17_t+Eff-wlq{Z4Ha+mB0CQO?O^UdTiU5L?R$qo^bX6+jXkITJh0QV;ff2 zth0mcS!d34rQBg>#azbFY(Fb>GmMRGZ*ZNVHF8#h5L>Fnldx5R4*C&dKqQn9YY)pOAv3k|qD;0=WZWiB<0?Y2 z1ZGtusvUci3%rS-q!UyG<7SnsLz`_6pIMRhxpHr!(zv{ zqsr%jJzO2akIGt(w1&(%{>DK&cYbWKnmI1`4|+ZQ!@dIQpk_B#1`_Gw-lw6|fBNoL z99}G>E=hl;HQFi|M!i>Vp9|;q!IqzAIQJLy;>Ys^#a5D@!n`!i;2h@1M-nz6Xi(mB zpo-{fj9KN0HPKoM^e;fQmh~V4`@Q?R&ZJx`snd9!YUmz`KYMCT!kH7D!bek6I?kw7 zBkjjQbpx~NLnK0`q?Gc#3L&8c#~Y?(i2zeF>7)gDcvKZxNLrn4Z+fgDLV+q$u zdRT0z@MOR#80*KA)H+btm^`&6tG6-$cn*$eN>pUsY3>D5s>Vs9*+t5uX6@DJuvd2OFw2Hzy{7I=1=1{)$L; zik>kNT?i^ET+E0xi+mb`gGI!(q>}?9Crm9Krh&$#o&*&rH%OoywJkxl4ZyvTnzpco zF6=~RAhljibt3s6s3KQ+Qr&!i0Ik^G{lqq!U^t?2qboVS1Vh&nwIg_Ov#A7r?^z|J z#$iB&?!y!?TdPvtc>VhEapAZU1Yzg618nxCOWHyXS~7|he><-&6i}(${#S?P3E~L> zH+nu@@kpDq0<+b?l<;-SHscT-1yp~fk6PCagD@!AA zV%8w0H+CFU?+#9gXO%1#yYkG$a~Y9xjjREZ!<_;oCm z9plrPTY$a|j?NVJfFj`~IDwW+)c$0~d65LW4MB)3@9Vl655Hcm7+fzFC42nU28tyE-7SIEN8I{p=oT=lujss!4|{Ej>h6a?n7J zXh~%~=*x-bLQFfid02ClxUTD*^Zl>1TDTLMU>Y8Czd~;B&_a>3lamv$)7V1zNQ#I% zLvz$ACi&KSUr74!D=C4y9Xzlqe9wP@Okbv)u9ixwv$NOiSPdzlnsK)5E#rAKpy~=z z%WktT=H)Kan5l}v3*@2j0WQ-RDd};=P{Nolb4&frDi0W8xQrB5l^dCzSk+lidCK7x z(y=_O#!W8u8~dfhDZ63d1pX*_-R#85_8F+UFfj9SQyd>OV|raAzgL;g5L&ka^usrY z^|QGAp&l}w-BtLM-5r3qd9}tf>o@|;CXdS?*#{P>6Cp!wy4fYu&DLOb7Dg%iW>aOV zej*!G3o~qzKt=X8OPo?{5Kcp(1~@W%nlHfDtECU2s~;RXVu(Z{B?I*Jw7o&byQpQF zq8S32Gu_yf{oGe_bK3O1c-=-C>dn|d9t1Ubz!v4Ht3e56H6rc+MlwWK99iNpXasip z-wA&(BHkB)92u>)6CdV+$qU(iaVi||Y!R>MLi)Ybjl|fFlPn=587anaDehmbZJ=EL z)YaZVcSF4Z{!<_#t5w?+0&w0WauI(hB^@+D3&ugtIp9G6dY9R*e(O9A7dLow+Bp=| z6vqrp-PFz1-FNL-SX%8cCzDr%uiNu^+v?OT_)reXwbPn$gFV2o4X=LC+9+}@TtTHV z!%QU(tr2^vbZpqDLnCHvN$?^fkF&m;N@r8&OX0fJY-vh<+aa=rgL`c_vtJ#vP%nm^ z5&{c{L1FSZ>lCf*9jaeOMb!^1h2b8@Bd9d&x(yX5N)T1F7~xt^V`srjCf*E;u_vsC z%vU%VxhY}Uye}8*DdeJrpjP&ho6_!V%g%!(K%o^L1m>c_f$v@GQ{L`tIKTYc1H}mt zn?xKE{qm?IwJ9~g2!{q#e}fe(vK2=cAjQWS!K8`EUYbQ+W~U(>^3-mRjXi(f!&&vu zG>y*ho|hkwX4Q_~A-Y;D(g@Li94*Y-qL2c@zczim$eIHyC58Gqo2=M)CeTxbL$NK7*#AL+c9jRD07szCBV=32RM z%d=P@M+z452oj#79GGV2m>)c1!x)&s*mmGr+&(t!3Ni-!@xq0vEU{sn zT^?RIny6xNdF%lVrS4-Rmw))%p>l%cwG!d$CT-xdj_FH2WW^aE5D1F*2_TPiN?$sK z=>agVlZF!;{#_pq7U&d8CU4vIq|v+QiHAB=mm?0uZ)%=@BB<#OG*UZpf&wHe1Q#`YgHXPgZN|x zxS+-&kopZyKoX}s_sjY96V^;nqpSOW8mNyZEF9+zu6czP zkDX0I2rq&PGo9}Yq7JVAk13u1-@^>m+(Z=#8z~V0mnb8e3;T|X?~j|!UIAHOJj(Y7i2x3}2I6*1>1vFo=4MMEB*YlSasxgny*qX` zGBWZ&)~;PuT_N+&3vy6@AgbHF_Z^_^fP+<(>=XaxKsFlxs@ilxEH zbwk$?^2)%fprM+ufvOoAwWOrP0EtFLCsv`kT#x$|SK-u$kfRUtv_aT6QpGXe=x*H7L{vhXpSj%;2Ev6mV)e$CF?@%dY)Cx5J<;#yvt7G+P z(eBOeT7f!qoKCZ!p_pJeW8zU%Y21~vu_4rDrfMLl_JV+$o<(2~$-_0_#LLmlvBV}$ z4F$OTuEhiVqXT|)RQr;kI{;J-7gJ`=lNhXU;1yCk`MQjn$x1ge2d$gG-3;WG4Eo{7 zajTNE${$4aD&`&2!w<8vvIy*!^wcE9R>~*Vf-rl4L3Ya%1!d7ML<v#7;iL1qjCPhd!j*(CQt-XW z#oQe=nZ$?N)fX`?tI{we+FRls3lisg5{xf!EkFDyK?z;|3SV@0pdG5Y*oc0THG_F( zmr+rKDV6r5`Q|v!6$Y4g>~chL?96#vep&piu3(ADtMNqwClhUvB?B4Ukgi~-#FmPq zon$?^ya!<~g~#W^5ReadK^T}WeNV;%!d&dumqGeM^1d<)UdN)nJAlEX*? zjBqhAljVb_a;D!A@1WZwzj0r#XP&1{fUJn|>>A~idM(>8DL z=Q|M=P~Q`s%4scN?Hq_38+!|yGFbJpa`h6Ca!Lw_oPB)&1FVvtP4_Q@%p;@^S433s zSw1z=K2%jO?7FS>GOBfM7-W8P`DV}jy2F-1F@M8>Q#GK)C#T)_t74U|dS*an)DiZKhUQIa_hy1nqO~IBQp-v*Z(_YVrYS7@<_UBPZy5;`tcvOJWG-+O&2;A$6e$N zf$GA63);{8%nVNx*Gs%se5Q&S9nV3CcXGPSAO_HY1mt4;qkGtb-FYTsX64 z^iDy*ioafTpWUSth>GTLXcH3_i?vjom@ipOQWk$}H4{zIC8BQlthW;TZ>#_E%cV=B z2TXQ@x;h(BMQEfJiFpKy(iZ1B^9W0w%GMc6b4mIrg^>r2DBOj|*p(0^5#h^a5f(?1 zqIBX$8^LQ(NPe<%ZeCshi)k%J& zRT4$7x54j;vmq?Of)}o0yjA?ahDk-zxcNY}3*`G%2y+qByWx!M4)#cw|(I@tI z1yeYz8#7<|9fm}9@Tf@N1ijWD`v`3Pp;-=IuLcUH#_O(Kg+{~vo2(=lekS49Ld~D- zY$j~4pAW7j)A0gkb#;$^QzETzCTP_Tc6J~$N zmI=haIJ7&VP$rAxPi+Xd~zJh{kJz-nzd4W8@?j#1ao*>hjOOgcn znyfMuLDX{zWC#FTlaY2o7v@wstS%x3+pz~>VKJVb(cCyT8p8C7^#k>5j0CCs zCIb%TqiP^lk~{G!>+04`g=&~0kdu)&Oo-$HM)3f1T}G<)1Z8@3IH1}#QnYSkE1vNJ zuD=lFOW&K_Vi(wOtCJhwZr!X@kbmU?XZNl~LPv3J0U0^N0nB>`3{&P$xac?@`MZL9*H*E*UJ4e3hT&F*zWn9 z62I?^g8&OO0e67Fi?Dc!7cFr>q2>74sL*;KY0T?&KprQwR_o}%h6?;p5Gk5~MQ9ym zn=)<4jlq;VtZW8zL5M|149y&;PDE1@#u=QY?TpJjmty*8AA{oyzm2=(3I7h-ZnSs3 zm7~#L!~WF(7#E`4F#iT;pE%q5Nhk)5DdaA_^=s$G+h>(=^X#foNrZN;2~ponE9tzm zz?mCH3y8)dtY4eVFzkzIqeBet5+XCUo_@m*%&>UaOjtYZGg)2@8d_o!Cxt(kzR&%B z)m%>K4(dFgSC_};CibXksdSgyiGa{eYWO88r+}-2!enA$rhsBQ2=;L3AAsv1_O};_j#y{8-o@Wj~)BL8J=7P!UL^vC1pl zFdKwfGC}>-;2=`MzPE|UkDniL0Pp71izqC`k^ag6+VJJGp;hH5PC?T%7X2l7)8~H! z2Mu<>IQTimVfo%=YS>Z~?F4Dy(E{Ug2M<&67S{<9ALA3hTNM_sfuJ1N3~12X2V_ak zJ>&hwflzUGkJvcwF50+de6~mO0~EVO;aGRPo7Ix|cEO_fq14!D^WCYhuU9#Y{AXbn z0Yofq{=Y=T3L7aR%8&d9NNjmG^3qY4d+?S;+S~sw)mV9;xCU60-Y`g*>%i3I0c?Cv zO(~o4s%`M|nK)QUX^BVB;>~fb1aXq&^28@)P?=E4xMNySyt!f0m$Uz)Y`P;lTEyY= zmBllxOoA9G-V}!vl!IW-BM`zs4?wox-vd67qbdvC4FJ_N$2PI_l68Ro!Y?h@5Y%41 zutSRH-X?0-%{K**_;1b3&zH)9a$6;&@E#~v6)vVygzxC?pgjf#`}KD3(K9eQvwN?}-n}LU`*jWWm>3w8y<0i(&jA-O=lpyk X|BC~d5m797_$-fFA1OZUarM6eLIEAP diff --git a/school-software/moodle/images/course-description.png b/school-software/moodle/images/course-description.png deleted file mode 100644 index ea7c74c02472dffdc59803951277bf2188906d85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13053 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 Nf8F?6x%Qpt{{~bQ(LDeF diff --git a/school-software/moodle/images/course-elements.png b/school-software/moodle/images/course-elements.png deleted file mode 100644 index 02bb753992d5550ca1add27bad101489ad761d8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11937 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 Y^;|-bAJE7{998)nUS889s~k0syun51p+}Z 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�kKzzCW>ex*s31zK4nrIc{t{l0Rma5)q0KQT?E~ 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≈#1 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 diff --git a/school-software/moodle/images/course-name.png b/school-software/moodle/images/course-name.png deleted file mode 100644 index bc8c9b875ca374bba9feeccd78ef20ffe02e6789..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40478 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 diff --git a/school-software/moodle/images/files.png b/school-software/moodle/images/files.png deleted file mode 100644 index 9617c35af299aa33a7ef0cc527ecee120992d895..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40224 zcmY(r2{_d6_Xa%1J|ShYH5Cz~WRJ0gC}l~gWEuOKok8}cvJ@tfWsF@?Us)m~Ys7@H zB@MR zRJsGxF)06+Gq8Ln_T$X#51C{iwjTTCx^e4aUbN`i83s|ycPS77X%X|(LCLJ*&{r-Y zB6$7hH5IGP<6ATWrN}a@>*s&=ci-LkzRB=WdWzOW8^`orrl!!;Xgd*QpYo@?Yf_lB z*n}T*|MM08p(}G44 zPE|CbBGwv2byFVwncOD#S4l2WerAa3+M7pFP*@7Y7=F$8Mfy^3E;V>@-;O`l?n7jK z+_c?tWHw?u6vrS)3dDs6coqk^=ud2lrEnoRFqT4JL>u$4_XwqEvp|T%kDsT_t52Nme_WWS|do- z%}JZxJ(P1eLLAFLU~i8&^JVT~{t&~@08)}e>*hmS83;oB=}hM4x7ui-c!%0gRes8? zzGx-gC^Q#8M^FTr<>Q2?1aGvpwC;!$$?0-$xEM$HnKd=C;@&&@?zQJm%3SpB+F(yl z)xBybh6egjnE1a-IdBYAFl|$nfs5R0@RjzR-&oD~!-w7g5ckg0E z?I}XL@W65{d1=W%q^yGR)}GF0vxrqQAoEsKECLPNEa772G^R}+Ldtz zm7Ks(_k;)aGB5ExRZ%%PgI|238Xn+#wHSi-cStq|`jPA(e5O12H0b87z8gChoL?M~ zf0YfzQo9CR_?V(r>HDr%sedT3k~avrk}w^ ztT^)lC9RB|Nm{+8#%aGnHWz1itkR!m@IvdT9>dT@G*tsnRmzov^)$3!*a+>Jp-zz3 zDM{7cwHGg78Avsrux?#Beu%G{prmqKP|G>%2hZ}WN4nL3izqAWy=f~m zGM?yQ>*RzP3W)ZoHOtOrVR@9mXA{Iw`8KTCf?2QFUN&_)xQH#DGF>?gg~gzy*rK%T zoW=0WKLh#`&gM_7_}A8f^<7>DFXrwZewia$^}+Y==TGF{QF#FJKib06tDMYSWgZ*L zWRS1Bo$86Fv#*Ni`b92W8_F<#5wdNNHz_?^a&Wo#i}{8BKPNsf`mWEUUC8@8JJ~YT z@PNL3D>7uPCTs(hK9F#|S69(G%iJddE==@A#3^G>uOJgBsQI=_%oRem3w0W++_Z?e zkw5G6^mT-D(V(k>AOnsgM@&mCDYL%Y9BQs}oI}maowb~pO>2Zd+(ja!vf1^U+-zxl> zP@N&<{8)kAnYI~aw2j0@?QLrq1UF<*&vf7_ZLrmQ-JDRBcE5VGRE9q7=tCj4hu@49 zS5WfwXH>;dxFPv@!De35Cb^c~*KOP$9+fDQF6zAhGVcM2^rsj?d2PQU(_@d+A~`K| z3W3;QBtxH<2@B1fG6 z)4S(uIj=rfzNNnUv2{DJuA!bCo=`in%6R*BZblcReR_U=L$0#vrnq@sPqyQuPqy4l zZ!~Lb4uko2wUuyX5lz z|G#4%bGsz$F}-hxc~JUl_qtEHgdMDJuF`^AHVFNjH?UQdfaE0V)rOYezIHve_1sPO z`l{Bs<0%Cv2-;$=YVwVY&JQnj*q?tKpps))l6v}{ByU28{ZFBj94wDMX&TC{d)S(b zN#l++62o*cFDA}F1O9roCMWnBh~ubEa^*+h2|JAx$a1X{GeffIUPJ@uXWx?QX0G4# zoW7suxvw=%`mjNokILK;feg&yV1sryqG4-lsqSxw7}WX$LNB+{t`~s}LLrhqT0!_Z zHiB&xer}CIol7Gh@d0iw7PbZ)j!((Wwq)SkHL`m?(ziTkFUY)1u z|CKs%Ye5cSIudecTebh)W9u*ke?hkg&F?90Aija`TRS&Dm%!Iv4|;gWU7}0%)Y#b1 zpWuE}9R~Dm#bGd#%B>m#mj&0-D#GS2*zCZJDo9IPA?JxW3hnsJCjH|Iw5yW}p zMe)qhn92!z0qtVHNcn?@LQi!>RLac^QyvRrQe%WqIW_l>TcN&Ml77&Cgg@c%X&__v^-6?eFUc?A@66=XCTo!qR4sC7e73+md zhNaJrnE$Dau@m7x$IjQBl3=4ns4vM(bSFRKg$HiA@F9ei(0zC0jGJTt(0$dVz zWFHs$+WL0ND2PCUPP;s#u44*Xn-Jn`Gb10m&D3Kqfa(2KwJT5%-jW?3d!6&dKQ;9+_bu4Mn5z>V0y2Df*{`~;cNCl{^cv%*TKeipQn6W=*L!Yx@nGB+A<{gYvqi}~IVC#7p z7d>tMSCWs$+N)u?6IsnO`DQ-I8eWVjY$wj1CtqYN4(<-5N|7%X7dwq9YM6iD6E^iE zhc!pKo9nhE$HL1qk0z_jljpx@lV1>4lWecsO|k{mdNxN^o~HFzuX9(%b!1=n!~L@@ zX8e_1S1R_fC;4i(9V+&o^%yHQA6OI4D3**dYT=G0Z^L{uMbX@f4+sB5*xjJUfqbqX zf7FIM_Fv-WPx{osJ}vT(_7BUc-S2hHTNiBu0z8wH6LgBE*FGh?=p@T+DYV@=Z{&MF zLWVzye=KQhvk@(o7da3eIMsCZ@^n>nARS8SrYwDlT6Y&rY6D_N!JG>7L$k}UjdqE8z3N1SqBU}T=2-?$1F zcWnAxaMUU}kQ;JE)5U^&q?XEX#nyaB?FXF$w?Nl?$M)DR#j$$a^t>kgoNi5b+0uq& zJ)-9fN0iL_<>}lj7hkBr zDN&j?A?6Z~$$I~-wF>Ryf_6XSH2zK>JzN;_)c$r|%bw?t?PYQuA8+PRyq1MnYVRuo zelycAaUeZ5u(9Rz`~!;2$^N^}5deH;*hK6&{TRMy6TUTk4~Kbcs;{lM8^O&H_eS2+ z{xHr4B;z~_jF2+f1k~vt zzg&-g}vxb+oSqo#x@ULBbkc--8uIu35C0 zbyep5`j{u-YoA!pgsm~;I7}U=YuL1KDd0gf$ECZEBN7tGWPSZ8PZzn|43&3cG>+r{qE{z7AvXXME0l2mug|~&z*Ca3KhUHzl zWGKfIC_9l6sn{mSj9T$#lA~}qD9Wjj0!dW62n9WB_&{e}I`i7TZMLUc3uSyNuhvry z^Y=0~I1HhI9J!p7y|p9qZ=;Qy13QDwngSgS`qKUh;6sim0H}L&a=r;~*HnZryW7w$ z&Z9X2cyMJJZ+NgeIdfL~;$(BqJj7i=FiD3oGdDLU2ge{LE-vQm3?UWE_p+JjaLYsQ zo&Q#BST*qwr`*TpFZOcgS;X(6GkXiyTmK$L*iV^FwSJ6MzQsk}&EWjO%*@xrUn69; zPVsdT1MAwCkzlx1>#fJ;T3;VF_twC~`j%Ip>y&WY&M*2F)GC?KcVXY_u|zAXb_6@o zmdajmgZ6qy{lsgcV(N4Rjsp{a?N}Xzxkko7`<&PlPs}7)QCli21h@NA=7lKp6%me3 z*@}DT$8)6oUah@3=Zgy&?ju(|lA?y5g;e2V}L0HW|9w z#47o}fZ*|#mP<>mpj>!el!WwvaCawOPVZr$_VxDm_Ce?T%1q0kXgf{EUW4__C+WvXker&_Y5@FZT$!{oGea|h2MY@{)2kA3araC4rlof_f`3dr zi2PmT9eMJD-`se;3HzU~8R}basClel&Bd3t{695Lc`Me{A|E?dYu04-ew5-SH1{Wa zUKvP4z2VvhT+{xP++M6p`9-HV}N8jtLcMLOFcW`Wb;Bw%ldMWN$xL;v>U&;H4Uq?koj10zd+Anyn?tOxB&eP~QMsF}r zFB&f4tyd>Vc}1BH*m{;E`ILft7Za8hg^zO1tBA1^yx{@`W54xP`W7KIZ?&Q~>+aaA zDp#142;{ijr?0eVTt+hD_J0H?CI?1($q$9j(^0ja6lCZcS0>gSqlmG_4t}feY}O~Z zq+}*PcW$hVv{G7rupD-#V508V+P{?V7RM~hBM8Xk^ewsmu}w+|5n(>|Z|AEJwi zxp+pYX}#^QU@YV8X7Sf=aBjjCZh~f$H8SY54FABVyHb3x4tqfr+0-uQQ>5;~t zy(!k*P^r|#t*EKpvV+~0{f0IEhomr4+&Mr0) z0&GxH*)T*1UuGITolNys480tiUG3TLVE92RT39Ak^n_@GmCAl%erE620@laVu2+Q} zQ3{2ewq)aP%g`OQYPAmEmX>;Uj=2BPCM_-1)$f@&;>x~%J^q8l__NaSCAPGyMEs#m+r z`9hC}hfk_+U|quw>O@* zgXHT!&!DhLQSD1zfn$M)YK`FVjU59qY&07CHFFgt5!Vm8s;awttLyuwrb@`?clW)) z0%@;1qnN79$)}S>O6n2Zgz}!HdyF5 z81bIM{PZrPl>)0t2i^WBl)gy-00l1X%QMC$m zZXPST4&5Av+oNyvL{aXX=aYgM-$5z}YBuz)k1pX59*q^^PnIlrWe{8}?ZQS8nW&*k_!{FmS@5sn_vj>8k5FogbsrGT+2 zIwxm&dD#}z26%8co0M_9Aj%cCM#Kn|N0{m>G=kjf67VvX2#u?fA1XO^;&$_PIb zv{V+kace*0fH`P7MmlU7u!M}Bekn&5_S6Sfy*)gqkfoh-5QH`P| z>0Gz~YTmV8v2Y1^cTls;?>(fP+=+qJigF9y%9;+RB|~xDr`I5vxZth3`RL}L_0&8j zP(-Z57S9P~ln(dhvHsk$e|N~e!o-T6OALMp2hXl^+`P}bTZCi-L-jpkdVyr><2D0C z9a*zFcy+QD|8{y_><4OMWmm-r`6r^9{hM1k*^3c-TQX3kQL0yr`&#qV;#$aWI-Hx8 zQHVoHv5;+K>}jF>^R|ImQEo!b*j$fhO~~?C|6dLn<>0NKB^sOt21Yl=MqKM21VVbc zodL)&lZ3ln0stoo8B{r?caBu7sZ}6@EsFO#N$7G!CJySh2fpG`w$2k;@c&MdV47^^ zWV%uvyu|zC2O5o31utC-|fz=H**wXVWg&>>ig<0-Gl7f@Xz_c|Bsl!=#c^8+IJqzMdlr z7c(J}MUPJ2e8uqXi6Tbo-#}rqk)6-z`FSKq(yjS>KbgcUi z{#f@4?Nu?u(Io9>h88`AH!?-%!;BpfkNp#I`+-)mWkg5G1X}bocctex&9<_sH@R9> zRmls2mFJg~gv|NDFG@4k2(G&03>5J_?{wOQ3B$W8Kj?NNZpQiZd#^{|d*+X#(SLt1 z<`1zye8MgS#(~m%(I$&+F}K2DuT7=VL5t_|&D0_zB2IsyUPyC0F*5#()?k%CMGdbq zc{BW{4O-!jz^DsQr&rv4T6p?Vd_&34j(7i`160_1Y?K2R7U^MUUKhOjcZpPW1k7F?M){qRHZW$ z`|~uWT*q4=UI-aGwnQEHwspwj*K?3Rb2j@sd69boKfV@+P1Z&i7hBdfZ=OnTsbMxS z$kvElKYPj;{BHA$K|OOw&AaE(++5nQXy<|;)U1}0wmh`GU=^dGrwS*AMary&=MOE? z1oZqA1UaH&V&>)^Ofo1c*46>?wxdJ!f%;$WOgv!1hVoeE=W`?Xw@9OTTPoa4&URD2 zuoyZ<3wO;+>X$s}wxYhU+*6$*FTMqT4c!Ypgl;fJO@1- zCgBfZxl&PA!|dTDb#eI@Ks7EP0vr^QX=vq0WG{wtr5k7&5oALNoF5wfopHtTnomtRqjoHtj#8kRbUMIa$!C zt*zm^wleuV@cc)8M9O-$)gpCbbm+?-mkbYV@HhNaU}&1lihwVIfFSr9d^&}Mo2d{k z$0+ld$fg!>-)Axd#R1vqq+yK-MhlGy+UD)kv|2J7jY+ zL+UaOkHT6aH{)|o7 zW-q8L8P-{O6?dXU?YL^Fx%gbH!=d~G^20V+JKqGC)8x;-*0{Kc6M!J$Nd5p7c0aYzW{~fs zd#3->+zd;Gq4QLY^(Xz2r@uJs7h|aWSw4Wb5XToMJ2Hu?VB`b{?Ak(XyL-!?D$UwYl3aAJF$H|Kjz zk9-KFZ7J?Dnn1&p~lZ-qPm*Bus) zI6Pjn0KgJqBS}Mp%BJjFtv)COv}tmpfrI@}3I12#QfuQf^MnA79?s#SKKjofCigwXAK~8or~~Yhb3l?1&!9 z5k%Bj)0sN8$gB%ey&c!5Q-x1hWoYG6d~(mR6T(Yt>UZ|(noTPoi;l@$o^Z{Km=71h zT3)nO7#kfOXHryJotzkfWc3aYhtmEhNe1GppJ@rinDOOr!1YDXsARtjS@X?{e!9Amo7xGKX)O{@BipQSeYa(wFv*X9KsTvbweundb2 zql7m@nsRc$;@Cfb*hMrrpK0{N+^Q*q4oTaw3_vTnk3+U)?R z%fWEJv%{6?MNfUUCnFC}jFuRqf#LinM+YG$f)tP)kw2eNBl^*NIMbYJjpT;J5l+ubgVKe8L6rKqahwRH2!qrF3sF8x}`kS*jr zxp#i%Y;wP)X#*#*&+w-4$07)ahi6$iG^ei#P*2yRT^$(BY-}uxAX?M@sM!xs&&JLY zoll9gA*00DWx!gPo<|%I?{`Q(7?s3q+`M`Bd^$5&y0=aYWHNSW8A@BZgl|3yrVd&& zO?sc1YLx7*$| z^A8!l7{_KPS$n1USbu)!6rh4|Azq<=1kKD2_D)ChWYWT8&UQoA%-p^?pjul?rv*}p z4l>3+CYxenKo;VayeB?JoH8>vH~WAQ4@j;h|6Ys{&Uxs3nlB+cXI|a7^aRY93EhZN zRz^TEnA^AK)hYDWdJLbG8Lv^PZ+6()rXS~ADyHfgfBj0-v9xS;uUJ>BuI7jy zTkiB#>{)6R=-Jmh-dBg3-?r;hn;%eJZu$Bz?40pY6MEq!hcggs&%WMn_fy6PL8_6I zg4`=@Jqh+g=SlCEWPn7LYe?1raHKB93x9j{ir>D>DBlq*^T)AOMm)Z!=fMi3?E9ES z-4PUal@`(pRG5?AVf&k!1)3#ks~BZPd@nV4U#I9!;Umcmhx`^$YB424_v>&yE((P| zl=vY$JX;^B3`sgo)>4eUV$9FIGDcro2NewZAiC8oEjzuTpJh)erq|SdUo?tm0MK!G zIPj#I_2lG=KL9GGrDW#s-@lW{p7|5bKdum_Q)Hb)VA{<`4GhzJ9x=!$DP6u<;OZx* zi_8ZCUa{77b8er4{k9m3qykp5Cz-`-d}IU=o0E|T*EM#x>lg?UX=38hn^a({sv((_ zJg3NfL#N0vIr7U<&E7bY_ta%BUzYt;{Gh+c!NbA9j={{lKAa9{FjIF2hwxKo*47qd zlPup!B$Dc>-CqxddOZ~cWnFkOD2x72&gKvP*uv*k4A1a?2=aCN?+#Ruv$h}ABqu;V z&B6aw4$qt$8R1nv2x&gpJF3x$Vg0jstA#!>7|$i7!f6vcmteyLi_wdDC_#3Ae3n#P z)J0nq+T4qX1V#rU3!`nwN0aFjc73t{UjV8sl>WUe@9$&M`ihm8lG0)}A}PwbddQCL zmP%M+eiw%woCwJu92vb|7mc9`CV8YoS+viYyzZVe>(`2=TkNc?HH){XM19`8P4J7!g{HTY5>j;z9ttJ`6_@bce{jbFoiI(V5yT6HU%iR&d%@OcU3BDYnx6nwa$wXFx>p+kCi_dgkP?h>URc|+b9P# zpL8-w^2h>BAY`}-c{Nv+fOu4ouG9aNXm{>W6jzI=UAQMbqCgTW@hvmCFqGZpKAWbV z{!y6SxZt$piEkqpI-k2nD76`-h_Y)R|BAbB-dS)%Jlk_f`DZYPuX$;2pUHn7b&Io> zW@c8*yu9T$HfE5B-JzJ6v=g?zzMh^AjIK2n7pGXqJf}(=s!WS8X{6zRYV*F^laZm9 z`>2EQ%8b{G%F4Vlg!$^~qVHMPhbiZk+)gPlRbJ`O%gbhp8jLTqMmxrnzz9a4svs@8 zUW7-Xz5F)DE~$j+pX(D>K_%Hb%cZO{Lnz4qV^1ncV|^?~a^kL=PF4mxLZx5^^%TL% zrag63`^VoM9B$P7$KPO;Pk@+jMfGR$bk#nB#25PE9`f*|ii`bsx1X{3Pe*^mb_ZWH zuv_g=CB7L&0ag_qwsg@Jlj>EeRbZW$$NH*-N(H7PR|S4InN+*iom*S>vKd9m@2gW` z*Q%?j{ryBphEy*xbHKLw=-cx0LrvlKZS)3byVfTZQb)u&YiyL^As`I&QcM$+s}QVa zHmm**A!cSHV?Sxpp|sk%@H4J8A(vq+a~q$TVy>m?U&wO_Y8wP(h&@t;U}so>_5#+6 z%)uU7^b>ZKKFNgo=8fQHZ$vH40Sg^2%nP~M6=4b&coFQCJFB& zU;11br!`C@aSElfKXm5F%=(YCsN3bp!YHK6%U5B;nx1Ypxx3p9!?<{QDdJn(+P<1J z^rG#Xk8;Er-;snuFvFvYIS`2tLJFk?8{N@>1kD64Wl(2{LN#;ruL-iwWeLDXl%31s_hNCNt{UQ@)^H` zS5+-7jarJG-d2pcLU~uj=yiXwlhZa}YmYV+`b@dq^j`E5NrL~Pw6`Z`T{u&2FzG)Zig&}xHy%% zsG%UNE}x?q9pg`Q6oYkZJ zW|+dCQSkA@;15Vug5bNU%`xK5>z$x7b) zv*N8=OFMsmNrGbL-E3Y_ee_}i*ML?uv~cnM?Tm@5$0|Ozhe!US!LqH-ZbTVPIh-suyAV43nR8<8V1Zw4OhFSJ6--dhlfZNyl?g8lVm-;a-v z|B}?^%NnpZzWRwkli*I$DL?X_JmH04Oh~}vn@(3&^ANUFj7od^H4fAO=96w*8*|ru zm)SGCL>x7h{5n14#rO!2iko6FRd}UnV87($Tl8^PjJD{dT^E_(@I&OA*u{4^V^EHL z;vvI@!0~q|$JW%$IRRLDDB8rLdmJGIJ7lYMX1U}KMplnd_tK&1KhOn~!nAyQa+`SttHI4Qy-`V@6?Bc8c`J~BWuzp- z{!CkXGXRZKQ3nxU* zG)t=MgZES_8^;%cC~vgO)a?{o_;xtcvpe9r2=>;LQo(QJ`N6?p`u5mZ(n+Al0wY8F z8E9%MpR{#@4zB9ZBOMW`VE^S>ti2=GJK!dCuE)09K3Q4rjWc_B- zs;tps+!>P_zqX<-+!GVaEPYl#Er&yKY4gaW?n_Zb$)~!dCthh0z2ZhA+HlXYgd7*0 zwF1dZm_62^*59DMyo-}B_7TG=Cjj7sUVXY&S8HktCduOBqZ*E{4=1^;t)wKc4CRG| z*OI)z$m#4Hu@8FD&JLf=U*JrV@t*+1DS$rCE&^_~)>9Mx{(qh2h)$%{inqi*Fg&zr zDIWRt%ftI%El#sWPkDsRX;iZ5*|3|UJDDT+C#to~l6YxnI!;hpUpAyB_`kBi>Ocn+T&cXCLnrG zBxr)dHn+WOS;xx@P$dZFAE|j^Tf-Obfi`}H?Nr>6t{t^gB8RtuR3Q)lu_4Dzfai*d zZS06LSV!*t1WmWx3Xcn3zxJauX>RTl1n3z@)knseyrv=!_B817`DWQ!9|JiTXpdTb zqm(B9;PQf(FWK7LySe!tM?LTgthHv9vd+cRXlbUPGNdb*+_KzyO00I=HzZl~Q-r<;Sv?lh83$&jo4 z!-ADpuSUGnV31svG=q?C>2CtF>Ov@MZfu9$NaFQch>Xe{?zxB3|dmZUJWU2*2ZK6fV%u)kG9g0RB zsdBzVOca(YW9*bwtyQa|7Oq@`)=`mZ0`8vE1~z5K9o+7 z%Qa))z5#)v*hET$hA@&MEv2Rs18QnI25^9gd1rRsIAw_@@N=c;* zq$I~1NFLDAQjSdO$D~e>%SWVvLCofFg4)z(KcjDU*PT-Ey})#-DRvt<(A8PZPs?9o z`LtBQxU_U8{CAQ!q<6lpt*(XB!!tmo>GUa^T26R^ze(1({gw(`*pU@<;-I zQ`=%pkxKngM2z1C4y{I;YsVf%Wzp{UTE*-9iHkyblU z^I4xsIMkK=(IKaOrrX95IgWrOWeEZ=P&#=3{?Fx){`Kq4ZQTE1F^eWOFd+TxfvHim zM4mtF_c6k4vG(Np-0N}o>-1e#4vD5ChF|@;~h)=Sv*dNQ1Sj1~!}tYYj0*7DlBwD;L?i@UESTgJyNjeYW+{1o}4K ze4yVEX)y1n+vX=w#c9i>41QnBi$b~|k~R2c2;}eI`}%-b?gwxExrM_~a~&Fhy+RJB zHwS1mU;zNR@CFFd01Ic9_ZWo&l18z9#mDUYpo9+VfX|0ome0OG<%i}NwoI)uCg~K| zlB2r5ICkEA_a)*BRU&g_+h=5nq1~>bsoBuw+q~GbqM^=grPP8FF>L+vmZB0a!OH~< zH7b8U0x!wLD@`_;d$-@+u=^Fmw=n+EhrwsU-q%?yV0U&C@u0Rh+pZpw^Au;0lIe>+ z&rn^RA&nXDl%+S2=sy^R*cM*;A!5;v+}f}tIC67mnj6Wx2zRgHKmMLv3~^w>qoq>U z!&|Ese9rR%4a823@Zh z&GO%{j)Oh)%N&eZWyJ%}b%QXSMhW`wjY6kqioK;Q|kYB z)(;rc;BO1#d-{AieuvbIbtJ$udHDo3h?0MXM%yfQ)R~izg|@u0FRaic-;LmO%Tigs zZ=acr05IX<0S2Q|W1}xr_e)Y9bam#JfDiPWhT58M?GibFSQ-b0jo;9BE%mmmA3LYp zmh8wtzDm?z5ymJzLuk0dZ!Cz4kd0pnE6PV$HyC3QHI4@i>cW2QU@4@sj4WGCl6DW?x0nXf) zcIvCa#ARouA|YF&7E^bpbDlIG6u%K@#uWbie&AVkah{(CAn*vEb%em{JIJtfy|nIG z(E(RtU#=?a2d_7G-V7|Z{|!aBV71wmGZG3tcr&w!bI34;GGLYn*xTJz!F=%af^u|z z3E2)IQj`$T;q&1!b8?tOb5qb28G7fxf1f!^ZffMXb3O(db3C8S{PY^838&pd!^yiV z6h$={0K?`F(>g zy#}3|{JU}-i-G^$k+Nn2?8RoILY#SN0JU#kY`{xgw}JDUTP`78j2&}Q=lS!(Mc+`A z4tLQ=T7);#+=N!AYuWg#e+Mk#0g*EwhAw0eV<>jWsnu z8V+NI{q=v14 z(DXt^G!C~(?ayNsOw!MgvUxRBGMG;(HhYPQuP+MI&|NS(4~LMPZd{#G;$j!+9T;>l zNB>Za9wBaA4);St`km_s&{B+te(4^D7-*9KXr?)$1wIObIFTfg*m{E6v-(^ek!nb9 zKScX&OaWzJa0UhcvOw&1L@Paw5~`GhU4aXNgK&#M?<7O6E+jheq96-fwY5Q3vD!dA z7I`&1Q`O=d^FnXjK1>_7g62Jk|(nG&?r@5B6FtagXS}P=FM3MgHPF5yF zFbP8~w+5#sYijD1g`NU|BS>r{mom`R?)#$m>zlih^L~E~qB{WRzm5Fx{V&iY~wVxTU zuUEDX{$6sY%2S0+*)ZXno=`SBP>|rwi;hpv!Y0!@mX_(i3V>v`CH5e3EL1f!90#)5fo#IA92Rs}3}m9=SY&8@DmP_Cj&Vi4Ci&{#hn# z53IH;sK#q9$);Fo>!Yw?Y`g4TBpe1j9z=tiCt#W>Ko;_Y4_p^f;l$mRW<&FRalT%J z#YPDw;FjWwM{C)Y`3M}w1fu}-##9cE z>$pT4GdT5%kV3jt@2K$=;#8kllAPjY$%;p2#M-$rS4I^va2%z5AV6T_negvK%@c(A zpz67*#?djw98cgP<|?dw-rpb691(=k24~n-cMDj&NfnOk2e?EH4)yk+%IHMsd`P%f2|1@4SoHh%46RZH6RAhW&eTp#kNG8Mab7tT<0%$>Ys>}+rxrZeYP zB&%^0GU`zSbF2mkL2o*_Kru=4es&6+<6+dpiX}02?Kxw!t?;M!Mm-8-l)I8csr`&i zr*ke}(WKgdmQ*#z!MTX)y!<($i@G=q)82MLJkyzwVn(QRAzy-@^ytQJM0M8=;bM-P zPUUjo&Ao+%ZmPJLm>8s6+@r$tHg}1wj!Th~v4vcH74dF@gNiY5I-lV{hT*bpcNzt5 zrRlw6GyCrPS!6R9rYV+;JY_+_R`^c4qkqV?jXr{!XJLNXX^jQB>W~$M?_Ml5DX5ms zQ`+ylv&ISzd|+FUa>C*gm}ffKd_zOGZ~MQ95w?ol2`jyJW#>D9u?tt10A-*^p-TJYGX9rn-ro`AIj_dAap_kf#xP4?<6ZVNO^UlgxR{WMkhMe>LIOPiETBR~JwX1sh~hYXzkZIutt z^fg-NaA_~E?>fr)OBo{*9Jb4j35Mlu!L(tTI2_>e+uzRO&f}2%68KC9(6=U? z#gH4*#402cR7~MCvs_Q1j~y8yaK+Z|7Y>qMYb7PmH##e-aXYA&nsBXk6C7p67Vs{< zl(VA-g-a$-25SXi(oZE5ro|WEb~{TrI?APWe}hBbTcp9bnSL`n$$8W{8T;5y6;nh~ z3n)@gO}vX%Z_7{uocg3G-rjDQ6ni-!a zDqy;*g2Id9p?49twQ40*M0!yPXRRy1S+V{(lPfB^52H3a5*=Y~Iv>U^KE?%KI_S$#Mf z;pFEaV3&AgN#{@e*;w>Rt~l@q6c)BJDgS|C3V#y@Tu52%!~h94P&U&#nIDi1`Dz|W zM-XJS>zJcG<(UNdaw(ZwPr3#jYIWPrd5dJ8d&161h@l#ERxSLN)&Fos^OGnzR0<1l zwo`qIe2l`f+YtN`ZJo27b=Z8fzb)D^F-(<2UCH3LO@AS=?OTv@WbW_q3wMOstHy6+ zJA`nf)T@fbR6>A&{eW*K{yfK{{9${k|74iXr+Iuwm51f+bq!>~Az@SR+XHqkGv|u> zTEX&0J>IdQxMBvta2%Fm^8C(f0pp?DAQaP{8dD71KF(N=0WtpDvD-7pRQ^1Ke`qm(6Y`h^?0@*?C1Vs=jh2 zlXB@qHjrgGBqWn`vLo#lK!(B9$2?(p_U7SG_W%DkvW3t^ zmJCu|Op-mu9*UG*C7LW*%R2U*lBKMrLbfEyr6RJ7Z7eZi7;AQ7Vq!2cF&JZh@42qe z=X=-Z`@N6jci+GJzW(UAjydKu=lMS0>+AJ=K3*7GcjhkR_(F@&BSRD*f?8E{cIEvz zd5+f{wiP+V6EF`51Rb|*Jth}5D`eCyQ!0EGSsZK#gcX|J-T5=^qudEahq0Xz&Od`P z{L$>5ovqF`PoSQYG8g>s&cJlC6g;dC+*B8ZNEt!j3LEvn4234rY!a^Pa3}%K!n8%q zEu_V#xTq6Te;P?M4<2^X8~h+{EL#A5+5hOIZp&_+?4*%Y3a;PA>Aq2qVm|DWzQI=o z?xtzZ8UAb6iSn;_g_r{#pL}po_j9gKYCCTn{MGEV)$3WyE~i?h^uWocvzDR?seGfG zn(<=B{u9}!KbZyCu`sechjuR*SLi6U*}e;y64o7r4QAa=y?2rYrv8^fQLBRo=l9LW z&XIW%YT1{&VaJhY3lF6DO9uKOzDYeed_DB0admNCjqH%sr9v^!!i#eiQrzWwA}V6lS=IHATe_OEiY=HzgB zjT0=gUdFVi7j+`LKGaR3J657|Mb62hcNRh+)~S5)28oM+rBP^Z!k9LHFz*)s^`#Ld z+$c;lrT^Aq6V5!*#mv`PXg&8H1mA>c$;Ki)*Vqgk>Z9|sKHOPTa@8*J-4h<%@l1Vr z-Pz`CEv_Q(=UOpx2AaK|IDOBVcRPxoF_v+m3%ue4z2U`0cjmWme|$Ghh*Gu+#|epW z)3e||n;&)c-+lIF#&an7(Q43g-C6(V+I;~YYXn!+aN%dI=e;0Lem+#35ENP9trFj7 zqECEH^}gevM_9ve{W`fNN^B7C;;?2k`o9@ve{uzJY({k=#$=F|nL9HIud=w(;kyh?k1VRVMg_t*YV zBL?+yhAo`?r+)WmPkRT)J0Q-njQ&{)ZX!3O_NL*Svei}5DHZ7_1D*vm1l;>c!9+5j zG^&1{FPGY0F}cu2oj9s5$<2D3yF4PFlNQIMuPML*;u$|h5py|uF@%jv;bMXqpl*B8 zj3o@OT2^!|_#yq&ju>#TTzXb?nB|4%7n$v zdEA~q*Z87ld~s2QLBbJHM@e%2VWyNS*~}hiXjZbpXQfmR_X)x4hUxsIGDFSRz68Cy_iWx7 z+;#R-%yB^})IP&;v979=^IcHtV?#U2{sn!>r^tT2037?X%49Q2ubp~QSr9rspG9%0 z+G)fi>=sA?xuzxxwE~nhQkwM>y+bU6SJqyhGiX&Xf~6)q4Pe51D&N9W4dvaAiQdaS zOxtzEziw+fHT!M2U*PR!MCRus-C)dC?ViSiUATrNy2@CZAIujth90PNOEh6 z%t5w#&(6%Sf_!BZ${e&A?EOeGG_x;g@-?Z)S$S$TWb({*v4nj}#v@WG5KDiTKPw@d zQk22ubu|9VPYoif=&-*=r-J{-P&*)^KhTta_>!=?B3DXPCYfjSEUsfJA?0^7-QNVB zN5}j^g9fUaFcGplh2Qs@g*ULL86%ZWp>z8lK2uRggQvv@* z#I@o+R@oOh=^+j6n-=NeSw;76!H?Q11m?>_^KetBuO1Q526FT4BNvEAz+iEz0Iua$ zsDW6;YQWs&x0m&(_mcRhr$+B*ePasd7f#@0L7gmok=141zeLXIZDnA;7cmoJ4Lz@r zY5n0Mn>iB0vS|wxU9k`Q1OX@oq#=4o=yKjd~J?5M!%bK#9&(EgX+A$-Goos#I!O=m4Y(onFGC;Q>vGi3KjekXzxzQlI8zJtMA7#X zorSDp{7)Grf5pzQ>(7t@9BYUKD=>L)8?=AvXMJ2 z4lO(IvJVB21k>|;VZ)^Dmj{#j!aYAf(~orwHcNR}NRo=~5mARX%?YFCVM)Dj5#FXGhRKzsn2WK*CG=9Xpa8Qw++{ z>7l)gK+Mg6Y&3Qo*dYZxJd(sky~y?g$?X}60~a<|miHQ4j%A2F}t) zQV*zO>u=h9m`m5Y&|u=`TGizl`g0t}8$X1sK^!Ktjf)sV#8~=(S#A}i%}o>f%KWn1 z9uNlS7GVL>3#1idSC?&X4Y1Wl&64lBW}poZ`y+)1#@RpAc-crAipB}mjDAzO%p%fP z3G~4x{D|hA=7WJYr5Fr|2z+pF%oh>iI{X=7D)BH1sa*BkC7ZX%;Hy!sB;@<{-Zzyd z)XKj0k@*z;r?Wf>{829xH`gQM%~OtZWHiruhl}-l`!@nLuBS>**nNrgo)7sujfaI& za{CBi_PCXs|4mXoYq&_8bgYEuNVIX<2vMr+3Ag(VQ+bj{go>-e|wIxQ0C@E zS8i#Ncx-twvP4rZ2k7VSJWY)ai@f!6pl%lB=%+F*mnGcVdHsbF4e z{@phh%E1H>LEP^jJh-J`1Psc{fehE}ysLqTASI=vL!2fA7-em7NVON{Z?5&Y$WAFS zi^SE#Ttki8rfy=KJHA-_SSC+;wUEa4mzL;}ao^mCe7n-#UOS%e

uQpYA@>S^}k| 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 W2f+#K-OG?XJ9q5;qTc`bx!(bAvqhNz diff --git a/school-software/moodle/images/forum.png b/school-software/moodle/images/forum.png deleted file mode 100644 index 96eb8c810522fbf167483a41580be9ba42ea2f18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55429 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�t8OAKaE7~NuwG6m(? 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 SUtHdabll$gSk=$xZ~R{<7tv1u diff --git a/school-software/moodle/images/login.png b/school-software/moodle/images/login.png deleted file mode 100644 index 053b87e63e514e1b3557f06856cdb99f2a6d4650..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43585 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 diff --git a/school-software/moodle/images/multi-select.png b/school-software/moodle/images/multi-select.png deleted file mode 100644 index 1b67b6fbed24910c2334437d3f69c2ec24ae257a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14583 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 diff --git a/school-software/moodle/images/path.png b/school-software/moodle/images/path.png deleted file mode 100644 index fe407906a511db98f8f98d2683b5bfef134a0dc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2031 zcmah~dr*^C7EcG)7pt%$g+b8PN29eOs0a;UDzAu2c!U&DLIgns#0caA0wLLIo$?S+ zS;WVHr3y$eVKD+FK(MVLvVhn{@(}|@6EGwnF(xqt^7yhJw*7nW%)P&Resg|j&N+AH zp3*2hZp~`9)hHBdP57aZ7!>LgB68pCxEwkAhp+#L!1ClHxDeaNwd$C05@A-IKNO#f z;GvH@Y%ue{5}9}YVA@}L)S=jPF$%T9H9X{CY{5(QRA1)$2=~WY{hLDjcCB+Y{z8TK z*6B*uh|f1iukUbbZzn`w4s~3U-0;)=lczpUp0PhnKNxb^J0W@Ns!!L=U0yI@OJ1o7 z-@obYKKeE_Eno3W(=0}J?d@M2p`^`=^fK?P?bu5H9BXCgWwA7?!rIE2q{#zN)rX?2f>`w5M=RJrLza}+N-PGJhGHXw18RY_^LHbBJ`+LpKR?3gO?Ei9b z$3r}1qOZFxt1s30=XNWVTCK2(%ZjPVtfNBjHLz#RS~gzSo1(ke3cPS>C-lRTQ64mZAeqw-d2 zkKx4beYQO{C7_sQS-9mh4odraa%Lb<1$lS~E7`}1#Uy8(FMcwhxFc7+`%c{W$cJ85 z-O=&LXGffIAokq?2ZJdSkb2;aX=mqt-(r*BSJlK~rRIHXOpB;BV}Ejer_mlXH1$Nb zn0np?k1aIGZw$0oY>1mRM~!p1+~zdnIRHBzK(!u)USs%K%rQD(ou*S2#h@6VdyJW$ zLX*@4sXkK0yD?xSF>mV8EFLy#p^yY5PM#s+K={|`>6sxie*z5tP%X@^YgW^cXtY7C zfF^-ij3z4ytSg)Flg&br1w6>H>rSR6td+1GB6YkYTIGp2GW3}em^cF+*@!cI6V+dt zA&J2AY5Mm`hV4RdCP{*n*l8syh*qmQt{?bT0Fc0@#Z;h<2$4YPBTrUdwpkeX#e8W- zOq;!vQ>|w)+*`1*e5OSuohsH%^MLMzIIz?y6I2Pkx5)KJ@2GZNGbz1G!t7fCMO5=uJ>J5+~ z((^f7h~Z)$_2E$BHNV{hzf)D581{z%Rcj@S*5p(50DAsFG4>MIl#IQ9{jiHC-Sn>^ z=kjKJN2dr|Qld{@FPRT_eryOT=_LYQ?AmiwVgQXkg*=pi&E*{6Eq-BL9{*)uA)rar z$$d;0Gh%=kb^bVSz5FF-%UEx4pSFC_d9|G#n{5EN6@kdS$-SwSvAv>5`?@N+~gXE`*942frIb*Nf%A$|WXY2DeG{<6?uv~aa zvW-ynvo>SYrTpSW2)sQk+{L%)^A0zH?#Z{&?sdG%Y$T!EpFJ@VtluHu67fMK z*_^4>CtC#bi$O-a@!ny5tv+Vv<_kvVoFNs97a2RKNIXfWhhLPn8#YZ0IHcC|^1`v` zl%m7{S5{jyz5f;kExKqq8DDYgcHBc_%@dmot5X{x8FEN?*xsJ2IGrXpcCqo1qspYW2rV(vNQpJ`YhOx&Il5L z;g722H|F!%wQc5_mThT&;evS;nkOwOM}V4aQ4ME?87p$Ezswzb+JE@CWn&D`By_Q!Z=c;o+Z+^myE{|$xu z=8CT7aO1D}A4i27{L7MbnUeYMO#xvaHl+{{Ya2E681+<6Y7#YdR|;~V_IP>u?egBU z%WHqE_g>7teHibrcY5u?czHQl9PIxRWKmMmPt*R7;AjL5iwIERq4*F^(8&w`0~U!l Au>b%7 diff --git a/school-software/moodle/images/question-bank.png b/school-software/moodle/images/question-bank.png deleted file mode 100644 index 31288355d3ce41c94e52ce0b57d4b3d12959a798..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53783 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Π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 L`njxgN@xNAKnc8k diff --git a/school-software/moodle/images/rename-files.png b/school-software/moodle/images/rename-files.png deleted file mode 100644 index ddf350d429d439a2781117d166fae37423f98007..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43190 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 diff --git a/school-software/moodle/images/short-answer.png b/school-software/moodle/images/short-answer.png deleted file mode 100644 index 3d9da59431a575296f37fb4e55778e67326e243c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25406 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%0AW)1POZ7oLx4kzUXTvI5^ah<+` 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 N@Px_l1;;Ml_+Kb(6)pe( diff --git a/school-software/moodle/images/unzip.png b/school-software/moodle/images/unzip.png deleted file mode 100644 index c322cb7f5f8f6ff42ddb302231b9898b4da3668a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9933 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 Q!qL?+cW*b+q0_(rA4<;HZ~y=R diff --git a/school-software/moodle/index.txt b/school-software/moodle/index.txt deleted file mode 100644 index 1650fbf..0000000 --- a/school-software/moodle/index.txt +++ /dev/null @@ -1,1215 +0,0 @@ -== Обучающая среда Moodle == - -=== Что такое Мoodle === - -Moodle (модульная объектно-ориентированная динамическая учебная среда) -- это -свободная система управления обучением, ориентированная прежде всего на -организацию взаимодействия между преподавателем и учениками, одновременно подходящая и -для организации традиционных дистанционных курсов, и для поддержки очного -обучения. - -Используя Moodle, преподаватель может самостоятельно создавать курсы, наполняя их содержимым в -виде текстов, вспомогательных файлов, презентаций, опросников и т.п. Для -использования Moodle достаточно иметь любой веб-браузер, что делает -использование данной учебной среды удобной как для преподавателя, так и для -обучаемых. По результатам выполнения учениками заданий преподаватель может -выставлять оценки и давать комментарии. Таким образом, Moodle является и центром -создания учебного материала, и центром обеспечения интерактивного взаимодействия между -участниками учебного процесса. - -Мооdle создаётся множеством разработчиков и переведена на десятки языков, в -том числе и на русский. - -* Основной сайт проекта: http://moodle.org/. -* Российская ассоциация пользователей Мооdle: http://www.infoco.ru/. - -==== Системные требования ==== - -Moodle является веб-ориентированной средой. Для работы виртуальной обучающей среды требуется: - -* веб-сервер с поддержкой PHP (например Apache2); -* сервер баз данных (по умолчанию используется MySQL). - -=== Настройка Moodle === - -Так как Moodle использует для своей работы веб-сервер Apache2 и -базу MySQL, перед началом настройки необходимо убедиться, что -соответствующие этим серверам службы запущены. Сделать это можно в модуле -*Центр управления системой -> Системные службы*. Необходимо проконтролировать -состояние служб и при необходимости запустить `httpd2` и `mysqld`. - -После того как Apache2 и MySQL запущены, можно обращаться на стартовую -страничку Moodle, расположенную по адресу: http://ip-адрес/moodle/. - -Например, если ip-адрес вашего сервера 192.168.0.1, то адрес, по которому -будет доступен Moodle следующий: http://192.168.0.1/moodle/. - -Естественно, при использовании в вашей сети DNS-сервера, ip-адрес может -быть заменён на имя, к примеру http://www.school-server.localnet/moodle/. - -==== Использование нестандартной базы данных ==== - -По умолчанию Moodle настраивается на использование БД MySQL, работающей на -той же машине, что и сам Moodle. Это является рекомендуемым вариантом, при -котором все настройки могут управляться централизованно из центра управления -системой. - -Однако, при необходимости, вы можете использовать и другую поддерживаемую БД, -например PostgreSQL. При этом следует учесть, что PostgreSQL придётся -доустановить с установочного диска, т.к. по умолчанию он не устанавливается, -а создание самой базы, требуемой для работы Moodle, необходимо -произвести самостоятельно. - -Другой возможный случай -- использование уже существующей БД, расположенной -на отдельной машине в сети. Для использования такой внешней БД необходимо -указать её при первоначальной настройке Moodle. - -[NOTE] -Для выполнения подобных операций вам может потребоваться доступ к консоли -настраиваемой системы: локальный или удалённый (например по `SSH`). - -=== Некоторые вопросы администрирования Moodle === - -Мы коснёмся только тех параметров настройки системы, которые необходимы для -управления учебным процессом. - -image::images/admin.png[] - -Администрирование выполняется при помощи команд блока *Администрирование*, -расположенного на главной странице системы (доступен только администратору). -По названиям пунктов меню этого блока вы можете определить круг -административных возможностей. - -Поскольку в справочной документации достаточно подробно освещаются вопросы -администрирования, остановимся лишь на некоторых задачах администрирования -системы. - -==== Создание учётных записей. Работа со списком пользователей. ==== - -В блоке *Администрирование* выбираем *Пользователи -> Учётные записи -> Работа со -списком пользователей*. Открывается страница *Редактирование списка -пользователей*. - -Здесь можно добавлять (регистрировать), удалять и редактировать учётные -записи пользователей системы. Щелчок мышью по имени пользователя открывает форму, -в которой хранятся его личные данные, блог, полные отчёты -о деятельности и сообщения на всех форумах, в которых участвует -пользователь. Здесь же можно назначить роль (права) пользователю, причём -эта роль будет глобальная, на уровне системы, т.е. пользователь будет иметь -назначенные ему права во всех курсах системы. Локальные роли назначаются на -уровне курса (*Управление -> Назначить роли*). - -В Moodle используются следующие роли: - -* администратор (полный доступ для любых действий на сайте и в любом курсе); -* создатель курса (полномочия для создания курса и обучения в нём); -* учитель (права редактора курса и его материалов); -* учитель без права редактировать (обучение и оценка учащихся); -* студент -- обучаемый (доступ к материалам курса); -* гость (доступ к каким-либо курсам (при разрешении гостевого доступа)). - -==== Резервное копирование курсов ==== - -Moodle позволяет делать резервные копии курсов (*Администрирование -> Курсы -> -Резервные копии*). Вы можете назначить файлы и служебную информацию для -резервирования. Также, можно выбрать автоматическое копирование через определённый -промежуток времени. - -Кроме этого, резервное копирование курса можно осуществлять и на уровне курса -(если вы не администратор) через блок *Управление -> Резервное копирование*. - -==== Настройка элементов курса ==== - -На уровне системы производится настройка всех модулей Moodle (элементов курса, -блоков и фильтров). Эти настройки являются настройками по умолчанию для всех -используемых в курсах элементов. - -==== Внешний вид ==== - -Оформление образовательного сайта имеет большое значение. В Moodle используется -стандартное оформление. Однако, несложно сменить его, изменив оформление -сайта и придав ему индивидуальные черты. Для этого необходимо поменять тему -оформления (*Администрирование -> Внешний вид -> Темы -> Выбор темы*). В -Интернете можно найти много свободных тем, разработанных для Moodle. -Для замены темы предварительно требуется загрузить её на сервер. - -image::images/theme.png[] - -Так выглядит созданный нами курс в новом оформлении. - -==== Настройки главной страницы ==== - -Очень важно правильно оформить главную страницу сайта (*Администрирование -> -Главная страница -> Настройки главной страницы*). Здесь задаётся имя -сайта (в нашем случае -- Веб-Учёба), определяется присутствие элементов на -этой странице, которые увидит непрошедший авторизацию пользователь. - -=== Возможности LMS Moodle === - -Moodle относится к классу систем управления обучением LMS -(Learning Management System). В нашей стране подобное программное обеспечение чаще -называют системами дистанционного обучения (СДО), так как именно при помощи -подобных систем во многих вузах организовано дистанционное обучение. Moodle -- -это свободное программное обеспечение с лицензией GPL, что даёт возможность -бесплатного использования системы, а также её безболезненного изменения в -соответствии с нуждами образовательного учреждения и интеграции с другими -продуктами. Moodle -- аббревиатура от Modular Object-Oriented Dynamic -Learning Environment (модульная объектно-ориентированная динамическая -обучающая среда). Благодаря своим функциональным возможностям, система -приобрела большую популярность и успешно конкурирует с коммерческими LMS. -Moodle используется более чем в 30 000 учебных заведений по всему миру и -переведена почти на 80 языков, в том числе и на русский. Более подробную -информацию о Moodle можно узнать на официальном сайте проекта -(http://www.moodle.org/). - -Moodle даёт возможность проектировать, создавать и в дальнейшем управлять -ресурсами информационно-образовательной среды. Интерфейс системы изначально -был ориентирован на работу учителей, не обладающих глубокими знаниями в области -программирования и администрирования баз данных, веб-сайтов и т.п. Система -имеет удобный и логичный интерфейс. Преподаватель самостоятельно, -прибегая только к помощи справочной системы, может создать электронный курс -и управлять его работой. Практически во всех ресурсах и элементах курса в -качестве полей ввода используется удобный WYSIWYG HTML редактор, кроме того, -существует возможность ввода формул в формате TeX или Algebra. Можно вставлять -таблицы, схемы, графику, видео, флэш и др. Используя удобный механизм -настройки, составитель курса может, даже не обладая знанием языка HTML, -легко выбрать цветовую гамму и другие элементы оформления учебного материала. - -Учитель может по своему усмотрению использовать как тематическую, так -календарную структуризацию курса. При тематической структуризации курс -разделяется на секции по темам. При календарной структуризации каждая -неделя изучения курса представляется отдельной секцией, такая структуризация -удобна при дистанционной организации обучения и позволяет учащимся правильно -планировать свою учебную работу. - -Редактирование содержания курса проводится автором курса в произвольном -порядке и может легко осуществляться прямо в процессе обучения. Очень легко -добавляются в электронный курс различные элементы: лекция, задание, форум, -глоссарий, wiki, чат и т.д. Для каждого электронного курса существует удобная -страница просмотра последних изменений в курсе. - -Таким образом, LMS Moodle даёт учителю обширный инструментарий для -представления учебно-методических материалов курса, проведения теоретических -и практических занятий, организации учебной деятельности школьников как -индивидуальной, так и групповой. - -Администрирование учебного процесса достаточно хорошо продумано. Учитель, -имеющий права администратора, может регистрировать других учителей и учащихся, -назначая им соответствующие роли (создатель курса, учитель с правом -редактирования и без него, учащийся, гость), распределять права, объединять -учащихся в виртуальные группы, получать сводную информацию о работе каждого -ученика. С помощью встроенного календаря определять даты начала и окончания -курса, сдачи определённых заданий, сроки тестирования. Используя инструмент -*Пояснение* и *Форум*, публиковать информацию о курсе и новости. - -Ориентированная на дистанционное образование, система управления обучением -Moodle обладает большим набором средств коммуникации. Это не только электронная -почта и обмен вложенными файлами с преподавателем, но и форум (общий и новостной -на главной странице программы, а также различные частные форумы), чат, обмен -личными сообщениями, ведение блогов. - -Moodle имеет не только многофункциональный тестовый модуль, но и предоставляет -возможность оценивания работы обучающихся в таких элементах курса как *Задание*, -*Форум*, *Wiki*, *Глоссарий* и т.д., причём оценивание может происходить и по -произвольным, созданным преподавателем, шкалам. Существует возможность -оценивания статей Wiki, глоссария, ответов на форуме другими участниками -курса. Все оценки могут быть просмотрены на странице оценок курса, которая -имеет множество настроек по виду отображения и группировки оценок. - -Поскольку основной формой контроля знаний в дистанционном обучении является -тестирование. В LMS Moodle имеется обширный инструментарий для создания тестов -и проведения обучающего и контрольного тестирования. Поддерживается несколько -типов вопросов в тестовых заданиях (множественный выбор, на соответствие, -верно/неверно, короткие ответы, эссе и др.). Moodle предоставляет много функций, -облегчающих обработку тестов. При корректировке преподавателем тестовых заданий -можно задать шкалу оценки для обучающегося после прохождения теста. Существует -механизм полуавтоматического пересчёта результатов. В системе содержатся -развитые средства статистического анализа результатов тестирования и, что очень -важно, сложности отдельных тестовых вопросов для обучающихся. - -Система управления обучением Moodle может быть использована не только для -организации дистанционного обучения, но, безусловно, будет полезна и в учебном -процессе традиционной школы и вуза. - -=== Общие принципы работы в Moodle === - -==== Интерфейс системы ==== - -Работа с системой начинается с инициализации. Вызов диалога *Вход в систему ДО* -осуществляется с помощью ссылки *Вход*, расположенной в строке *Вы не прошли -идентификацию (Вход)*, как правило, размещённую в верхнем правом углу окна. - -image::images/login.png[] - -Вы вводите свой логин, пароль и входите в систему. Если вы ещё не -зарегистрированы в системе (не имеете логина и пароля), то, в зависимости -от настроек системы, вы можете самостоятельно зарегистрироваться или войти -гостем. Если ни то ни другое не возможно, то необходимо обратиться к -администратору. - -При входе в систему открывается главная страница СДО. В центре страницы -содержится список доступных электронных курсов. По краям расположены -функциональные блоки, позволяющие настраивать работу системы и производить -определённые действия, и информационные блоки, содержащие дополнительную -информацию для учителей и учащихся. Количество и содержание блоков зависит -от настроек системы, а также определяется правами пользователя. Так, например, -блок *Администрирование* присутствует только у администраторов системы. При -необходимости можно свернуть блок, нажав на кнопку *--* в верхнем правом -углу блока. - -image::images/blocks.png[] - -Название курса в списке курсов является гиперссылкой. Щелчок мышью по названию курса -открывает его главную страницу. - -image::images/course-home.png[] - -Так выглядит типичная главная страница курса. В центральном блоке страницы -представлено содержание данного курса, выделены тематические разделы курса. -По бокам расположены функциональные и информационные блоки, часть которых доступна -и видна только пользователям с правами администратора и учителям курса. В -стандартном оформлении Moodle используются маленькие пиктограммы, связанные -с определёнными объектами или действиями. Посмотрите, например, в блоке -*Элементы курса* с какими пиктограммами связаны элементы Moodle, используемые -в данном курсе. Теперь, просмотрев содержание курса, вы без труда сможете -определить где форум, где лекция, а где задание для обучающихся. - -==== Режим редактирования ==== - -Обратите внимание на кнопку *Редактировать* в правом верхнем углу на главной -странице или на странице курса. Эта кнопка доступна только тем пользователям, -у которых есть права редактировать и изменять материалы курса (администратору, -создателю курса, учителю с правом редактирования). При нажатии на кнопку -*Редактировать* меняется интерфейс. В каждом блоке, возле объектов, доступных для -редактирования, выведены кнопки инструментов, позволяющие изменять содержание -и вид этого объекта (блока, ресурса, элемента курса, темы и т.д.). В режим -редактирования можно перейти и с помощью пункта меню *Редактировать* в -блоке *Управление*. - -Нажатие на кнопку *Закончить редактирование* соответственно закрывает этот режим. - -image::images/edit.png[] - -Рассмотрим назначение каждой кнопки - -* *Помощь* (контекстная) -- вывести справочную информацию по нужному -объекту. -* *Переместить вправо*, *переместить влево* -- передвинуть объект вправо -(влево). -* *Переместить вверx*, *переместить вниз*. -* *Перенести* -- переместить элементы и ресурсы выше или ниже по курсу. -* *Перенести сюда* -- выводится при попытке перенести элемент или ресурс курса -(после нажатия ). Этим знаком помечаются места, доступные для перемещения -объекта. Щелчок мюшью по одному из них поместит перемещаемый элемент в данное место. -* *Открытый глаз* -- объект виден учащимся. Нажатие на него курсором мыши сделает -этот объект невидимым и изменит пиктограмму на *Закрытый глаз*. -* *Закрытый глаз* -- объект скрыт от учащихся. Нажатие на него курсором мыши -сделает элемент видимым для учащихся (*Открытый глаз*). -* *Удалить* -- удаляет объект. -* *Выделение темы как текущей*. -* *Скрыть все остальные разделы и показывать только текущий*. -* *Показывать все разделы курса*. -* *Редактировать* -- открыть страницу, содержащую настройки для данного -объекта, в том числе окно встроенного текстового редактора, в котором -можно редактировать и форматировать текст, относящийся к объекту. - -image::images/editor.png[] - -Встроенный текстовый редактор имеет наглядный интерфейс. При желании -можно увеличить размер окна редактора. Редактор поддерживает все основные -операции форматирования текста, позволяет вставлять таблицы, рисунки -(предварительно загруженные на сервер), гипертекстовые ссылки и др. - -Выход со страницы редактирования текущего объекта, как правило, осуществляется -нажатием на кнопку *Save and return to course*, расположенную внизу -страницы редактирования объекта. - -[[filemanagment]] -==== Управление файлами ==== - -Для каждого курса система Moodle создаёт отдельный каталог, в который можно -загружать файлы, сохранять созданные в системе ресурсы курса (текстовые и -веб-страницы) и т.д. - -Доступ к корневой папке курса осуществляется с главной страницы данного курса. -Для этого в блоке *Управление* нужно выбрать пункт меню *Файлы*. - -image::images/files.png[] - -Пока корневой каталог курса пуст. - -===== Создать каталог ===== - -1. Войти в каталог, в котором планируется создать новый каталог (подкаталог). - -2. Нажать кнопку *Создать каталог*. - -3. Ввести имя каталога. - -===== Переименовать каталог, файл ===== - -1. Для соответствующего каталога (файла) выбрать действие *Переименовать*. - -2. Ввести новое имя каталога (файла). - -image::images/rename-files.png[] - -===== Удалить каталоги, файлы ===== - -1. Поставить галочку рядом с именем удаляемых каталогов и файлов. - -2. В списке *С выбранными файлами* выделить *Полное удаление*. - -3. Подтвердить удаление. - -===== Переместить каталог, файл в другой каталог ===== - -1. Поставить галочку рядом с именем перемещаемого каталога или файла. - -2. В списке *С выбранными файлами* выделить *Переместить в другой каталог*. - -3. Войти в нужный каталог. - -4. Нажать кнопку *Переместить сюда*. - -===== Закачать файл ===== - -1. Войти в каталог, в который предполагается сохранить файл. - -2. Нажать кнопку *Закачать файл*. - -3. С помощью кнопки *Обзор* открыть окно файлового менеджера и выбрать нужный файл. - -4. Нажать кнопку *Отправить*. - -===== Распаковать архив ===== - -1. Поместить архив в каталог, в котором предполагается его распаковать. - -2. Для файла-архива выбрать действие *Распаковать*. - -3. Нажать *ОК*. - -image::images/unzip.png[] - -Действие *Список* для архивного файла выводит оглавление архива. - -===== Создание архива ===== - -1. Отметить галочкой файлы, подлежащие архивации. - -2. В списке *С выбранными файлами* выделить *Создать zip архив*. - -3. Ввести имя архива и подтвердить создание. - -=== Создание электронного учебного курса в Moodle === - -Создадим небольшой курс, иллюстрирующий основные возможности Moodle по созданию -курса и его управлению. Тематика создаваемого курса будет посвящена знакомству с гуманно-личностным -подходом в образовании. - -==== Создание категории курса ==== - -Для удобства ориентации в большом количестве создаваемых курсов в Moodle -предусмотрена структуризация их по категориям и подкатегориям. Поэтому, при -создании курса следует указать категории (подкатегории) -данного курса, и, если подходящей категории не существует, создать её. - -Войдите в Moodle как Администратор. - -* В блоке *Администрирование* выберите пункт меню -*Курсы -> Добавить/редактировать курсы*. - -image::images/course-add.png[] - -В открывшейся странице *Категории курсов* перечислены все имеющиеся -категории, по умолчанию в Moodle создана только одна категория -- *Разное*. - -image::images/course-category.png[] - -* Нажмите кнопку *Добавить категорию*. - -* В открывшейся странице *Добавить категорию* введите название категории в -поле *Имя категории* (*Category name*). - -* Для создаваемого курса в поле *Имя категории* запишите -- «Педагогика». - -Если вы создаёте подкатегорию, то следует указать название родительской -категории (parent category). Её можно выбрать из выпадающего списка категорий. - -image::images/category-list.png[] - -Создать краткое описание категории (не обязательно) можно в окне -текстового редактора. Нажатие на кнопку *Сохранить* завершает процесс -создания категории. - -В дальнейшем, с помощью кнопок инструментов, расположенных в колонке -*Редактировать* на странице *Категории курсов*, можно вносить изменения, -удалять, переименовывать категории, делать их подкатегориями других категорий, -передвигать категорию выше/ниже в списке категорий, делать название категории -невидимым для обучающихся. - -==== Создание курса ==== - -1. В блоке *Администрирование* выберите пункт меню -*Курсы -> Добавить/редактировать курсы*. - -2. В открывшейся странице *Категории курсов* выберите категорию, в которой -предполагается создать курс (в нашем случае -- *Педагогика*). - -3. Нажмите на кнопку *Добавить курс*. - -4. На странице *Редактировать настройки курса* заполните обязательные поля -(*Полное имя курса* и *Короткое имя курса*) и выберите подходящие настройки для -создаваемого курса. - -* *Полное имя курса* - -** Название курса, которое будет отображаться в перечне курсов. Задайте полное имя -создаваемому курсу, к примеру, «Гуманная педагогика». - -* *Короткое имя курса* - -** Имя, которое будет использоваться для сокращённого обозначения курса, в частности, -в показывающий *путь* строке, расположенной в верхней части окна. - -image::images/path.png[] - -Присвойте короткое имя курсу -- «ГП». - -Заполнение остальных полей не обязательно. Moodle по умолчанию присваивает -наиболее подходящие значения всем параметрам курса. Рассмотрим наиболее важные их них. - -===== Категория ===== - -* Если до создания курса вы не выбрали категорию, то можно сделать это теперь. -Из выпадающего списка нужно выбрать подходящую категорию курса. - -===== Краткое описание ===== - -* Краткое описание содержания курса. - -** Для данного курса можно написать следующее: «Краткое изложение идей -гуманной педагогики». - -* Формат курса: - -** Формат для создаваемого курса: «Форма организации курса». - -Moodle предлагает следующие форматы: - -Календарь (CSS):: - -календарная организация расписания курса (неделя за неделей) с точным -сроком начала и окончания. - -Структура:: - -организация курса по темам. - -Сообщество (форум):: - -курс организуется на основе одного большого форума. Может -использоваться не только как курс, но и как одна большая доска сообщений. - -Для создаваемого курса используйте тематическую организацию -(*Формат курса -- Структура*). - -===== Количество тем/недель ===== - -Этот параметр определяет количество секций, наличие которых необходимо на главной странице -курса (для каждой темы/недели -- отдельная секция). В данном конкретном случае будет -достаточно 3 тем. - -===== Группы ===== - -Использование групповых режимов работы в курсе: - -Нет групп:: - -ученики не делятся на группы, каждый является частью одного большого -сообщества. - -Отдельные группы:: - -группы изолированы друг от друга, работа учеников одной группы не -видна для других групп. - -Доступные группы:: - -ученики каждой группы могут видеть происходящее в других группах. - -[NOTE] -Если групповой режим определён здесь, на уровне курса, то он является режимом -по умолчанию для всех элементов, создаваемых в курсе. Если предполагается -организовать групповую работу только для некоторых элементов курса, то группой -режим лучше установить на уровне элементов курса. - -О значении остальных настроек курса вы можете узнать, используя кнопку помощи -(знак вопроса), относящуюся к соответствующему элементу. - -Нажатие на кнопку *Coхранить* внизу страницы завершает процедуру создания и -настройки курса. - -Обычно далее Moodle предлагает назначить роли, т.е. определить какие -пользователи смогут работать в данном курсе и какие права иметь. Мы вернёмся -к этому вопросу чуть позже. - -Теперь вы можете вернуться на главную страницу (с помощью верхней строки, -показывающей «путь») и увидеть созданный курс в списке курсов. - -===== Изменение настроек созданного курса ===== - -Для корректировки настроек созданного курса: - -* в блоке *Администрирование* выберите пункт меню *Курсы -> Добавить/редактировать -курсы*; - -* в открывшейся странице *Категории курсов* выберите категорию, в -которой находится курс; - -* в выведенном на монитор списке курсов найдите нужный курс и нажмите кнопку, относящуюся -к этому курсу. Откроется страница редактирования настроек данного курса. - -===== Наполнение курса ===== - -Зайдите на главную страницу созданного курса (щёлкните мюшью по названию курса в -списке доступных курсов). - -image::images/course-name.png[] - -Во вновь созданный курс автоматически включается только новостной форум. -LMS Moodle располагает большим разнообразием модулей (элементов курса), -которые могут быть использованы для создания курсов любого типа. В зависимости -от содержания курса и концепции преподавания создатель курса включает наиболее -подходящие элементы и ресурсы, предоставляемые системой Moodle. - -Можно разделить инструменты (модули) Moodle для представления материалов курса -на статические (ресурсы курса) и интерактивные (элементы курса). - -К ресурсам относятся: - -* Текстовая страница. -* Веб-страница. -* Ссылка на файл или веб-страницу. -* Ссылка на каталог. -* Пояснение. (Позволяет помещать текст и графику на главную страницу курса. -С помощью такой надписи можно пояснить назначение какой-либо темы, недели или -используемого инструмента.) - -К интерактивным элементам курса относятся: - -* Элемент *Лекция* строится по принципу чередования страниц с теоретическим -материалом и страниц с обучающими тестовыми заданиями и вопросами. -Последовательность переходов со страницы на страницу заранее определяется -преподавателем -- автором курса, и зависит от того, как учащийся отвечает на -вопрос. На неправильные ответы преподаватель может дать соответствующий -комментарий. -* Элемент *Задание* позволяет преподавателю ставить задачи, которые требуют -от обучающихся ответа в электронной форме (в любом формате), и даёт возможность -загрузить его на сервер. Элемент *Задание* позволяет оценивать полученные ответы. -* Элемент *Тест* позволяет создавать наборы тестовых заданий. Тестовые задания -могут создаваться с несколькими вариантами ответов, с выбором верно/не верно, -предполагающими короткий текстовый ответ, как сравнение на соответствие, эссе и др. Все -вопросы хранятся в базе данных и могут быть впоследствии использованы снова -в этом же курсе (или в других). Тесты могут быть обучающими (показывать -правильные ответы) или контрольными (сообщать оценку). -* Элемент *Wiki* делает возможной совместную групповую работу обучаемых над -документами. Эта технология была разработана специально для коллективной -разработки, хранения, структуризации информации (в основном гипертекста) -путём взаимодействия пользователя с веб-сайтом. Любой участник курса может -редактировать wiki-статьи. Все правки wiki-статей хранятся в базе данных. -Возможно запрашивать любой прошлый вариант статьи или для сравнения разницу между -любыми двумя прошлыми вариантами статей с помощью ссылки *Последние правки*. -Используя инструментарий *Wiki*, обучаемые работают вместе над редактированием -одной wiki-статьи, её обновлением и изменением её содержания. Редактор, -встроенный в *Wiki*, позволяет вставлять в текст статьи таблицы, рисунки и -формулы. В зависимости от настроек групповой работы Moodle может включать в -себя двенадцать различных wiki-редакторов. При коллективной работе -преподаватель, используя функцию *История*, может отследить вклад каждого -участника в создании статьи и оценить его. -* Элемент *Глоссарий* позволяет создавать и редактировать список определений, -подобный определениям в словаре. Наличие глоссария, объясняющего ключевые термины, употреблённые -в учебном курсе, необходимо в условиях внеаудиторной самостоятельной -работы. Элемент *Глоссарий* облегчает преподавателю задачу создания подобного -словаря терминов. В виде глоссария можно организовать также персоналий. -*Глоссарий* может быть открыт для создания новых записей (статей) не только -для преподавателем, но и обучающимся. *Глоссарий* -- один из способов -фундаментально улучшить их опыт исследовательской самостоятельной работы. -Элемент курса *Глоссарий* предоставляет возможность комментирования и оценивания -статей как преподавателем, так и обучающимся. -* Элемент *Форум* используется для организации дискуссии и группируется по -темам. После создания темы каждый участник дискуссии может добавить к ней свой -ответ или прокомментировать уже имеющиеся ответы. Для того чтобы вступить в -дискуссию, пользователь может просмотреть темы дискуссий и ответы, -которые предлагаются другими. Это удобно как для новых членов группы, так и -для быстрого освоения основных задач, над которыми работает группа. История -обсуждения этих проблем сохраняется в базе данных. Пользователь также может -сыграть и более активную роль в обсуждении, предлагая свои варианты ответов, -комментарии и новые темы для обсуждения. - -В каждом электронном курсе LMS Moodle даёт возможность создания нескольких -форумов: - -* *Чат* -- предназначен для организации дискуссий и деловых игр в режиме -реального времени. Пользователи системы имеют возможность обмениваться -текстовыми сообщениями, доступными как всем участникам дискуссии, так и -отдельным участникам по выбору. -* *Опрос* -- предназначен для проведения быстрых опросов и голосований. Задаётся вопрос и -определяются несколько вариантов ответов. -* *Анкета* -- несколько типов анкет, полезных для оценки -интерактивных методов дистанционного обучения. -* *пакет SCORM* -- позволяет легко загружать любой стандартный пакет SCORM и -делать его частью курса. - -===== Добавление элементов курса и ресурсов ===== - -Добавление ресурсов и интерактивных элементов осуществляется в режиме -редактирования. Для входа в данный режим нажмите мышью на кнопку *Редактировать* -в правом верхнем углу главной страницы курса. - -image::images/edit.png[] - -В каждой секции курса на экран выводятся поля со списком *Добавить ресурс* и -*Добавить элемент курса*. Выбор нужного элемента или ресурса открывает страницу -редактирования и настройки этого элемента или ресурса. - -Данный курс будет создан как содержащий наиболее часто используемые элементы и -ресурсы курса. - -image::images/course-elements.png[] - -Добавьте в создаваемый курс некоторые ресурсы и элементы курса. -Под новостным форумом вставьте пояснение. - -===== Добавление пояснения ===== - -Выберите *Добавить ресурс -> Пояснение*, затем, в открывшемся редакторе -наберите текст пояснения. - -image::images/course-description.png[] - -Используйте панель инструментов для изменения цвета шрифта. Вставьте подходящий -смайлик. Для того чтобы вернуться на главную страницу курса, нажмите кнопку -*Save and return to course*. - -===== Добавление темы ===== - -В сектор 1 запишите тему этого раздела. - -Нажмите на кнопку, расположенную рядом с цифрой 1 (рука с пером). - -В текстовом редакторе выберите подходящие настройки шрифта и наберите -текст: «Основы гуманно-личностной педагогики». Нажмите *Сохранить*, -чтобы вернуться на главную страницу. - -Аналогично добавьте тему в сектор 2: «Необходим ли гуманно-личностный подход -в современной школе?» и сектор 3: «Контрольное тестирование» - -===== Добавление элемента курса «Лекция» ===== - -В сектор 1 добавьте лекцию. - -1. Добавьте элемент курса -- *Лекция*. - -2. В открывшейся странице *Добавление лекции* укажите название лекции -и при необходимости измените настройки, выставленные по умолчанию. - -Введите в поле *Название*: «Цели и задачи гуманно-личностного подхода». - -Не ограничивайте лекцию по времени, а -*Максимальное количество ответов в карточке* установите равным 2. - -Чтобы каждый кадр лекции смотрелся хорошо, в *Форматировании урока* установите: - -* *Слайд-шоу* -- *Да*; -* *Показывать слева список страниц* -- *Да*; -* Ширину, высоту слайда и цвет фона установите по собственному усмотрению. - -Остальные параметры *Лекции* пока оставьте без изменений. Нажмите кнопку -*Save and display*. - -===== Создание лекции ===== - -В лекцию можно добавить: - -* Кластер (используется для дополнительных вопросов); -* Карточку-рубрикатор (используется для создания разделов в лекции); -* Страницу с вопросами. - -Основной элемент лекции -- это веб-страница с вопросами. В начале страницы -даётся объяснение фрагмента учебного материала, а в конце страницы предлагаются -вопросы для контроля усвоения этого фрагмента. Если на вопросы даётся -правильный ответ, загружается следующая страница лекции. При ошибочном ответе обучающемуся -предлагается ещё раз прочитать плохо усвоенный фрагмент учебного материала. - -Добавьте и заполните страницу с вопросами. - -image::images/question-page.png[] - -Поскольку в настройках лекции мы указали *Максимальное количество ответов в -карточке* равное 2, то в карточке содержится только два варианта ответа на -заданный нами вопрос. Выберите тип вопроса *Верно/Неверно* (см. имена -вкладок вверху страницы). - -[width="100%"] -|============================================================================== -|*Ответ 1* |На личность ребёнка. -|*Комментарий на ответ 1* |Верно. -|*Переход 1* |Следующая страница. -|*Баллы за ответ 1* |1 -|*Ответ 2* |На личность учителя. -|*Комментарий на ответ 2* |Прочтите, пожалуйста, ещё раз цели и особенности -концепции гуманной педагогики. -|*Переход 2* |Текущая страница. -|*Баллы за ответ 2* |0 -|============================================================================== - -Создайте вторую страницу лекции с вопросами, введя аналогичные параметры. - -image::images/question-page.png[] - -[width="100%"] -|============================================================================== -|*Заголовок страницы* |«Задачи гуманной педагогики». - -|*Ответ 1* |Ребёнок никогда не должен забывать то, что взрослый умнее, старше и -опытнее его. -|*Комментарий на ответ 1* |Скорее всего, вы сторонник авторитарной педагогики. -|*Переход 1* |Текущая страница. -|*Баллы за ответ 1* |0 -|*Ответ 2* |Сотрудничать с детьми -- значит быть с ними на равных, радоваться, -играть, грустить, совершать ошибки вместе с ними. -|*Комментарий на ответ 2* |Вы правильно поняли основные идеи гуманно-личностного -подхода. -|*Переход 2* |Следующая страница. -|*Баллы за ответ 2* |1 -|============================================================================== - -Сохраните страницу. - -Если сейчас войти в режим просмотра (вкладка *Просмотр*), то можно увидеть, что -данная лекция состоит из двух страниц. Переход на вторую страницу осуществляется -только после правильного ответа на вопрос первой страницы. - -Также можно увидеть, что блок *Меню лекции* пока пуст. Заполнение *Меню лекции* -происходит автоматически при включении в лекцию карточек-рубрикаторов. - -*Карточка-рубрикатор* -- страница лекции, содержащая ссылки на другие страницы -лекции. Обычно карточки-рубрикаторы используются для деления лекции на разделы, -каждый раздел начинается с карточки–рубрикатора, в которой даётся оглавление -данного раздела. - -Добавьте карточку-рубрикатор в начало лекции. - -Обратите внимание, что меню добавления элементов лекции содержится как до, -так и после каждой страницы лекции. Это предусмотрено для того, чтобы можно было вставить в -любое место лекции дополнительную страницу. В данном конкретном примере будет использоваться меню -добавления элементов, расположенное перед первой страницей лекции. - -Выберите *Добавить карточку-рубрикатор (раздел)* в верхнем меню. -Теперь заполните предложенную страницу. - -[width="100%"] -|============================================================================== -|*Заголовок страницы* |«Цели и задачи гуманной педагогики». -|*Содержание страницы* |1. Цели гуманной педагогики. - -2. Задачи гуманной -педагогики. -|*Описание 1* |«Цели». -|*Переход 1* |В выпадающем списке страниц выберите страницу «Цели гуманной -педагогики». -|*Описание 2* |«Задачи». -|*Переход 2* |В выпадающем списке страниц выберите страницу «Задачи гуманной -педагогики». -|============================================================================== - -Сохраните страницу и войдите в режим просмотра. - -image::images/card.png[] - -Вид карточки-рубрикатора. Переход на другие страницы осуществляется нажатием на -соответствующие кнопки внизу карточки. Обратите внимание, что в боковом меню -лекции выводится ссылка на данную карточку-рубрикатор. - -[NOTE] -Если в лекции не предполагается использовать много рубрикаторов, -то левое боковое меню лекции становится бесполезным. Для его удаления нужно -открыть страницу с настройками лекции -- секцию *Форматирование урока* и -установить значение поля *Показывать слева список страниц* -- *Нет*. - -===== Внесение изменений в текст лекции ===== - -Вы можете редактировать страницы созданной лекции. Для этого: - -1. Откройте лекцию. - -2. Войдите в режим редактирования (вкладка *Редактировать*). - -3. Нажмите кнопку редактирования, расположенную в заголовке нужной страницы. - -С помощью соответствующей кнопки можно перемещать выше и ниже указанную -страницу, а кнопка *x* удалит выбранную страницу. - -===== Изменение настроек лекции ===== - -1. Откройте главную страницу курса и войдите в режим редактирования -(кнопка *Редактировать*) - -2. Рядом с названием лекции будет выведена кнопка редактирования. Нажмите на -данную кнопку для открытия страницы, содержащей настройки лекции. - -==== Добавление ссылки на веб-страницу ==== - -Итак, в секции 1 описываемого курса мы создали интерактивную лекцию. Добавим в -неё дополнительные материалы к лекции. - -Добавьте ссылку на веб-страницу, содержащую информацию о ежегодных конференциях -по гуманной педагогики. - -1. Добавьте ресурс -- *Ссылка на файл или веб-страницу*. - -2. На странице *Добавить ресурс* заполните обязательное поле *Название* и укажите -адрес веб-страницы. - -Если веб-страница загружена на ваш сервер, то для указания ссылки используйте -кнопку *Выбрать или загрузить файл*. Если веб-страница не загружена на ваш сервер, используйте кнопку -*Искать веб-страницу* (поиск в Google) или вручную наберите её адрес. - -Введите в поле *Название* текст: «Педагогические чтения по гуманной педагогике». - -Размещение: http://www.icr.su/rus/departments/human/chteniya.php. - -Обратите внимание на значение поля *Окно*. Если вы хотите, чтобы страница -открылась в новом (дополнительном) окне, выберите *Новое окно*. - -[NOTE] -Если у вас уже имеется электронный курс в формате веб-страниц, -то можно закачать его на сервер, предварительно заархивировав, и создать -ссылку на первую страницу курса (обычно `index.html`), сделав его таким образом -доступным в системе Moodle. - -===== Добавление веб-страницы или текстовой страницы ===== - -Дополнительный материал и пояснения можно разместить на текстовой странице или -веб-странице, созданных непосредственно в Moodle. - -1. Добавьте ресурс -- *Текстовая страница* или *Добавить ресурс* -- веб-страница. - -2. Введите название и во встроенном редакторе создайте страницу. - -===== Добавление форума ===== - -Во вторую тематическую секцию добавим форум, чтобы организовать дискуссию по -теме: «Необходим ли гуманно-личностный подход в современной школе?» - -1. Добавьте элемент курса *Форум*. - -2. Заполните обязательные поля: *Название форума* и *Вступление для форума*. - -3. Скорректируйте остальные настройки форума. - -В Moodle поддерживаются различные типы форумов: - -* Простое обсуждение -- состоит из одной темы и используется для того, -чтобы сфокусировать обсуждения на одной теме. -* Стандартный общий форум -- открытый форум, в котором каждый может начать -новую тему. -* Каждый открывает одну тему -- в этом типе форума можно ограничить число -создаваемых пользователями тем. - -Существует возможность принудительной подписки участников курса на форум. -Тогда сообщение, которое появляется на форуме, автоматически будет рассылаться -участникам курса при помощи электронной почты. При этом, если опция -*Подписать всех на этот форум* имеет значение *Да, всегда*, то все -участники курса будут получать рассылку без возможности от неё отказаться. -Если значение опции выставлено в *Да, с возможностью отписаться*, то, при желании, -участники курса могут отказаться от этой рассылки. - -Если предполагается оценивать выступления участников на форуме, то -необходимо настроить опции группы *Оценка*. - -Опции *Количество сообщений для блокирования* позволяют настроить -количество сообщений, которое может передать один пользователь. Как только -количество сообщений превысит допустимую норму, этот участник будет -заблокирован на определённое время (в зависимости от установок). - -Нажатие на кнопку *Save and return to course* завершает создание форума. - -image::images/forum.png[] - -Добавьте темы для обсуждения. - -===== Добавление элемента курса «Задания» ===== - -Элемент *Задания* позволяет преподавателю ставить задачи, которые требуют -от обучающихся ответа в электронной форме (в любом формате) и даёт им возможность -загрузить его на сервер, после чего можно оценить полученные ответы. - -Задания поддерживают несколько способов ответа: в виде одного файла, в виде -нескольких файлов, в виде текста и вне сайта. - -1. Добавьте элемент курса -- выберите *Задание с соответствующим вариантом ответа*. - -2. Напишите название и содержание задания. - -image::images/assignment.png[] - -Пример задания с ответом в виде текста. Кнопка *Редактировать мой ответ* -позволяет обучающимся открыть встроенный редактор и записать свой ответ. - -===== Добавление теста ===== - -Основным средством контроля результатов дистанционного обучения являются тесты. -Поэтому, учителю необходимо уметь создавать тесты в системе Moodle и включать -их в электронные курсы. - -Любой тест в Moodle создаётся на основе специальной базы данных *Банк вопросов*. -То есть, прежде чем создавать тест, нужно наполнить банк данных -вопросами для этого теста. - -===== Создание банка тестовых вопросов ===== - -В блоке *Управления* на главной странице курса выберите *Вопросы*. - -image::images/question-bank.png[] - -Далее откроется страница редактирования вопросов. - -Вопросы в базе данных *Банк вопросов* упорядочены по категориям. По умолчанию для каждого курса -создаётся отдельная категория, кроме того, существуют категории, совпадающие с -общими категориями курсов. При желании, можно создать дополнительные категории -(вкладка *Категории*). Перед созданием вопроса нужно выбрать категорию, к -которой будет относиться этот вопрос. - -В Moodle используется несколько типов вопросов в тестовых заданиях: - -* *Множественный выбор* (Учащийся выбирает ответ на вопрос из нескольких -предложенных ему вариантов, вопросы могут предполагать один или -несколько правильных ответов.); -* *Верно/Неверно* (Ответ на вопрос, учащийся выбирает между двумя вариантами -«Верно» и «Неверно».); -* *На соответствие* (Каждому элементу ответов первой группы нужно сопоставить -элемент ответов второй группы.); -* *Короткий ответ* (Ответом на вопрос является слово или короткая фраза, -допускается несколько правильных ответов с различными оценками.); -* *Числовой* (То же, что и короткий ответ, только на выполнение вычислительных -операций. Числовой ответ может иметь заданный интервал предельно допустимой -погрешности отклонения от правильного значения.); -* *Вычисляемый* (Такой вопрос предлагает вычислить значение по формуле. -Формула является шаблоном, в который при каждом тестировании подставляются -случайные значения из указанных диапазонов.); -* Вложенные ответы, *embedded answers* (Представляют собой текст, -в который вставляются короткие ответы, числовые ответы или множественный выбор -(как в «рабочей тетради»).); -* *Эссе* (Учащийся кратко излагает свой взгляд на рассматриваемую проблему.). - -[[questionsforms]] -===== Формы для создания вопросов ===== - -Тестовые задания создаются путём заполнения полей в специальных формах, -которые зависят от типа используемого в задании вопроса. - -Форма любого типа вопроса содержит следующие поля. - -* *Название вопроса* -- используется для облегчения ориентирования в списке вопросов, -хранящихся в базе данных. -* *Содержание вопроса* -- это формулировка вопроса. Для содержания -используется встроенный редактор, поэтому можно форматировать текст -формулировки, вставлять списки, таблицы, рисунки (если загружены на -сервер, см. <>). -* *Картинка для показа* -- вставляет иллюстрацию в содержание вопроса. -В выпадающем списке перечисляются все графические файлы, содержащиеся на -сервере в папках данного курса, т.е. иллюстрацию предварительно нужно -загрузить на сервер (см. <>). -Выберите нужный файл из списка, и он в режиме просмотра отобразится после -сформулированного вопроса. -* *Оценка для вопроса по умолчанию* -- указывается добавляемое количество баллов -за правильный ответ. -* *Штраф* -- указывается вычитаемое количество баллов -за неправильный ответ. -* *Общий комментарий* -- дополнительные пояснения к заданному вопросу для -тестируемых. - -Остальные поля формы варьируются в зависимости от типа вопроса. - -Рассмотрим создание некоторых типов тестовых вопросов. - -===== Множественный выбор ===== - -В форме *Банк вопросов* в выпадающем списке *Создать новый вопрос* выберите -*В закрытой форме (множественный выбор)*. - -Значение основных полей было рассмотрено нами выше. - -* *Один или несколько ответов* -- сколько правильных ответов содержится в -тестовом задании. Каждый вариант ответа состоит из самого ответа, его оценки -и комментария. -* *Оценка* -- сколько баллов (в процентном отношении от общего количества -баллов) получит тестируемый за выбор данного ответа. Если в задании содержится -несколько правильных ответов, то можно за каждый давать одинаковое количество -процентов (в сумме правильные ответы должны составить 100%). -* *Комментарий* к ответу позволит при обучающем тестировании помочь учащемуся -понять свою ошибку. - -По умолчанию предлагается 5 вариантов ответов, при желании, количество вариантов -ответов можно добавить (кнопка *Добавить ещё 3 варианта ответов*). - -Далее можно составить комментарии для полностью правильного ответа, -частично правильного и неправильного. - -image::images/multi-select.png[] - -Для создания этого вопроса заполните поля формы следующим образом: - -[width="100%"] -|============================================================================== -|*Название вопроса* | Педагоги-гуманисты. -|*Содержание вопроса* | Среди перечисленных педагогов укажите тех, чьи взгляды -были близки к гуманно-личностной педагогике. -|*Оценка для вопроса по умолчанию* | 1 -|*Штраф* | 0,1 -|*Один или несколько ответов?* | Допускается несколько ответов. -|============================================================================== - -[width="100%"] -|============================================================================== -|*Вариант ответа 1:* *Ответ:* Сухомлинский; *Оценка:* 33,333%. - -|*Вариант ответа 2:* *Ответ:* Фаберже; *Оценка:* пусто. -|============================================================================== - -Для других вариантов ответа используйте аналогичную схему. Поскольку правильных ответов 3, то -оценка за каждый правильный ответ -- 33,333%. - -===== Вопросы на соответствие ===== - -В форме *Банк вопросов* в выпадающем списке *Создать новый вопрос* -выбирите *На соответствие*. Значения основных полей рассмотрено выше. - -После основных полей предлагается установить соответствия. Каждое соответствие -объединяется в группу Вопрос1, Вопрос 2, Вопрос 3. При желании, количество групп -соответствий можно увеличить, нажав на кнопку *Добавить 3 вопроса*. - -В каждой группе соответствий запишите вопрос и соответствующий ему ответ. -Рассмотрим на примере: - -image::images/correspondence.png[] - -Форма этого вопроса была заполнена следующим образом: - -[width="100%"] -|============================================================================== -|*Содержание вопроса*: Для каждого высказывания определите, кому оно принадлежит. - -|*Вопрос 1:* -«Если учитель и его ученики, -закончившие начальную школу, слезами -обмывают радость расставания друг с другом, -значит, их духовная жизнь за прожитые четыре -года состоялась».|*Ответ:* А. Амонашвили - -|*Вопрос 2:* -«Воспитание представляется сложным и трудным делом только до тех пор, -пока мы хотим, не воспитывая себя, воспитывать своих детей или кого бы -то ни было».|*Ответ:* Л.Толстой - -|*Вопрос 3:* -«Самой главной чертой педагогической культуры должно быть чувствование -духовного мира каждого ребёнка, способность уделить каждому столько -внимания и духовных сил, сколько необходимо для того, чтобы ребёнок -почувствовал, что о нем не забывают, его горе, его обиды, его страдания -разделяют».|*Ответ:* В.Сухомлинский -|============================================================================== - -Значения остальных полей выбраны по умолчанию. - -===== Короткий ответ ===== - -В форме *Банк вопросов* в выпадающем списке *Создать новый вопрос* выберите -*Короткий ответ*. - -Значения основных полей смотрите в разделе <>. - -Поскольку ответ тестируемый должен будет ввести самостоятельно с клавиатуры, -в подобных вопросах необходимо предусмотреть все возможные варианты правильной -формулировки ответа. Составитель теста записывает все возможные варианты в -поле *Вариант ответа*. Необходимо назначить оценку за каждый правильный вариант, и, -если он частично правильный, то значение оценки можно поставить ниже 100 %. - -По умолчанию предлагается заполнить три варианта ответа, однако это число -может быть увеличено (кнопка *Добавить 3 варианта ответа*). - -Создание следующего тестового вопроса: - -image::images/short-answer.png[] - -[width="100%"] -|============================================================================== -|*Содержание вопроса*: Чей это портрет? Назовите фамилию, имя, отчество. - -|*Картинка для показа*: Выбран соответствующий графический файл. -|============================================================================== - -Значения остальных основных полей -- по умолчанию. - -[width="100%"] -|============================================================================== -|*Вариант ответа 1:* *Ответ:* Макаренко; *Оценка:* 80%; Комментарий: Вы не -назвали имя и отчество! - -|*Вариант ответа 2:* *Ответ:* Макаренко А.С.; *Оценка:* 90%; Комментарий: Вы не -полностью назвали имя и отчество. - -|*Вариант ответа 3:* *Ответ:* Макаренко Антон Семёнович; *Оценка:* 100%. -|============================================================================== - -На рисунке вы видите реакцию системы на частично правильный ответ. -Аналогично создаются тестовые вопросы других типов. - -===== Создание теста ===== - -С помощью функции *Добавить элемент* -- *Тест* добавьте тестирование в третью -тематическую секцию курса. Откроется страница настроек создаваемого теста. - -Здесь нужно определить будет ли тест иметь какие-либо ограничения по времени, -сколько вопросов будет отображаться на одной странице, случайный или не -случайный порядок заданных вопросов, сколько попыток будет предоставлено каждому -тестируемому, какие методы оценивания будут применяться и прочие параметры. -О значении каждого параметра можно узнать, нажав знак вопроса возле этого -параметра. - -Наполните созданный тест вопросами из *Банка вопросов*. -На главной странице курса в режиме редактирования щёлкните курсором мыши по названию -теста. Откроется страница редактирования теста. - -image::images/test.png[] - -В *Банке вопросов* отметьте галочкой те вопросы, которые должны войти в тест. -Нажмите кнопку *Добавить в тест*. Чтобы удалить какой-либо вопрос из теста, -нажмите на кнопку с двойной стрелкой. Вопрос будет перемещён в -*Банк вопросов*. - -Обратите внимание, что добавлять новые вопросы в *Банк вопросов* можно и с -этой страницы (верхнее меню -- *Вопросы*). - -Для того чтобы увидеть как будет отображаться тест на экране, откройте -вкладку *Просмотр*. - -Существует возможность импортировать и экспортировать тестовые вопросы. - -Посмотреть результаты протестированных участников курса и получить -статистическую информацию можно во вкладке *Результаты*. - -Итак, мы создали небольшой курс и познакомились с основным инструментарием -системы Moodle. - -==== Заключение ==== - -В рамках этого пособия невозможно описать все возможности LMS -Moodle. Целью данного пособия является знакомство с системой Moodle и показ -вариантов использования её для создания самостоятельного электронного курса. -Надеемся, вы присоединитесь к числу преподавателей и учителей, -начавших использовать систему управления обучением Moodle в своей -педагогической практике. diff --git a/school-software/programming/basic/index.txt b/school-software/programming/basic/index.txt deleted file mode 100644 index 7e7b5d6..0000000 --- a/school-software/programming/basic/index.txt +++ /dev/null @@ -1,29 +0,0 @@ -=== BASIC === - -[float] -==== BASIC-256 ==== - -BASIC-256 -- открытая реализация языка программирования Бейсик и одновременно -- -интегрированная среда разработки для него. Ориентирована на обучение -программированию школьников. Язык имеет встроенный графический режим, -позволяющий в считанные минуты рисовать на экране картинки, и русскоязычную -документацию. - -[float] -==== FreeBASIC ==== - -FreeBASIC -- язык программирования высокого уровня по синтаксису наиболее -близкий к QuickBASIC, а также компилятор для него. - -Несмотря на то что компилятор имеет совместимость с QuickBASIC, в язык -FreeBASIC были добавлено множество расширений и возможностей для соответствия -современным требованиям, стандартами и совместимостью с библиотеками и API -написанными на C/C++. - -CAUTION: В (DISTRO) FreeBASIC представлен в виде инструмента командной строки - -// HOW TO RUN: - -// [user@domain folder]$ echo 'Print "Hello World!"' > test.bas -// [user@domain folder]$ fbc test.bas -// [user@domain folder]$ ./test diff --git a/school-software/programming/codeblocks/index.txt b/school-software/programming/codeblocks/index.txt deleted file mode 100644 index 40144d6..0000000 --- a/school-software/programming/codeblocks/index.txt +++ /dev/null @@ -1,12 +0,0 @@ -=== С/C++ === - -[float] -==== Code::Blocks ==== - -Code::Blocks -- свободная кроссплатформенная среда разработки. Code::Blocks -написана на С++ и использует библиотеку wxWidgets. Имея открытую архитектуру, -может масштабироваться за счёт подключаемых модулей. - -Code::Blocks поддерживает языки программирования С/С++, D (с ограничениями). Включает -в себя встроенный интерфейс под множество компиляторов, как свободных, так и -проприетарных. diff --git a/school-software/programming/geany/images/geany.png b/school-software/programming/geany/images/geany.png deleted file mode 100644 index 182ab3172606e0912d3fc3ada21ce7e50f5bed34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84850 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

F3@?`) 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 diff --git a/school-software/trainingsoft/gcompis/images/discovery.png b/school-software/trainingsoft/gcompis/images/discovery.png deleted file mode 100644 index fa40574668f845a4ac29743c8bb5095946144123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6152 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 UTxaB@vH$=807*qoM6N<$f_+g!zW@LL diff --git a/school-software/trainingsoft/gcompis/images/fun.png b/school-software/trainingsoft/gcompis/images/fun.png deleted file mode 100644 index 58bd47ffb6fad5dbec0b3f819f9a28f5b9191e89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5073 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 diff --git a/school-software/trainingsoft/gcompis/images/strategy.png b/school-software/trainingsoft/gcompis/images/strategy.png deleted file mode 100644 index abf58ed46e0ddc05f4e8824d246362eb602390fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6256 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 diff --git a/school-software/trainingsoft/kde-edu/images/kalgebra.png b/school-software/trainingsoft/kde-edu/images/kalgebra.png deleted file mode 100644 index 120e7f7da489961e53caeffef2edb497ecb89a5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmV+b2LJhqP)Px#32;bRa{vGh*8l(w*8xH(n|J^K00(qQO+^RS3kMZ9Aed}!_y7O^24YJ`L;(K) z{{a7>y{D4^00n?aL_t(|+U-_rY!p=(Z2==%MF;^wqd^QLikhH_4@47xfGB0>xidSD zo#*b(zS=E)mxnE43l=D})JlPBqyJTp+z zP)T-4;8$;Qa(D0Ex%YhM`_4C;(Legf-G)k#qcoD71W+nL40|A#Dl|P%BZ$EYNe+%E zMstpC9aTxP03;s0@0SO8A((F^+H{(!Hd$|Rb=8XQlHAf?5q(zgeMOugFA%jIOC;mR zd%;IOd5Oiaqx%quYr%%vn&z&EtQ{?i6&?eDOA%R*-?wtP6a0;Wyhccht&(jygHe?qHta-w|fm=lT!`3x27ly6HmIygIvX**Y6U_G=XN zn(Fan_Uw@fPu6lda1taIs7MPi3U~o{QE@;J4#xQjVz}(_48fX%C;YvD?^y~(59mWc zqv{5FH-`4;W z(=R}h7#Wt;4ULW4>|8T)xw2x}*@pT}T@_^uI>VBBP@$-4vw3lTvleZg>E*}avI!XwffmhdUZq;y&ZT>;B73<%Xt#!o?Vmyg_FSLbh3DT9Q9tRX zVTi%7vd*xtLh?bqfBRI@j7HTur_t0H5FMWH(ZdWE_^ma>q9qIqoGpk!x7;G}J0aW8$FB zR|`eW-jCX71r|w$jkOpsC}jel2+H)Wfy5bDt~KH1$Is%$*IV@H?=xASfe7D%8eO|W z1ulV2My^x+*Rl539A0k6d<8`9Jyzi@cf@R@W<4D7WXc3`8E)(vEwTs2b-qeanMINw z`&B%aOaAN}J#j{g8vGCByk$yn9^0000XYOR~z%g%7#+oRi=8 zbI!?4Zit!l0#UpKJO&!UW?<7Amyh6e;2hu#mOuxvgzAF z&-cD){{$54E`Xw5@SPfNx4$F9(^y+(0ol(G+jr_93@6&u~Dn`(qC5 zxxy6{=hZEFL~ns_MX-g&xsXQrb_%o8G{jps$N1^`Gu*uMEI;8t!$p<}Hqx{Z=+R98 z#qJVCZ4_ZU4e}k-&rUi9LhPcW0-X1vy^kF@7p zQYeTm2+g9DDN~>ku)tt2a8pwg?%RNha_#kcMgMgp(a##ez_{q3D$KAMTd_l2-|Vx} zosilCx&6NyX`)=sRm0bU1;8qGb#)>*jmpZ(q~L$U|Af>L^m)9rcNYW}ifDV<7&E!q zPMw#G6kR7WGX>fKr{eK=xVEec%@@kyGn+6O?2@s5iCQ)Uie44la9oD=fY(7c zcmo`kQhiC$C-oDMK;S_XUkb^<1K?%w66lg5hm))GLEiqHV)-A!?7uvS(w!g(+QExS ziRB|i{gAZfM?i7{0f&g%5Ez5NH3-aLC64!KJiz<|)cR~;mv>W>00000NkvXXu0mjf DG<-ov diff --git a/school-software/trainingsoft/kde-edu/images/kanagram.png b/school-software/trainingsoft/kde-edu/images/kanagram.png deleted file mode 100644 index 6dd03bea98f2c0c89ff08f7f599eae6183ba81ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1835 zcmV+`2h{k9P)9RO~M0U%02w2P;tk)UCPYH)R5f|yJ6 zVtjm@o^FpRbWqa&kgoRP5xsi~=GX}PI{Lo^Q$D92znn>fx4JOk0K(_k>b;OonM4v9xjs2NZU zV9Cr}i`v>cnGsbE*g4jdlhYpgcw#HSdYvBX{N-`!*$fD%2-lTQgG_@X{4p4AvZS{RbN-3t*s5QF|jBq z*-NpvVq|0lw{PFZsTJq5@sr-N?$y6oy)@R#?mylpZb> zTk*gr2e5qkax!KVC3{P7_Uu_<{Nkv^*j4lqh4@=$KotUI4@X5sVbP*+JbLsHM~@zb z*?AU?so-Q#*Qs)3TUOXr~Gn>um>+9#j#HVK=psLO^qUabSR0KuYPMadi(m&-hM~SPfkk4(xpq$(9qznwrU2H91w9n@#P8RZr{!^ z6blRnKZ;);_o+IrKvH5N0rV@i!)l!rh9)E=V0d_l7^0XDx{ZyGkH^-nn`!+3eH)-L z9U$S^yTH%ij}+=LFff4czQ4e6k9eE^?$U&XdFgjVgg1-Mj1%7 zx6{+n+|o>pG$AHB8V4y1?-dr}*K74`q{6bsTOD8uf4Taz@T#k;8`tZvQ3m_LGHJmV z$3I6{NEn8VPceV~E9mU}3jzKCxOk~fssDe{uITBxCv=@GKPmEI#ArldU?6I029iK4iT))Ka$S&Wa3vDcha+~j#)8Bj`V zWMm{FUt3IxcOB0a$+IgxZ?1O+2%jw!O0w6zO9kcHvFwf4NuOC<&#ZKMUO4{)mv^VifavIGEmt-M zWF;TG{~-g)^;|wJ<@m@DQqpnxoyNk7ii%EMxpHMJ zBO{}hZd7ae`)qC2L5lO4oSYn2TwGi;DW5lUoB&)@R61sUr@6~$jV&)P&qde!*cK{CFyVQnU?nQje?xh0NPk%ORJPtK~0O52!PoVz~sWe_f(;e_4 Z{{X_OUiMN>wf6u3002ovPDHLkV1iXPTrU6s diff --git a/school-software/trainingsoft/kde-edu/images/kbruch.png b/school-software/trainingsoft/kde-edu/images/kbruch.png deleted file mode 100644 index 54014e7e6b6a391dfef103e5fda5db794da3a112..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1630 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 V<$J`M!TkUL002ovPDHLkV1muBE3*Iq diff --git a/school-software/trainingsoft/kde-edu/images/khangman.png b/school-software/trainingsoft/kde-edu/images/khangman.png deleted file mode 100644 index ac2df7e82b16e653f33665bbb425cde61b8b4ac1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2092 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 Td|fmW00000NkvXXu0mjf-FUQ% diff --git a/school-software/trainingsoft/kde-edu/images/klettres.png b/school-software/trainingsoft/kde-edu/images/klettres.png deleted file mode 100644 index 813334be04af46661c5698d57a8cec149bbed2d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1590 zcmV-62Fdw}P)dV-F9AcMjEMdrpd<#PC?*C*AfgN$nr$GCb?aDnX}hi0 z)6<@d?BKJV89RaN11I=8J^v*s3nTJ3p0$$~I4GV;7E z%T*qaXBp-jnhHX7RaMnZiu`<6fCr(esp;9awzg^jHewj};Na1dwF6N!sSIl}GD^77 zjh~vEn=_arFq(?8va%1U{BK(;7Jl~l)2oxR%2t8lyd29^B(tnTR#k@QSn#rhq5@%z zXXM|^yt3oadz-G$iGYvD+qq_6( z?oBP21y~T`@wi-9R|k$!WI>c5h*_laDBWR3p-4<;F_sW*V+rZgt$V+CW7YzOhljDqluW1goK;vX@_FE}S&_~v#)QNi*s|})hFJ-yudlb7OeTnFA*m(Gqb`Q- zGZL09^x~;H4YS9Xp!ex6cw6q z^?E-B!%--zN+L59nZj^VIkf%b@6PT1RK$u054^MfOrC)D_V$F&=Yx@FW*jhGfibvkMR40KC@m_4 ze;|StPgdjmi=F5mOrpBN1xj|OVX1O`A)$yWNMtH0!op_$1aKy=2fSWyQGb6wL`g2h z3>X$=O zP%GfM#Wgr}{x4X~Msfp(fBHh`4Tb-+u)7{r=3rz<{=|g_scx&b9|I z8cV@hYQ^szy%>!qQDQZsf>xd+SHx4AYjg+Yxr%=BwzjtNc>-!`YD(xhhL{mecmNDU zQn=g|K&9IONmg;H^%^`*8s7$*QPK8eTVGRN6VfD< zG#A{K7$Y7842$-gBN!V`P}h499*d!|#zVH{5D3K)iKd`3IrnJHS()SR+L=YypjZds zk}e>d%`$;N04OgrK~-`I?xNVlN_GnuBrElkwZ?gtiSdjY7gM&MiB2XTv>z?tmYJ9PVN151(A+d zJG7*-^xB&nn}e7J$BvyT{{BkGOP4#k-}R5A>cR5R7C~!;GR^!+h^jB|IJVhrCuj>^ z357zhN2Ad%@etUxzoq2#mD|TV0@2l+*$MDw$aGDG>N3+G-N)a0MsLF6;$qX#&`@qG z@R0am=jP~&h1|=F7T7LAkpWuRbVy|--^r6F4Y~k23ktL*Bqy+#1rG1olX`K9XKjPW zcnSBxP*f`ZwI{Vy7Z3~vGl@h(6QcWbHkDZ0_}IGT)uyis4V*ajA7P-QKT)d-(3&uv zPDA5d;Qd`2BNtk>y|!+V^@Rqv>4>M)a0`RvgK*^0_N@@n+CQ1_tO~itG o1TZ<~Lz&{m(j?0Fp`sH01vdsEjFY-?x&QzG07*qoM6N<$f;4L3`2YX_ diff --git a/school-software/trainingsoft/kde-edu/images/kmplot.png b/school-software/trainingsoft/kde-edu/images/kmplot.png deleted file mode 100644 index 84454436804db12b3a3eee49b2e7c9e0401806a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1775 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 P00000NkvXXu0mjf>v6IH diff --git a/school-software/trainingsoft/kde-edu/images/kturtle.png b/school-software/trainingsoft/kde-edu/images/kturtle.png deleted file mode 100644 index 3ad4844e12050fe9cb10d5eaca5820bb0d4ea12c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 814 zcmV+}1JV46P) zK~#9!wN}4t6+sZ5ncaOaHvRxXRIrGk0j=^MM4MESCXmKT1hH2zl^}>HSP3z8unK9! zKOkiw5YQ^6U}Gw=h`jfBw%r|$7%nT`ph;E8GCGV%9 zk0E4(7efUlo4g)FAJYkuC#~z634*RRnCic~Q?m;Ww8iFyufiDuWyB5V;_R8S7I962Hy*{I`wq5!~H957`n@c z$LOly1VliEklZWnms|o_SrS|vP}$J^z+Tv?1c=Cs?{B)x(;U>6qYsgx>b-i0+}K;& z^Dnga3`o>oPZ2;{OLw>oYPPo5$H)W-P`nIQ0GnCrML;X#rn=ZX2w|fe%EMBP;J;-+ zHKMo8l-G&KTIx$cYoCGER+9|H$)q018lTa7pYH#xkcb0T+V$hg_AL-g>H;kLnbM~> zsC)sHQmI1ycos*ptL}$@ew4^Ci5`j$K=#?Y4KYhEf!M~E4L5yPDlWKenk{XuY>89P z62SWBbwBSu*!7N%l&J}m0%b6>_APwg9lr%<&z7D?OVDyA6x&(danmBCn`AbACX~qI s!t8IcOlat6j`0~<`mwxk%G+@N0u_nT?%^1|%K!iX07*qoM6N<$f*RO!bpQYW diff --git a/school-software/trainingsoft/kde-edu/images/kwordquiz.png b/school-software/trainingsoft/kde-edu/images/kwordquiz.png deleted file mode 100644 index e2cecef6bf9831531e2100fff92b0f7d691d14a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1869 zcmV-T2eSByP)3A6AjKsT zYFa8vXjPR;ZBeB>wQ9vH3TmTBe|5C$r@kS zUE^Kvu6K5BJ#)maR$XK0L(4etqoOHRt7_%P#_o#mRD3% z_;g*jPo6yas?gEVp#rEcN~Hd0B0A95(9jU7si|=jxk-GK#82Z4pU+pWX`1R)yh_4} zl}A%?Pb3}@(t29(D*-fCH=r)G22c4LAqf&>QAReaXS%w&UXs0D?~BKeAOAy;LZhJH z3c>54kR-{4EQ%tp78ew}6$Ak^&Rf&T;Yzp{k;D{Y`aMXh0af$B@i>?>a`-Bofsqzb z<*mgtH7z*M{$n~$1lNF~C~Ml=+jlH4FN2~$U>F8W(_|7to~-2iq8`WT;dfzZNtF2| z=w<@RXa*9!Y&Vac1H3kT6$)Z@7?FGb!oc6Y#IZfcg@+blDbdOzEXTzABX0mcoyq3r z?qkNk057I9hClN z0sTl@StRuomIw>E1pYGm3Fo0V9Kj)HY~EIR8fc$1mU1Z~*O3u3Fst+z#Z|~x6T$fD z)?Z`hn?+8VB&3BbdWL&AmqRb`r_I~1qtg&&2dYbJ`sxXk5k)Vg|FXYD%z^h_xYz(wILA?N@ zqocTc_bztt-i@Ds_XvZ6_XXzzlUue8+qUq^r+9~z%y8~|@`G7m38xK7Nv$M14?(Syt#>U11c_b3y{WopeRG4utm*dlu z@0OOu0`T6ox8QHcK$3}kR>r={L-^6wLm+*;UtU0o{fR^Zr%#_oAP~Uby?YCy=-hLM zT)%$3`ycP0N~J(ulxu^MlI=D-Fg`N|Co~UDlOe_fcwz0&(AL-v%d{cFf^FGg_gCnA zJo98SiGBO_fi4LJYj51R!S=VcwG{-%VzFX!ZZal0&^z%toT>$s=lrNhwqj#_3oOHe zkuzMdOT_{Tn3$Nr`1m*%T}w+#UKrQI!omXlem|O2#WtQ{!=00y}f{>Q$UNbqWU$9t7P9|>Zji_HGIb)-OTUn*fDOkM~-lt#s2;KK{qa- z`#UI#lDD3ZBiGX8%GZ5;eP5kBckb_zKs@yH?&?=fCA-;wP~Cf=?S)-0?|3ba(kSf% zM~@!G$jAs^{YXHuJ8tV`QnGNF+VM0wGSu7KdzI?p9{?r^F`D7>Grwz#Br1(E16imZ zS?LQ~@4UPN+a5~*om;lNcwDELo}Qki84jO6fBqU3PXPFaut0?R|MSu8B9Vhg@g(AjKc4>^?4+fNjlb{@00000NkvXX Hu0mjf2$y;) diff --git a/school-software/trainingsoft/kde-edu/images/marble.png b/school-software/trainingsoft/kde-edu/images/marble.png deleted file mode 100644 index ac17cccb15770f03691ba4026904baca098908f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2259 zcmV;^2rT!BP) zK~#9!?N)n?RCg8r?sM+F^V*r&nc1CT3zY3H4=Y_DKuM*Q_7B@ynns(Didd6I6Q~Ww zL{0o(jW(LrNFuGgqKQpQ$|hn9rQKFqf>f4;Wr1ZEW}mb3e!uQ(uIJuuHcc91Q2)@R zCpo!uXYTyYcfRwTa}PeZ|4SP>eSBbMYW&T7cA;1*WVC!PH8y^2_y=zd9ushf#^4U^ ztrN!{SlPSwop9H3$!uF-Sr(!o0G5IA>m$b-^~%>DeB`PBE`V1Kz1~x-)SuKeZ95C| zA;1cYA`g}Uc%FwON#Hmh9M3`5ty2W-?cP;)4LV_;!5JeGf(?qpaLnd25zErh1Ui>H&2)y|0?wx~o0)PVl zX??S)zFeskw|gWG%i?i}E(x_-1NC|hre&ft7^J{5BnmFOTyQNqJtsOP(KH>?Gjo_s z%)v0NbKy|%`ENe+)l2^pz^{IDY>%q8epfCmNSilpL?{$NquI2bf;Uj9lqp*dJj*#u zkOUkcUauFyP{_GT1cVoO@KlyYqlMv-E0~$fsInsO-S?echyE#m7hgKOU)9uKr{@#c zw)K9*<1vuVkj)h^IWvX1|?~vn%-W7Bb@}u z?EwGVg-e)S$Phc?k6zfj`xl=9@Y7!&_=+TZPF@|kz-|~AK&-nPX1k5c=g)y@5cTo9 zpm@CSg`KGlpj)rbo zx~}g0;r{3T3^ER6k3aD>&ziOOof^M(*&hsaz~}d4d@6w(Qra^PeU8wS2ex-o6tbPWt_`3A@w0A8Q(@oXjyg=))C z;7BY6x6cPD6a`z&BS5s{(VaNgGLbtm2>kH~`bx8iv%IVE=MxwwN}H)9S}Rtd)zJZy z7~#(kIg=1zoQzEhY!D-wZa~#^at%7&H|Q$4yrV~qL7IR z_w)OZdif<3My^s|eKBj50uun$>3|xNnG8C5?}f*$Ae&AxO8_#dl+mJIzef>p^Tu_w zD1+5*picn;0w9p6Sio_34iIq-TD0a=8b>hE2-8ivK-qqAqBw;EWxXAiW~Z=-56(7ypXX@Fg~4e*B% zBvJYq6St>sBa=>zU%5Pd$N|vX+rLg$+}k+HbY-j?wR{%0sw%vJAUa(vp*9gPY7k(8 zfI6+kavVgShio?C7kPw2L8P)dT=@9!i0*h8(Lxrb+fM!PsmP1y%yf3y@3|;a~uvfFH8t0xUo` zG*Y?lfMPkG=DrUy32b~~0!dNEU2X{t`hT>t0Ka8GC5>s#26DNaK6?4$_h)COlMVny zma=Y-Hy(*ZH@ZX-0?(nt=Rv2)p_E?0L^_8=RYQ?#S~uFz84h~A>a3NR86m`P^IWs-=@tM;ne>^=sZ7fYf+oq?da%cZ~W{)hp4tI3;AAr;Q3>X4ar-^9q ze_moH$OE#A0!x!zae! zQ-iA17uM@wmcf4?^v z46Wa|ar4vRNc0g&QhFGc^V%A5i7wKJ%Lz;xu)#Pb)3jENl9*XY&b|BLhabF=$)qpc zym_*I4H@Sdc|Ib~M~t!zDdnc7*1^hvahvA_?5W*onM`Hv%-x4XuwDK_4Lkfp+oinqe z=PdRg)atS?YGeCBojS(-t4#Vk*czlK2(*VWmY%Pf7Y%jgcyp(ZuRZpUE4;e85Luu- z+QyOuikp*^bz@j*!*p3=fo0hOkR?}GpKtk=1g6Ul@=o$X{Z>blB)Gs z7(+Vt*?&>;z&2cp0{$^=IFtqehP2h*5%B1Vj?qm*is~At0_=W~+t= z2L+XAQEf5ZJ+jYt>g562kI*{ctw}-}YgX%)#5mTiV^K8>dkKxx>@OV4+9Qb~>ejKH z1!RejQUT+BfOAl`hQ^)iaR*_b34@3y#}=bQl(yw>$CK^%o*ga$5I_=jf=ST5_n)mW z&QiCI);83Q!CElZ;dzh-iq+aM8HA@gSo&eOVZ5vjpFJ-qs+QKA$~R5bInc}x9`8LrxTWGNC>0=V7vcWGlBGV@ zIiAj2TBlKGN~@J%kS0j&Q&bkM1EK(0x0wOsJXW>9iF5LwXCRdJ57SwBOC$mWC+zp= zuta+vpYE?ZqB+Nkmj)4mFA01JJ(w2_)(ZZ*x8UaGghgTKCyIxMB@V%PQboMnhPHn3 zo5NZC{#IVnHeCq-8sKkF*CdgmSR14el(jjntMSm{G}>4j9vl=bi<-YbU9+qVS?Y7N ztPu#@IsQH=K^~Y-9zK1>yKhG*9pIgz^sc#Jn1@dGfYzGYdQ1iZ$3=tm1nrr{WOUdq?fdud*F`OiH4WAnjA<`CQdlI0OIwoL zR}+kBY1@{fsyUihNDM`}rmi>T%BtpYULu@D35z{*XKl+#{>u6BoLAsrRYIt(gAkQ$} za_uM^!BJr_R&3k>#DQi}K^jWZD4?+&5qX|Eb-=3@ziaC9owH4N9=;0r%i|?YV=mnN z@w4i}FT&^8n^x>iJIXE^gP^1FrmoIppql?m`{57IH{n?v7XpJuYyEFby&7u^QYwT1 z&vi|B;=uFA_kUlnyD_{luP<>hYjO5s^#3Uw&>Bb6RGZa)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L02{9W02{9XUK)`c00007bV*G`2iOJ! z6A>)XEj)Gr00^f^L_t(o!|j)QY!t^G$G{LZDS3aUVnh z1qW!bK_zuShEl;=CQd|>R!ORq3c8`t2Hen8RY=<4rlnFF$!%kr%Bj;B$03jA02>Ez z?2GT^yWP8e&2Inj9y%;hHI>@_(~(wl_nV#hetwUc-39*N{>P2`G&iqbzusq>W~8dB zDk=y*G!7=|%w7>24LH>*CY~&H)hV9`A12TmIC;j>$+IGcJ1VRK3@?G1}8-#kqd2Y zZN}9IY}>Z&$hvjwZW|aFsNJ<|*O)BJGXM-KisF_m3;;JNiZTEI+qZ9rX_^b;@wgre zg(^d#P<0>>s1!x9k`Qt;rF0R`^Ni-tq9{s|BtaBK_KS~c>a%9en!0@X@&^)$#Jzj=?CEG}X#oHNK$rlU z@w~pKm6erI%d&I;mt;o_gAW%}M<6-do1zp!IPdFvZ@(rbPeLi2AD2h2Eieios0!fmti2xxaY*|*e zM2rVu14zrV9P-T7ilU5^OuGTV6#$SVNzirO_G&5vzyuKS)+qvH34k0S1diie1K>E0 zX<1fKmgQn(Y5-hT6eR^9JRumWEX!p8L`6|d0HBmoRaNcc4HqvCj@~$Z`h9oR)_!>F z;w8Orz14Fcr8G+{%hEWGb2Lqx7=eN$Nhtu;MN{dyP}&qli32DtFxa+DbGh7AfMh!T z%~&k<@Mo*5XZ_-(6N_qUYQ97%&5^BJx4JyftNDChngF0P#>DHS-;`xJ3Lrb-Sa*tl zG)<$0Lg6aFj-5N}7A;(ej*bpYpFSO{SAP|RkQ@O3j^oBArhrmvIF2*P%l{+*Mse(G zn>GzcB9T>_Hf>4*z)zk#zH;5Vy61N6*zwaFYHr*L0J&U_Xqt8vARG!OzPR#Ey#MzY z-g*B+jC?W*#@ILjV@x$o(_ac82tvVe95E7&UXDbfcdw~i9|wR{ciwfco-Yj7)z!WH z!^20;&6#`iw%#+n9hH?8cbva)Vb$h_`sc%uif^c@%9jGX^Y)qVJ$LL`HCSGTci-+o zZY%@CFftSXEX>mL*LDNTpIUS1ex<3kE0Obn4V^6N{HD+jq+?3!a%VW4f=i^EAHw z_+zu==9aeJ-X7Stjm5X#ifJ`97>^6bjj^0FL8alLC(8 zbdKXdDaEGy?}ues*!sW&xOi~@1=GT7f9XOYp9h#V`uJmykz6_%c_)>CAP6?4^k66y zda%5_{B{7H-U&**o&m5mO$#u_#sO^G&T<^*o3M@YT0W0Ib)E*L6oz47ER(T!G&McL z7?X!D4e~tCYlM)-Kp^lgA!IuMzvDP38X6jU8XFs}&6_v>a`x=mceJ;+x2UQb_aKb% zO`?@Kj*}|_8Ce2q88hWbc+OTMivPdh|zvAk0ap(|yg&%_#sp zfbV)9+5q_D$B%cNI(2GAV`JmNojZ4SwYRq){ph2QUSN!k0kCvk4*(dC0Hri72tuS3 zAfL}0jIr#<$jE|FDD?S!K7W4q?%h`a2u)2*2>@wt-%9{Q??FQW6ac6I^h6>txPSlt zEh|>6*t~J$#wYsv`qp%Hb+zVlxz`wDegNYUNF)+(hr{7#SFT)n;PmO!mjPgGY)mJF zOnT^{hjajEyxdLlo`wNW*aDz?w$FGy=Y_d=Zs=WIT|e*Z>wBZ2q2b8|3l_ZG)6;W; z=lPK1I7tEkd-v}BgU{zXJ8#~+SL^HR!vMHcDrKmuDgp=shgYbJ0KF@3BffT%l zjt#)|E(d_2Y1)TvZEf{EJv|R@*s$StLdfeJ#|>V6D=sfDuiUq9->b1$EYBGG%G9Y- zt0zyM9BXZDz1b5gctoyz#X8VR@}Bd4Th|eX7ZtNO&XmsiC86`7BBbHeC+TO4MRgiAG@ym-jXFt9_2Vr2m}I8 zc6WE@CkVO!j@Z8h008~{{r!PJ;8HLctlGbS|FM#S`mcXCivMYme*kD66^^`DF#7-i N002ovPDHLkV1oQ5S=Rsn diff --git a/school-software/trainingsoft/kde-edu/index.txt b/school-software/trainingsoft/kde-edu/index.txt deleted file mode 100644 index 5b4bd4e..0000000 --- a/school-software/trainingsoft/kde-edu/index.txt +++ /dev/null @@ -1,60 +0,0 @@ -=== Образовательный проект KDE === - -Пакет KDE Edu (KDE Education Project), являющийся частью проекта среды рабочего -стола KDE), включает в себя набор обучающих программ по различным учебным -дисциплинам (математике, химии, астрономии, языкам и др.), клавиатурный -тренажёр, простой и функциональный редактор для составления тестов и средства -для обучения программированию школьников среднего и старшего звена. - -Практически все программы коллекции KDE Edu имеют очень простой и понятный -интерфейс. Освоение работы с этими программами не требует длительного обучения -педагога. В пакет входят программы для преподавателей, помогающие планировать уроки. - -В списке программ образовательного пакета KDE Edu: - -.Языки: - -* image:images/kanagram.png[] Kanagram -- игра в анаграммы. - -* image:images/khangman.png[] KHangMan -- игра. - -* image:images/kiten.png[] Kiten -- программа для изучения японского языка. - -* image:images/klettres.png[] KLettres -- программа для изучения алфавита и простейших слогов. - -* image:images/parley.png[] Parley -- тренировка словарного запаса. - -.Математика: - -* image:images/kbruch.png[] KBruch -- программа, обучающая операциям над дробями. - -* image:images/kig.png[] Kig -- программа интерактивной геометрии. - -* image:images/kmplot.png[] KmPlot -- графопостроитель функций. - -* image:images/kalgebra.png[] KAlgebra -- калькулятор, основанный на специальном языке разметки Mathml. -Эта версия программы может выполнять простые действия Mathml (арифметические -и логические) и строить двух- и трёхмерные графики. Для того чтобы использовать -KAlgebra не обязательно знать Mathml. - -.Разное: - -* image:images/blinken.png[] blinKen -- компьютеризированная версия игры «Саймон сказал». - -* image:images/kgeography.png[] KGeography -- программа для изучения географии. - -* image:images/ktouch.png[] KTouch -- клавиатурный тренажёр. - -* image:images/kturtle.png[] KTurtle -- образовательная среда программирования. - -* image:images/kwordquiz.png[] KWordQuiz -- программа для изучения новой лексики. - -.Наука: - -* image:images/kalzium.png[] Kalzium -- периодическая таблица химических элементов. - -* image:images/kstars.png[] KStars -- виртуальный планетарий. - -* image:images/marble.png[] Marble -- настольный глобус. - -* image:images/step.png[] Step -- имитатор физических процессов. diff --git a/school-software/trainingsoft/logisim/index.txt b/school-software/trainingsoft/logisim/index.txt deleted file mode 100644 index 454ea09..0000000 --- a/school-software/trainingsoft/logisim/index.txt +++ /dev/null @@ -1,14 +0,0 @@ -=== Logisim === -Logisim -- инструмент, позволяющий разрабатывать и моделировать цифровые -электрические схемы, используя графический интерфейс пользователя. - -Logisim может использоваться учащимися в курсе изучения информатики для -разработки и экспериментов с цифровыми схемами при моделировании. Схемы -разрабатываются в Logisim с помощью графического интерфейса, близкого к -традиционному для программ для рисования, такой интерфейс встречается во многих -других программах для моделирования схем. Относительная простота интерфейса -делает программу удобной для обзорных курсов. - -Для запуска программы через терминал введите в командной строке -интерпретатора shell строку `logisim` и нажмите клавишу Enter. Для старта -`logisim` из меню запуска приложений выберите *Образование* -> *logisim*. diff --git a/school-software/trainingsoft/maxima/index.txt b/school-software/trainingsoft/maxima/index.txt deleted file mode 100644 index e42cce1..0000000 --- a/school-software/trainingsoft/maxima/index.txt +++ /dev/null @@ -1,17 +0,0 @@ -=== Графическая оболочка Maxima === - -Maxima -- свободная кроссплатформенная система компьютерной алгебры. - -Среди возможностей системы Maxima решение уравнений, построение двухмерных и -трёхмерных графиков, упрощение выражений, использование широкого спектра -математических функций, дифференцирование и интегрирование функций и многое -другое. Maxima предоставляет широчайший набор средств для проведения аналитических, -численных вычислений и построения графиков. - -Maxima имеет удобный графический интерфейс (wxMaxima), а также возможность -работать в режиме командной строки. - -Maxima является профессиональной системой, предназначенной для решения -достаточно сложных математических задач, а также для графического отображения -данных. Система Maxima является адаптированным для использования в учебных целях -инструментом. diff --git a/school-software/trainingsoft/scilab/images/scilab.png b/school-software/trainingsoft/scilab/images/scilab.png deleted file mode 100644 index efdff2b71a0640b28d9e2e53ce1a648104bb3c4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21609 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 TcUyw80>Gv7HeZ*YbBq563;jWA diff --git a/school-software/trainingsoft/scilab/index.txt b/school-software/trainingsoft/scilab/index.txt deleted file mode 100644 index dbafa83..0000000 --- a/school-software/trainingsoft/scilab/index.txt +++ /dev/null @@ -1,40 +0,0 @@ -=== Scilab === - -Scilab -- кроссплатформенный пакет прикладных математических программ, -предоставляющий открытое окружение для инженерных (технических) и -научных расчётов. Пакет включает в себя набор инструментов и интерактивную -документацию. - -Основные характеристики пакета Scilab: - -* графический и консольный интерфейс; -* система помощи; -* алгоритмы базовой математики; -* возможность программирования; -* возможность работать не только в численном виде, но и в формульном варианте; -* возможность работы с графикой. - -Scilab -- это система компьютерной математики, предназначенная для -решения вычислительных задач. Применение Scilab преподавателями в -повседневной педагогической практике позволит, используя презентационные -возможности системы, увеличить эффективность демонстрации материала. - -image::images/scilab.png[Основное окно Scilab] - -//application path -Для запуска программы через терминал введите в командной строке интерпретатора shell строку -`scilab` и нажмите клавишу *Enter*. Для старта Scilab из меню запуска приложений -выберите *Образование -> Математика -> Scilab*. - -Основное окно Scilab условно можно разделить на две области: - -* область меню, расположенная вверху экрана; - -* рабочая область с командной строкой, в которой, собственно, и -происходит решение задачи. - -//application path -Индикатором готовности программы к работе является символ -\-> в рабочей области, -возле которого находится курсор. Строку в рабочей области, где находится курсор, -называют командной строкой. Для завершения сеанса следует выполнить в командной -строке команду `quit` или выбрать стандартный пункт меню *Файл -> Выход*. diff --git a/school-software/trainingsoft/teacher/images/class32.png b/school-software/trainingsoft/teacher/images/class32.png deleted file mode 100644 index 01e0876cebe905ce8c381252f032733c627077fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2913 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 LNkvXXu0mjfc>8k~ diff --git a/school-software/trainingsoft/teacher/images/edit1.png b/school-software/trainingsoft/teacher/images/edit1.png deleted file mode 100644 index a49c4f7d9b68233e4f17a022cb2edfae22c91b28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3554 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 c{ zaB^>EX>4U6ba`-PAZ2)IW&i+q+ND)lk|j3?{MRXb1OWoUakNJG20p%1s+xB9cw#)Z zOYus2lorTLP+EWdzSD1bh}BZj>K0}hPl*!TF!205=!rAsz?fd!+f(~$Pvu=i{p*Ks zcJ}W!;-?dW<&4+6k-Y=q=L41Je;w}u0_zVvvhbSACy(O&KHm+k)?!}OrZHoCUPAZH z=P=3VpEUG>H;ePJV4U!Bm_*Lb7b$FAPi(KJXE~ohfurJNz;r+wGmqTS2C!#OalqDUr_Y|{H=X?(uYP1rX83a0k+(qExOXf>d}*2ZUyrc z{Ucv?r794`wr(sdUBce5&*|2l7)G)un(z#17UAy(#y+>~Y@)>35uu+GP7;W;DS*A{# zb^46i7A;6=m8EIfs>@fbwxP8xyKLRI>-HVHeXvGv3V+}J1#9%O#+RuxuYRxwYpqY8 zu3oUo;S7v%AuwJK1E(+^&azV}e3(0&Z2l?hA}lUrZRlh@|8#Nou20zb@G zskt$9Z6GTLA|`^|2d%)3(z>IJtkD9ggg9&PEIR<~GEfgG!h(Dl9XbPe8yo=gO%=L; zM3FI$#2UcEIzmI?EIgwj)08zYow%~89;6|7cgO~rh|~ciawG*g9sSFOTqFGn?6_Et z@T&vU00004b3#c}2nYxWdX`RjJ!um3Gif{%~LCp2zR}&-a~M1%QYg6_M|4Y;64W*$Wpw z2Phtr)Bxa@BC@cyw#JKpey#K7ub+S9)GHU0`9}OybAIka*|B#$7G+sed)wBX-i>~z zcPTf;-=4hq+Q0u_fC#{Qf2Al2v$A$84z4c#>EoAQ`sRrPjW5rn>9OR|BM_qy%uG^dj0Os#jl?K`HlbC0f6o8?H^r!^B-To`?W7EeX_TCEIiNz z1m@=8)1QGbM8xB)!#amkA)S|Bq_=d9?bgiZj1orYpeb07gz4AP8#e7@F@>7 z--Zjj8~|vwT8oE|96@LGV`0$-5eO9Yd$4mC8Vzs`aSpK#Q32HJ_+FQKr#BONo=Lqt z6DLvoH%F(h_O-cM7`I}rcgENQ-pKonmyh&Bo@EjMa5Jmdv9q(VHE>fYFdEuh5Xayw zI0x1t0xHQMjPMG)IF$FKLW>|g6^EQEe1H~9?m>Hp_YQ$atF8o<`?WYtJ=1eI=SHQ@ z!`EvLNKqhp9~DIqhP!N*%2oC}4+ebf3?yR!-EQ|*8pj9FxUv@593gyPL+ag2l5gCog+m7 zMGoGT03xGkmI}-Sg)n8{=orAslP8Nf2-bsx2eDB!7+*?&yjLE&fI>r&BSj8IqoTMn zdr%bzCT(Xy+2cEh&($DAd2Xn=d2EuEc~4kY*SgGxFa%=}V-e#J=f`4TmxdUfhrCNe6&2T)Bzlu|2cy-vT@0Kdn-Vi<&FCX|6# zAlB}R{E6D*hALAr8v_uL)g-I2Gd)+%y6UPK1fL#cz%USXasMe-iq-DpP;HQky8xVX zYe|yiy3ri(##tyT4wwQlx^!S~Z8eE#*Zxq~aA*vm+wI;-qHwD>GYcvhZDoqm5of`B z)PKqKQgT022+Q8zF$Qq%+__E`MeDBF!Vc3*4NOxCHQ3Q6X}nzB?*##1;qftmvuDrx zCk-69GhIso7|7b9wnaz+d*WbK&y(CE(KeBYbx&Zhg4#-~QJt$cMJJizAWW;;#O prADLiw%Wh1&YU?j+(qA3{RiDNmvdl=y>0*i002ovPDHLkV1o0*;{X5v diff --git a/school-software/trainingsoft/teacher/images/itest.png b/school-software/trainingsoft/teacher/images/itest.png deleted file mode 100644 index 0b95ca188c25920cfb773783e461a2ac09730060..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68609 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

|!2 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 diff --git a/school-software/trainingsoft/teacher/images/itest32.png b/school-software/trainingsoft/teacher/images/itest32.png deleted file mode 100644 index aabcf2648ea6c269f0a2d673ac697957b5674412..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3907 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 RJ4FBh002ovPDHLkV1kV}lgt1B diff --git a/school-software/trainingsoft/teacher/images/itestserver32.png b/school-software/trainingsoft/teacher/images/itestserver32.png deleted file mode 100644 index 7fe56caabef3748994cf006bea0a101fa6637683..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3940 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 Параметры -> Центр управления системой*; diff --git a/system-management/acc/gui/acc-kde.txt b/system-management/acc/gui/acc-kde.txt deleted file mode 100644 index 3a0d4f6..0000000 --- a/system-management/acc/gui/acc-kde.txt +++ /dev/null @@ -1 +0,0 @@ -* в графической среде KDE: *Меню запуска приложений -> Центр управления системой*; diff --git a/system-management/acc/gui/acc-lxde.txt b/system-management/acc/gui/acc-lxde.txt deleted file mode 100644 index adaf64d..0000000 --- a/system-management/acc/gui/acc-lxde.txt +++ /dev/null @@ -1,2 +0,0 @@ -//application path -* в графической среде LXDE *Меню приложений -> Настройки -> Администрирование -> Центр управления системой*; diff --git a/system-management/acc/gui/acc-mate.txt b/system-management/acc/gui/acc-mate.txt deleted file mode 100644 index 9118d47..0000000 --- a/system-management/acc/gui/acc-mate.txt +++ /dev/null @@ -1,2 +0,0 @@ -//application path -* из меню в графической среде MATE: *Система -> Администрирование -> Центр управления системой*; diff --git a/system-management/acc/gui/acc-xfce.txt b/system-management/acc/gui/acc-xfce.txt deleted file mode 100644 index 1b04b24..0000000 --- a/system-management/acc/gui/acc-xfce.txt +++ /dev/null @@ -1,2 +0,0 @@ -//application path -* в графической среде Xfce *Меню приложений -> Настройки -> Центр управления системой*; diff --git a/system-management/acc/images/alterator-datetime.png b/system-management/acc/images/alterator-datetime.png deleted file mode 100644 index 09104d90dc436dc6a87e7c18fd8fb620d259cd5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 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 z 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 diff --git a/system-management/network/index.txt b/system-management/network/index.txt deleted file mode 100644 index 7397d26..0000000 --- a/system-management/network/index.txt +++ /dev/null @@ -1,3 +0,0 @@ -== Настройка сети == - -include::networkmanager.txt[] diff --git a/system-management/network/knetworkmanager.txt b/system-management/network/knetworkmanager.txt deleted file mode 100644 index e52bb3b..0000000 --- a/system-management/network/knetworkmanager.txt +++ /dev/null @@ -1,14 +0,0 @@ -[float] -==== Виджет «Управление сетью» ==== - -Значок виджета *Управление сетью* располагается в системном лотке. При нажатии -левой кнопки мыши отобразится информация о сетевых интерфейсах компьютера и о -текущих соединениях. - -Для того чтобы открылось окно настроек, нажмите *Изменить соединения...* . - -image::images/knetworkmanager-settings.png[Настройка виджета «Управление сетью»] - -При нажатии на кнопку *Добавить* будет открыт диалог добавления нового -соединения, в котором вы сможете указать опции, специфичные для данного типа -соединения. diff --git a/system-management/network/networkmanager.txt b/system-management/network/networkmanager.txt deleted file mode 100644 index 3efa430..0000000 --- a/system-management/network/networkmanager.txt +++ /dev/null @@ -1,36 +0,0 @@ -=== NetworkManager === - -NetworkManager позволяет подключаться к различным типам сетей: проводные, -беспроводные, мобильные, VPN и DSL, а также сохранять эти подключения для -быстрого доступа к сети. Например, если вы подключались к сети в каком-либо -интернет-кафе, то можно сохранить настройки этого подключения и в следующее -посещение этого кафе подключиться автоматически. - -//nm-applet - -Для управления настройками сети в (DISTRO) используется программа NetworkManager. - -[options="autowidth",cols="2"] -|==== -|image:images/nm-applet-LMB.png[Левая кнопка мыши] -|При нажатии *левой кнопкой мыши* на значок NetworkManager, вы увидите меню, в -котором можно выбрать одну из доступных Wi-Fi сетей и подключиться к ней. Из этого -меню так же можно отключить активное Wi-Fi соединение. - -|image:images/nm-applet-RMB.png[Правая кнопка мыши] -|При нажатии *правой кнопкой мыши* на значок NetworkManager, вы увидите меню, из -которого можно получить доступ к изменению некоторых настроек. Вы можете -узнать версию программы, глянуть сведения о соединении, можете изменить -соединения (например, удалить Wi-Fi сеть, чтобы не подключаться к ней автоматически). - -2+^|image:images/nm-applet-pass.png[Просьба ввести пароль] - -Обратите внимание, что при работе с NetworkManager вам потребуется вводить пароль -вашей учетной записи. -|==== - -//knetworkmanager - -Для управления настройками сети в (DISTRO) используется виджет *Управление сетью*. - -include::knetworkmanager.txt[] diff --git a/system-management/printer/printer-cups.txt b/system-management/printer/printer-cups.txt deleted file mode 100644 index 2bf7942..0000000 --- a/system-management/printer/printer-cups.txt +++ /dev/null @@ -1,66 +0,0 @@ -//application path -== Установка принтера с помощью CUPS == - -Перед началом установки убедитесь в том, что в случае локального -подключения принтер присоединён к соответствующему порту компьютера и включён, -а в случае сетевого подключения принтер корректно сконфигурирован для работы в -сети. - -[float] -=== Последовательность установки === - -. Для настройки принтера вам потребуется запустить браузер и зайти по -адресу `http://localhost:631` - -[WARNING] -Если вы получаете сообщение "Веб-страница недоступна", тогда вам следует -запустить службу CUPS. Это можно сделать с помощью модуля -"Системные службы" в приложении *Центр управления системой*, также вы можете -запустить службу CUPS через терминал, для этого от имени администратора -выполните одну из команд `service cups start`, или -`/etc/rc.d/init.d/cups start`. - -[start=2] -. В открывшемся странице в верхней панели перейдите в раздел -*Администрирование*. - -. Под заголовком *Принтеры* нажмите кнопку *Добавить принтер*. - -. Введите пароль администратора системы. Если будет предложено, не рекомендуется - сохранять введенные данные в браузере. - -. Выберите свой принтер в одной из категорий. Затем нажмите *Продолжить*. -- *Локальные принтеры* -- к этой категории отнесены принтеры, -подключенные к компьютеру физически. -- *Обнаруженные сетевые принтеры* -- к этой категории отнесены -принтеры в вашей локальной сети. -- *Прочие сетевые принтеры* -- в этой категории перечислены различные возможные -способы подключения сетевых принтеров. - -. В этом диалоге вам стоит проверить данные. Если всё определилось верно -автоматически, то вы можете оставить значения по умолчанию. -Нажмите *Продолжить*, когда закончите. -- В поле *Название* можно указать название принтера (в названии не должно быть -символов /, # и пробелов). -- В поле *Описание* можно указать расширенное описание принтера. -- В поле *Расположение* можно указать расположение принтера. -- Вы можете отметить пункт *Совместный доступ*, если хотите разрешить -совместный доступ к принтеру. - -. Вы увидите информацию из прошлого диалога. Теперь вам следует проверить, - верно ли определены производитель и модель принтера. Оставьте значения по умолчанию, - если всё верно. В противном случае укажите правильные данные. - Нажмите *Добавить принтер*, когда закончите. -- При помощи кнопки *Выбрать другую модель* вы можете выбрать правильного производителя принтера. -- В списке *Модель* можно выбрать модель вашего принтера из известных системе. - -. В последнем диалоге нужно уточнить параметры печати. - Нажмите *Сохранить параметры по умолчанию*, когда закончите. -- Выпадающий список *Page Size* предназначен для выбора размера бумаги, - поддерживаемого принтером, например A4. -- *Media Source* -- если в принтере больше одного лотка для бумаги, - тогда выберите предпочтительный, иначе оставьте значение по умолчанию: _default_. -- *Double-Sided Printing* -- позволяет включить двустороннюю печать. -- *Resolution* -- позволяет указать количество точек на линейный дюйм. - -После этих действий принтер станет доступен для использования в приложениях. diff --git a/system-start/index.txt b/system-start/index.txt deleted file mode 100644 index e04aab4..0000000 --- a/system-start/index.txt +++ /dev/null @@ -1,5 +0,0 @@ -= Обзор рабочей станции = - -include::system-boot.txt[Загрузка системы] - -include::system-login-dm.txt[Вход в систему] diff --git a/system-start/system-boot.txt b/system-start/system-boot.txt deleted file mode 100644 index 667b7cb..0000000 --- a/system-start/system-boot.txt +++ /dev/null @@ -1,52 +0,0 @@ -== Загрузка системы == - -image::images/system-boot.png[Загрузка] - -После включения компьютера на экране появляется меню, в котором -перечислены возможные варианты загрузки операционных систем. - -[NOTE] -При первом старте, в условиях установки нескольких ОС на один -компьютер, возможно отсутствие в загрузочном меню пункта/пунктов с -другой/другими операционными системами, они будут добавлены в список -при последующей перезагрузке. Все перечисленные в меню после -перезагрузки варианты могут быть загружены загрузчиком Linux. - -Стрелками клавиатуры *Вверx* и *Вниз* выберите нужную -операционную систему. Дополнительно к основным вариантам запуска ОС -из этого меню можно загрузить Linux в безопасном режиме или запустить -проверку памяти. - -Загрузка операционной системы по умолчанию (первая в списке) начинается -автоматически после небольшого времени ожидания (обычно несколько -секунд). Нажав клавишу *Enter*, можно начать загрузку немедленно. - -Нажатием клавиши *E* можно вызвать редактор параметров текущего пункта -загрузки. Если система настроена правильно, то редактировать их нет -необходимости. - -Загрузка операционной системы может занять некоторое время, в -зависимости от производительности компьютера. Основные этапы загрузки -операционной системы -- загрузка ядра, подключение (монтирование) -файловых систем, запуск системных служб -- периодически могут -дополняться проверкой файловых систем на наличие ошибок. В этом -случае время ожидания может занять больше времени, чем обычно. Подробную -информацию о шагах загрузки можно получить, нажав клавишу *Esc*. - -[float] -=== Получение доступа к зашифрованным разделам === - -image::images/luks-enter-password.png[Требование пароля для luks раздела] - -В случае, если вы создали шифрованный раздел, вам потребуется вводить -пароль при обращении к этому разделу. - -Например, если вы зашифровали домашний раздел `/home`, то для того, -чтобы войти в систему под своим именем пользователя, вам потребуется -ввести пароль этого раздела и затем нажать *Enter*. - -[NOTE] -Если вы не успеете ввести пароль за отведенный промежуток времени, -то загрузка системы завершится ошибкой. В этом случае вам следует -перезагрузить систему. Для этого нажмите два раза *Enter*, -а затем последовательно зажмите клавиши *Control* + *Alt* + *Delete*. diff --git a/system-start/system-login-dm.txt b/system-start/system-login-dm.txt deleted file mode 100644 index 45c1863..0000000 --- a/system-start/system-login-dm.txt +++ /dev/null @@ -1,22 +0,0 @@ -=== Вход в систему === - -image::images/dm.png[Регистрация в системе] - -Для регистрации в системе необходимо выбрать из списка созданное вами в -процессе установки системы имя системного пользователя, ввести пароль и нажать -*Enter*. После непродолжительного времени ожидания запустится графическая -оболочка операционной системы. - -Добавлять новых пользователей или удалять существующих можно после загрузки -системы с помощью стандартных средств управления пользователями. - -Если систему устанавливали не вы, то имя _системного пользователя_ и его _пароль_ вам -должен сообщить системный администратор, отвечающий за настройку данного -компьютера. - -[NOTE] - -Поскольку работа в системе с использованием учётной записи _администратора -системы_ небезопасна, вход в систему в графическом режиме для суперпользователя -root запрещён. Попытка зарегистрироваться в системе будет прервана сообщением -об ошибке. diff --git a/whatis-alt/index.txt b/whatis-alt/index.txt deleted file mode 100644 index ddace63..0000000 --- a/whatis-alt/index.txt +++ /dev/null @@ -1,87 +0,0 @@ -== Что такое ALT Linux == - -[float] -=== ALT Linux Team и проект ALT === - -Команда ALT Linux (http://www.altlinux.org/ALT_Linux_Team[http://www.altlinux.org/ALT_Linux_Team]) -- это -интернациональное сообщество, насчитывающее более 200 разработчиков свободных -программ из России, Белоруссии, Украины, Казахстана, Эстонии и Израиля. -Большинство из них не является сотрудниками OOO «Альт Линукс». Компания -«Альт Линукс» координирует этот проект, осуществляет внедрение и поддержку решений. - -Целью проекта ALT является разработка и поддержка широкого спектра решений на -основе свободных программ, отличающихся высокой степенью надёжности и защиты, -простотой и доступностью обновления, простым и логичным интерфейсом, -качественной интернационализацией и локализацией (особое внимание уделяется -поддержке русского языка). Все собственные разработки ALT Linux Team -распространяются под свободными лицензиями. Проект ALT -- участник разработки и -распространения свободных программ. В его команде есть и разработчики основных -компонентов Linux. Разработки команды ALT входят во все дистрибутивы ALT Linux. - -[float] -=== Сизиф === - -Sisyphus (http://sisyphus.ru/[http://sisyphus.ru/]) -- наш ежедневно обновляемый банк программ -(часто называемый репозиторий). На его основе создаются все дистрибутивы ALT -Linux. Поддерживаемая ALT Linux Team целостность Sisyphus, оригинальная -технология сборки программ, утилита `apt-get` и её графическая оболочка synaptic -позволяют пользователям легко обновлять свои системы и быть в курсе актуальных -новостей мира свободных программ. - -Обратите внимание на то, что ежедневно изменяющийся репозиторий содержит самое -новое программное обеспечение со всеми его преимуществами и недостатками -(иногда ещё неизвестными). Поэтому, перед обновлением вашей системы из -Sisyphus, мы советуем взвесить преимущества новых возможностей, реализованных в -последних версиях программ, и вероятность возникновения -неожиданностей в работе с ними (http://www.altlinux.org/Sisyphus_changes). - -Разработка Sisyphus полностью доступна. У нас нет секретных изменений кода и -закрытого тестирования с подписками о неразглашении. То, что мы сделали -сегодня, завтра вы найдёте в сети. По сравнению с другими аналогичными банками -программ (Debian unstable, Mandriva Cooker, PLD, Fedora), в Sisyphus есть -немало самобытного. Особое внимание уделяется защите системы, локализации на -русский язык, полноте и корректности зависимостей. - -Название Sisyphus (Сизиф) заимствовано из греческой мифологии. C кропотливым Сизифом, -непрерывно закатывающим в гору камни, команду ALT Linux Team объединяет постоянная -работа над усовершенствованием технологий, заложенных в репозиторий. - -Sisyphus, в первую очередь, -- открытая лаборатория решений. Если вам это -интересно, если вы хотите дополнить Sisyphus новыми решениями, если вы -считаете, что можете собрать какую-то программу лучше -- присоединяйтесь к -проекту ALT (http://www.altlinux.org/Join). - -[float] -=== Что такое седьмая платформа === - -Как уже говорилось ранее, Sisyphus является часто обновляемым репозиторием, -скорее предназначенным для разработчиков. Решением для тех пользователей, -которым стабильность и предсказуемость работы системы важнее расширенной -функциональности (а это в первую очередь начинающие и корпоративные -пользователи), являются стабильные дистрибутивы ALT Linux, периодически -выпускаемые на основе Sisyphus. Такие стабильные дистрибутивы ALT Linux базируются на стабильном срезе репозитория Sisyphus. Эти срезы называются платформами. - -//даты отсюда http://www.altlinux.org/Branches - -//Седьмая платформа (p7) была создана в апреле 2013 года и её поддержка продлится -//до конца августа 2015. - -[float] -==== Основные новшества в седьмой платформе ==== - -* Большинство модулей Центра управления системой получили поддержку IPv6 -* Для 64-битных систем реализована возможность установки и загрузки в системах -с UEFI -* Добавлена возможность установки на шифрованные разделы -* В дистрибутивах для рабочих станций осуществлён переход на новую систему -инициализации systemd - -[float] -=== Дистрибутивы ALT Linux === - -Дистрибутив Linux -- это не просто собранные вместе операционная система и -набор приложений. Это интегрированная рабочая среда, предназначенная для -решения различных задач пользователей. ALT Linux выпускает специализированные и -универсальные дистрибутивы, ориентированные как на опытных, так и на начинающих -пользователей. Более подробную информацию о дистрибутивах можно найти на -сайте ALT Linux (http://www.altlinux.ru/products/). diff --git a/whatis-distro/index.txt b/whatis-distro/index.txt deleted file mode 100644 index 0ae9d7b..0000000 --- a/whatis-distro/index.txt +++ /dev/null @@ -1,3 +0,0 @@ -== Что такое (DISTRO) == - -**(DISTRO)** -- это дистрибутив Linux производства компании «Альт Линукс». diff --git a/whatis-linux/index.txt b/whatis-linux/index.txt deleted file mode 100644 index 87ccc66..0000000 --- a/whatis-linux/index.txt +++ /dev/null @@ -1,103 +0,0 @@ -== Что такое Linux == - -[float] -=== Свободные программы === - -Операционная система (далее -- ОС) Linux -- ядро, основные компоненты системы и -большинство её пользовательских приложений -- свободные программы. -Свободные программы можно: - -- запускать на любом количестве компьютеров; -- распространять бесплатно или за деньги без каких-либо ограничений; -- получать исходные тексты этих программ и вносить в них любые изменения. - -Свобода программ обеспечила их широкое использование и интерес к ним со стороны -тысяч разработчиков. Основные программы для Linux выходят под лицензией GNU -General Public License (далее -- GPL). Лицензия GNU не только гарантирует -свободу, но и защищает её. Она допускает дальнейшее распространение программ -только под той же лицензией, поэтому исходный код ядра Linux, компиляторов, -библиотеки glibc, пользовательских графических оболочек не может быть -использован для создания приложений с закрытым кодом. В этом принципиальное -отличие Linux от свободных ОС семейства BSD (FreeBSD, NetBSD, OpenBSD), фрагменты -которых вошли в Microsoft Windows и даже стали основой OS X. Linux -включает в себя многие разработки BSD, но его компиляторы и системные библиотеки -разработаны в рамках проекта GNU (http://www.gnu.org/home.ru.html). - -[float] -=== Разработка Linux === - -В отличие от распространённых несвободных ОС, Linux не имеет географического -центра разработки. Нет фирмы, которая владела бы этой ОС, нет и единого -координационного центра. Программы для Linux -- результат работы тысяч -проектов. Большинство из них объединяет программистов из разных стран, -связанных друг с другом только перепиской. Лишь некоторые проекты -централизованы и сосредоточены в фирмах. Создать свой проект или присоединиться -к уже существующему может любой программист, и, в случае успеха, результаты -этой работы станут известны миллионам пользователей. Пользователи принимают -участие в тестировании свободных программ, общаются с разработчиками напрямую. -Это позволяет за короткий срок добавлять в программное обеспечение новые -возможности, оперативно находить ошибки и исправлять их. - -Именно гибкая и динамичная система разработки, невозможная для проектов с -закрытым кодом, определяет исключительную экономическую эффективность Linux. -Низкая стоимость свободных разработок, отлаженные механизмы тестирования и -распространения, привлечение независимых специалистов, обладающих -индивидуальным, самостоятельным видением проблем, защита исходного текста -программ лицензией GPL -- всё это стало причиной успеха свободных программ. - -Такая высокая эффективность разработки не могла не заинтересовать крупные -фирмы. Они стали создавать свои свободные проекты, основывающиеся на тех же -принципах. Так появились Mozilla, LibreOffice, свободный клон Interbase, SAP -DB. IBM способствовала переносу Linux на свои мейнфреймы. - -Открытый код программ значительно снизил себестоимость разработки закрытых -систем для Linux и позволил снизить цену решения для пользователя. Вот почему -Linux стала платформой, часто рекомендуемой для таких продуктов, как Oracle, -DB2, Informix, Sybase, SAP ERP, Lotus Domino. - -[float] -=== Защищённость === - -ОС Linux унаследовала от UNIX надёжность и отличную систему защиты. Система -разграничения доступа к файлам позволяет не бояться вирусов. Но всё же, -программ без ошибок не бывает, и Linux не исключение. Благодаря открытости -исходного кода программ, аудит системы может осуществить любой специалист без -подписок о неразглашении и без необходимости работы в стенах нанявшей его -компании. Сообщества разработчиков и пользователей свободных программ создали -множество механизмов оповещения об ошибках и их исправления. Сообщить об ошибке -и принять участие в её исправлении независимому программисту или пользователю -так же просто, как специалисту фирмы-разработчика или автору проекта. Благодаря -этому ошибки защиты эффективно выявляются и быстро исправляются. - - -[float] -=== Дистрибутивы Linux === - -Большинство пользователей для установки Linux используют дистрибутивы. -Дистрибутив -- это не просто набор программ, а готовое решение для выполнения -различных задач пользователя, обладающее идентичностью установки, управления, -обновления, а также едиными системами настройки и поддержки. - -[float] -=== Новичку === - -* Linux -- самостоятельная операционная система. Все операционные системы - разные: Linux -- не Windows, не OS X и не FreeBSD. В Linux свои правила, их - необходимо изучить и к ним необходимо привыкнуть. Терпение и настойчивость в - изучении Linux обернётся значительным повышением эффективности и безопасности - вашей работы. То, что сегодня кажется странным и непривычным, завтра - понравится и станет нормой. - -* Не стесняйтесь задавать вопросы, ведь самый простой способ найти ответ -- - совет опытного специалиста. Взаимопомощь и общение -- традиция в мире Linux. - Всегда можно обратиться за помощью к сообществу пользователей и разработчиков - Linux. Большинство вопросов повторяются, поэтому для начала стоит поискать - ответ на свой вопрос в документации, затем в сети Интернет. Если вы не нашли - ответа в перечисленных источниках, не стесняйтесь, пишите на форум или в - списки рассылки так, как писали бы своим друзьям, и вам обязательно помогут. -+ -Для дистрибутивов ALT Linux вы можете воспользоваться ресурсами: -+ -** Форум: http://forum.altlinux.org/ -** Списки рассылки: http://lists.altlinux.org/ -** ALT Linux Wiki: http://www.altlinux.org/ From d86622a5a96e8a2e8c0419e91d9204fc1d965d07 Mon Sep 17 00:00:00 2001 From: Alexandr Boltris Date: Mon, 12 May 2014 14:07:53 +0300 Subject: [PATCH 49/53] fix project name --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 145f788..bd079eb 100755 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ IMAGEEXTS = BMP bmp CGM cgm DVI dvi EPS eps EQN eqn FAX fax GIF gif IGS \ FILEDIR := $(LANGUAGE) BUILDDIR := tmp/$(LANGUAGE) -PROJECT = simply-linux +PROJECT = doc #docdir = /usr/local/share/doc/$(PROJECT) docdir = /tmp/$(PROJECT) DESTDIR = From ef76c00f84a6acce26369dce871af43e301bd5fa Mon Sep 17 00:00:00 2001 From: Alexandr Boltris Date: Mon, 12 May 2014 14:08:31 +0300 Subject: [PATCH 50/53] fix install command in Makefile / add index.html --- Makefile | 11 ++++++++-- index.html | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ publican.cfg | 2 ++ 3 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 index.html diff --git a/Makefile b/Makefile index bd079eb..39d8252 100755 --- a/Makefile +++ b/Makefile @@ -25,6 +25,7 @@ docdir = /tmp/$(PROJECT) DESTDIR = INSTALL = install +INSTALL_DATA = $(INSTALL) -m 644 # Essential prerequisites: ALL := $(shell find ru-RU \( -name '.*' -prune \) -o -type f -print) @@ -65,8 +66,14 @@ all: html-desktop html-single html epub pdf txt install: html-single $(wildcard html-desktop) - $(INSTALL) -d $(DESTDIR)$(docdir)/ - publican install_brand --path=$(DESTDIR)$(docdir)/ + $(INSTALL) -d $(DESTDIR)$(docdir)/ru-RU/Common_Content/css/ + $(INSTALL) -d $(DESTDIR)$(docdir)/ru-RU/Common_Content/images/ + $(INSTALL) -d $(DESTDIR)$(docdir)/ru-RU/images/ + $(INSTALL_DATA) publish/home/ru-RU/Common_Content/css/* $(DESTDIR)$(docdir)/ru-RU/Common_Content/css/ + $(INSTALL_DATA) publish/home/ru-RU/Common_Content/images/* $(DESTDIR)$(docdir)/ru-RU/Common_Content/images/ + $(INSTALL_DATA) publish/home/ru-RU/images/* $(DESTDIR)$(docdir)/ru-RU/images/ + $(INSTALL_DATA) publish/home/ru-RU/splash.html $(DESTDIR)$(docdir)/ru-RU/index.html + $(INSTALL_DATA) index.html $(DESTDIR)$(docdir)/ .PHONY: clean clean: diff --git a/index.html b/index.html new file mode 100644 index 0000000..8a6b8c2 --- /dev/null +++ b/index.html @@ -0,0 +1,62 @@ + + + + +Release Notes + + + +

+

+

+ + + diff --git a/publican.cfg b/publican.cfg index 6f7774c..46b5859 100644 --- a/publican.cfg +++ b/publican.cfg @@ -13,3 +13,5 @@ doc_url: "http://docs.altlinux.org/" mainfile: docs product: "ALT Linux branch master" docname: Documentation + +web_type: home From fe33fa20a1c64ff1b3d2d0a3531111fefb156a11 Mon Sep 17 00:00:00 2001 From: Alexandr Boltris Date: Tue, 13 May 2014 10:45:47 +0300 Subject: [PATCH 51/53] fix formatting for words with - --- ru-RU/desktop-software/e-mail.xml | 4 ++-- ru-RU/desktop-software/web-navigation.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ru-RU/desktop-software/e-mail.xml b/ru-RU/desktop-software/e-mail.xml index ab31bea..074e4a3 100644 --- a/ru-RU/desktop-software/e-mail.xml +++ b/ru-RU/desktop-software/e-mail.xml @@ -10,8 +10,8 @@ готового набора, проверку орфографии по мере набора текста и другие полезные функции. - Современные пользователи предпочитают работать с электронной почтой через веб- - интерфейс, используя браузер. Подручных средств, предоставляемых популярными почтовыми + Современные пользователи предпочитают работать с электронной почтой через + веб-интерфейс, используя браузер. Подручных средств, предоставляемых популярными почтовыми сервисами, для повседневных почтовых нужд пользователя практически достаточно, но использование специально предназначенных программ даёт некоторые преимущества: diff --git a/ru-RU/desktop-software/web-navigation.xml b/ru-RU/desktop-software/web-navigation.xml index bd27436..301fbaf 100644 --- a/ru-RU/desktop-software/web-navigation.xml +++ b/ru-RU/desktop-software/web-navigation.xml @@ -7,7 +7,7 @@ Веб-браузеры — комплексные программы для обработки и отображения HTML-страниц по протоколу HTTP и HTTPS (открытие страниц сайтов, блогов и т.д.). Основное - назначение веб- браузера — предоставление интерфейса между веб-сайтом и его + назначение веб-браузера — предоставление интерфейса между веб-сайтом и его посетителем. В базовые функции современных веб-браузеров входят: From 2b1fc92c638ec96c6ee0d57149e9d13c13304fd1 Mon Sep 17 00:00:00 2001 From: Alexandr Boltris Date: Tue, 13 May 2014 10:48:30 +0300 Subject: [PATCH 52/53] change toc depht to 0 --- publican.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/publican.cfg b/publican.cfg index 46b5859..27a804f 100644 --- a/publican.cfg +++ b/publican.cfg @@ -4,7 +4,7 @@ xml_lang: "ru-RU" type: Book brand: common -toc_section_depth: 1 +toc_section_depth: 0 # can be moved to brand package prod_url: "http://www.altlinux.ru/products/7th-platform/" From 92c233b7698db42c7f9e423847e13ae5a884842a Mon Sep 17 00:00:00 2001 From: Alexandr Boltris Date: Tue, 13 May 2014 11:22:31 +0300 Subject: [PATCH 53/53] move starting-os to own part --- ru-RU/docs.xml | 1 + ru-RU/install-distro/index.xml | 17 ++- ru-RU/install-distro/starting-os.xml | 121 ------------------ ru-RU/starting-os/access-to-crypted-disks.xml | 35 +++++ ru-RU/starting-os/index.xml | 17 +++ ru-RU/starting-os/login-to-system.xml | 36 ++++++ ru-RU/starting-os/system-boot.xml | 49 +++++++ 7 files changed, 146 insertions(+), 130 deletions(-) delete mode 100644 ru-RU/install-distro/starting-os.xml create mode 100644 ru-RU/starting-os/access-to-crypted-disks.xml create mode 100644 ru-RU/starting-os/index.xml create mode 100644 ru-RU/starting-os/login-to-system.xml create mode 100644 ru-RU/starting-os/system-boot.xml diff --git a/ru-RU/docs.xml b/ru-RU/docs.xml index bc0740f..e0bb402 100644 --- a/ru-RU/docs.xml +++ b/ru-RU/docs.xml @@ -17,6 +17,7 @@ --> + diff --git a/ru-RU/install-distro/index.xml b/ru-RU/install-distro/index.xml index a217f7d..814cabe 100644 --- a/ru-RU/install-distro/index.xml +++ b/ru-RU/install-distro/index.xml @@ -3,13 +3,13 @@ "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd"> - Установка дистрибутива - - - В этой части рассматривается процесс установки дистрибутива. - - - + Установка дистрибутива + + + В этой части рассматривается процесс установки дистрибутива. + + + @@ -25,6 +25,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/ru-RU/install-distro/starting-os.xml b/ru-RU/install-distro/starting-os.xml deleted file mode 100644 index 700d14a..0000000 --- a/ru-RU/install-distro/starting-os.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - - - Обзор &DISTRO_RU; - -
- Загрузка системы - - - - - - - - Загрузка системы - - - - - После включения компьютера на экране появляется меню, в котором перечислены - возможные варианты загрузки операционных систем. - - - При первом старте, в условиях установки нескольких ОС на один компьютер, возможно - отсутствие в загрузочном меню пункта/пунктов с другой/другими операционными системами, они - будут добавлены в список при последующей перезагрузке. Все перечисленные в меню после - перезагрузки варианты могут быть загружены загрузчиком Linux. - - - Стрелками клавиатуры Вверx и Вниз - выберите нужную операционную систему. Дополнительно к основным вариантам - запуска ОС из этого меню можно загрузить Linux в безопасном режиме или - запустить проверку памяти. - - Загрузка операционной системы по умолчанию (первая в списке) начинается - автоматически после небольшого времени ожидания (обычно несколько секунд). - Нажав клавишу Enter, можно начать загрузку немедленно. - - Нажатием клавиши E можно вызвать редактор параметров - текущего пункта загрузки. Если система настроена правильно, то редактировать их - нет необходимости. - - Загрузка операционной системы может занять некоторое время, в зависимости - от производительности компьютера. Основные этапы загрузки операционной системы - — загрузка ядра, подключение (монтирование) файловых систем, запуск системных - служб — периодически могут дополняться проверкой файловых систем на наличие - ошибок. В этом случае время ожидания может быть занять больше времени, чем - обычно. Подробную информацию о шагах загрузки можно получить, нажав клавишу - Esc. - -
- -
- Получение доступа к зашифрованным разделам - - - - - - - - Запрос ввода пароля для LUKS-раздела - - - - - В случае, если вы создали шифрованный раздел, вам потребуется вводить - пароль при обращении к этому разделу. - - Например, если вы зашифровали домашний раздел /home, то для того, чтобы войти в систему под - своим именем пользователя, вам потребуется ввести пароль этого раздела и затем - нажать Enter. - - - Если вы не успеете ввести пароль за отведенный промежуток времени, то - загрузка системы завершится ошибкой. В этом случае вам следует перезагрузить - систему. Для этого нажмите два раза Enter, а затем - последовательно зажмите клавиши Ctrl - AltDelete. - - -
- -
- Вход в систему - - - - - - - - Регистрация в системе - - - - - Для регистрации в системе необходимо выбрать из списка созданное вами в - процессе установки системы имя системного пользователя, ввести пароль и нажать - Enter. После непродолжительного времени ожидания запустится - графическая оболочка операционной системы. - - Добавлять новых пользователей или удалять существующих можно после загрузки системы с - помощью стандартных средств управления пользователями. - - Если систему устанавливали не вы, то имя системного пользователя и его пароль вам - должен сообщить системный администратор, отвечающий за настройку данного компьютера. - - - Поскольку работа в системе с использованием учётной записи - администратора системы небезопасна, вход в систему в - графическом режиме для суперпользователя root запрещён. Попытка - зарегистрироваться в системе будет прервана сообщением об ошибке. - - -
- -
\ No newline at end of file diff --git a/ru-RU/starting-os/access-to-crypted-disks.xml b/ru-RU/starting-os/access-to-crypted-disks.xml new file mode 100644 index 0000000..1088ea9 --- /dev/null +++ b/ru-RU/starting-os/access-to-crypted-disks.xml @@ -0,0 +1,35 @@ + + + + + Получение доступа к зашифрованным разделам + + + + + + + + Запрос ввода пароля для LUKS-раздела + + + + + В случае, если вы создали шифрованный раздел, вам потребуется вводить + пароль при обращении к этому разделу. + + Например, если вы зашифровали домашний раздел /home, то для того, чтобы войти в систему под + своим именем пользователя, вам потребуется ввести пароль этого раздела и затем + нажать Enter. + + + Если вы не успеете ввести пароль за отведенный промежуток времени, то + загрузка системы завершится ошибкой. В этом случае вам следует перезагрузить + систему. Для этого нажмите два раза Enter, а затем + последовательно зажмите клавиши Ctrl + AltDelete. + + + diff --git a/ru-RU/starting-os/index.xml b/ru-RU/starting-os/index.xml new file mode 100644 index 0000000..0af6cda --- /dev/null +++ b/ru-RU/starting-os/index.xml @@ -0,0 +1,17 @@ + + + +Начало использования &DISTRO_RU; + + + В этой части рассматривается загрузка установленной операционной системы и вход + в среду рабочего стола. + + + + + + + + \ No newline at end of file diff --git a/ru-RU/starting-os/login-to-system.xml b/ru-RU/starting-os/login-to-system.xml new file mode 100644 index 0000000..8371f17 --- /dev/null +++ b/ru-RU/starting-os/login-to-system.xml @@ -0,0 +1,36 @@ + + + +Вход в систему + + + + + + + + Регистрация в системе + + + + + Для регистрации в системе необходимо выбрать из списка созданное вами в + процессе установки системы имя системного пользователя, ввести пароль и нажать + Enter. После непродолжительного времени ожидания запустится + графическая оболочка операционной системы. + + Добавлять новых пользователей или удалять существующих можно после загрузки системы с + помощью стандартных средств управления пользователями. + + Если систему устанавливали не вы, то имя системного пользователя и его пароль вам + должен сообщить системный администратор, отвечающий за настройку данного компьютера. + + + Поскольку работа в системе с использованием учётной записи + администратора системы небезопасна, вход в систему в + графическом режиме для суперпользователя root запрещён. Попытка + зарегистрироваться в системе будет прервана сообщением об ошибке. + + + diff --git a/ru-RU/starting-os/system-boot.xml b/ru-RU/starting-os/system-boot.xml new file mode 100644 index 0000000..9c8a046 --- /dev/null +++ b/ru-RU/starting-os/system-boot.xml @@ -0,0 +1,49 @@ + + + +Загрузка системы + + + + + + + + Загрузка системы + + + + + После включения компьютера на экране появляется меню, в котором перечислены + возможные варианты загрузки операционных систем. + + + При первом старте, в условиях установки нескольких ОС на один компьютер, возможно + отсутствие в загрузочном меню пункта/пунктов с другой/другими операционными системами, они + будут добавлены в список при последующей перезагрузке. Все перечисленные в меню после + перезагрузки варианты могут быть загружены загрузчиком Linux. + + + Стрелками клавиатуры Вверx и Вниз + выберите нужную операционную систему. Дополнительно к основным вариантам + запуска ОС из этого меню можно загрузить Linux в безопасном режиме или + запустить проверку памяти. + + Загрузка операционной системы по умолчанию (первая в списке) начинается + автоматически после небольшого времени ожидания (обычно несколько секунд). + Нажав клавишу Enter, можно начать загрузку немедленно. + + Нажатием клавиши E можно вызвать редактор параметров + текущего пункта загрузки. Если система настроена правильно, то редактировать их + нет необходимости. + + Загрузка операционной системы может занять некоторое время, в зависимости + от производительности компьютера. Основные этапы загрузки операционной системы + — загрузка ядра, подключение (монтирование) файловых систем, запуск системных + служб — периодически могут дополняться проверкой файловых систем на наличие + ошибок. В этом случае время ожидания может быть занять больше времени, чем + обычно. Подробную информацию о шагах загрузки можно получить, нажав клавишу + Esc. + +