38
Лабораторная работа № 7 по учебной дисциплине «Основы операционных систем» Тема работы: Автоматизация администрирования серверных ОС семейства Unix с помощью сценариев командной оболочки Цели работы: 1. Получить практические навыки установки серверной ОС семейства Linux. 2. Изучить на типовых примерах сценарии системного администрирования серверной ОС семейства Linux. 3. Разработать собственные сценарии для решения задач администрирования серверных ОС семейства Linux. Программа работы: 1. Используя методические указания к настоящей работе, а также рекомендованные в списке использованных источников учебные пособия, изучить основные этапы установки (из дистрибутива) ОС семейства Linux (серверная версия) (на примере ОС Ubuntu Server 16.04) и настройки системных сервисов. 2. Используя технологию виртуальных машин (Oracle VirtualBox): создать аппаратную платформу виртуальной машины для серверной ОС Ubuntu Server 16.04 LTS (или Ubuntu Server 12.04 LTS), обеспечив возможность её подключения к компьютерной сети; выполнить установку (инсталляцию) серверной ОС Ubuntu Server выбранной версии (12.04 LTS или 16.04 LTS). 3. Изучить на учебных примерах (выполняемых с правами администратора ОС) практику настройки серверной ОС семейства Linux (режим локального администрирования). 4. Используя технологию виртуальных машин (Oracle VirtualBox): импортировать в среду менеджера виртуальных машин (Oracle VirtualBox) виртуальную машину с ОС Ubuntu (клиентская версия), обеспечив возможностью её подключения к компьютерной сети (при необходимости дополнить аппаратную платформу сетевым адаптером); создать сегмент виртуальной компьютерной сети с выбранным пространством IP-адресов для локальных сетей (192.168.x.x); выполнить (используя встроенные системные утилиты ОС Ubuntu и/или сценарии), ручную и/или автоматизированную конфигурацию двух хостов одного сегмента виртуальной компьютерной сети;

Eабораторная работа - kspt.icc.spbstu.rukspt.icc.spbstu.ru/media/files/2017/course/basicos/BOS__A07.pdf · поддержка файловых систем ZFS и

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Лабораторная работа № 7

по учебной дисциплине «Основы операционных систем»

Тема работы: Автоматизация администрирования серверных ОС семейства Unix

с помощью сценариев командной оболочки

Цели работы:

1. Получить практические навыки установки серверной ОС семейства Linux.

2. Изучить на типовых примерах сценарии системного администрирования

серверной ОС семейства Linux.

3. Разработать собственные сценарии для решения задач администрирования

серверных ОС семейства Linux.

Программа работы:

1. Используя методические указания к настоящей работе, а также

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

изучить основные этапы установки (из дистрибутива) ОС семейства Linux

(серверная версия) (на примере ОС Ubuntu Server 16.04) и настройки

системных сервисов.

2. Используя технологию виртуальных машин (Oracle VirtualBox):

создать аппаратную платформу виртуальной машины для серверной

ОС Ubuntu Server 16.04 LTS (или Ubuntu Server 12.04 LTS), обеспечив

возможность её подключения к компьютерной сети;

выполнить установку (инсталляцию) серверной ОС Ubuntu Server

выбранной версии (12.04 LTS или 16.04 LTS).

3. Изучить на учебных примерах (выполняемых с правами администратора ОС)

практику настройки серверной ОС семейства Linux (режим локального

администрирования).

4. Используя технологию виртуальных машин (Oracle VirtualBox):

импортировать в среду менеджера виртуальных машин (Oracle

VirtualBox) виртуальную машину с ОС Ubuntu (клиентская версия),

обеспечив возможностью её подключения к компьютерной сети (при

необходимости дополнить аппаратную платформу сетевым

адаптером);

создать сегмент виртуальной компьютерной сети с выбранным

пространством IP-адресов для локальных сетей (192.168.x.x);

выполнить (используя встроенные системные утилиты ОС Ubuntu

и/или сценарии), ручную и/или автоматизированную конфигурацию

двух хостов одного сегмента виртуальной компьютерной сети;

проверить (использую утилиту ping) возможности

сконфигурированных хостов обмениваться трафиком ICMP-пакетов.

5. Изучить на учебных примерах (выполняемых с правами администратора ОС)

практику мониторинга и/или настройки серверной ОС семейства Linux

(режим удалённого администрирования).

6. Разработать и реализовать собственные сценарии, имеющие следующую

