FreeBSD live CD

#freebsd, #unix

Como tornar o FreeBSD um Live CD.

Obtendo o FreeBSD

Não será preciso fazer download de arquivos iso além do seu sistema FreeBSD para qualquer instalação padrão. Obtendo seus CDs faça uma instalação normal e conforme fizer em seu HD será no live CD, afinal faremos o live CD como uma cópia do que estiver no HD, inclusive arquivos de configurações e até arquivos pessoais se você não der uma última olhada e apagar o que for desnecessário.

Copiando os Arquivos para a Raiz do Live CD

Crie o diretório /livecd e copie todos os arquivos da raiz para este diretório:

# mkdir /livecd
# cp -fr / /livecd

Caso não dê certo sugiro que compacte o diretório raiz e depois descompacte em /livecd, isso dará certo pelo fato de que o tar ao compactar ignora sockets, dispositivos, mas conserva as permissões:

# tar cfzp /livecd_compacted.tar.gz /
tar: Removing leading '/' from member names
tar: /livecd_compacted.tar.gz: Can't add archive to itself
tar: /var/run/devd.pipe: tar format cannot archive socket: Inappropriate file
type or format
tar: /var/run/log: tar format cannot archive socket: Inappropriate file type
or format
tar: /var/run/logpriv: tar format cannot archive socket: Inappropriate file
type or format
# tar xfzp /livecd_compacted.tar.gz -C /livecd

NOTE: Fiz compactado pois pode querer usar o arquivo novamente, tente usar o rsync.

Áreas de Escrita

Dentro de /mnt crie o diretório mdfs.

O sistema precisará de áreas de gravação, além de arquivos de log, creio que você vai querer fazer alterações para testar o CD, para estas área que precisem de gravação usaremos o recurso Memory Disks.

Após a linha . /etc/rc.subr em /livecd/etc/rc adicione sh /etc/rc.d/rc.diskless, ou seja, deve ficar desta forma:

. /etc/rc.subr
sh /etc/rc.d/rc.diskless

Crie e edite o arquivo /livecd/etc/rc.d/rc.diskless:

#!/bin/sh
# /livecd/etc/rc.d/rc.diskless

# swap
mdconfig -a -t malloc -o compress -s 30m -u 0
swapon /dev/md0

# /etc
mdconfig -a -t malloc -o compress -s 4m -u 1
newfs -U -O 2 md1 > /dev/null 2>&1

# /usr/local/etc
mdconfig -a -t malloc -o compress -s 1m -u 2
newfs -U -O 2 md2 > /dev/null 2>&1

# /var
mdconfig -a -t malloc -o compress -s 20m -u 3
newfs -U -O 2 md3 > /dev/null 2>&1

# /root
mdconfig -a -t malloc -o compress -s 3m -u 4
newfs -U -O 2 md4 > /dev/null 2>&1

# montando todos os MDfs's
mount -a

# descompactando os arquivos dos MDfs's
tar xfjp /mnt/mdfs/var.tar.bz2 -C /
tar xfjp /mnt/mdfs/etc.tar.bz2 -C /
tar xfjp /mnt/mdfs/usr_local_etc.tar.bz2 -C /
tar xfjp /mnt/mdfs/root.tar.bz2 -C /

Este script monta na memória as áreas de escrita e se encarregará também de descompactar o conteúdo dos diretórios que compactaremos, mas antes edite o arquivo /livecd/etc/fstab para que os diretórios sejam montados no boot e tenham permissão de escrita.

/dev/acd0   /               cd9660    ro   0   0
proc        /proc           procfs    rw   0   0
/dev/md1    /etc            ufs       rw   0   0
/dev/md2    /usr/local/etc  ufs       rw   0   0
/dev/md3    /var            ufs       rw   0   0
/dev/md4    /root           ufs       rw   0   0

Feito as alterações em /etc/ agora compactaremos os diretórios: /livecd/etc, /livecd/usr/local/etc, /livecd/var/ e /livecd/root; não esqueça de fazer isso dentro de /livecd, pois se compactados usando seu endereço completo quando for descompactar descompactará usando seu endereço completo também, por exemplo: se compactado com tar cfjp /livecd/mnt/var.tar.gz /livecd/var, será descompactado para /livecd/var/ quando o que realmente queremos é o diretório /var descompactado na raiz do live cd.

# cd /livecd/
# tar cfjp /livecd/mnt/mdfs/var.tar.bz2 var
# tar cfjp /livecd/mnt/mdfs/etc.tar.bz2 etc
# tar cfjp /livecd/mnt/mdfs/usr_local_etc.tar.bz2 usr/local/etc
# tar cfjp /livecd/mnt/mdfs/root.tar.bz2 root

Recompilando o Kernel

Não precisei recompilar meu kernel, tentei fazer o boot sem recompilar o kernel dando certo não busquei informações sobre como recompilá-lo.

Mas caso precise recompilar o kernel e o diretório /livecd/ já esteja com todo sistema copiado e devidamente configurado, copie o kernel recompilado e os módulos de /boot/kernel para a raiz do live CD, como no comando abaixo:

# cp -fr /boot/kernel/* /livecd/boot/kernel/

Criando a Imagem iso e Queimando o CD

Para poder carregar o sistema a partir do CD é necessário o arquivo cdboot se não tiver na instalação do HD copie do CD-ROM ambos estão no diretório boot a partir da raiz.

A imagem iso se faz com o comando:

# cd /
# mkisofs -b boot/cdboot -no-emul-boot -c boot/boot.catalog -V "livebsd" -o /live.iso livecd

Para fazer a gravação do CD:

# burncd -e -f /dev/acd0 data live.iso fixate

Informações Finais

Seguindo tudo isso, para mim funciona, basta instalar pacotes extras como para gravação de CDs e os necessários para seus testes e remover os arquivos extras como o ports em /usr/ports com 239MB, além do ports não creio que o código fonte em /usr/src com 99MB precise estar no live.

Tomei como base este artigo no Viva o Linux: http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=4414; veja este também de como reduzir o tamanho de uma instalação do FreeBSD: http://neon1.net/misc/minibsd.html.