Как-то, работая, заметил, что мой личный ноутбук на i5-ом, с 8 гигабайтами ОЗУ на Linux уступает служебной, менее мощной, «лошадке».

Было решено сделать «ход конём»: вместо старого SATA HDD был приобретен новый SSD диск. Админы по сути своей существа ленивые, и я не стал исключением. Вспоминать все, что было сделано заново, выстраивая свою рабочую среду, не хотелось от слова совсем, и перенос операционной системы был наименее беспроблемным вариантом в моем случае. Итак, приступим.

В ноутбук, через переходник-контроллер в слот DVD-привода, был подключен вторым новый SSD-диск на 60 Гб, определившийся в системе как /dev/sdb.

На старом 320 Гб HDD-диске /dev/sda было три раздела: /dev/sda1 (swap — предварительно отключен), /dev/sda2 (/корневой раздел), /dev/sda3 (/home). Полный объем всех данных на всех разделах занимал около 50 Гб.

Загрузился в режим LiveUSB, на Ubuntu MATE 14.04 с usb-флешки. Gparted-ом создал раздел sdb1 на SSD-диске. Флаги не ставил. Входим в привилегированный режим root:

sudo -i

Проверяем есть ли поддержка TRIM:

hdparm -I /dev/sdb | grep -i trim

* Data Set Management TRIM supported (limit 1 block).

Вывод листинга означает, что поддержка TRIM есть и она активна.

Проверяем выравнивание разделов:

parted /dev/sdb align-check opt 1

Если 1 выровнено или 1 aligned, то все в порядке.

Создаем каталоги точек монтирования:

mkdir /mnt/{sda2,sda3,sdb1}

Монтируем нужные разделы:

mount /dev/sdb1 /mnt/sdb1
mount /dev/sda2 /mnt/sda2

Переносим, синхронизируя данные с корневого раздела:

