TinyCore Linux - Passos iniciais

Para este sistema, que eventualmente vai ser um servidor chamado verynice, criei uma VM com 256MB de RAM e 640MB de disco.

O TinyCore1 é uma instalação Linux muito especial, devotada a sistemas com muito poucos recursos. Vou usar a versão CorePlus, a mais “luxuosa”, com ambiente gráfico e possibilidade de instalação em disco, mas há versões Core muito mais frugais que correm alegremente de uma pen USB carregando-se para uma RAMdrive no arranque.
O seu modo de funcionamento é muito particular, porque o core do sistema é completamente separado das aplicações e configurações, e estas só são aplicadas no arranque seguinte se forem explicitamente guardadas.
Muito poucas concessões são feitas à conveniência e user-friendliness, todos os comandos da shell por defeito (busybox)2 são extremamente simplificados em relação a uma distribuição Linux normal e os utilitários de gestão são os do Unix/Linux de há dez anos.

Instalação

Descarrega-se do site da distribuição TinyCore (http://tinycorelinux.net/) o instalador da versão CorePlus (na página Downloads, http://tinycorelinux.net/11.x/x86/release/CorePlus-current.iso)
Coloca-se o ISO na drive óptica virtual da VM e inicia-se a VM.
Escolhe-se a opção por defeito: FLWM topside

Na doca ao fundo do ecrã, abre-se a aplicação tc-install3

Escolhem-se as opções: Frugal, Whole disk, e depois desta última, o disco sda. Confirmar que Install boot loader está activado. Clicar em >

Formatting Options: ext4 >

Boot options a colocar no instalador (consultar a lista apresentada no ecrã, ou o capítulo 10 do livro oficial do Tiny Core Linux, Into the Core):

tce=sda1 home=sda1 opt=sda1 nodhcp showapps safebackup cron syslog host=verynice kmap=qwerty/pt-latin1.kmap

(Mude o hostname para algo mais adequado para si, obviamente)

O teclado está em layout US, por isso:

  • o caracter = está na tecla «
  • e o caracter / está na tecla

Clicar em >

Tipo de instalação

Eu escolhi Core and X/GUI Desktop mas seguindo este guia, talvez não seja necessário o GUI e se possa escolher Core Only
A única extensão que se vai instalar é Non-US keyboard layout support
Clicar em >

Na realidade, depois de ter o CoreLinux instalado e a rede configurada, esta extensão pode-se instalar com bastante facilidade a partir do gestor de extensões, por isso também não é obrigatório utilizar o instalador CorePlus para ter teclados internacionais, um instalador mais leve seria suficiente. Mas esta é a opção mais geral.
O mesmo pode não ser verdade para o suporte a placas Wi-Fi, que também se escolhe neste painel mas que eu não testei.
Revêm-se as configurações e clica-se em Proceed

Clicar no ícone Exit da doca, opção Shutdown, OK

Quando a instalação terminar, retirar o ISO da drive óptica e reiniciar a VM.

Configurações iniciais

Mudar as opções de arranque

Se for preciso mudar as boot options: editar /mnt/sda1/tce/boot/extlinux/extlinux.conf e mudar o conteúdo da linha APPEND

Teclado português

Abrir o Terminal e testar uma tecla específica do teclado PT-pt; se o resultado não for o esperado (o boot option kmap não estiver a activar o layout PT-pt), usar o comando

1
echo 'loadkmap < /usr/share/kmap/qwerty/pt-latin1.kmap' >> /opt/bootsync.sh
  • o caracter - está na tecla '
  • o caracter / está na tecla
  • o caracter ' está na tecla º

Seguido de (já explicarei estes comandos):

1
2
filetool.sh -b
sudo reboot

Configurar permanência

Sem este passo, o TinyCore Linux não vai guardar automaticamente as alterações que fizermos à configuração, porque depois de cada reinício, todas as configurações são perdidas excepto aquelas que dissermos que queremos guardar (o que tem vantagens e desvantagens).
O processo abaixo configura a gravação automática das configurações em caso de shutdown do sistema, através do script que o sistema corre automaticamente durante o shutdown.

1
vi /opt/shutdown.sh

Por baixo da linha #put user shutdown commands here, acrescentar:

1
filetool.sh -b

Guardar e sair. O comando para forçar a gravação desta alteração é, claro,

1
filetool.sh -b

Mudar a palavra passe do utilizador por defeito (tc)

1
passwd

Colocar uma palavra-passe que lhe apeteça.

Adicionar um ficheiro de configuração à Permanência

Para guardar um ficheiro de configuraçºao, como o ficheiro das palavras-passe, depois de um reinício (dar-lhe permanência), o caminho do ficheiro a guardar, menos o / inicial, é colocado no ficheiro /opt/.filetool.lst

1
2
sudo echo 'etc/shadow' >> /opt/.filetool.lst
filetool.sh -b

Rede

Para configurar uma interface de rede numa versão do CoreLinux com o ambiente gráfico, usar o comando sudo network numa janela de terminal (estes valores servem apenas de exemplo):
Interface: eth0
DHCP Broadcast: no
IP Address: 10.123.130.6
Net mask: 255.255.255.248
Broadcast: 10.123.130.7
Gateway: 10.123.130.1
NameServers: 1.1.1.1, 8.8.8.8
Save Configuration: yes
Apply

Testar com ping 1.1.1.1
Confirmar a configuração com cat /opt/eth0.sh
Deve ser:


#!/bin/sh
pkill udhcpc
ifconfig eth0 10.123.130.6 netmask 255.255.255.248 broadcast 10.123.130.7 up
route add default gw 10.123.130.1
echo nameserver 1.1.1.1 > /etc/resolv.conf
echo nameserver 8.8.8.8 >> /etc/resolv.conf

Para configurar a rede sem se ter acesso ao modo gráfico, basta copiar a informação acima para /opt/eth0.sh
Confirmar que o /opt/eth0.sh está configurado para ser adicionado à permanência com o comando

1
cat /opt/.filetool.lst | grep eth0

opt/eth0.sh

Se não estiver,

1
echo "opt/eth0.sh" >> /opt/.filetool.lst && filetool.sh -b

Aliases

Os aliases do utilizador por defeito (tc) estão em ~/.ashrc. Acrescentei estes aliases que julgo úteis:

1
2
3
4
#filtrar o syslog
echo "alias log='grep /var/log/messages -e'" >> ~/.ashrc
#usar sudo com aliases	
echo "alias sudo='sudo '" >> ~/.ashrc			

E seria bom ter esses aliases (e os outros, como ll='ls -l' e especialmente rm='rm -i') se estivermos numa rootshell; copiar os ficheiros necessários para a pasta /root e dizer ao CoreLinux que queremos guardar o conteúdo da pasta /root entre arranques:

1
2
sudo cp /home/tc/.ashrc /root/.ashrc && sudo chown root:root /root/.ashrc
echo "root" >> /opt/.filetool.lst && filetool.sh -b

Configurar Time Zone

Fonte
Confirmar que estamos na pasta home do utilizador: cd ~
Assegurar que temos ligação ao exterior (por exemplo, ping 1.1.1.1)
O comando tce-fetch.sh descarrega uma extensão sem a instalar. Neste caso queremos a extensão tzdata.tcz (Time Zone data.TCextension Zipped)

1
tce-fetch.sh tzdata.tcz

O CoreLinux pode montar as extensões directamente para leitura (é, de resto, como ele “instala” uma extensão). Criar uma pasta e montar:

1
2
mkdir tztemp
sudo mount tzdata.tcz tztemp -t squashfs -o loop,ro

Copiar a informação de timezone de Lisboa para o local por defeito, /etc/localtime

1
sudo cp -a tztemp/usr/local/share/zoneinfo/Europe/Lisbon /etc/localtime

Dar permanência à configuração:

1
2
sudo echo "etc/localtime" >> /opt/.filetool.lst
filetool.sh -b

Acesso remoto por OpenSSH

Fonte
Assegurar que temos ligação ao exterior (por exemplo, ping 1.1.1.1)
O comando tce-load -wi instala directamente uma extensão de modo permanente:

1
tce-load -wi openssh.tcz

Criamos a configuração do serviço OpenSSH copiando a configuração por defeito fornecida com a extensão:

1
2
cd /usr/local/etc/ssh
sudo cp -a sshd_config.orig sshd_config

Arrancamos o serviço com o script fornecido pela extensão:

1
sudo /usr/local/etc/init.d/openssh start

Verificar o serviço com

1
netstat -anp | grep 22

Tcp	0	0  0.0.0.0:22		0.0.0.0:*		LISTEN
1470/sshd

Primeira ligação

Com o sshd_config que vem por defeito com a extensão é obrigatório ter uma palavra-passe configurada para o utilizador inicial tc, por isso se a palavra-passe não estiver configurada é necessário fazê-lo agora (é possível configurar host-based auth ou chaves assimétricas, mas só depois de editar o sshd_config)

1
2
3
passwd
#Colocar a palavra-passe do costume duas vezes
sudo echo "etc/shadow" >> /opt/.filetool.lst && filetool.sh -b

Testar, logando por SSH com um cliente (como o PuTTY em Windows):

Garantir que as configurações do SSH são guardadas:

1
sudo echo "usr/local/etc/ssh" >> /opt/.filetool.lst && filetool.sh -b

Colocar o serviço a arrancar com o sistema

Ai, que me deu aqui um baque de nostalgia… Era assim que se fazia antes do SystemD:

1
sudo echo 'usr/local/etc/init.d/openssh start &' >> /opt/bootlocal.sh && filetool.sh -b

(Aaahhhh… nem por isso. O SystemD é um enorme avanço sobre tricotar shell scripts e gerir dependências à unha, mas seria mais pesado que o resto do CoreLinux inteiro…)

Instalar um editor de texto (vim)

Chamar o gestor de aplicações em modo texto:

1
tce-ab

S)earch
Enter starting chars of desired extension, e.g. abi:

Escrever vim, tecla Enter


tce - Tiny Core Extension browser
         1. gvim-base.tcz
         2. gvim-doc.tcz
         3. gvim.tcz
         4. gvim-tutor.tcz
         5. vim-locale.tcz
         6. vim.tcz
Enter selection ( 1 - 6 ) or (q)uit:
6

É mostrada a informação About da extensão; q para sair e mostrar o menu:


A)bout I)nstall O)nDemand D)epends T)ree F)iles siZ)e L)ist S)earch P)rovides K)eywords or Q)uit:
i
vim.tcz.dep OK
Downloading: gvim-base.tcz
Connecting to repo.tinycorelinux.net (89.22.99.37:80)
saving to 'gvim-base.tcz'
gvim-base.tcz        100% |************************************************************************************| 8036k  0:00:00 ETA
'gvim-base.tcz' saved
gvim-base.tcz: OK
Downloading: ncursesw.tcz
Connecting to repo.tinycorelinux.net (89.22.99.37:80)
saving to 'ncursesw.tcz'
ncursesw.tcz         100% |************************************************************************************|  212k  0:00:00 ETA
'ncursesw.tcz' saved
ncursesw.tcz: OK
Downloading: vim.tcz
Connecting to repo.tinycorelinux.net (89.22.99.37:80)
saving to 'vim.tcz'
vim.tcz              100% |************************************************************************************| 1432k  0:00:00 ETA
'vim.tcz' saved
vim.tcz: OK
 vim.tcz