функциональность:

плановое резервное копирование (архивация) файлов из папки, путь

к которой указан в командной строке сценария (для режимов

локального и удалённого администрирования сервера);

получение списка учётных записей пользователей ОС, использующих

дисковое пространство вне домашнего каталога сверх квоты,

указанной в командной строке сценария.

7. Используя системные программы, проверить правильность исполнения всех

разработанных сценариев.

Методические указания к выполнению работы:

1. Введение

В настоящее время существует большое количество серверных ОС семейства

Linux. В данной лабораторной работе будет рассмотрена одна из таких ОС –

Ubuntu Server 16.04 LTS. Аббревиатура LTS (Long Term Support) означает, что

гарантируется сопровождение текущей версии ОС в течение длительного

времени (для клиентских версий - в течение 3 лет, для серверных версий – в

течение 5 лет). Для обычных (не LTS версий) срок поддержки составляет 1,5 года.

Версия Ubuntu Server 16.04 LTS (Xenial Xerus) появилась в 2016 году. Её отличают

следующие функциональные особенности:

ядро Linux версии 4.4;

обновлённая версия сервиса контейнерной виртуализации LXD 2.0 с

поддержкой OpenStack;

поддержка файловых систем ZFS и CephFS для облачного хранения

данных;

поддержка других системных программ (Docker 1.10, HTTP/2, Open SSH

7.2p2, Python 3.5, PHP 7.0.5, Go 1.6).

2. Установка ОС Ubuntu Server 16.04 LTS

2.1. Создание аппаратной платформы виртуальной машины

Для установки ОС Ubuntu Server 16.04 LTS требуется в среде менеджера

виртуальных машин VirtualBox создать аппаратную конфигурацию виртуальной

машины со следующими рекомендуемыми значениями параметров (в скобках

указаны минимальные системные требования):

Количество процессоров – 1 (процессор с частотой 300 МГц)

Объём оперативной памяти – 2 Гб (192 Мб)

Объём жесткого диска – 5 Гб (1 Гб)

Обязательно наличие привода CD/DVD-ROM, USB-интерфейса,

видеоадаптера и монитора (разрешением не менее 640х480), сетевого

адаптера.

Все остальные параметры виртуальной машины существенно не влияют на

работоспособность сервера минимальной конфигурации, поэтому выбираются

самостоятельно.

2.2. Пошаговая процедура установки ОС Ubuntu Server 16.04 LTS

После создания аппаратной конфигурации виртуальной машины необходимо

смонтировать на приводе CD-ROM ISO-образ дистрибутива ОС Ubuntu Server

16.04 LTS.

Установка серверной ОС Ubuntu производится в два этапа. На первом

(предварительном) этапе необходимо задать три системные настройки: 1) учётная

запись администратора сервера; 2) сетевое имя сервера; 3) часовой пояс для

организации локальной службы времени ОС; а также несколько интерфейсных

настроек (в основном, относящихся к языку интерактивного ввода данных). На

втором (основном) этапе формируется физическая (разметка разделов жёсткого

диска) и логическая (форматирование назначенных разделов) подсистемы

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

дистрибутива и загрузка в файловую систему) и настройка (чтение и исполнение

сценариев конфигурационных файлов) всех системных компонент сервера.

Рассмотрим содержание предварительного этапа установки серверной ОС.

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

аналогичного нижеприведённому:

В данном окне требуется выбрать язык, который будет использован в процессе

установки ОС. Выбор языка установки ОС производится либо с помощью

указателя мыши, либо с помощью клавиш управления курсором. Выбрав язык,

нажимаем клавишу <Enter>.

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

действий, характерных для большинства программ установки ОС (установить ОС

на жёсткий диск компьютера, установить сервисные программы, проверить

оперативную память или жёсткий диск компьютера на наличие ошибок, загрузить

или восстановить ранее установленную ОС):

Следует выбрать «Установить Ubuntu Server» и нажать клавишу <Enter>.

Далее появляется окно, в котором предлагается выбрать страну, в которой

устанавливается серверная ОС:

Выбираем «Российская Федерация» и нажимаем клавишу <Enter>.

В последующих четырёх окнах необходимо выполнить настройки клавиатуры.

Активация каждой из выбранных настроек и переход к следующей настройке

производится нажатием на клавишу <Enter>.

В первом из указанных окон программа-установщик ОС предлагает определить

раскладку клавиатуры интерактивно (т.е. по нажатию клавиш):