rsync -qaHEAXh /mnt/sda2/* /mnt/sdb1

где:
-q — уменьшить уровень подробностей
-a — архивный режим
-H — сохранять жесткие ссылки
-E — сохранить исполняемость файлов
-A — сохранить списки ACL
-X — сохранить расширенные атрибуты
-h — выходные числа в легко воспринимаемом формате

Монтируем раздел с каталогом пользователя и также переносим с него данные:

mount /dev/sda3 /mnt/sda3
rsync -qaHEAXh /mnt/sda3/* /mnt/sdb1/home

Для большей сохранности от случайных ошибок отмонтируем разделы исходного HDD-диска:

umount /mnt/sda2
umount /mnt/sda3

Монтируем файловые системы нативной ОС, в которую перенесли данные:

mount --bind /proc /mnt/sdb1/proc
mount --bind /dev /mnt/sdb1/dev
mount --bind /sys /mnt/sdb1/sys

Операцией chroot изменяем рабочий корневой каталог на тот, в который переносим данные:

chroot /mnt/sdb1

Бекапим один из конфигурационных файлов со сведениями о файловых системах:

cp /etc/fstab{,.bak}

Добавляем актуальную метку UUID раздела sdb1 в fstab:

ls -l /dev/disk/by-uuid |grep sdb >> /etc/fstab

Редактируем fstab:

nano /etc/fstab

И приводим его к примерному виду:

# / was on /dev/sdb1 during installation
UUID=c45939b4-3a58-4873-aa6e-247746hgftb5 / ext4 errors=remount-ro 0 1

где UUID=значение sdb1

Обновляем конфигурационный файл загрузчика Linux:

update-grub

Проверяем, правильно ли выставлены значения UUID раздела в конфигурационном файле grub.cfg:

cat /boot/grub/grub.cfg | grep «uuid sda2»

где вместо «uuid sda2» подставляйте свое значение uuid-раздела. У меня остались старые значения, поэтому:

Выходим из chroot:

exit

Отмонтируем файловые системы:

umount /mnt/sdb1/sys
umount /mnt/sdb1/dev
umount /mnt/sdb1/proc

Меняем в grub.cfg все старые значения uuid раздела sda2, на новые значения uuid раздела sdb1. Мне проще было сделать так. Вы можете сделать это по своему.

Ставим сервер mysql, в котором есть утилита replace (пароль любой, одинаковый — не пригодится):

apt-get install mysql-server-5.5

Меняем UUID-ы:

replace 'old_uuid' 'new_uuid' -- /mnt/sdb1/boot/grub/grub.cfg

где old_uuid и new_uuid, старое и новое значения соответственно.

Проверяем поменялись ли значения в grub.cfg:

cat /mnt/sdb1/boot/grub/grub.cfg | grep «uuid sdb1»

Заново монтируем файловые системы и chroot-имся:

mount --bind /proc /mnt/sdb1/proc
mount --bind /dev /mnt/sdb1/dev
mount --bind /sys /mnt/sdb1/sys
chroot /mnt/sdb1

Устанавливаем сам загрузчик на sdb:

grub-install /dev/sdb

Выходим из chroot:

exit

Размонтируем всё смонтированное:

umount /mnt/sdb1/sys
umount /mnt/sdb1/dev
umount /mnt/sdb1/proc
umount /mnt/sdb1

Выходим из привилегированного режима root-а:

exit

Перегружаемся в новую систему. При перезагрузке в BIOS не забываем выбрать и установить загрузку с нового устройства.

Комментарии (35)


  1. c0rp
    18.02.2016 22:13
    +28

    Ставить mysql сервер чтобы сделать замену всех вхождений слова это очень сурово. Чем же Вам sed не угодил?


    1. icCE
      19.02.2016 00:15
      +6

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


      1. badfiles
        19.02.2016 00:32
        +1

        Я бы не стал горячиться, учитывая, что во-первых mysql ставится для replace, а во-вторых, менять uuid'ы местами вообще не надо, поскольку из chroot обновлятор граба сам запишет правильные в новый конфиг.


        1. icCE
          19.02.2016 10:11
          +6

          Да тут всю статью можно разложить и подавать на лекциях, как не надо делать. Но некоторые места действительно оригинальные.
          поэтому тут все как в Шурике


    1. ComodoHacker
      19.02.2016 09:40

      Сказано же:

      Админы по сути своей существа ленивые


    1. umart
      19.02.2016 09:51
      -7

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


      1. c0rp
        19.02.2016 16:31
        +1

        В сети stackexchange полно ответов на похожие вопросы. Вот примеры по поводу замены слова. А вот примеры по поводу миграции 1 2 3. Многие используют grub-install вместо финта с replace. Я советую Вам поправить свой гайд, потому на что русском языке материала нет. По возможности протестируйте всё в виртуалке.


        1. umart
          20.02.2016 08:22

          Спасибо за подсказки. На выходных постараюсь проанализировать и переделать статью.


  1. leschenko
    18.02.2016 22:34
    -2

    Не проще ли акронисом скопировать разделы целиком? Делается "мышкой" условно говоря за 10 кликов.
    Перенос 50 Гигов — это минута кликанья + минут 20 ожидания.


    1. badfiles
      18.02.2016 22:48

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


    1. d7s2di
      19.02.2016 11:05
      +2

      акронисом

      Зачем нужна проприетарная поделка, когда есть штатное открытое решение, которое ничем не хуже?


      1. leschenko
        19.02.2016 11:14
        -1

        скажем так: эта поделка позволяет выполнить переезд на ssd максимально быстро. + доступна обычному пользователю.


        1. d7s2di
          19.02.2016 11:56
          +1

          Все то же самое позволяет выполнить и disk dump.


  1. badfiles
    18.02.2016 22:40
    +14

    Когда вы зашли chroot'ом на новый диск, просто выполните

    grub-install /dev/sdX
    update-grub

    и не надо для этого ставить mysql.


  1. andvgal
    18.02.2016 22:44
    +3

    1. Если для доведения системы до пригодного состояния требуется много времени — вы пользуетесь не тем продуктом.

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

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

    4. Если ноутбук, то обязательно требуется шифрование диска, которое уже давно интегрировано в систему установки Debian и Ubuntu.

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

    P.S. Вроде не заметил уточнений какие файловые системы выбраны и какие настройки были допилены для дружбы с SDD. Подскажу минимум: noatime, nodiratime, discard, noop/deadline scheduler, /tmp & /run -> tmpfs, commit(ext4) и т.д.


    1. icCE
      19.02.2016 00:17
      +2

      Вне зависимости от системы, LVM крайне желателен.
      ну с btrfs он уже становится мало актуальным.


      1. andvgal
        19.02.2016 00:39

        Это всё же частный случай, как и ZFS, где подобная функция срослась с файловой системой.
        Пока что LVM самое надёжное и наиболее интегрированное решение. Да и не стоит забывать, что /home на десктопе лучше всегда держать обособлено.


        1. mickvav
          19.02.2016 00:50
          +1

          LVM — да. А вот /boot на lvm до сих пор, кажется, кое-где подглючивает.


          1. foxmuldercp
            19.02.2016 11:46
            +2

            поэтому пару сотен мегабайт в классическом разделе + остальное в боольшой lvm pv


  1. saggid
    18.02.2016 22:46

    Было такое дело как-то. Решил проблему тупым копированием всех данных с одного диска на другой, кроме папок dev, tmp и т.д., после чего прошёлся по инструкции восстановления работы grub2. Всё работало)

    Вопрос к автору — что значит этот магический набор параметров в rcync: -qaHEAXh? Может для простых смертных было бы лучше использовать полные аналоги этих аргументов, а не их сокращённые варианты? Чтобы люди понимали, что делают.


    1. umart
      19.02.2016 10:09
      -5

      Путем гугления нашел один из примеров синхронизации с параметрами. Надо было конечно перед использованием проверить на что они влияют, но именно в этом случае у меня не было особого желания и времени для уточнения. Согласен, для новичков это было бы удобнее. Но ничего не мешает тем кому интересно вбить в bash:

      имя команды --help


      1. torkve
        19.02.2016 12:49

        То есть Вы нашли в интернете какую-то команду с параметрами, не разобрались, что она делает, и теперь тупо её распространяете? Я ничего не перепутал?


        1. umart
          19.02.2016 14:58

          Внёс дополнения с разбором используемых параметров rsync в статью.


          1. torkve
            19.02.2016 15:08
            +4

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


  1. Wedmer
    18.02.2016 22:59
    +22

    Статья о том, как простое сделать сложным.


    1. umart
      19.02.2016 10:37
      -5

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


      1. Wedmer
        19.02.2016 15:27

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


  1. PinGniX
    19.02.2016 07:55
    +7

    Что-то с каждым днем на хабре статьи одна "лучше" другой стали появляться. Такими темпами будем в необозримом будущем читать статьи про установку ubuntu.


    1. foxmuldercp
      19.02.2016 11:50

      Ну, про описание нормального решения, аналогичное MS WDS сервису, для развертывания аппаратных серверов под той же ubuntu/centos, я бы и сам с удовольствием почитал, а то сейчас обхожусь IP KVM + netinstall + apt-get install wget && wget my_install_script.sh && bash ./my_install_script.sh, но диски надо разбивать ручками и всё такое. а хорошее готовое решение, которое я когда-то использовал во времена выхода KDE4, к сожалению, заброшено, что уже даже название забыл


  1. d7s2di
    19.02.2016 11:01

    А чего бы просто не использовать dd?


    1. umart
      19.02.2016 11:05
      -2

      У dd другая логика работы с дисками. Мне же важны были размеры дисков и гибкость в настройке.


    1. dmial
      23.02.2016 18:39

      Как раз недавно менял диск на нашем скромном файлопомоечном сервере. Вариант с «dd if=… of=...» показался самым простым. Запустил команду, выключил — переткнул — включил, всё :-)


  1. begemot_nn
    20.02.2016 10:37
    +1

    Я могу сильно заблуждаться, или просто не понять всей глубины мыслей, но:
    parted (fdisk)
    dd
    resize2fs (для ленивых)
    vi /etc/fstab (если там разделы монтировались по uuid)

    вполне себе достаточный набор.


    1. Zapped
      20.02.2016 14:03

      добавлю, свои 5 копеек:
      dump/restore?


  1. Anonym
    20.02.2016 11:14

    А я просто загрузил Clonezilla с флешки и через полчаса имел рабочую систему в первозданном виде.