LG.BALUKATION's Weblog

Ничего, это тоже кое-что… А при желании из него можно сделать что угодно

HOWTO Перенос системы на другой жёсткий диск

Posted by LG.BALUKATION на 2009/01/10

Оказывается, некоторые люди не подозревают о такой замечательной особенности UNIX-систем, как возможность переноса всей системы простым копированием.

Когда-то у меня был старенький жёсткий диск всего на 15 гигабайт и там ютилась Gentoo Linux, а так же раздел со всякими ценными для меня данными. Потом я купил диск объёмом уже 320 гигабайт и что бы не утруждать себя перестановкой и настройкой — просто скопировал систему и данные на новый диск. А сейчас вот мои данные заполнили и тот диск, так что я купил ещё один на пол-терабайта и хочу всё перенести туда, попутно рассказав, как же оно делается.

Важно отметить, что для копирования системы с одного компьютера на другой требуется несколько дополнительных телодвижений и этот пост оставит их за бортом — я расскажу как перенести систему с одного диска на другой в рамках одного компьютера. Кстати да — у меня всё ещё Gentoo %)

Итак, сперва нам нужно некое окружение, в котором мы будем вершить «консольный ад». Лично я для этого выбрал диск install-amd64-minimal-2008.0-r1.iso — минимального образа вполне хватит, однако это может быть практически любой LiveCD или консоль другого дистрибутива. Нам просто нужна какая-нить система с возможностью создавать/форматировать/монтировать раздела и, естественно, копировать данные.

Чтож, давайте попробуем загрузится — сперва у нас спросят об используемом ядре и его опциях (можно просто нажать Enter и есть шанс что всё заработает — хотя некоторым системам нужны дополнительные опции для нормальной работы или например ядро без поддержки фреймбуффера). Потом у нас спросят про используемую клавиатуру — можно попробовать выбрать русскую, введя «32» (ru), а можно и ничего не выбирать. Если всё прошло гладко, система встретит нас приглашением «livecd root #».

Как видно из этого, мы суперпользователь. Обычно в UNIX на суперпользователя накладывается минимум ограничений, так что важно работать аккуратно и ничего не сломать — система часто никак не мешает админу угробить себя, справедливо полагая, что админ всегда прав и как-то не гоже хорошей системе в нём сомневаться.

Теперь пора узнать, под какими устройствами (файлами) в системе числятся жёсткие диски. Традиционно, Linux именует всякие жёсткие диски/компакт-диски/флешки/карты памяти как /dev/sd* или /dev/hd*. Конкретное имя зависит от ядра и способа подключения каждого накопителя, обычно для IDE используются символы hd, а для SCSI и SATA — sd.

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

Соответственно, если мы не знаем, под какими именами система увидела наши диски, нужно это дело уточнить в системном журнале. Вот например у меня диск на 500 гигов подключен по SATA вторым устройством — значит он наверное должен будет обозначаться sdb (sd — SCSI/SATA, b — второе устройство, первое былоб a, третье c и так далее). Ищем — «dmesg | grep sdb» — какраз пишут, что под таким именем найдено SCSI устройство на 500108 мегабайт. Вообще можно сделать например поиск по имени (у меня это будет Hitachi — так в BIOS показывается) и там посмотреть адрес устройства вида x:x:x:x — когда устройству присваивают файл, его адрес тоже пишется.

Кстати, поскольку жёсткий диск у меня новый, его необходимо ещё разбить на разделы и создать на них файловые системы. Разбиение диска и выбор файловых систем, это тема для отдельных холиваров, я же скажу так — будет MBR, небольшой раздел под саму систему и всё остальное для данных. Всё это добро будет отформатировано в ReiserFS, так-то. Ну а вообще Linux держит туеву хучу файловых систем и вагон таблиц разделов, так что простор для выбора тут не малый.

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

Что бы редактировать разделы устройства, нужно выполнить «fdisk /dev/имя_устройства». Если указать параметр -l, fdisk только расскажет о найденных разделах и не завершится. При запуске, fdisk будет ждать команд, основные из которых — это m (справка), q (выход без сохранения), w (выход с сохранением), n (создать новый раздел), p (показать таблицу разделов), d (удалить раздел), a (отметить раздел загрузочным). Ну и дальше тоже будет несколько вопросов, например при создании спросят под каким номером сделать раздел и где. Я сделал первичные разделы номер 1 и 3, первый с начала диска и до +16G (16 гигов), второй на всё оставшееся место и ещё я пометил первый загрузочным.

Теперь настала пора отформатировать разделы. Если вы использовали gparted/qparted — можете это сделать там же, я же по-привычке сделаю это в консоли. Обычно файловые системы создаются в linux программами с именами навроде mkfs.файловая_система или mkфайловая_система. Я буду использовать утилиту mkreiserfs. И ещё, лично мне кажется правильным присваивать файловым системам метки, так что команды будут такими: «mkreiserfs -l gentoo /dev/sdb1» и «mkreiserfs -l data /dev/sdb3». После каждой команды, нам расскажут что мы собираемся делать, скажут что все данные на этих системах будут потеряны и попросят нажать ‘y’ в подтверждение своих намерений. Однако у меня диск новый и терять там нечего %)