Т.к. ранее нами уже была назначена раскладка с русским языком, то

рекомендуется отказаться от интерактивной настройки, выбрав «Нет».

В двух следующих окнах требуется выбрать одинаковую опцию «Russian»,

указывающую не только страну, в которой будет использоваться клавиатура, но и

конкретный язык (диалект языка), соответствующий требуемой (для конкретной

ОС) раскладке клавиатуры:

Наконец, в завершающем настройку клавиатуры окне необходимо назначить

комбинацию клавиш, обеспечивающую переключение между стандартной

латинской и национальной раскладками клавиатуры:

Настройкой по умолчанию является комбинация клавиш <Alt> + <Shift>, которую

можно подтвердить или выбрать иную из приведённого в окне списка.

Следующее окно позволяет задать сетевое имя компьютера, на который

производится установка серверной ОС:

Показанное на вышеприведённом изображении имя будет предложено программой-установщиком ОС. Однако рекомендуется назначить более содержательное имя, например «Ubuntu.Server.16.04» или аналогичное. После ввода желаемого имени необходимо активизировать (с помощью клавиатуры или мыши) поле <Продолжить>.

Следующие два окна предназначены для создания учётной записи (имени и пароля) пользователя ОС, который будет управлять устанавливаемой серверной ОС:

Рекомендуется ввести имя пользователя латинскими буквами. При назначении пароля пользователя можно (с помощью активации опции «Show Password in Clear») обеспечить (для визуального контроля правильности) эхо-вывод символов пароля. Рекомендуется следовать указаниям программы-установщика ОС и задать надёжный пароль.

Следующие два окна обеспечивают задание часового пояса. Используя системные настройки компьютера (CMOS BIOS), программа-установщик ОС попытается определить часовой пояс автоматически:

Если автоматический выбор оказался верным, то соглашаемся – опция <Да>. Если требуется коррекция (т.е. наш часовой пояс не «Europe/Moscow»), то активизируем опцию <Нет> и выбираем часовой пояс вручную:

На этом предварительный этап установки серверной ОС завершается.

Рассмотрим содержание основного этапа установки серверной ОС.

Первым делом необходимо произвести разметку жесткого диска. (Если в аппаратной конфигурации компьютера содержится более одного жесткого диска, то потребуется разметка всех жестких дисков). Целью разметки является распределение общего (физического) дискового пространства между несколькими ОС (если это необходимо) либо организация требуемой и/или выбранной структуры разделов конкретной (в нашем случае – серверной) ОС. Для серверных ОС семейства Linux требуется создание, по крайней мере, трёх основных разделов: системного, пользовательского и раздела подкачки. Для правильного распределения доступного объёма дискового пространства между указанными разделами требуется опыт администрирования серверных ОС. Поэтому, как правило, большинством начинающих администраторов выбирается разметка диска по умолчанию:

Поэтому рекомендуется выбрать метод разметки, показанный на вышеприведенном изображении, т.е. «Авто – использовать весь диск и настроить LVM». В данном случае аббревиатура LVM означает Logical Volume Manager. Сервис LVM обеспечивает автоматическое реформирование физических разделов жесткого диска (количество которых равно четырём в стандартной конфигурации BIOS персональных компьютеров) в вид логических разделов (томов данных разного типа). Следует заметить, что раньше процедура разметки разделов диска была обязательной как для серверных, так и для клиентских версий ОС семейства Linux.

Следующее окно позволяет выбрать жесткий диск (если их несколько), на который необходимо установить серверную ОС. Ниже показан случай единственного диска в конфигурации виртуальной машины (физический объём диска – 21,5 Гб), созданной в менеджере виртуальных машин VMware Player:

Этап разметки диска очень важен, т.к. результатом неправильной разметки и последующего форматирования разделов может быть полная потеря ранее записанных на диск данных. Поэтому программа-установщик ОС уведомляет о планируемых действиях и требует подтверждения:

По умолчанию активна опция <Нет>, что предотвращает случайное внесение изменений в таблицу разделов диска. После проверки правильности выбранного диска для установки ОС активируем опцию <Да>.

На следующем шаге необходимо задать настройки для сервиса LVM, т.е. выбрать распределение объёма доступного дискового пространства между логическими томами. В большинстве случаев достаточно создать один логический том и выделить для него всё дисковое пространство (заметим, что это совпадает с предлагаемой программой-установщиком ОС настройкой по умолчанию):

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

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

