Клонирование — это создание точной (побитной) копии исходного носителя. Носителем в нашем случае будет корневая файловая система Linux. Клонированная копия называется образом.
Если вам нужно установить дистрибутив на несколько компьютеров одинаковой конфигурации (например, вы администрируете интернет-зал), то целесообразно установить и настроить его на одной машине, а на другие — склонировать. Для домашней системы из одного компьютера клонирование тоже имеет смысл: если что-то вдруг «слетит», то вы сможете быстро восстановить исходное состояние системы простым развертыванием образа. На развертывание образа нужно намного меньше времени, чем на установку и настройку системы.
Перезагрузитесь в однопользовательском режиме (о режимах и вариантах загрузки сказано в п.9.1.1). Введите команду mount, чтобы узнать, какой раздел содержит корневую файловую систему:
/dev/hda1 on / type ext3 (rw,noatime)
none on /proc type proc (rw)
none on /sys type sysfs (rw)
Корневая файловая система расположена на разделе
/dev/hda1
. Образ именно этого раздела мы будем сохранять на другом носителе. Носителем может быть другой жесткий диск — я буду использовать внешний USB-винчестер. Для его подключения должен быть загружен модуль usb_storage
. Создадим каталог /mnt/imag
e и примонтируем к нему USB-винчестер:# modprobe usb_storage
# mkdir /mnt/image
# mount /dev/sda1 /mnt/image
Все, что осталось сделать, — это перемонтировать корневую файловую систему в режиме «только чтение» и создать образ:
# sync
# mount -о remount.ro /
# dd if=/dev/hda1 of=/mnt/image/image.bin
Подробно описывать утилиту dd не стану — это очень хорошо сделано в справочной системе. Скажу только, что кроме dd существует еще и утилита dd_rescue, которая при клонировании пропускает плохие секторы и делает максимально возможную копию файловой системы. Для меня, да и для вас использование этой утилиты неактуально — ведь винчестеры меняют минимум один раз в год, поэтому не думаю, что у вас будет «битый» винчестер.
Теперь рассмотрим, как можно восстановить систему. Для восстановления системы вам понадобится загрузочный компакт-диск Linux, Подойдет первый диск любого дистрибутива, даже несовместимого с вашим. Если вы используете не LiveCD, а простой загрузочный диск, для перехода на текстовую консоль нажмите Ctrl+Alt+F2. Подмонтируем наш внешний винчестер:
# mkdir /image
# modprobe usb_storage
# mount /dev/sda1 /image
Теперь на новом винчестере нужно создать разделы. Это можно сделать с помощью утилиты fdisk или с помощью программы установки — как вам удобнее. Если же вы восстанавливаете систему после сбоя, ничего создавать не нужно — все уже создано. Не забудьте только создать раздел подкачки (тип раздела
/dev/hda2
должен быть Linux swap):# mkswap /dev/hda2
Теперь развернем образ (обратите внимание на параметры if и of программы dd — на этот раз их аргументы поменялись местами):
# dd if=/image/image.bin of=/dev/hda1
Сейчас нам нужно изменить корневую файловую систему, чтобы попасть «внутрь» развернутого образа:
# mkdir /install
# mount /dev/hda1 /install
# chroot /install /bin/bash
Теперь корнем стал каталог
/install
, к которому примонтирован новый винчестер, а в качестве командной оболочки используется /bin/bash
. Все, что нам осталось сделать — это перезаписать загрузчик. Если у вас LILO, введите команду:# lilо
А если GRUB:
# grub-install /dev/hda
Теперь перезагрузите компьютер (reboot) — ваша система успешно восстановлена после клонирования.
Глава 8Язык командного интерпретатора
Для автоматизации часто выполняемых работ по обслуживанию системы вам понадобится объединять команды в сценарии. С простейшими сценариями, обеспечивающими последовательное выполнение перечисленных команд, вы уже познакомились в гл. 3. Уточню только, как система обрабатывает сценарии. Она ищет в первой строке файла сценария выражение
#!/абсолютный/путь/к/программе/интерпретатору/сценария
и передает сценарий ей на обработку. Как правило, эта программа — либо одна из установленных в системе оболочек (например,
#!/bin/tcsh
), либо один из интерпретирующих языков (#!/usr/bin/perl
), либо ваш собственный интерпретатор: #!/usr/bin/my_program
. Если сценарий предназначен для обработки оболочкой sh, то ее имя указывать необязательно. Между символами # и ! не должно быть пробелов.Чтобы непосредственно запустить файл сценария на выполнение, вы должны иметь полномочия на исполнение этого файла. Если он доступен вам только для чтения, выполнить его можно командой
$ /программа/обработчик -f <имя_файла>
Эта глава посвящена языку программирования, встроенному в оболочку bash.
Базовыми операциями этого языка служат все установленные в системе программы, утилиты и сценарии. Оболочка находит их, запускает, обеспечивает передачу им — аргументов, а результатов их работы — другим программам и пользователю, выполняет подстановку переменных и раскрытие шаблонов. Кроме того, оболочка содержит операторы цикла и условные операторы, в результате чего получается мощный язык программирования.
8.1. Параметры
Вместо переменных, как и обычных языках программирования, в bash используется понятие параметра. Именем параметра может быть: слово, состоящее из латинских букв, цифр и знаков подчеркивания, начинающееся с буквы; число; один из специальных символов; *, #, ?, $, !, 0, _.
Тип всех параметров — строковый. Если параметру присвоено значение (хотя бы пустая строка), то говорят, что он задан или установлен. Чтобы сослаться на значение параметра, нужно поставить символ $ перед его именем:
$ echo $0
bash
Параметры делятся на:
♦переменные оболочки — о них рассказано в п. 3.4.3;
♦позиционные параметры — их имена представляют собой натуральное число, а значениями служат аргументы с соответствующими номерами, начиная с 1, переданные сценарию или самой оболочке при их запуске;
♦специальные параметры — их именами служат перечисленные специальные символы, а назначение сведено в таблицу 8.1. Эти параметры — шаблоны, подстановку которых производит оболочка.
Специальные переменные Таблица 8.1
Название Подстановка $0 Имя выполняемого сценария (или, в интерактивном режиме, — самой оболочки) $# Количество позиционных параметров, переданных сценарию $_ Последний аргумент предыдущей из выполнявшихся команд $? Код завершения последней выполненной команды (напоминаю, что значение 0 говорит об успешном завершении, другое — об ошибочном) $$ Номер текущего процесса (PID) $! Номер (PID) последнего асинхронного процесса (команды, выполненной в фоновом режиме) $* Все позиционные параметры, слитые в одну строку: «$*» эквивалентно «$1x$2x…,$n», где x — первый символ значения переменной IFS (internal field separator), по умолчанию — пробел $@ Все позиционные параметры, подлежащие дальнейшему разбору: «$@» эквивалентно «$1» «$2» ... «$n»
Напоминаю, что специальные символы в значениях параметров нужно экранировать. Экранировать одиночный символ можно символом «\» (обратный слэш), несколько — апострофами или двойными кавычками. Разница в том, что внутри двойных кавычек выполняются подстановки значений: сравните вывод команд
echo '$0'
и echo "$0"
.Организовать диалоговый ввод значения переменной можно с помощью встроенной команды
read
:echo -n "Продолжать? (y/n): "
read yesno
echo $yesno
Ключ -n команды
echo
не выводит символ новой строки в конце сообщения, то есть не переводит строку. Команда read
читает значение, введённое пользователем с клавиатуры, и записывает его в переменную yesno
. Последняя команда выводит только что введенное значение.Одной командой
read
можно прочитать несколько переменных:read name middle lastname
Пользователь должен ввести значения переменных, разделяя их пробелами, и для окончания ввода нажать <Ввод