miniBSD - Redunzindo FreeBSD  (ultima atualização: 8/27/2003)

Por muito tempo, eu soube que um dia onde eu me começaria um SBC pequeno (Single Board Computer) - somente tentativa por diversão. Quando eu vi aqueles que a Engenharia Soekris oferece, eu soube que seu SBC net4501 era exatamente o que eu queria.Um processador de baixa poder, três NICs de 10/100 e um cartão Compact Flash em vez de um disco rígido - o hardware perfeito para construir meu próprio roteador/firewall.

Assim eu requisitei um daqueles. Enquanto aguardava por chegar, eu quis saber que tipo de sistema operacional eu poderia executar nele. Eu sabia que tinha que ser algum sabor de UNIX, preferivelmente FreeBSD. Eu queria que a placa agisse como um roteador com NAT e firewall, como um pequeno servidor HTTP e FTP e como um servidor DHCP para minha LAN. Eu fiz a instalação "minima" do FreeBSD em um PC normal, mas encontrado que requer 80 MB. Meu objetivo era por tudo em um cartão CF de 64 MB e ainda ter o espaço amplo para dados do usuário. Eu sei que há algumas distribuições de Linux que enquadrariam minhas necessidades, mas eu não gosto de Linux muito de qualquer forma. Há um projeto, PicoBSD, que visa encaixar o FreeBSD em um único disco flexível, mas aquele é demasiado minimalistico para mim - eu queria algo entre uma instalação minima do FreeBSD e o PicoBSD.

Eu fiz uma outra instalação minima do FreeBSD e comecei-as procurar coisas que eu poderia remover a fim conservar o espaço. Após muito consertar, meu "miniBSD" pesou somente 22 MB (todos os binários ligados dinâmicamente) e teve ainda toda a funcionalidade que eu queria (incluindo ssh, FTP, perl e todos os comandos básicos um esperam em um sistema razoável de UNIX). Sem perl, ele coube em 12 MB aproximadamente.

Está assim aqui um guia de como começar se você estiver procurando a mesma coisa. Eu suponho que você tem já bastante conhecimento sobre FreeBSD a se decidir no seus próprios, por exemplo, que arquivos de dispositivo ou binários você necessita. Note também que isto não é um guia completo e uma vez que você é feito com ela você irá necessitar ainda customizar seu miniBSD para torna-lo útil. Eu suponho que você está tentando conseguir o mesmo objetivo - instalando FreeBSD em um net4501 - mas com algumas mudanças este guia aplica-se também a outras instalações (por exemplo em CD-ROM, disco rígido...).

Eu tenho agora meu net4501 ascendente e funcionando como um gateway PPPoE com NAT e Firewall, tão bem quanto um servidor web (thttpd) e servidor FTP. Trabalha como rocha-sólida!

Se você tiver quaisquer sugestões, o sucesso relata ou o que quer que, por favor me deixem saber em <[email protected]>. Você pode também enviar e-mail a mim com perguntas, mas por favor esteje ciente que eu não posso responder às perguntas de todos os newbies - busque em http://groups.google.com/ - eu posso quase sempre encontrar a resposta a minhas perguntas lá.

Finalmente, desculpe -me por quaisquer erros de ortografia/gramática - O inglês não é minha língua nativa (se você quer corrigir este original - vá em frente! :).

 


Tabela de conteúdos

  1. Instalando o FreeBSD
    1. chroot jail
  2. Fazendo a árvore do diretório
  3. Reconstruindo o carregador de boot
  4. Dinâmico vs. estáticos executáveis
  5. Copiando os binários
  6. Construindo o kernel
  7. Copiando as bibliotecas "libraries"
  8. Povoando o /etc
  9. /dev fun
  10. Usando Tar em tudo
  11. Gerando a image flash
  12. Copiando tudo para o cartão flash
  13. Carregando o novo sistema

História Revisão

8/27/2003

8/01/2003

7/06/2003

3/04/2003

2/28/2003

2/8/2003

11/16/2002

10/26/2002

10/11/2002

10/04/2002

09/22/2002

07/25/2002

07/10/2002

07/07/2002

07/06/2002


1. Instalando o FreeBSD

Primeiramente de tudo, você necessita uma instalação padrão de FreeBSD em um PC ou laptop normal. Eu não cobrirei este tópico em detalhe, porque eu suponho que você conhece FreeBSD a algum grau (ou seja disposto aprender:). Uma instalação mínima com fontes do kernel bastará. Este guia é baseada no FreeBSD 4.8, embora deva trabalhar com versões mais antariores, também. O FreeBSD 5.0 trabalha, também, mas o procedimento é um bocado diferente (cuidado com comentários sobre 5.0 nesta guia). FreeBSD 5.1 deve trabalhar quando usar o material novo do rc da geração, mas o programa "disklabel" foi substituído pelo "bsdlabel", e a sintaxe não é a mesma mais. Se você quiser usar 5.1, você terá que figurar comandos correspondentes do bsdlabel voce mesmo.

