System Administration Toolkit: Перемещение файловой системы в UNIX

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

Мартин Браун, внештатный автор, консультант

Мартин Браун (Martin Brown) пишет статьи уже более семи лет. Он является автором многочисленных книг и статей по различным темам. Его квалификация охватывает множество платформ и языков разработки - Perl, Python, Java™, JavaScript, Basic, Pascal, Modula-2, C, C++, Rebol, Gawk, Shellscript, Windows®, Solaris, Linux, BeOS, Mac OS X и т.д., а также Web-программирование, системное управление и интеграция. Мартин является внутренним экспертом (SME) компании Microsoft® и регулярно пишет для ServerWatch.com, LinuxToday.com и IBM developerWorks. Он также принимает участие в блогах Computerworld, The Apple Blog и на других сайтах. Связаться с ним можно через его Web-сайт.



07.05.2008

Об этой серии статей

Любой администратор UNIX® владеет стандартным набором утилит, которыми регулярно пользуется в своей работе. Эти утилиты, команды и сценарии используются для упрощения выполнения различных задач. Некоторые из этих инструментов поставляются вместе с операционной системой, но знание большинства приемов работы приходит с опытом и желанием системных администраторов облегчить себе жизнь. Этот цикл статей посвящен различным инструментам UNIX, включая механизмы, упрощающие администрирование в гетерогенной среде.

Перемещение каталога или файловой системы в UNIX

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

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

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

Листинг 1. Пример использования файловой системы и жесткого диска
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda3              7692908   6467756   1225152  84% /
udev                    517560       184    517376   1% /dev
/dev/hda1            115377640   1743668 107773060   2% /var/lib/mysql
/dev/hdb1            115380192  14604460  94914696  14% /export/data
/dev/hde1             96132940   3962940  87286644   5% /export/home
/dev/hde4             22960280    133484  21660480   1% /tmp
none                    517560         0    517560   0% /dev/shm

Как можно увидеть из листинга 1, корневая файловая система на 84% заполнена, и администратору, возможно, придется переместить каталог из корневой файловой системы на другой логический раздел, чтобы освободить в корневой файловой системе немного места.

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

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

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


Последовательность действий при перемещении данных

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

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

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

Давайте подробнее рассмотрим перечисленные выше действия.


Создание нового логического раздела и файловой системы

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

Листинг 2. Перемещение каталога /usr из текущей файловой системы
$ du -sk /usr
3923068 /usr

Опция -s гарантирует, что отобразится общий размер каталога в целом, а не размер элементов его содержимого по отдельности, а опция -k отвечает за то, чтобы размер каталога отображался в килобайтах. Из информации, предоставленной командой, можно предположить, что новый раздел должен быть размером по крайней мере в 4 Гб.

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

После того как мы определили размер текущей файловой системы, надо создать логический раздел, который на 25% больше, чем необходимо (по крайней мере новый логический раздел должен иметь запас на 10% больше, чем необходимо). Например, для файловой системы из примера выше размер нового раздела должен быть не менее 5 Гб.

Чтобы создать новый раздел и файловую систему, используются стандартные утилиты операционной системы. Например:

  • В Linux® используется fdisk для конфигурации разделов на жестком диске и одна из команд mke2fs или mkfs.* для создания файловой системы на выбранном разделе.
  • В Solaris SPARC используется команда format для создания или конфигурирования логических разделов. В Solaris x86, прежде чем использовать format для настройки разделов, может понадобиться запустить fdisk для конфигурирования дисков. Для создания файловой системы используется команда newfs.
  • В AIX® используется mkvg, chpv или другая утилита для создания логических разделов. Для создания файловой системы используется команда crfs.

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

Для примера с /usr выше я создал новый каталог /mnt/usr.tmp, в котором и смонтировал файловую систему.


Копирование данных

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

Копировать можно множеством разных способов. Двумя самыми распространенными являются использование утилит cp или tar. Первая команда выполняется с очень большой скоростью, но при работе с ней могут возникнуть проблемы с нестандартными файлами, такими как конвейеры и файлы устройств. Утилита tar более медленная, но поддерживает все типы файлов и выводит отчет о процессе копирования.

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