После форматирования всех разделов начинается копирование файлов из дистрибутива ОС на жесткий диск:

Длительность процесса копирования данных на диск зависит как от производительности аппаратной платформы устанавливаемой серверной ОС, так и от суммарного объёма данных, составляющих её дистрибутивный комплект. Т.к. в серверных версиях ОС семейства Linux, как правило, не используется графическая оболочка X Window, то установка таких версий (в отличие от клиентских версий) ОС относительно непродолжительна.

После завершения процесса копирования всех необходимых данных из дистрибутива на жесткий диск необходимо настроить режим обновления ОС, обеспечиваемый гарантированным длительным (пятилетним) сопровождением серверной ОС Ubuntu. Для этого предназначены два следующих интерактивных окна. В первом окне требуется указать (при наличии) HTTP-прокси для доступа в Интернет:

Во втором окне требуется задать конкретный способ обновления ОС (в данном окне такие обновления называются обновлениями безопасности):

Рекомендуется выбрать опцию, указанную на вышеприведённом изображении, т.е. «Устанавливать обновления безопасности автоматически».

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

В приведённом списке готовых наборов программного обеспечения указаны следующие опции:

Настройка серверных ролей с помощью выбора конкретных (интерактивно)

устанавливаемых пакетов программ;

Установка DNS-сервера (т.е. сервера разрешения символьных имён: DNS –

Domain Name Server);

Установка LAMP-сервера (т.е. набора системных программ для web-

сервера: LAMP – это аббревиатура, составленная из первых букв

наименований следующих программ: Linux, Apache, MySQL, PHP);

Установка сервера электронной почты;

Установка сервера баз данных PostgreSQL;

Установка файлового сервера Samba (используемого, как правило, для

сопряжения файловых систем ОС Linux и ОС MS Windows);

Установка набора стандартных системных утилит;

Установка сервера виртуальных машин;

Установка OpenSSH-сервера (т.е. сервера защищённых терминалов: SSH –

Secure SHell).

Рекомендуется выбрать опцию «standard system utilities» (установка набора стандартных системных утилит). Такой выбор обеспечивает, с одной стороны, отказ от готовых (обычно функционально избыточных и потому необоснованно снижающих производительность и ресурсоёмкость серверной ОС) комплектов

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

Замечание. В случае выбора (отмеченного символом «звёздочка») каких-либо из вышеуказанных серверных ролей (например, «Samba file server», «Virtual Machine host» и «OpenSSH server», показанных на нижеприведённом изображении), будет выполнена только установка соответствующих пакетов (без настройки конфигураций этих серверов).

Для продолжения активируем опцию <Продолжить>.

Завершающим шагом установки серверной ОС является выбор системного загрузчика. Проблема такого выбора возникает только в случае наличия на жестком диске нескольких ОС (установленных в разных разделах). Если у нас единственная ОС Ubuntu, то в главную загрузочную запись (MBR – Master Boot Record), будет установлен загрузчик GRUB (GRand Unified Bootloader):

Загрузчик GRUB является эталонной реализацией спецификации Multiboot и поэтому позволяет осуществлять загрузку любой ОС, совместимой с указанной спецификацией (в частности, ОС семейства MS Windows 2k). После активации опции <Да> программа-установщик ОС Ubuntu сообщает об успешном завершении установки ОС:

В показанном выше окне сообщается о необходимости извлечь из приводов внешних устройств носители данных с дистрибутивом ОС. Однако в сервере виртуальных машин Oracle VirtualBox такая процедура, как правило, выполняется автоматически.

После активации опции <Продолжить> компьютер или его виртуальная машина будут перезагружены.

После перезагрузки появляется приглашение серверной ОС Ubuntu Server 16.04 LTS ввести входное имя пользователя:

После правильного ввода имени пользователя и пароля (эти атрибуты учётной записи пользователя были нами выбраны на предварительном этапе установки ОС) серверная ОС готова к дальнейшей работе:

3. Настройка ОС Ubuntu Server 16.04 LTS

Замечание. Все настройки будут выполняться с помощью команд и сценариев командной оболочки.

3.1. Настройка сетевой конфигурации

Типовая конфигурация ОС семейства Linux использует Ethernet-адаптеры для подключения к компьютерным сетям. Такие адаптеры именуются eth0 (для первого адаптера), eth1, eth2 и т.д. (для следующих адаптеров, если их несколько).

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

ifconfig –a | grep eth