1.1 chroot jail

Enquanto nós estavamos preparando os binários para o miniBSD, nós estavamos sobrescrevendo alguns binários da base do sistema com nossas customizações, binários do net4501-tuned (para a causa do simplicidade nós não os instalamos diretamente em nosso diretório net4501, mas instalaremos dentro da base do sistema e copiaremos mais tarde). Se você não quiser hdanificar/mudar sua base do sistema de nenhuma maneira, você tem duas escolhas: um chroot jail ou um segundo disco rígido. O último é mais fácil - você apenas instala FreeBSD em um disco rígido separado (ou ao menos em uma partição separada) e use apenas para preparo do miniBSD, e nada mais. O outro método permite que você trabalhe em um "sandbox" sem requerer um segundo disco rígido ou partição.

Um chroot jail é consideravelmente fácil de instalar - você apenas faz um diretório em uma partição com espaço suficiente (recomendado 800 MB), diz, /usr/jail. Então você põe o CD-ROM da instalação do FreeBSD em seu drive, inicie /stand/sysinstall, começa uma instalação customizada e ajuste "Install Root" nas opções para apontar seu diretório jail. Após aquilo, você inicia a instalação e quando estiver feita você terá um "FreeBSD dentro do FreeBSD". Digite

chroot /usr/jail

e você encontrará que a raiz do sistema de arquivos foi mudada - o que você vê agora como root (/) em seu shell é realmente somente /usr/jail. Até que você não deixe esse shell, todas as modificações que você fizer ocorrerão somente em /usr/jail e seus subdiretórios. Você pode make world ou o que você quiser, e ele não afetará sua base do sistema.

Não se esqueça de que se você deixar o shell, você tem que chroot outra vez.

Contribuído por Murray Taylor: modifique a linha "set prompt" em /usr/jail/root/.cshrc se você quiser ser lembrado do fato que você está dentro do jail pelo prompt do shell:
set prompt = "MiniBSD %~ %# "


Você pode também querer copiar /etc/localtime para /usr/jail/etc/localtime para que os timestamps etc. sejam indicados corretamente.


2. 2. Fazendo a árvore de diretório

Nós uniremos nossa instalação inteira do miniBSD em um diretório, assim no fim nós poderíamos teóricamente somente copiar tudo deste diretório ao cartão flash. Eu o deixarei até você onde você está indo criar este diretório; o meu é /usr/minibsd e o resto do guia supõe que é o seu, demasiado (apenas certifique-se que você tenha cerca 100 MB de espaço sobrando na partição onde você criou). Feito isso, nós necessitamos povoar este diretório com alguns subdiretórios padrões (bin, dev, etc, usr, e assim por diante). Você poderia usar o mtree povoá-lo com diretórios vazios, mas eu prefiro fazê-lo manualmente. Está aqui a árvore dos diretórios que você tem que mkdir:

.
|-- bin
|-- boot
| `-- defaults
|-- dev
|-- etc
| |-- defaults
| |-- mtree
| |-- namedb
| |-- ppp
| |-- ssh
| `-- ssl
|-- mnt
|-- modules
|-- proc
|-- root
|-- sbin
|-- tmp -> /var/tmp
|-- usr
| |-- bin
| |-- lib | `-- aout
| |-- libexec
| |-- local
| |-- sbin
| `-- share
| `-- misc
`-- var

As permissões são 0755 (root.wheel) para todos os diretórios exceto /proc (0555). Você pode também querer chmod 0700 /root, mas aquela é uma matéria do gosto pessoal:)
Não se esqueça o link de /tmp ao /var/tmp - é por mais importante que o sistema de arquivo root seja mais tarde montado com somente-leitura (nós forneceremos sistema de arquivos de memória para /var).


3. Reconstruindo o carregador de boot