Использование cp

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

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

  1. Смените текущий рабочий каталог на целевой, только что созданный каталог, после этого убедитесь, что перешли в нужный каталог (см. листинг 3).
    Листинг 3. Смена рабочего каталога
    $ cd /mnt/usr.tmp
    $ pwd
    /mnt/usr.tmp
  2. 2. Скопируйте файлы из старого каталога в текущий (новый каталог), как показано в листинге 4.
    Листинг 4. Копирование файлов в новый каталог
    $ cp -pr /usr/* .

Далее нужно быстро проверить, все ли файлы скопировались правильно. Для этой цели подойдет команда ls (см. листинг 5). Методики, предоставляющие более подробную информацию, я рассмотрю позже.

Листинг 5. Верификация скопированных файлов
$ ls -l /usr
total 238
drwxr-xr-x   2 root     bin         1024 Apr 20 13:11 4lib/
lrwxrwxrwx   1 root     root           5 Apr 20 12:40 5bin -> ./bin/
lrwxrwxrwx   1 root     root           9 Apr 20 12:34 X -> ./openwin/
drwxr-xr-x   6 root     bin          512 Apr 20 12:42 X11/
lrwxrwxrwx   1 root     root           3 Apr 20 12:41 X11R6 -> X11/
lrwxrwxrwx   1 root     root          10 Apr 20 13:03 adm -> ../var/adm/
drwxr-xr-x  10 root     bin          512 Apr 20 12:59 apache/
drwxr-xr-x   8 root     bin          512 Apr 20 12:47 apache2/
drwxr-xr-x   8 root     bin          512 Apr 20 12:53 appserver/
drwx------   8 root     bin          512 Apr 20 12:53 aset/
drwxr-xr-x   4 root     bin        16384 Apr 20 13:17 bin/
drwxr-xr-x   4 root     bin          512 Apr 20 12:33 ccs/
...
lrwxrwxrwx   1 root     root          10 Apr 20 12:32 tmp -> ../var/tmp/
drwxr-xr-x   4 root     bin         2048 Apr 20 13:00 ucb/
drwxr-xr-x   4 root     bin          512 Apr 20 13:17 ucbinclude/
drwxr-xr-x   3 root     bin         1024 Apr 20 13:17 ucblib/
drwxr-xr-x   7 root     bin          512 Apr 20 13:03 vmsys/
drwxr-xr-x   5 root     bin          512 Apr 20 12:44 xpg4/
drwxr-xr-x   3 root     bin          512 Apr 20 12:40 xpg6

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


Использование tar

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

Лучший способ использовать tar для копирования данных - передать файл, созданный этой утилитой, через другую выполняющуюся утилиту tar в новый каталог, в котором вторая утилита tar выполнит его распаковку. Это действие показано в листинге 6.

Листинг 6. Использование tar для копирования
$ cd /usr
$ tar cfp - ./* |(cd /mnt/usr.tmp; tar xvfp -)

Аргумент c в первой команде tar говорит, что tar должен создать архив. Опции v, f, и p обеспечивают подробную информацию (выводят файлы, которые были добавлены в архив или извлечены из него), осуществляет запись в файл или чтение из файла (файл используется вместо магнитной ленты) и сохраняет все права доступа и имена собственников соответственно.

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

Если нужно создать файл .tar и впоследствии использовать его, а не выполнять прямое копирование, то файловая система должна быть достаточно вместительной, чтобы хранить все эти временные файлы с исходного каталога. Листинг 7 показывает процесс копирования.

Листинг 7. Процесс копирования
$ cd /usr
$ tar cfp /tmp/usr.tar ./*
$ cd /mnt/usr.tmp
$ tar xvfp /tmp/usr.tar

Какой бы метод работы с tar ни использовался, применение опции v предоставит отчет о каждом файле, который добавлен в архив или извлечен из него (см. листинг 8).

Листинг 8. Вывод информации о процессе копирования
a ./4lib/ 0K
a ./4lib/libX.so.1.0 symbolic link to ./libX11.so.4.3
a ./4lib/libX11.so.4.3 216K
a ./4lib/libXaw.so.4.0 208K
a ./4lib/libXmu.so.4.0 72K
a ./4lib/libXol.so.3.1 1056K
a ./4lib/libXt.so.4.1 264K
a ./4lib/libce.so.0.0 48K
a ./4lib/libdeskset.so.0.1 64K
a ./4lib/libdga.so.1.0 40K
a ./4lib/libhelp.so.1.0 24K
a ./4lib/libolgx.so.3.1 56K
a ./4lib/libtt.so.1.1 848K
a ./4lib/libttstub.so.1.1 32K
a ./4lib/libxview.so.3.73 1328K
a ./4lib/libdl.so.1.0 symbolic link to ../../lib/libdl.so.1
a ./4lib/libc.so.1.9 403K
a ./4lib/libc.so.2.9 402K
...

tar и непосредственное копирование файловой системы

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

При монтировании в каталог новой файловой системы:

  1. Создайте новый раздел и файловую систему, как было объяснено выше.
  2. Создайте .tar-файл с исходным каталогом (см. листинг 9).
    Листинг 9. Создаем .tar-файл
    $ cd /home
    $ tar cfvp /tmp/home.tar
  3. Переименовываем исходный каталог (см. листинг 10).
    Листинг 10. Переименование исходного каталога
    $ cd ..
    $ mv home home.old
  4. Создаем каталог и задаем ему права доступа и группу-владельца, такую же, как и у исходного каталога.
  5. Смонтируем файловую систему в новый каталог.
  6. 6. Извлекаем данные из.tar-файла (см. листинг 11).
    Листинг 11. Распаковка .tar-файла
    $ cd home
    $ tar xvfp /tmp/home.tar

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

Листинг 12. Изменение логического раздела существующей файловой системы
$ cd ..
$ umount /home

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


Проверка копии

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

Сначала проверим информацию, которую выведет команда du для старой и новой файловой системы (см. листинг 13).

Листинг 13. Результаты работы du
$ du -sk /usr
3923068 /usr
$ du -sk /mnt/usr.tmp
3923068 /mnt/usr.tmp

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

Другим хорошим тестом является сравнение числа файлов и каталогов в исходной и новой файловой системе. Осуществить подсчет файлов можно командой find, как показано в листинге 14.

Листинг 14. Сравнение числа файлов/каталогов в новой и исходной файловой системе.
$ find /usr |wc -l
347001
$ find /mnt/usr.tmp |wc -l
347001

Другой хорошей проверкой после копирования файловой системы является сравнение числа inode-файлов в исходной и новой файловых системах; эта проверка покажет, сколько inode-файлов было распределено для новой файловой системы. Если новая файловая система такого же типа что и исходная, количество inode-файлов для каждой файловой системы должно быть одинаково. Используйте df с опцией -i для получения статистической информации об inode-файлах или - на традиционных UNIX-системах - df без каких-либо опций покажет число созданных "файлов".

Листинг 15 выполнен в Linux-системе

Листинг 15. Сравнение числа inode-файлов
$ df -i /usr
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3             977280  411959  565321   43% /

Листинг 16 осуществлен в ОС Solaris.

Листинг 16. Сравнение числа inode-файлов в ОС Solaris
$  /bin/df /usr
/usr               (/dev/dsk/c0t0d0s3 ): 9076010 blocks   863695 files

Завершение установки файловой системы

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

Если в пределах существующей файловой системы вами был перемещен каталог, то:

  1. Переименуйте исходный каталог.
  2. Создайте новый каталог
  3. Используйте chown и chmod чтобы задать прав доступа и владельцев для нового каталога.

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

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

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


Заключение

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

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

Ресурсы

Научиться

Получить продукты и технологии

  • IBM trial software: ознакомительные версии программного обеспечения для разработчиков, которое можно загрузить со страниц сообщества developerWorks.(EN)

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


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

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX, Open source
ArticleID=306795
ArticleTitle=System Administration Toolkit: Перемещение файловой системы в UNIX
publish-date=05072008