A)bout I)nstall O)nDemand D)epends T)ree F)iles siZ)e L)ist S)earch P)rovides K)eywords or Q)uit:

Q para sair ou S, P, ou K, para encontrar mais extensões a instalar. Por exemplo, coreutils.tcz instala os comandos GNU/POSIX mais vulgares em versões mais completas que as integradas no busybox, e bash.tcz instala essa shell em vez do busybox (mas como o TinyCore não nos segura nas mãozinhas, é necessário ir ao /etc/passwd mudar a login shell do utilizador, configurar o /etc/passwd para ser guardado no backup, e fazer o backup)

Configurar o vim

1
2
cd ~
vim .vimrc

Configurar no ficheiro as opções desejadas (uma vez que está na pasta /home/tc/, será guardado automaticamente pelas boot options que demos, nomeadamente home=sda1).
Uma sugestão para um .vimrc está na página Dotfiles.
Depois de o ter configurado a nosso gosto, seria bom manter a configuração mesmo quando estamos a editar um ficheiro como o utilizador root. Para conseguir isso, copia-se o .vimrc para a pasta pessoal do root:

1
2
sudo cp /home/tc/.vimrc /root
sudo chown root:root /root/.vimrc

(ver a secção Aliases para o comando que adiciona a pasta /root à Permanência, se já não estiver)