A BIOS do net4501 parece ter um erro pequeno em sua emulação do console serial - se você carregar um bootloader padrão de FreeBSD nele, espalhará os caráteres (por exemplo o "swoosh" "swoosh" (- \ | / - ...) toda sobre seu terminal. Quando o kernel carrega, coisas são normais outra vez, mas pode ser importante ver as mensagens de erro caso que o bootloader não pode carregar o kernel. Para reparar isto, nós temos que recompilar o carregador do boot (não se preocupe, é fácil e rápido).

Nota: você necessitará ter a distribuição de desenvolverdor instalada em sua base do sistema para recompilar o carregador de boot - apenas as fontes do kernel não são suficientes. Você pode instalar a distribuição de desenvolvedor com o /stand/sysinstall. Se você não pode/quiser recompilar o carregador de boot, você pode dar o download um carregador de boot pré-compilado (para 4.7-RELEASE) aqui. gunzip ele e jogue-o em /boot/loader. Não se esqueça o chmod 555.

Edite /sys/boot/i386/libi386/Makefile e comente a linha que lê

CFLAGS+= -DTERM_EMU

Deixe o editor, cd ao /sys/boot e digite make clean && make && make install (naturalmente isto mudará também o carregador de boot de sua base do sistema FreeBSD à não usa emulação do terminal, mas que não fere muito).


4. Dinâmicos vs. estáticos executaveís

Em uma instalação normal de FreeBSD, os binários em /bin e /sbin são ligados estaticamente, que significa que eles não dependem de nenhumas bibliotecas para funcionar. Isto deixa -os muito grandes, embora, e você pode conservar diversos MBs (aproximadamente 6.7 MB com meu conjunto de binários) ligando os dinâmicamente, também. Desde que nós mantemos tudo em uma partição, eles seriam ainda usaveis no modo mono-usuário porque as bibliotecas estão disponíveis. A única desvantagem é que se suas bibliotecas corroperem, você não poderá fazer muito no sistema para reparar. Decida-se por si mesmo se você quer os ligados dinâmicamente. Se você quiser, edite /etc/make.conf e adicione a linha.

NOSHARED=no

a este. Então cd para /usr/src/bin e digite make clean && make && make install. Faça o mesmo para /usr/src/sbin. Voilà.

NOTA: se você realmente executar o "make install" com NOSHARED=no definido em um sistema real do FreeBSD (não em um jail como explicado no capítulo 1.1), você deve realmente certificar-se de que seu diretório /usr está em sua partição root (não em uma partição separada). Se não seu reboot seguinte falhará horrívelmente porque /sbin/init está ligado dinâmicamente mas as bibliotecas requeridas não podem ser encontradas (desde que as outras partições não são montadas nesse tempo, ainda).

Se você sentir como economizar outros 400 KB (com meu conjunto binário), você pode fazer o mesmo para /usr/src/usr.bin, porque alguns binários lá (bzip2, gzip e tar entre outros) são também ligados estaticamente por default.


5. Copiando os binários

Agora, por divertimento ... Você pode agora ir visitar seus diretórios /bin, /sbin, /usr/bin, /usr/sbin, /usr/libexec e pegar os binários que você quer e copia-los em seus respectivos diretórios /usr/minibsd. Apenas brincadeira ;) Eu posso conservá-lo mais do trabalho duro. Eu fiz um pequeno script em perl que lesse uma arquivo que listasse todos binários necessários e os copiasse, recriando as ligações duras apropriadas no processo (por exemplo, /bin/ln e /bin/link são o mesmo arquivo, mas se você copia-los com cp, você termina com duas cópias de ln/link em seu sistema de arquivo do miniBSD, assim desperdiçando muito espaço).

Obtenha mkmini.pl e minha lista de binários, minibsd.files. Para FreeBSD 5.0, use minibsd5.files.

Agora execute mkmini.pl (certificando-se que seus diretórios /usr/minibsd/bin, /usr/minibsd/usr/bin, ..... estão vazios, se não mkmini.pl pode falhar enquanto tenta fazer os links):

perl mkmini.pl minibsd.files / /usr/minibsd

O mkmini.pl lerá a lista dos arquivos em minibsd.files e copiara-los de seu sistema em / para dentro de seu sistema de arquivo root miniBSD em /usr/minibsd. Minha lista de arquivos contem uma quantidade razoável de binários ajustados para sacrificar menor quantidade de funcionalidade para minha finalidade, mas cabe ainda bem em um cartão CF. As coisas como perl e sendmail faltam, entretanto, porque eu não os necessito realmente. Se você necessita, mude minibsd.files para refletir suas exigências.

Se você sentir como ecomizar quase 200 KB, você pode copiar o arquivo striped-down termcap do PicoBSD sobre o arquivo padrão /usr/minibsd/usr/share/misc/termcap. Você encontrará o arquivo de reposição em /usr/src/release/picobsd/mfs_tree/etc/termcap. O arquivo padrão termcap contem muitos tipos de terminais que você provavelmente não usará de qualquer maneira. Há também arquivos de serviços divididos em /usr/src/release/picobsd/mfs_tree/etc/services. (sugerido por Stuart Henderson)


6. Construindo o kernel

Você deve fazer um kernel customizado para conservar algum mais espaço e para incluir as opções específicas ao net4501 (você necessita ter sources/compilers instalados em sua base do sistema). Vá para /sys/i386/conf, faça uma cópia do GENERIC e edita-a. Você pode mais provavelmente jogar para fora coisas como controladores SCSI, NICs que você não necessite, susporte a USB, etc. Eu removi mesmo as coisas como CD9660 desde que eu não posso conectar um drive de CD-ROM ao meu SBC de qualquer maneira. Se você quiser algumas otimizações da CPU, edite /etc/make.conf agora (eu usei CPUTYPE=i486 desde que o net4501 é baseado em 486). Finalmente, adicione a seguinte linha ao seu arquivo de configuração do kernel:

options CLK_USE_I8254_CALIBRATION

