aboutsummaryrefslogtreecommitdiff
path: root/index.mdwn
blob: 969be3d984239c4f89e3eafa936304081cd68147 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
[[!meta title="Bootless: anti-tampering bootloader"]]

**WARNING** - this pre-alpha software with portuguese-only docs!

* Bootless é uma integração tecnológica que permite um computador criptografado a permanecer sem gerenciador de partida (bootloader), de modo que grampos em software sejam difícies de serem instalados.
* O Bootless é um gerenciador de partida em software livre instalado numa mídia removível e utilizado para inicializar computadores.
* É previsto suporte inicial para o sistema operacional Debian.
* O Bootless atualmente usa a [Hydra Suite](https://git.sarava.org/?p=hydra.git;a=summary).

TODO
----

- Cleanup and translate docs.
- Setup issue tracker.
- Add contact information.
- Setup git-annex into the repository.
- Split bootless script from hidra suite but preserve integration.
- Add pre-built and signed images.

Construindo um volume bootless
------------------------------

Primeiro, prepare o dispositivo:

    export device=/dev/nome_do_dispositivo
    export partition=numero_da_particao
    mkfs.ext3 "$device""$partition"
    mkdir /tmp/bootless
    mount "$device""$partition" /tmp/bootless

Clone o repositório bootless:

    git clone ssh://exemplo.org/bootless.git /tmp/bootless/boot

Se você já tiver uma cópia de trabalho na sua máquina, pode ser mais interessante clonar direto dela para economizar tempo e banda, mas certifique-se de atualizá-la antes. Se houver pouco espaço na pasta de destino, faça o clone usando a opção `--depth=1`.

Em seguida, instale o GRUB no MBR do dispositivo, rodando `grub` e digitando em seu shell, substituindo o nome do dispositivo e da partição conforme apropriado:

    root (hd1,1)
    setup (hd1)

Limpe a casa:

    umount /tmp/bootless
    rmdir /tmp/bootless

Agora seu pendrive está pronto para reinicializar os nodos físicos :)

Mantendo o repositório compacto
-------------------------------

Apesar de ser um repositório `git` e portanto de fácil manutenção de uma árvore distribuída, o `bootless` sofre de um problema de espaço: a cada imagem binária adicionada ou removida, o histórico do repositório cresce muito. Para evitar que o repositório cresça muito e não caiba numa pequena partição de um pendrive, é preciso reconstruir sua história.

Aqui segue um exemplo usando o `git-rebase` para agregar commits. Primeiramente, faça o rebase, juntando commits com 'squash' (vide referências):

    git rebase -i COMMIT

No caso, `COMMIT` é o commit inicial do repositório `bootless` que estamos usando. Em seguida, é preciso que o seu repositório local seja clonado pois só assim (!) é possível salvar espaço:

    cd ..
    mv bootless bootless.old
    git clone bootless.old bootless
    cd -
    git gc --aggressive
    git prune
    cp ../bootless.old/.git/config .git/

Dependendo da situação anterior, após esse processo o repositório pode diminuir bastante de tamanho. Um grande inconveniente desse processo é que ele agride a história de modo que as outras cópias do repositório precisam de uma força para serem atualizadas:

    git push --force

GRUB2
-----

Adaptei o bootless para o GRUB2 utilizando o mesmo repositório. Isso significa que:

  * É possível utilizar o repositório do bootless tanto com o grub-legacy quanto com o grub2.
  * O grub-legacy utiliza o arquivo `menu.lst` enquanto que o grub2 usa o `grub.cfg`. Ambos arquivos precisam ser mantidos atualizados enquanto ambas as versões do grub forem suportadas.

No caso da instalação de um pendrive usando grub2, é necessário utilizar o seguinte comando de instalação ao invés de simplesmente invocar o `grub`:

    grub-install --root-directory=/tmp/bootless $device --force

Procedimento completo de exemplo:

    export device=/dev/nome_do_dispositivo
    export partition=numero_da_particao
    mkfs.ext3 "$device""$partition"
    mkdir /tmp/bootless
    mount "$device""$partition" /tmp/bootless
    git clone --depth=1 ssh://gitosis@exemplo.org/bootless.git /tmp/bootless/boot
    grub-install --root-directory=/tmp/bootless $device
    umount /tmp/bootless
    rmdir /tmp/bootless

Em casos emergencias pode ser muito útil usar o seguinte comando para gerar uma imagem bootavel:

    grub-mkrescue -o bootless.img bootless/