Для получения более подробной информации о сетевых интерфейсах ОС следует применять другую команду:

sudo lshw –class network

(Очевидно, что вышеуказанная команда является привилегированной, т.е. для её выполнения требуются права суперпользователя ОС).

Базовая конфигурация хоста IP-сети предусматривает задание трёх параметров: IP-адреса хоста, маски подсети и IP-адреса шлюза по умолчанию. Два первых параметра назначаются следующей командой:

sudo ifconfig eth0 192.168.56.2 netmask 255.255.255.0

(Указанный IP-адрес относится к сетевому сегменту с адресом 192.168.56.0, определённому по умолчанию менеджером виртуальных машин Oracle VirtualBox).

Для задания шлюза по умолчанию (в том же сетевом сегменте) используется следующая команда:

sudo route add default gw 192.168.56.1

Шлюз по умолчанию необходим для обеспечения маршрутизации сетевого трафика, адресуемого вне текущего сегмента.

Просмотр таблицы маршрутизации обеспечивает следующая команда:

route –n

Замечание. Рассмотренные настройки формируют временную (для текущего сеанса работы пользователя) конфигурацию хоста компьютерной сети. Чтобы сделать такие настройки постоянными, их следует включить в конфигурационные файлы сетевых сервисов ОС.

3.2. Настройка учётных записей пользователей

В ОС Ubuntu введён особый режим использования учётной записи суперпользователя с именем root. Создание интерактивного пользовательского сеанса под таким именем невозможно. Поэтому для реализации административных функций применяется префикс привилегированных команд (sudo), позволяющий авторизованным пользователям (в частности, администратору ОС, назначаемому при её установке) временно повышать свои привилегии.

Замечание. Если необходимо иметь учётную запись суперпользователя root, её можно активировать с помощью следующей команды:

sudo passwd

Указанная команда инициирует стандартную диалоговую процедуру назначения пароля пользователя (в данном случае – суперпользователя с именем root). Соответственно для отключения учетной записи root следует использовать следующую команду:

sudo passwd –l root

В действительности, указанная команда не удаляет, а лишь блокирует учётную запись (для снятия блокировки требуется та же команда, но с ключом -u).

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

sudo adduser <имя_пользователя>

sudo deluser <имя_пользователя>

При добавлении пользователя ОС активирует диалоговую процедуру назначения параметров новой учётной записи. При удалении существующей учётной записи также автоматически удаляется основная группа этой учётной записи, но не удаляется её домашний каталог (при необходимости его надлежит удалять вручную).

Для блокировки или разблокировки учётной записи применяются команды, аналогичные рассмотренным выше для пользователя root.

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

sudo addgroup <имя_группы>

sudo delgroup <имя_группы>

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

sudo adduser <имя_пользователя> <имя_группы>

sudo deluser <имя_пользователя> <имя_группы>

3.3. Настройка серверных ролей

Выбор серверных ролей ОС Ubuntu Server определяется перечнем задач, решаемых системными и прикладными серверами в компьютерной сети. К наиболее часто используемым системным серверам, относятся следующие:

1) Сервер учётных записей; 2) Файловый сервер; 3) Сервер печати; 4) Терминальный сервер; 5) Сервер виртуальных машин; 6) Сервер виртуальных сетей.

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

1) Установка серверного пакета в конфигурацию ОС с помощью следующей команды:

sudo apt-get install <имя_пакета>

2) Создание текстовых файлов конфигурации сервера (вид файла специфичен для каждого типа сервера);

3) Запуск сервера, обычно реализуемый следующей командой:

sudo <имя_сервера_ОС> start

4) Установка и настройка локального или удалённого клиента сервера.

Ниже (для примера) приведена процедура настройки базового файлового сервера ОС семейства Unix на основе сетевой файловой системы (NFS – Network File System).

Этап установки сервера (команда):

sudo apt-get install nfs-kernel-server

Этап настройки конфигурационных файлов (содержимое файла /etc/exports):

/ubuntu *(ro,sync,no_root_squash)

/home *(rw,sync,no_root_squash)

Таким образом, папки /ubuntu и /home назначены в качестве сетевых (разделяемых) ресурсов. Вместо символов * следует указать сетевое имя хоста файлового сервера. В скобках указаны режимы доступа к разделяемым ресурсам.

Этап запуска сервера (команда):

sudo /etc/init.d/nfs-kernel-server start

Этап установки (первая команда) и настройки (вторая команда) клиента (команды):