Isto é becessário porque o CPU AMD Elan SC520 usado no net4501 funciona com clock em 1.1892 MHz em vez do padrão 1.19318 MHz. Se você não o usar, seu clock será provavelmente lento por diversos minutos por o dia (agradecimentos a Matt Peterson por apontar isto!).

No FreeBSD 4.7, é também sugerido adicionar as seguintes opções no kernel:

options CPU_ELAN
options HZ=250

Isto permitirá que o temporizador #2 de finalidade geral da CPU do Elan seja usado como um contador de tempo, que seja uma melhoria vasta excedente usando o temporizador i8254. O HZ tem que ser colidido de 100 a 250 , though. Permite também o dispositivo /dev/elan-mmcr acessar os registradores MMCR do Elan.

Desde que o net4501 não tem real hardware de video/keyboard, o kernel cairá no console serial. Os ajustes default são 9600 bps - se você quiser mudar aquilo, você terá que adicionar uma option CONSPEED=x ao seu arquivo de configuração do kernel. Você deve certificar-se de que a definição baud rate na comBIOS e nas configurações do kernel concordem. Eu defino apenas a comBIOS com velocidade a 9600, assim que nenhum ajuste na configuração do kernel é requerida. Há uma opção na comBIOS para impedir que o kernel mude a baud rate do console; Eu não verifiquei se isso funciona, entretanto.
Note que desde que o carregador de boot use as mensagens da saída da BIOS, nós não temos que se importar com ele porque a comBIOS automaticamente redicionará a saída ao console serial.

Agora faça

config MYKERNEL

(naturalmente substituindo MYKERNEL com o nome do arquivo de configuração que você criou)

e cd para /sys/compile/MYKERNEL (ou /sys/i386/compile/MYKERNEL para o FreeBSD 5.0). Faça um

make depend && make

Quando estiver feito, você deve ter seu kernel. Nós agora instalaremos ele gzippando para economizar mais espaço:

gzip -9 kernel

Para o FreeBSD 4.7:
cp kernel.gz /usr/minibsd
Para o FreeBSD 5.0:
mkdir -p /usr/minibsd/boot/kernel
cp kernel.gz /usr/minibsd/boot/kernel

O carregador do FreeBSD encontrará automaticamente o kernel .gz lá e gunzip ele antes de invocá-lo. Note que você poderia também usar o kgzip, porém você perderia todos os símbolos no processo e ferramentas como o top falharia. Desde que nós não nos importamos com os 300 KB adicionais que o carregador requer, nós faremos desta maneira.

