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

  1. У меня нет инструментов для вскрытия старого ноутбука и подключения нового диска через USB к новому ноутбуку.

  2. Я использую полное шифрование диска, у старого ноутбука диск на 512 ГБ, а у нового — NVME на 1 ТБ; как менять размер LUKS, я не знаю.

Он ответил, что обе проблемы можно решить. На первом этапе можно просто открыть доступ к диску при помощи NVME over TCP, подключить его по сети и создать полную копию диска, а остальное сделать достаточно просто. Если вкратце, он предложил следующее:

  1. Экспортировать диск, использовав из старого ноутбука nvmet-tcp.

  2. Создать копию диска на новом ноутбуке.

  3. Изменить размер раздела, чтобы использовать весь 1 ТБ.

  4. Изменить размер LUKS.

  5. Изменить размер корневого диска BTRFS.

Экспортируем диск через NVME TCP

Коллега сказал, что проще всего это сделать при помощи systemd-storagetm.service. Этот сервис можно вызвать, просто загрузившись в storage-target-mode.target, указав rd.systemd.unit=storage-target-mode.target. Но он рекомендовал не использовать это, потому что мне нужно настроить образ dracut initrd, чтобы задействовать сетевые сервисы, а также настроить из этого режима WiFi, а это довольно непростой процесс.

Поэтому вместо этого я просто запустил оба ноутбука с аварийным CD GRML. А для того, чтобы экспортировать диск NVME на новый ноутбук при помощи модуля nvmet-tcp Linux, я выполнил следующий шаг:

modprobe nvemt-tcp
cd /sys/kernel/config/nvmet
mkdir ports/0
cd ports/0
echo "ipv4" > addr_adrfam
echo 0.0.0.0 > addr_traaddr
echo 4420 > addr_trsvcid
echo tcp > addr_trtype
cd /sys/kernel/config/nvmet/subsystems
mkdir testnqn
echo 1 >testnqn/allow_any_host
mkdir testnqn/namespaces/1
cd testnqn
# replace the device name with the disk you want to export
echo "/dev/nvme0n1" > namespaces/1/device_path
echo 1 > namespaces/1/enable
ln -s "../../subsystems/testnqn" /sys/kernel/config/nvmet/ports/0/subsystems/testnqn

Эти команды гарантируют экспорт устройства при помощи NVME over TCP. Дальше нужно распознать это на новом ноутбуке и подключить устройство:

nvme discover -t tcp -a <ip> -s 4420
nvme connectl-all -t tcp -a <> -s 4420

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

Копируем диск

Я просто воспользовался командой копирования корневого диска на новый ноутбук. Так как у нового ноутбука нет разъёма Ethernet, мне пришлось пользоваться только WiFi, и для копирования всех 512 ГБ на новый ноутбук понадобилось семь с половиной часов. Скорость копирования составляла примерно 18-20 МБ/с. Ещё одно решение заключалось бы в создании начального раздела и файловой системы с последующим выполнением rsync корневого диска или использованием непосредственно BTRFS для переноса файловой системы.

dd if=/dev/nvme2n1 of=/dev/nvme0n1 status=progress bs=40M

Меняем размер раздела и контейнера LUKS

Последняя часть была очень простой. После запуска parted он обнаружил, что таблица разделов не соответствует размеру диска и спросил, нужно ли исправить это, на что я ответил утвердительно. Дальше мне нужно было установить cloud-guest-utils, чтобы получить growpart для исправления второго раздела. Следующая команда расширила раздел на весь 1 ТБ:

growpart /dev/nvem0n1 p2

Дальше я использовал cryptsetup-resize для увеличения размера контейнера LUKS.

cryptsetup luksOpen /dev/nvme0n1p2 ENC
cryptsetup resize ENC

Далее я перезапустил диск, и всё заработало. После входа в систему я изменил размер файловой системы BTRFS. Для изменения размера BTRFS требует монтирования системы, поэтому я не мог попробовать это сделать при live boot.

btfs filesystem resize max /

Вывод

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