Разделы созданы и отформатированы, настало время смонтировать их. Для начала нужно понасоздавать каталогов для всего этого добра — «mkdir /mnt/old_gentoo /mnt/new_gentoo /mnt/old_data /mnt/new_data». Назначение этих каталогов таково:

old_gentoo — это система на старом диске, отсюда мы будем её копировать
new_gentoo — место для системы на новом диске, сюда мы будем её копировать
old_data — данные на старом диске
new_data — место для данных на новом диске

Монтирование производится обычной командой mount с параметрами что (файл устройства) и куда (каталог), например «mount /dev/sdb1 /mnt/new_gentoo» и аналогично для всех остальных разделов.

Посмотреть, что куда смонтировано можно вызовом mount без параметров — утилита перечислит все смонтированные системы. Например, в моём случае там кроме всяких системных будут и строчки:

/dev/sda1 on /mnt/old_gentoo type reiserfs (rw)
/dev/sdb1 on /mnt/new_gentoo type reiserfs (rw)
/dev/sda3 on /mnt/old_data type reiserfs (rw)
/dev/sdb3 on /mnt/new_data type reiserfs (rw)

Теперь нужно просто скопировать данные со старого диска на новый. Сделать это можно например так «cp -vrp /mnt/old_gentoo/* /mnt/new_gentoo» для системы и похожим образом для данных. Главное тут не забыть опцию r (рекурсивно — иначе будет скопирован только один каталог), звёздочку (иначе получим нечто типа /mnt/new_gentoo/old_gentoo/файлы) и p (права доступа — иначе все файлы будут принадлежать root, что не есть хорошо). Опция v просто для показа какой файл и куда копируется — так всяко интересней, чем сидеть перед чёрным терминалом. И хотя копировать с одного жёсткого диска на другой несколько быстрее, чем в пределах одного диска, процесс этот всё равно длительный… Лучше пока оставить систему и позаниматься чем-нить полезным в реальной жизни ;-)

Последними штрихами является установка загрузчика и правка /etc/fstab. В new_gentoo нада открыть этот файл и заменить старые имена sda на новые sdb. Если же вы, наивно следуя новым веяниям, используете UUID для именования разделов — то мне вас искренне жаль, ибо менять придётся не одну букву, а много.

С загрузчиком тоже не всё так просто. Точнее лично я использую его «старые методы», а вроде как теперь там сменили файл конфигурации и ещё какой-то бред для полуавтоматизации замутили… Лично я исправил у новой системы в boot/grub/grub.conf номер диска в строке root (hdX,Y), где X — номер диска, а Y номер раздела на нём. Ещё Linux автоматически монтирует первую попавшуюся файловую систему как корень, посему нада добавить/исправить параметр ядра, говорящий ядру что же именно надо монтировать как корень (например «kernel ядро параметры root=/dev/sdb1»). После правки конфига запускаем grub и даём две команды:

root (hdX,Y) — выбираем раздел с новой системой
setup (hdX,Y) — устанавливаем сам загрузчик для неё (можно писать только X — тогда загрузчик будет установлен в главную загрузочную запись указанного диска).

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

ЗЫЖ
Кстати, пока оно всё копировалось, borr предложил интересный вариант переноса данных… Просто есть не плохой шанс, что скопировать информацию не отдельными файлами, а сразу разделами (с помощью dd) может быть быстрее. Правда в моём случае размер разделов на старом и новом диске отличались, так что всё равно пришлось бы тратить время на изменения размеров новых разделов (что не всегда быстро). Но по-любому это интересный момент!

Реклама

комментариев 9 to “HOWTO Перенос системы на другой жёсткий диск”

  1. Igor said

    я когда переносил, использовал cp -a, dd — только для копирования *.img на flash.

  2. ну ‘-a’ это просто сочетание других опций и кстати это чисто GNU-приблуда :-)
    dd может копировать любые файлы.

  3. Igor said

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

  4. Не, ну ИМХО прощще скопировать всю ФС, чем по-одному вытаскивать из неё файлы и копировать каждый. Если размер разделов одинаков, получим линейные чтение и запись вместо хаотитичного блуждания по дискам в поисках что где лежит =)

  5. Dmitry said

    не, ну тут нужно понимать для чего, что используем, если клонировать раздел, то dd удобнее, если скопировать данные то tar (перенос на другой компьютер) или cp (на этот)

  6. Dmitry said

    да, и зафига лайф сиди-то?

  7. ram32 said

    Дим, а тебе нужен всякий /proc и иже с ними? :)

  8. Igor said

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

  9. Саня уже ответил, не вижу смысла копировать все эти системные директории, реально отсутствующие или почти не находящиеся на жёстком диске. Ну заодно и сам нынешний образ глянул — кстати не впечатлило +)

Добавить комментарий

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

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s