Se você necessitar algum módulo (eu necessito alguns módulos do netgraph para o suporte PPPoE), você pode simplesmente copiá-los dentro de seu /usr/minibsd/modules (ou /usr/minibsd/boot/modules para o FreeBSD 5.0). Você os encontrará em sys/compile/MYKERNEL/modules/usr/src/sys/modules/[modulename]/*.ko. Somente o BTW, para suporte cliente PPPoE você necessitará netgraph.ko,
ng_ether.ko, ng_pppoe.ko e ng_socket.ko.


7. Copiando as bibliotecas

Nós não copiamos todas as bibliotecas essenciais em /usr/lib ainda. Estas não são listados em minibsd.files porque a lista de bibliotecas necessarias depende de que binários você instalou. Em uma versão mais adiantada desta guia, nós copiariamos todas bibliotecas em /usr/lib e então removeriamos aquelas que nós estariamos certos de que não seria requerido (por exemplo *.a). Esses sobraram muitas bibliotecas desnecessárias (aproximadamente 5.9 MB com FreeBSD 4.6) que encontram-se ao redor. Se você usar minha lista de arquivos (minibsd.files), as bibliotecas que são absolutamente necessárias pesam 3.2 MB - isto significa outros 2.7 MB economizados.

Eu escrevi um script, mklibs.pl, que anda através da sua árvore do miniBSD e usa o ldd em todos os binários extrair uma lista de somente daquelas bibliotecas que são
requeridas para ao menos um binário em seu sistema miniBSD.

Obtenha mklibs.pl agora e execute:

perl mklibs.pl /usr/minibsd > minibsd.libs

De um olhada na saída (minibsd.libs). Se parece OK, você pode usa-lo com o mkmini.pl:

perl mkmini.pl minibsd.libs / /usr/minibsd

As únicas bibliotecas que estão faltando ainda agora são os módulos do PAM. Fazendo um

cp -p /usr/lib/pam* /usr/minibsd/usr/lib

deve reparar isso. Se você não quiser todos os módulos do PAM (você provavelmente não necessitará os módulos do Kerberos, por exemplo), você deve copiar ao menos pam_deny, pam_permit, pam_unix, pam_login_access e pam_nologin. Para 5.x, mais módulos são necessários ao login, assim eu sugiro você copiar todos.
Finalmente, se você mkdir /usr/minibsd/usr/lib/aout, você evitar a mensagem de advertência que aparece de outra maneira.

É isto. Nosso diretório de bibliotecas foi povoado.


8. Povoando o /etc

Naturalmente nós necessitamos também arquivos de configuração para nosso miniBSD... Suas melhor aposta é provavelmente visitar seu /etc existente e copiar todos os arquivos/diretórios que você necessite ao /usr/minibsd/etc. Como um ponto inicial, está aqui minha árvore do /usr/minibsd/etc (arquivos que você terá que provavelmente modificar estão marcados de vermelho):

/usr/minibsd/etc
|-- auth.conf
|-- crontab
|-- defaults
|   |-- make.conf
|   `-- rc.conf
|-- dhclient.conf
|-- disktab
|-- fbtab
|-- fstab
|-- ftpusers
|-- gettytab
|-- group
|-- host.conf
|-- hosts
|-- hosts.allow
|-- hosts.equiv
|-- hosts.lpd
|-- inetd.conf
|-- localtime
|-- login.access
|-- login.conf
|-- master.passwd
|-- motd
|-- mtree
|   |-- BSD.include.dist
|   |-- BSD.local.dist
|   |-- BSD.root.dist
|   |-- BSD.sendmail.dist
|   |-- BSD.usr.dist
|   |-- BSD.var.dist
|   |-- BSD.x11-4.dist
|   `-- BSD.x11.dist
|-- namedb
|   |-- PROTO.localhost.rev
|   |-- make-localhost
|   |-- named.conf
|   `-- named.root
|-- networks
|-- newsyslog.conf
|-- objformat
|-- pam.conf
|-- passwd
|-- ppp
|   `-- ppp.conf
|-- profile
|-- protocols
|-- pwd.db
|-- rc
|-- rc.conf
|-- rc.diskless1
|-- rc.diskless2
|-- rc.firewall
|-- rc.i386
|-- rc.local
|-- rc.network
|-- rc.serial
|-- rc.shutdown
|-- rc.sysctl
|-- resolv.conf
|-- security
|-- services
|-- shells
|-- skeykeys
|-- spwd.db
|-- ssh
|   |-- primes
|   |-- ssh_config
|   |-- ssh_host_dsa_key
|   |-- ssh_host_dsa_key.pub
|   |-- ssh_host_key
|   |-- ssh_host_key.pub
|   `-- sshd_config
|-- ssl
|   `-- openssl.cnf
|-- sysctl.conf
|-- syslog.conf
|-- termcap -> /usr/share/misc/termcap
|-- ttys
`-- wall_cmos_clock

/etc/periodic está faltand aqui - eu encontro que eu posso fazer para fazer sem ele em meu SBC. Verifique se houver qualquer coisa em seu crontab que necessite ser removido (neste caso, os trabalhos 'periódicos' têm que ser removidos, também).

Edite o fstab e remova todas as montagens que você não necessita - você será deixado provavelmente com um fstab que pareça aproximadamente como este:

/dev/ad0a       /           ufs     ro      1   1
proc /proc procfs rw 0 0

Eu tenho meu sistema de arquivo root em ad0a desde que ad0 é o dispositivo que os cartões CF são associoados no net4501. Não se esqueça de mudar as opções 'rw' de seu sistema de arquivos root para 'ro' - nós queremos o FS root ser montado somente-leitura. Isto é necessário desde que a midia flash tem um numero limitado de ciclos de escrita até que desgaste. Se você o mantiver montado como leitura/gravação e o tiver arquivos log ou algo que escreva periodicamente, seu cartão flash não viverá por muito tempo (assim que dizem).

O arquivo seguinte nós temos que olhar é rc.conf. Você quererá muito provável desabilitar daemons como usbd ou sendmail. Meu rc.conf parece como este:

hostname="fb.neon1.net"
ifconfig_sis0="192.168.0.200 netmask 255.255.255.0"
kern_securelevel_enable="NO"
nfs_reserved_port_only="YES"
sendmail_enable="NONE"
sshd_enable="YES"
usbd_enable="NO"
inetd_enable="NO"
portmap_enable="NO"
diskless_mount="/etc/rc.diskless2"
update_motd="NO"
varsize=8192

o diskless_mount instrui o script de boot, /etc/rc, invocar /etc/rc.diskless2, que é fornecido com o FreeBSD por default e serve para montar sistemas de arquivos em memória para /var e /dev. varsize define o tamanho desse sistema de arquivos a 4 MB (8192 blocos) - você pode ter que mudar que se você tiver que mudar e registro grandes em lá. update_motd instrui o rc para não tentar atualizar dos índices /etc/motd com o nome atual do release do sistema - não poderá fazer isso, desde que / esteja montado como somente-leitura.

FreeBSD 5.0 somente: adicione
rc_ng="NO"
a seu rc.conf assim o FreeBSD usará o velho-estilo de configuração do rc em vez do material novo /etc/rc.d.
Isto não trabalhará para FreeBSD 5,1! Você tem que adicionar /sbin/rcorder ao seu sistema miniBSD e editar /etc/rc.d/diskless para remover a verificação a uma montagem NFS (assim que ela executa sempre diskless) para fazer trabalhar com 5.1.

Não se esqueça de editar /etc/newsyslog.conf para rotacionar arquivos de log mais frequentemente e não arquiva-las. Você provavelmente não quererá muitos registros de qualquer maneira, desde que todos seus arquivos log serão perdidos quando você rebootar sua máquina.

Se você estra executando dhclient (isto é se você quiser sua máquina miniBSD agir como um cliente de DHCP), recorde que dhclient tenta escrever informação do nameserver obtida através do DHCP ao arquivo /etc/resolv.conf. Isto não é normalmente possível, naturalmente, porque o filesystem root é de somente-leitura. A solução é um symlink /etc/resolv.conf ao /tmp/resolv.conf.
Agradecimentos a Roddy Collins que apontou isto!

Naturalmente há outras modificações que você pode ter que fazer para tornar seu sistema útil, mas como I digo, estes são documentados em outra parte e eu não pretendo reinventar a roda.

Não se esqueça de que se você fizer quaisquer mudanças a master.passwd, você terá que reconstruir a base de dados com

pwd_mkdb -p -d /usr/minibsd/etc /usr/minibsd/etc/master.passwd

Se você sente como economizando alguma memória extra, abra o rc.diskless2 e mude a linha que lê

mount_md 4096 /dev 3 512

para

mount_md 1024 /dev 3 512

...Eu achei que 512 KB são bastante para meu arquivos de dispositivo :) Você pode ser capaz de reduzir mesmo mais essa figura, mas esteja certo que todos os arquivos do dispositivo caberão nelas! (df é seu amigo)

Se você quiser começar livre do atraso de 10 segundos do boot, edite /usr/minibsd/boot/loader.rc e adicione a linha

autoboot 0

a ele.

Se você quiser poder registrar realmente em seu net4501 através do console serial (nao somente veja o loader/kernel/mensagens de boot), edite /etc/ttys e mude a linha que lê

ttyd0 "/usr/libexec/getty std.9600" dialup off secure

para

ttyd0 "/usr/libexec/getty std.9600" vt100 on secure

Mude a velocidade, se necessário.


9. /dev fun

FreeBSD 5.0: agradecimentos aos devfs, você pode saltar esta seção!

Para carregar e executar seu sistema miniBSD, você necessita também de alguns arquivos especiais de dispositivo. O FS em que residem te que ser montado como leitura/gravação para que todo o material como getty funcionar, assim que rc.diskless2 construam uma FS memória para ele. O kernel ainda esperará encontrar o arquivo dispositivo da partição root para montar dentro partição root, assim que nós construiremos um /dev completo em nosso FS root do miniBSD. Comece fazendo

cp /dev/MAKEDEV /usr/minibsd/dev
cd /usr/minibsd/dev
sh MAKEDEV all

Certifique-se que você tem o arquivo de dispositivo para sua partição root do miniBSD! (use sh MAKEDEV [name] se você não tem). Se você sentir como economizando alguns KBs extra de espaço, verifique os índices de /usr/minibsd/dev e apague tudo que você não necessite (por exemplo, da * arquivos de disco SCSI, ad[1-3]*, e assim por diante).

O rc.diskless2 espera encontrar um arquivo chamado /conf/dev.cpio.gz com todos os arquivos de dispositivo - se não puder, ele irá find(1) todos os arquivos de dispositivo em sua partição root e gerar o arquivo cpio em /tmp. Isto pode levar um "longo" tempo, assim que nós pre-criaremos esse arquivo:

cd /usr/minibsd
mkdir conf
find -x dev | cpio --create -H newc | gzip > conf/dev.cpio.gz

É isso. Nós temos agora duas cópias de nossos arquivos de dispositivo - uma em /dev na partição root, e uma no arquivo dev.cpio.gz mencionado acima. Quando seu carrega sistema, o kernel irá encontrar os arquivos de dispositivos previstos na FS root, então o rc.diskless2 montará um sistema de arquivos memória e povoará-lo com os mesmos arquivos de dispositivo assim que o /dev é leitura-escrita para mais tarde.


10. Usando Tar em tudo

Por causa da inabilidade acima mencionada do cp reproduzir as hard links, nós construiremos um arquivo tar de nossa instalação inteira do miniBSD. Faça o seguinte:

cd /usr/minibsd
tar cfvz /usr/minibsd-46-1.tgz *

Naturalmente, o nome do arquivo .tgz é uma matéria do gosto pessoal:)
Quando feito, você estará restando um arquivo .tgz que contem tudo (bem, quase) para seu miniBSD.


11. Gerando a imagem flash

Embora nós poderíamos usar o cartão CF como um disco rígido, o disklabel e o newfs ele e explodir nosso arquivo do tar diretamente nele, eu sinto que é mais fácil e mais rápido fazer essa tarefa em uma imagem de disco e dd que diretamente no cartão flash - adicionalmente, prolonga a vida do cartão CF escrevendo todos setores somente uma vez.

Nós usaremos o vnconfig começar um disco virtual que nós podemos disklabel. Você terá que saber o tamanho de seu cartão flash em setores (512 unidades de byte), mas você não pode figurar este para fora sem realmente conectar o cartão a sua máquina (veja o começo da seção seguinte para a informação de como fazer isto). Uma vez que você conectou, use o seguinte comando para encontrar o número de setores:

disklabel -rwn ad[n] auto | grep sectors/unit

... naturalmente substituindo o número de dispositivo apropriado de seu cartão flash para [ n ].

Sugestão: se o disklabel relatar erros como "Nenhum espaço restando no dispositivo", tente o seguinte comando primeiramente:
dd if=/dev/zero of=/dev/rad[n] bs=1k count=20
Isto apagará toda a informação da partição que pode já estar presente no cartão CF.

Nota: você pode ter que criar primeiramente o dispositivo fazendo cd /dev; sh MAKEDEV ad[n].

Agora nós criaremos uma imagem de disco do mesmo tamanho, enchida inicialmente com os zeros:

dd if=/dev/zero of=/usr/minibsd-disk.bin bs=512 count=[number of sectors on your flash card]

Vamos usar este arquivo de imagem de disco como um dispositivo vn assim que nós podemos disklabel ele:

FreeBSD 4.7:
vnconfig -s labels -c vn0 /usr/minibsd-disk.bin
FreeBSD 5.0:
mdconfig -a -t vnode -u 0 -f /usr/minibsd-disk.bin
(use md0 em vez de vn0 para o FreeBSD 5.0 nos seguintes comandos)

Nosso disco virtual novo tem que ser particionado e o sistema de arquivo criado. Use:

disklabel -Brw vn0 auto
disklabel -e vn0

Você será deixado cair em seu editor. Encontre a linha que começa com c: e duplique -a, mudando o c: para a: e o fstype para 4.2BSD. Esta é nossa partição root, que medirá sobre a fatia inteira. Se você quiser uma segunda partição (por exemplo para informação da configuração), reduza o tamanho do a: a fatia pela quantidade de espaço que você quer para sua segunda partição, a seguir faça uma outra linha que comece com e:, um offset igual ao tamanho de a:, e um tamanho igual ao que você subtraiu de a:. Salve.

Note que nós não temos uma partição de troca - não há nenhum local para pô-la. Você não pode pôr partições de troca em seu cartão flash - é meio tão lento e arruinaria logo seu cartão. Assim você é melhor certificar-se de que você tenha conseguido bastante memória para suas aplicações...

Agora deixe-nos newfs e montar nossa partição:

newfs -b 8192 -f 1024 -U /dev/vn0a
mount /dev/vn0a /mnt

(se você fizer uma segunda partição mais adiante, não se esqueça aos newfs de que um, também). Assim nós conseguimos nosso disco virtual montado em /mnt, e nós estamos agora pronto para explodir nosso .tgz nele:

cd /mnt
tar xfvzP /usr/minibsd-46-1.tgz

É isto. Deixe-nos limpar acima:

cd /
umount /mnt

FreeBSD 4.7:
vnconfig -u vn0
FreeBSD 5.0:
mdconfig -d -u 0


12. Copiando tudo para o cartão flash

Este é um bocado complicado. Você poderia netboot (com PXE) seu net4501 com o cartão CF instalado e copiar tudo pela rede, mas preparar um FreeBSD bootavel para esta finalidade não é completamente simples, tampouco. Você necessitará algum tipo de adaptador a fim conectar seu cartão CF a sua base do sistema. Se sua base de sistema for um notebbok, você pode usar um CF -> adaptador PCMCIA (permita o pccardd e você verá cartão como um dispositivo ATAPI, como por exemplo ad8) ou um CF -> adaptador IDE se for uma máquina desktop. Uma ou outra maneira, você terminará com um dispositivo do ad[n] que represente o cartão CF (se comporta como um disco rígido IDE).

Se você não tiver ainda os arquivos de dispositivo para seu dispositivo ad[n] no /dev de sua base da instalação do FreeBSD, de cd para /dev e sh MAKEDEV ad[n] agora.

Nós podemos agora simplesmente transferir a imagem de disco que nós criamos no passo anterior bloco-por-bloco em nosso cartão flash:

dd if=/usr/minibsd-disk.bin of=/dev/rad[n] bs=8k

(certifique-se que você obteve o valor correto para [n] neste comando ou você pode apagar seu disco rígido!!!)

Se você quiser ver o progresso, digite Ctrl-T.


13. Carregando o novo sistema novo

Desligue sua base do sistema, remova o cartão flash e ponha-o em seu net4501. Conecte ele porta do console a algum PC e execute um terminal emulator. Você está agora pronto para carregar seu novo sistema miniBSD - ligue seu net4501. Não se apavore se não carregar corretamente - leia as mensagens de erro, o mais provavelmente é somente um arquivo faltando em algum lugar.

Se você vir avisos como o seguinte:

Warning: Block size restricts cylinders per group to xx.

você pode com segurança ignorá-los.

Uma vez que você have.got o acima e executando, você pode começar abilitando os vários daemons que você necessita, configure o ipfw, ppp, natd, o que quiser. Veja a próxima seção para ajuda em instalando ports.

Se você necessitar montagem-leitura-escrita para o sistema de arquivo root, use

mount -uw -o noatime /

Não esqueça de fazer

mount -ur /

quando você terminar!

A flag noatime indica que o atime (tempo do último acesso) não deve ser atualizado. Sem noatime, cada acesso do arquivo (ainda se for somente uma leitura) resultará em uma escrita ao cartão CF, causando desgaste mais rapidamente. O atime não é normalmente necessário.

AVISO: alguns pessoas acreditam que remontando um sistema de arquivo de escrita como somente-leitura outra vez poderia conduzir ao corrupção do sistema de arquivos a longo prazo. Eu não sei se é verdadeiro ou não, mas eu não descartaria essa possibilidade. Ao menos aconteceu-me uma vez que eu não poderia remontar ro sem usar a flaf -f (force) (uma coisa muito ruim fazer) porque alguns processos daemon tinham aberto um arquivo leitura-gravação no entanto (através do fstat não me diria sobre isso). Assim eu suponho que a maneira mais segura deveria fazer um reboot limpo após ter montado um sistema de arquivo leitura/gravação.

Se você fizer quaisquer mudanças em seu funcional net4501, eu sugiro fazê-las também em sua base do sistema FreeBSD (no seu /usr/minibsd ou o que quiser que você escolheu). Isto fará coisas muito mais fáceis quando for hora de atualizar a próxima release do FreeBSD. :)

Note que é uma boa idéia gerar agora novas chaves ssh, desde que de outra maneira seu net4501 compartilharia do mesmo conhunto de chaves com seu sistema base:

ssh-keygen -t rsa1 -N "" -f /etc/ssh/ssh_host_key
ssh-keygen -t rsa -N "" -f /etc/ssh/ssh_host_rsa_keyssh-keygen -t dsa -N "" -f /etc/ssh/ssh_host_dsa_key


Apêndice A - Instalando ports

Você irá querer muito provável instalar alguns ports para começar seu sistema fazer algo útil. Você pode apenas carregar sua base do sistema, então construir o port enquanto
usual mas especifique PREFIX=/usr/minibsd/usr/local quando fazendo make install. Se você quiser fazer extra-cleanly, instale o port em sua base do sistema, então imagine que binários/bibliotecas/arquivos de configuração/scripts rc.d você REALMENTE os necessita e copie-os a suas respectivas posições em /usr/minibsd.
Contribuido por Tom Thompson: você pode usar pkg_info -qxl [package name] para ajudar encontrar quais arquivos foram instalados por um port em particular.


Apêndice B - Mas eu quero meu perl!

OK, OK... Isto tomará aproximadamente uns 10 MBs adicionais (sem pod). Adicione a linha

usr/bin/perl:usr/bin/perl5:usr/bin/perl5.00503

a seu minibsd.files. Copie em /usr/libdata/perl (você pode omitir /usr/libdata/perl/pod). Certifique-se que você obteve as corretas permissões (usando tar e usando o tar com -P enquanto está extraindo é a maneira a mais fácil).


Apêndice C - Salvando dados através de um reboot

Se você executar algo como o dhcpd em seu net4501, você encontrará que seus arquivos é perdida toda vez que você reboot/power seu net4501. Eu fiz uma pequena partição separada em meu cartão flash somente com a finalidade de conservar os índices /var/db antes de desligar. Somente adicione as seguintes linhas a seu rc.shutdown, apenas onde diz "Insert other shutdown procedures here":

# Save databases
echo -n 'Saving databases in /var:'
mount -u -o rw /conf
rm -Rf /conf/varsave/dbcp -Rp /var/db /conf/varsave
mount -u -o ro /conf
echo '.'

Você necessita ter uma entrada no fstab para /conf, e o diretório /conf/varsave deve existir. Adicione o seguinte ao seu rc.local (crie-o se não existir) para restaurar as bases de dados no boot:

# Load saved databases
cp -Rp /conf/varsave/db /var

Note que o rc.shutdown é somente invocado se você encerrar seu sistema com shutdown(8), não com halt/reboot(8). Use shutdown -h now preferencialmente.


© 2002 por Manuel Kasper <[email protected]>. Todos direitos são reservados.
© 2003 por Traduzido por Gustavo Fukao <[email protected]>.

 

Hosted by www.Geocities.ws

1