sudo apt-get install nfs-common

sudo mount example.hostname.com:/ubuntu/ /local/ubuntu

где example.hostname.com – доменное имя сервера (хоста);

ubuntu – имя сетевого каталога;

/local/ubuntu – точка монтирования сетевого каталога в ОС клиента.

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

Учебные примеры сценариев:

Сценарий массового переименования файлов

#!/bin/bash # bulkrename -- переименовывает указанные файлы, замещая текст в их именах. printHelp() # Случай 1 { echo "Usage: $0 -f find -r replace FILES_TO_RENAME*" echo -e "\t-f The text to find in the filename" echo -e "\t-r The replacement text for the new filename" exit 1 } while getopts "f:r:" opt # Случай 2 do case "$opt" in r ) replace="$OPTARG" ;; f ) match="$OPTARG" ;; ? ) printHelp ;; esac done shift $(( $OPTIND - 1 )) if [ -z $replace ] || [ -z $match ] # Случай 3 ($replace) и Случай 4 ($match) then echo "You need to supply a string to find and a string to replace"; printHelp fi for i in $@ # Случай 5 do newname=$(echo $i | sed "s/$match/$replace/") # Случай 6 (sed) mv $i $newname && echo "Renamed file $i to $newname" done

Проанализируем данный сценарий.

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

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

Первой идет функция printHelp() (см. Случай 1), которая выводит список требуемых аргументов и назначение сценария, после чего завершает сценарий. Код, следующий за определением функции, выполняет обход аргументов, переданных сценарию с помощью getopts (см. Случай 2), и, используя прием, обеспечивающий присвоение переменным replace и match значений соответствующих аргументов командной строки. Затем сценарий проверяет наличие значений для дальнейшего использования. Если переменная replace (см. Случай 3) или match (см. Случай 4) имеет нулевую длину, сценарий выводит сообщение об ошибке, извещая пользователя, что тот должен передать строку для поиска и строку замены, а затем вызывает функцию printHelp и завершается.

Убедившись в наличии значений в переменных match и replace, сценарий при-ступает к обработке остальных аргументов (см. Случай 5), в которых должны передаваться имена файлов для переименования. Мы использовали sed (см. Случай 6) для замены строки match строкой replace в именах файлов и сохраняем новое имя файла в переменной. После сохранения нового имени файла сценарий вызывает команду mv для перемещения файла с новым именем и затем выводит сообщение, извещающее пользователя, что файл переименован.

Сценарий определения доступного дискового пространства

#!/bin/bash # diskspace -- суммирует доступное дисковое пространство и выводит сумму # в логичном и удобочитаемом виде tempfile="/tmp/available.$$" trap "rm -f $tempfile" EXIT cat << 'EOF' > $tempfile { sum += $4 } END { mb = sum / 1024 gb = mb / 1024 printf "%.0f MB (%.2fGB) of available disk space\n", mb, gb } EOF df -k | awk -f $tempfile # Случай 1

exit 0

Проанализируем данный сценарий.

Сценарий является развитием системной команды df. Он опирается на временный awk-сценарий, который сохраняется в каталоге /tmp. Этот awk-сценарий вычисляет общий объем доступного дискового пространства на основе переданных ему данных и затем выводит результат в удобочитаемом формате. Результаты вызова команды df по конвейеру передаются команде awk (см.

Случай 1), которая в свою очередь выполняет операции, определяемые awk-сценарием. Когда работа сценария завершается, временный awk-сценарий удаляется из каталога /tmp благодаря обработчику сигнала выхода, установленному командой trap в начале сценария.

Выполнение сценария не требует привилегий, поэтому его использование доступно любому пользователю ОС.

Сценарий учёта использования дискового пространства

#!/bin/bash # fquota -- инструмент анализа расходования дискового пространства для Unix; # предполагается, что все учетные записи рядовых пользователей # имеют числовые идентификаторы UID >= 100 MAXDISKUSAGE=20000 # В мегабайтах for name in $(cut -d: -f1,3 /etc/passwd | awk -F: '$2 > 99 {print $1}') do /bin/echo -n "User $name exceeds disk quota. Disk usage is: " # Вам может потребоваться изменить следующий список каталогов, чтобы # он лучше соответствовал структуре каталогов на вашем диске. # Наиболее вероятно, что вам придется заменить имя /Users на /home. find / /usr /var /Users -xdev -user $name -type f -ls | \ # Случай 1 awk '{ sum += $7 } END { print sum / (1024*1024) " Mbytes" }' done | awk "\$9 > $MAXDISKUSAGE { print \$0 }" # Случай 2