Cliente NTP

Se o relógio de sistema não estiver correcto a comunicação entre um serviço local e os servidores na WAN pode ser recusada por estes últimos. E numa VM VirtualBox sem GuestAdditions, o relógio vai estar quase sempre errado.
Apesar de existir um pacote chrony para o TinyCore, usei apenas um cliente NTP4 muito básico, porque estava interessado em aligeirar o mais possível o sistema .

1
tce-load -wi ntpclient.tcz

Downloading: ntpclient.tcz
Connecting to repo.tinycorelinux.net (89.22.99.37:80)
saving to 'ntpclient.tcz'
ntpclient.tcz        100% |********************************| 12288  0:00:00 ETA
'ntpclient.tcz' saved
ntpclient.tcz: OK

Configurar o cliente

Colocar no /opt/bootlocal.sh três instruções com diferentes propósitos:

1) Actualizar o relógio durante o arranque5

Caso não tenhamos DNS disponível nesta fase do arranque, precisamos de usar directamente IPs e não nomes, por isso não podemos usar uma pool. Neste caso, vamos pedir a hora aos servidores da Hora Legal de Portugal6

1
echo "ntpclient -c 1 -s -t -h 194.117.47.42 || ntpclient -c 1 -s -t -h 194.117.47.44" >> /opt/bootlocal.sh

2) Sincronizar o RTC

Mas o TinyCore, até lhe dizerem o contrário, ignora esta hora e vai sempre buscar a hora do relógio de hardware, que sem Guest Additions não sabe perguntar ao host e arranca na mesma hora em que a VM foi desligada. Depois de recebermos a hora de sistema a partir de um servidor NTP, temos de actualizar o relógio de hardware com o comando hwclock -w

1
echo "hwclock -w" >> /opt/bootlocal.sh

3) Corrigir o desvio de tempo

Depois é não deixar que o relógio se vá desviando durante a operação do sistema, criando um processo que verifica periodicamente o tempo correcto:6

1
echo "/usr/local/bin/ntpclient -c 0 -l -t -i 300 -h 3.pt.pool.ntp.org &" >> /opt/bootlocal.sh
Um detalhe importante é que em caso de reboot, o relógio avança uma hora, mas correndo os dois primeiros comandos manualmente no final do arranque o tempo fica imediatamente corrigido. Não sei se é bug ou problema da minha configuração, tentei todas as combinações de UTC e localtime no Virtualbox e no TinyCore e não resolveu.
Começando de desligado, funciona bem.

Conclusão

O TinyCoreLinux é muito pequeno, mas isso tem os seus custos.
Tudo tem de ser configurado, tudo tem de ser definido como persistente.
Comporta-se mais como um container do que como uma instalação vulgar.
Nisso, tem boa companhia, porque o AlpineLinux tem exactamente a mesma atitude, e também é muito popular como base para containers (é o default do Docker) e sistemas embedded.
No entanto, parece-me que o TinyCore já começa a dar demasiado trabalho para aquilo que poupa em recursos. Já não estamos assim tão desesperados, geralmente.
Para um sistema realmente minimalista, existe uma versão ainda mais reduzida, o MicroCoreLinux (ou simplesmente Core), sem ambiente gráfico e com apenas 8MB.
Para algo que me permitiria ser produtivo rapidamente, tenho esperança no AlpineLinux, que vou tentar testar em breve.


  1. http://distro.ibiblio.org/tinycorelinux/ ↩︎

  2. https://busybox.net/ ↩︎

  3. http://tinycorelinux.net/install.html ↩︎

  4. -c = count <vezes>; -s = set; -t = trust; -h = host <endereço_servidor_NTP> ↩︎

  5. http://oal.ul.pt/hora-legal/como-acertar/ ↩︎

  6. -c 0 = sem limite de tentativas; -l = lock; -i = intervalo ; este comando usa nomes e presume-se que existe resolução DNS ↩︎