Кроме того, благодаря своему коллеге я научился экспортировать диски при помощи NVME over TCP.

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


  1. m0xf
    15.03.2024 09:06
    +7

    Можно было воспользоваться netcat (nc) совместно с dd.


    1. datacompboy
      15.03.2024 09:06
      +13

      +1. Что-то типа

      # Получатель
      nc -l 4444 | pbzip2 -d | dd of=/dev/nvme0n1 obs=1M
      
      # Отправитель
      pv /dev/nvme0n1 | pbzip2 -9 | nc DESTIP 4444

      На отправителе мы будем видеть прогрессбар и оценку скорости отправки в сырых данных (байтах диска); на получателе будем видеть скорость передачи по вайваю (до распаковки), это позволит наблюдать за скоростью передачи и процентом сжатия :D

      ... сжатие только бесплоезно, раз диск зашифрован...


      1. funca
        15.03.2024 09:06

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


    1. Incognito90
      15.03.2024 09:06
      +1

      Можно было и dd через ssh

      dd if=/dev/nvme0n1 status=progress | gzip -9cf | ssh admin@192.168.0.1 bash -c "gunzip -c | sudo dd of=/dev/nvme0n2 status=progress"


  1. c0r3dump
    15.03.2024 09:06

    Интересно, в чем преимущество использования nvme-over-tcp по сравнению с простым созданием шифрованной фс на новом ноуте и переноса туда файлов по сети tar | nc или аналогичным способом? Я просто много лет уже как так делал, и совершенно не важно какие типы накопителей, файловых систем (в рамках совместимых). Я не говорю, что предложенный метод плох, просто интересуюсь.


    1. datacompboy
      15.03.2024 09:06
      +1

      скипается шаг создания разделов, настройки шифрования, настройки загрузчиков и проч.


      1. Fox_exe
        15.03.2024 09:06

        Как написали выше - dd+nc решает эту проблему целиком и полностью. (Всмысле - можно копировать хоть диск целиком, хоть конкретные разделы, хоть сами файлы из раздела).


        1. 13werwolf13
          15.03.2024 09:06

          а если между dd и nc воткнуть pigz/zstd/lzo/etc то ещё и шустрее выйдет..

          но всё равно интересное


          1. c0r3dump
            15.03.2024 09:06

            Как выше уже писали, в случае зашифрованного диска вряд ли сжатие что-то даст кроме дополнительной нагрузки на CPU, разве нет?


            1. 13werwolf13
              15.03.2024 09:06

              На самом деле zstd даже на шифрованном диске даёт пусть не космическую, но достаточно заметную разницу чтобы это имело смысл, покрайней мере на моём опыте это было так.


      1. edo1h
        15.03.2024 09:06

        Зато добавляется шаг изменения размера разделов. То на то и выходит.


  1. RighteousHippie
    15.03.2024 09:06

    А если ключ шифрование в чипе TPM2 ноутбука находится, тогда это всё не заработает?


    1. Prototik
      15.03.2024 09:06
      +1

      Спросит пароль для расшифровки диска, дальше уже на новом ноуте enroll'им новый ключ в tpm2.


  1. MikhailZakharov
    15.03.2024 09:06

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


    1. Prototik
      15.03.2024 09:06
      +1

      В этой схеме есть пара просчётов:

      1. Нужен внешний диск (который не всегда есть)

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


      1. nixtonixto
        15.03.2024 09:06
        +4

        Однако, учитывая отсутствие езернет-разъёма у автора статьи, и наличие USB-3 у большинства ноутбуков, старше 2011-го года, из-за более высокой скорости USB можно было бы потратить меньше времени.


      1. axe_chita
        15.03.2024 09:06
        +1

        А разве Clonezilla не умеет копировать диски напрямую между машинами через сеть?


  1. adrozhzhov
    15.03.2024 09:06
    +1

    Если ноутбук действительно старый, и ядро там не самое свежее, то и работа nvmet модуля может быть с неожиданностями.

    ssh с перенаправлением вывода dd удалённой машины на вход локального dd (или наоборот) и надёжно, и секретно.

    И никаких модулей ядра не надо.

    (своё набивание шишек с nvme я описывал тут https://habr.com/ru/companies/beeline_tech/articles/770174/)


  1. S-trace
    15.03.2024 09:06
    +1

    А этот nvme-over-tcp лучше или хуже работает чем nbd или iscsi при соединении через интернет+wiregiard? У кого-нибудь есть подобный опыт?


  1. okhsunrog
    15.03.2024 09:06
    +3

    Тут предлагают разные способы решения этой проблемы. Добавлю и от себя один: если у вас btrfs или ZFS, можно сделать снэпшоты нужных разделов и отправить их через любой pipe. Хоть ssh, хоть netcat. И с флешки загружаться не надо на ноуте, с которого отправляете


  1. CCNPengineer
    15.03.2024 09:06

    есть ноутбук с виндоус 10 в корпоративной АД и зашифрованый диск. можно ли скопировать диск на съемный диск и запускать его на другом ноутбуке,?


    1. CCNPengineer
      15.03.2024 09:06

      ChatGPT
      Ваша ситуация представляется сложной. Если диск зашифрован с использованием технологии, такой как BitLocker, и интегрирован в корпоративную сеть Active Directory (АД), есть несколько аспектов, которые следует учитывать:

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


    1. Blogoslov
      15.03.2024 09:06

      А если тоже самое но диск не зашифрованный? Можно всё скопировать? Хочу скопировать и виртуализировать его через ProxMox и не таскать с собой с работы ноутбук. Тем более он используется только как тонкий клиент для связи с внутренними удалённым столами.