exit 0

Проанализируем данный сценарий.

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

В соответствии с соглашениями, идентификаторы пользователей (User ID, UID) от 1 до 99 отводятся для системных демонов и административных задач, а идентификаторы со значениями 100 и выше можно выбирать для учетных записей обычных пользователей. Поэтому сценарий игнорирует все учетные записи со значениями UID меньше 100. Аргумент -xdev в вызове команды find (см. Случай 1) гарантирует, что find не будет выполнять поиск во всех файловых системах. Иными словами, этот аргумент предотвращает обход командой системных областей, каталогов, доступных только для чтения, извлекаемых устройств, каталога /proc действующих процессов (в Linux) и других подобных областей. Вот почему в список явно включены такие каталоги, как /usr, /var и /home. Эти каталоги часто размещаются в отдельных файловых системах для упрощения их резервного копирования и организации. Добавление их в список, когда они действительно находятся в корневой файловой системе, не означает, что они будут просмотрены дважды.

На первый взгляд кажется, что сценарий выведет сообщение exceeds disk quota (превышение дисковой квоты) для любой учетной записи, но это не так: команда awk, следующая за концом цикла (см. Случай 2), позволит вывести такое сообщение только для учетных записей, файлы которых занимают больше чем MAXDISKUSAGE.

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

Сценарий резервного копирования каталогов

#!/bin/bash # archivedir -- создает сжатый архив заданного каталога. maxarchivedir=10 # Размер большого каталога в блоках. compress=gzip # Измените, если предпочитаете другую программу сжатия. progname=$(basename $0) # Улучшенный формат вывода для сообщений об # ошибках. if [ $# -eq 0 ] ; then # Нет аргументов? Это проблема. echo "Usage: $progname directory" >&2 exit 1 fi if [ ! -d $1 ] ; then echo "${progname}: can't find directory $1 to archive." >&2 exit 1 fi if [ "$(basename $1)" != "$1" -o "$1" = "." ] ; then echo "${progname}: You must specify a subdirectory" >&2 exit 1 fi if [ ! -w . ] ; then # Случай 1 echo "${progname}: cannot write archive file to current directory." >&2 exit 1 fi # Архив может получиться опасно большим? Давайте проверим... dirsize="$(du -s $1 | awk '{print $1}')" if [ $dirsize -gt $maxarchivedir ] ; then /bin/echo -n "Warning: directory $1 is $dirsize blocks. Proceed? [n] " read answer answer="$(echo $answer | tr '[:upper:]' '[:lower:]' | cut -c1)" if [ "$answer" != "y" ] ; then echo "${progname}: archive of directory $1 canceled." >&2 exit 0

fi fi archivename="$1.tgz" if tar cf - $1 | $compress > $archivename ; then # Случай 2 echo "Directory $1 archived as $archivename" else echo "Warning: tar encountered errors archiving $1" fi exit 0

Проанализируем данный сценарий.

Сценарий обеспечивает создание резервных копий отдельных каталогов или де-ревьев каталогов. Резервная копия формируется в виде сжатого tar-архива.

Наибольший объём кода в сценарии осуществляет проверки возможных ошибок для исключения потерь данных или создания неправильного архива. В дополнение к обычным проверкам уместности начальных аргументов и действительности содержащейся в них информации, этот сценарий требует, чтобы пользователь был владельцем родительского каталога, вмещающего архивируемый подкаталог, и проверяет возможность сохранения файла архива в надлежащем месте после завершения. Инструкция if [ ! -w . ] (см. Случай 1) проверяет наличие у пользователя права на запись в текущий каталог. Более того, сценарий предупреждает пользователя перед архивацией, если есть вероятность того, что файл с резервной копией может получиться слишком большим.

Сама команда tar, выполняющая архивирование каталога, находится в строке (см. Случай 2). Сценарий проверяет код, возвращаемый этой командой, чтобы не удалить каталог, если возникла какая-либо ошибка.

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

Сценарий управления резервными копиями

#!/bin/bash # backup -- Создает полную или инкрементальную резервную копию набора # каталогов в системе. По умолчанию выходной файл сжимается # и сохраняется в /tmp, в файле с именем, содержащим время создания копии. # При желании можно указать устройство для вывода (другой диск, съемное # устройство хранения или что-то другое по вашему выбору). compress="bzip2" # Измените, если предпочитаете другую программу сжатия. inclist="/tmp/backup.inclist.$(date +%d%m%y)"