Versões específicas de kernel
-----------------------------

Às vezes pode ser necessário criar manualmente a initramfs após uma atualização de kernel (reparei isso em máquinas rodando Ubuntu). Abaixo, comando para atualizar o initramfs para uma versão específica de kernel:

    update-initramfs -v -u -k 2.6.32-26-generic

Hydra Suite
-----------

Criando o repositório:

    hydra exemplo bootless init ssh://gitosis@exemplo.org/bootless.git
    hydra exemplo bootless make /dev/sdb1
    hydra exemplo bootless git pull
    hydra exemplo bootless git commit -a

Criando uma imagem:

    hydra exemplo bootless image

Isso criará o arquivo bootless.img na pasta atual. Para especificar um nome de arquivo distinto, use

    hydra exemplo bootless image arquivo.img

Para gerar a imagem e gravá-la simultaneamente numa mídia removível localizada em `/dev/sdb`, use

    hydra exemplo bootless image arquivo.img /dev/sdb

Se você quiser gerar uma imagem apenas para ser gravada em `/dev/sdb`, isto é, sem um arquivo.img sobrando, use

    hydra exemplo bootless image /dev/sdb

Customização
------------

Algo que vale a pena pensar para possíveis mudanças futuras no `bootless`: atualmente utilizamos uma nomenclatura única no `LVM` de todas as máquinas, o que permite compartilharmos a `initrd` entre os sistemas.

Se utilizássemos nomes distintos para cada máquina, precisaríamos de uma `initrd` por sistema -- o que aumentaria muito o tamanho do repositório -- ou então ter alguma forma de customizar a imagem de inicialização para suportar esse esquema.

Usar uma nomenclatura única simplifica a manutenção do bootless, porém pode complicar o gerenciamento de volumes, por exemplo quando quisermos abrir o disco de um servidor em outro.

Temos três [alternativas](http://wiki.debian.org/InitrdReplacementOptions):

  * [initramfs-tools](http://packages.debian.org/stable/initramfs-tools), que é utilizado atualmente.
  * [yaird](http://packages.debian.org/sid/yaird), supostamente a ser utilizado no futuro.
  * [dracut](http://packages.debian.org/stable/dracut), uma [outra possibilidade](https://lwn.net/Articles/317793/).

É preciso fuçar na documentação desses softwares para saber como a montagem de volumes pode ser customizada.

O arquivo conf.d/cryptroot das initrds usadas atualmente contém o seguinte: 

    target=root,source=/dev/mapper/vg-root,key=none,rootdev,cipher=aes-cbc-essiv:sha256

O ideal seria ter várias entradas nesse arquivo. Talvez seja o caso de estudar também o `/usr/share/initramfs-tools/hooks/cryptroot`.

Referências
-----------

Git:

  * http://kerneltrap.org/mailarchive/git/2007/10/7/331471
  * http://stackoverflow.com/questions/37219/how-do-you-remove-a-specific-revision-in-the-git-history
  * http://www.alexrothenberg.com/2009/06/changing-history-with-git-rebase-how-to.html
  * http://stackoverflow.com/questions/250238/collapsing-a-git-repositorys-history

Grub:

  * [Grub2](https://help.ubuntu.com/community/Grub2) (Ubuntu Help).
  * [GRUB2 Manual](http://grub.enbug.org/Manual) (Wiki).
  * [Using GRUB to Set Up the Boot Process](http://www.linuxfromscratch.org/lfs/view/development/chapter08/grub.html).
  * [GNU Grub Manual](http://www.gnu.org/software/grub/manual/grub.html).

Boot:

- [Auto-booting and Securing a Linux Server with an Encrypted Filesystem](http://serverfault.com/questions/34794/auto-booting-and-securing-a-linux-server-with-an-encrypted-filesystem).
- [Smartmonster](https://github.com/ioerror/smartmonster).

Imagens:

  * [How can I mount a disk image?](http://superuser.com/questions/344899/how-can-i-mount-a-disk-image).
  * [GRUB 2 - OSDev](http://wiki.osdev.org/GRUB_2): instalando o grub em várias mídias distintas.
  * [Disk mounting](http://www.noah.org/wiki/Disk_mounting).
  * [Loop-mounting partitions from a disk image](http://madduck.net/blog/2006.10.20:loop-mounting-partitions-from-a-disk-image/ Loop-mounting partitions from a disk image).