Как подружить Truecrypt loader и Grub 2?

    image
    Сегодня я расскажу, как подружить загрузчик от программы шифрования Truecrypt и никсовский загрузчик Grub 2. Такая необходимость может возникнуть (и неотвратимо возникает) при попытке установить рядом на одном жёстком диске ОС Windows, зашифрованную бесплатной программой Truecrypt, и unix-образную операционную систему, например Ubuntu.

    Основная проблема заключается в том, что Grub не умеет работать с ключами truecrypt и не может расшифровать виндошный раздел, а truecrypt loader не [всегда] умеет загружать другие операционные системы. Существует два основных подхода к решению задачи.

    Подход первый. В Master boot record (MBR) находится загрузчик Truecrypt



    В принципе, такой вариант должен был бы работать «из коробки» (потому как загрузчик truecrypt умеет передавать загрузу другим загрузчикам на разных разделах жёсткого диска) и не требовать никаких лишних телодвижений от пользователя, но существует несколько подводных камней.

    Проблемы, в основном, связаны с тем, что ОС Windows 7 при инсталляции создаёт для себя небольшой загрузочный раздел на 100 мегабайт (он необходим для шифрования с помощью BitLocker), а в такой ситуации трукрипт отказывается установить мультизагрузочный загрузчик «из коробки» при шифровании системного раздела… По крайней мере такое поведение справедливо для Truecrypt версии 7.1a. Таким образом, приходится устанавливать обычный загрузчик трукрипт, который выглядит так:
    TrueCryptBootLoader


    Как можно заметить, имеется возможность отказаться от ввода пароля, нажав клавишу Esc. В таком случае, нам будет предложен список разделов жёсткого диска, которым можно передать управление для дальнейшей загрузки.
    TrueCryptBootLoader's partitions


    Подводный камень залючается в том, что не всегда /boot раздел Linux присутствует в данном списке. Чтобы он там появился, должно быть выполнено несколько условий. Загрузочный раздел *nix должен быть первичным разделом (primary partiton), а не частью расширенного (не extended patition), должен иметь флаг «загрузочный» («bootable»), а также иметь на себе загрузчик, которому можно передать управление.

    Если с первыми двумя условиями всё понятно, и при установке того же Ubuntu можно сразу правильно сконфигурировать жёсткий диск, то с последним условием могут возникнуть затруднения. Дело в том, что Grub версии 2 не любит устанавливаться не в MBR, т.к. при этом используется неотказоустойчивая система и есть вероятность, что загрузчик будет время от времени «слетать». Сообщение об этом вы увидите, когда попытаетесь выполнить команду установки загрузчика на раздел. Для того, чтобы всё получилось необходимо использовать ключ "--force".
    sudo grub-install /dev/sda6 --force
    

    где /dev/sda6 — /boot раздел вашего Ubuntu.

    Алгоритм


    Таким образом, последовательность установки и настройки всего можно описать следующим образом:
    1. Уснавливаем windows
    2. Устанавливаем Ubuntu, создав /boot раздел для неё на отдельном первичном разделе, поставив флаг «загрузочный»
    3. Загружаем Ubuntu и устанавливаем Grub в /boot раздел (как было описано выше)
    4. Перезагружаемся в windows, устанавливаем Truecrypt, шифруем системный раздел

    Теперь у нас в MBR загрузчик Truecrypt.
    • Для того, чтобы загрузиться в windows просто вводим правильный пароль от системного раздела
    • Для того, чтобы загрузить Ubuntu нажимаем Esc, чтобы отказаться от ввода пароля и выбираем /boot раздел


    Траблшутинг


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

    Создаём резервную копию:
    dd if=/dev/sda of=~/truecrypt.mbr count=1 bs=512
    dd if=/dev/sda of=~/truecrypt.backup count=8 bs=32256
    


    Восстанавливаем из резервной копии (где /dev/sda6 — ваш /boot раздел!) в случае сбоя:
    sudo dd if=~/truecrypt.mbr of=/dev/sda count=1 bs=512
    sudo dd if=~/truecrypt.backup of=/dev/sda count=8 bs=32256
    sudo grub-install /dev/sda6 --force
    


    Подход второй. В Master boot record (MBR) находится загрузчик Grub 2


    А как же передать управление загрузчику Truecrypt из Grub 2? Можно было бы сохранить загрузчик и ключи в виде файла и пытаться передать управление ему… Можно было бы использовать iso Truecrypt Recue CD, если бы Grub 2 умел загружать iso образы как делает его младший брат Grub4Dos (а он не умеет! умеет только монтировать файловую систему iso..) Я уже было совсем отчаялся в поисках, но внезапно наткнулся на достаточно простое и элегантное решение.

    Благодаря замечательным людям, которые разрабатывают проект "Grub2 loves TrueCrypt" стало возможно сконвертировать загрузочный спасательный iso-образ Truecrypt в формат, с которым умеет работать Grub2.

    Итак, устанавливаем git, чтобы склонировать репозиторий с grub2tc, а также ruby для работы самой программы:
    sudo -i
    apt-get install git ruby
    git clone git://gitorious.org/grub2tc/grub2tc.git
    


    После этого копируем в папку с программой образ «TrueCrypt Rescue Disk.iso» и переименовываем его в «tcrescue.iso». Выполняем команду
    make
    


    В папке появится файл «tcloader», который нужно скопировать в /boot

    Теперь осталось отредактировать меню загрузчика, чтобы в нём появился пункт загрузки Truecrypt. Добавляем в файл /etc/grub.d/40_custom:
    menuentry "Windows via TrueCrypt" {
          insmod multiboot
          multiboot /tcloader
    }
    


    Затем выполняем:
    update-grub2
    grub-install /dev/sda
    

    где /dev/sda — ваш жёсткий диск

    Теперь, ещё один важный момет. Последней командой (когда вы переустановили Grub в MBR жёсткого диска) вы скорее всего повредили ключи Truecrypt, необходимые для расшифровки системного раздела. Отныне при попытке ввести пароль, вы будете получать сообщение «Incorrect password». Чтобы это исправить, восстановим ключи из файла-бэкапа, который заботливо создал для нас в своей директории grub2tc volhead:
    dd if=volhead of=/dev/sda bs=512 seek=62
    
    где
    if=volhead — файл, где хранится бэкап ключей
    of=/dev/sda — устройство, куда этот бэкап посекторно следует записать
    bs=512 — размер блока
    seek=62 — сколько блоков отступить от начала устройства /dev/sda (там загрузчик Grub)

    Теперь можно загружаться!

    Алгоритм


    Таким образом, последовательность установки и настройки всего для этого метода можно описать следующим образом:
    1. Уснавливаем windows
    2. Устанавливаем Ubuntu
    3. Перезагружаемся в windows, устанавливаем Truecrypt, шифруем системный раздел
    4. Как-нибудь загружаем Ubuntu :) (например с загрузочной флешки/диска) и проделываем вышеописанные манипуляции с помощью программы grub2tc

    Теперь у нас в MBR загрузчик Grub2.
    • Для того, чтобы загрузиться в Ubuntu просто выбираем такой пункт при загрузке
    • Для того, чтобы загрузить Windows выбираем пункт «Windows via TrueCrypt» и вводим правильный пароль


    Траблшутинг


    Если загрузчик Truecrypt по каким-либо причинам перестал узнавать ваш пароль (повреждены ключи), то их всегда можно восстановить из резервной копии в папке с grub2tc командой:
    dd if=volhead of=/dev/sda bs=512 seek=62
    


    P.S.


    Оба метода подходят для использования их совместно с шифрованием линукса dm-crypt и LVM, что позволяет иметь обе-две операционные системы полностью зашифрованными :)
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 19

      0
      Спасибо за статью!

      Можно было бы использовать iso Truecrypt Recue CD, если бы Grub 2 умел загружать iso образы как делает его младший брат Grub4Dos (а он не умеет! умеет только монтировать файловую систему iso..)
      А вот тут Вы что-то не так читали/делали… Вот собственно
      пример
      menuentry «Ubuntu 10.04 Lucid Lynx» {
      loopback loop /images/ubuntu-10.04-desktop-i386-custom.iso
      linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/images/ubuntu-10.04-desktop-i386-custom.iso noeject noprompt — initrd (loop)/casper/initrd.lz
      }
      пункта меню для загрузки с iso. Таким макаром у меня грузится iso'шник Ubuntu с того же раздела где и стоит grub на флешке с папки images.
        +1
        спасибо, но это именно то, что я описал как " Grub2 умеет только монтировать файловую систему iso". Т.е. если на исошнике присутствует линуксовое ядро и рамдиск — загрузиться получится. А если на исошнике что-то абсолютно иное (как на TrueCrypt Rescue Disk.iso) то загрузить это не получится :)
          0
          Тогда я не понял фразу) Претензий больше не имею)
            0
            поинтересовался поподробнее и нашёл способ загружать iso с помощью Grub 2 даже если в исошнике не линукс :)

            оказывается надо скопировать мемдиск

            sudo cp /usr/lib/syslinux/memdisk /boot


            ну а потом создать такой пункт меню:

            menuentry «Windows via Truecrypt iso from directly Grub» {
            insmod part_msdos
            insmod ext2
            set root='(hd0,msdos6)'
            linux16 ($root)/memdisk iso raw
            initrd16 ($root)/tcrescue.iso
            }


            только что проверил — работает (пункт не создавал — изменил на лету пункт для загрузки убунты, чтобы много не писать) поэтому в листинге выше может быть не совсем рабочий код ;)
              0
              Меня всё же терзают смутные сомнения, в iso'шник не удасться передать управление простым chainloader'ом? Не очень понимаю что из себя представляет iso.
            0
            Не совсем так. Если на исошнике операционная система, которая поддерживает загрузку из исошника, вот тогда сработает. Дело в том, что в параметрах загрузки ядру передаётся путь — где искать исошник, с которого нужно грузиться. Если ядро этого не поддерживает (а есть дистрибутивы, ядра в которых этого не поддерживают), то ничего не выйдет. В принципе, любая другая система (не линукс) тоже могла бы поддерживать такую загрузку, тогда можно было бы загрузиться и через grub.

            На флэшке я использую связку grub2 для загрузки из исошников линукосв + grub4dos для всего остального.
              0
            +3
            Потенциально полезная статья, спасибо.
              0
              Если загрузчик Truecrypt по каким-либо причинам перестал узнавать ваш пароль (повреждены ключи), то их всегда можно восстановить из резервной копии в папке с grub2tc командой:

              dd if=volhead of=/dev/sda bs=512 seek=62


              А под виндой как ключи забэкапить?
              0
              Что-то мне подсказывает, что на системе с EFI помимо BIOS можно просто установить оба загрузчика так, чтобы выбирались ещё на уровне EFI, до каких-либо загрузчиков. И тогда проблема автоматом отпадёт.
            • UFO just landed and posted this here
                0
                А что делать, если необходимо зашифровать весь HDD полностью? Чтобы зашифрованными были и Винда и Убунту?
                +1
                винду следует зашифровать truecrypt, a ubuntu зашифровать LUKS
                  0
                  все сделал как описано в статье (вариант 2), но столкнулся с проблемой на стадии «Make»

                  root@*****:~/grub2tc# make
                  as --32 -o tcloader.o tcloader.S
                  ld -melf_i386 -pie -Ttext=0x20000 -o tcloader.out tcloader.o
                  ld: warning: cannot find entry symbol _start; defaulting to 0000000000020000
                  objcopy -O binary -j .text -S tcloader.out tcloader.bin
                  ruby extract.rb tcrescue.iso
                  extract.rb:78:in `pack': can't convert String into Integer (TypeError)
                  from extract.rb:78:in `'
                  make: *** [tcloader] Error 1
                    +1
                    Нашел решение и написал по шагам: habrahabr.ru/post/160945/
                      0
                      да, так действительно намного проще :) спасибо!

                      было бы ещё замечательно, если бы кто-нибудь добавил к нашим статьям подробный пункт о том как зашифровать и сам убунту LUKSом =)

                  Only users with full accounts can post comments. Log in, please.