output="/tmp/backup.$(date +%d%m%y).bz2" tsfile="$HOME/.backup.timestamp" btype="incremental" # По умолчанию выполняется инкрементальное копирование. noinc=0 # Обновлять файл с отметкой времени. trap "/bin/rm -f $inclist" EXIT usageQuit() { cat << "EOF" >&2 Usage: $0 [-o output] [-i|-f] [-n] -o lets you specify an alternative backup file/device, -i is an incremental, -f is a full backup, and -n prevents updating the timestamp when an incremental backup is done. EOF exit 1 } ########## Основной сценарий ########### while getopts "o:ifn" arg; do case "$opt" in o ) output="$OPTARG"; ;; # getopts автоматически изменяет OPTARG. i ) btype="incremental"; ;; f ) btype="full"; ;; n ) noinc=1; ;; ? ) usageQuit ;; esac done shift $(( $OPTIND - 1 )) echo "Doing $btype backup, saving output to $output" timestamp="$(date +'%m%d%I%M')" # Получить текущие месяц, число, час, минуты. # Интересны форматы? "man strftime" if [ "$btype" = "incremental" ] ; then if [ ! -f $tsfile ] ; then echo "Error: can't do an incremental backup: no timestamp file" >&2 exit 1 fi find $HOME -depth -type f -newer $tsfile -user ${USER:-LOGNAME} | \

pax -w -x tar | $compress > $output # Случай 1

failure="$?" else find $HOME -depth -type f -user ${USER:-LOGNAME} | \ pax -w -x tar | $compress > $output # Случай 2 failure="$?" fi

if [ "$noinc" = "0" -a "$failure" = "0" ] ; then touch -t $timestamp $tsfile fi

exit 0

Проанализируем данный сценарий.

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

Собственно резервное копирование выполняется командой pax в строках (см. Случай 1) и (см. Случай 2), вывод которой через конвейер передается программе сжатия (bzip2 по умолчанию) и затем направляется в выходной файл или устройство. Однако инкрементальное копирование требует некоторых ухищрений, потому что стандартная версия программы tar не позволяет проверять время изменения (в отличие от GNU-версии). С помощью команды find создается список файлов, изменившихся с момента предыдущего резервного копирования, и сохраняется во временном файле inclist. Для большей совместимости его формат имитирует формат вывода команды tar. Далее этот файл передается непосредственно команде pax.

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

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

Вышеуказанных проблем можно избежать, если сохранить дату и время перед началом резервного копирования (в переменной timestamp) и применить значение $timestamp к $tsfile, использовав для этого флаг -t в команде touch, только после успешного завершения резервного копирования.

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

копировании). Начальные параметры позволяют указать другой файл или устройство для вывода (-o output), выбрать создание полной резервной копии (-f), явно выбрать создание инкрементальной резервной копии (-i), даже при том, что этот режим предполагается по умолчанию, или предотвратить обновление файла, играющего роль отметки времени, при инкрементальном резервном копировании (-n).

Список использованных источников:

1. Тейлор Д., Перри Б. Сценарии командной оболочки. Linux, OS X и Unix. – СПб:

Питер, 2017. – 448 с.

2. Taylor D. Wicked Cool Shell Scripts. [Электронный ресурс] URL:

https://www.intuitivestories.com/wicked/wicked-cool-shell-script-library.shtml Дата

обращения: 15.09.2017.

3. Купер М. Искусство программирования на языке сценариев командной оболочки /

Пер. с англ. А. Киселева [Электронный ресурс] URL:

http://www.opennet.ru/docs/RUS/bash_scripting_guide/ Дата обращения: 15.09.2017.

4. Barschel C. Unix Toolbox. [Электронный ресурс] URL: http://cb.vu/unixtoolbox.xhtml

Дата обращения: 15.09.2017.

5. Установка и настройка Ubuntu Server 16.04. [Электронный ресурс] URL:

https://sysadmin-note.ru/ustanovka-i-nastrojka-ubuntu-server-16-04/ Дата обращения:

15.09.2017.

6. Руководство по Ubuntu Server. [Электронный ресурс] URL:

https://launchpadlibrarian.net/135831926/serverguide-precise-ru.pdf Дата обращения:

15.09.2017.