Você está na página 1de 13

Distribuição Linux

1/13
2/13
#preparar pen

3/13
#como root, assumindo que a pen corresponde a /dev/sdb
umount /dev/sdb*
dd if=/dev/zero of=/dev/sdb bs=1M count=4 conv=fsync
fdisk /dev/sdb
# criar partição de arranque com 20 MB ('n','p',1,1,+20M, 'a',1)
# criar outra partição com o restante espaço
# concretizar alterações e terminar ('w')

#retirar pen e voltar a inserir


mkfs.ext2 /dev/sdb2
mkfs.vfat /dev/sdb1
syslinux -s /dev/sdb1
mkdir pen
mount /dev/sdb1 pen
cd pen
#fazer download do ficheiro linux26 para este directório
#(usar wget)
#
#Criar o ficheiro syslinux.cfg com o conteúdo abaixo:

LABEL pico
KERNEL linux26
APPEND ramdisk_size=2048 initrd=picord.gz

LABEL micro
KERNEL linux26
APPEND ramdisk_size=2048 initrd=micrord.gz vga=789

LABEL mini
KERNEL linux26
APPEND ramdisk_size=2048 initrd=minird.gz vga=789

LABEL full
KERNEL linux26
APPEND ramdisk_size=2048 initrd=fullrd.gz vga=789 init=/sbin/init

cd ..

4/13
# pico

# Criar initrd
dd if=/dev/zero of=initrd.img bs=1k count=2000
mkfs.ext2 initrd.img
# Montar initrd
mkdir initrd
mount initrd.img initrd -o loop
cd initrd
#fazer download do ficheiro ash para o directório actual
#
#criar ficheiro linuxrc com o conteúdo abaixo:

#!/ash
# Beep
echo -e "\007"
# Hello
echo ""
echo " Pico ARCOM Linux"
echo ""
echo " ISEP, 2009"
echo ""
echo " Nº dos Alunos"
echo ""

# Shell
/ash

chmod 755 ash linuxrc


cat linuxrc
# Criar /dev/console
mkdir dev
cd dev
mknod console c 5 1
ls -la
# Desmontar initrd
cd ..
ls -la
cd ..
umount initrd
gzip initrd.img
# copiar initrd para pendrive (após montar pendrive em pen)
umount /dev/sdb1
mount /dev/sdb1 pen
cp initrd.img.gz pen/picord.gz
# Desmontar pendrive
umount pen

#testar no qemu
qemu -k pt -hda /dev/sdb1 -hdb /dev/sdb2

(após o arranque, deverá surgir a linha de comando do syslinux, no qual


deverá introduzirá a opção “pico”)

#testar na ebox

5/13
# micro

# Montar initrd
gunzip initrd.img.gz
mount initrd.img initrd -o loop
cd initrd
#instalar busybox
mkdir -p bin
cd bin
#fazer download do ficheiro busybox
#
chmod 755 busybox
#Coreutils
ln -s busybox cat
ln -s busybox df
ln -s busybox echo
ln -s busybox ls
ln -s busybox pwd
ln -s busybox sleep
ln -s busybox tty
#Shell
ln -s busybox ash
#Editors
ln -s busybox vi
#Linux Module Utilities
ln -s busybox insmod
ln -s busybox lsmod
#Linux System Utilities
ln -s busybox mount
cd ..
mkdir -p proc

mknod dev/null c 1 3

#sistema de consolas virtuais (ttyX) e pseudo-terminais Unix98 (ptmx, pts)


mknod dev/tty c 5 0
mknod dev/tty0 c 4 0
mknod dev/tty1 c 4 1
mknod dev/tty2 c 4 2
mknod dev/ptmx c 5 2
mkdir -p dev/pts

6/13
# alterar linuxrc

#!/bin/ash
# Beep
echo -e "\007"
# Hello
echo ""
echo " Micro ARCOM Linux"
echo ""
echo " ISEP, 2009"
echo ""
echo " Nº dos Alunos"
echo ""

PATH=/bin
export PATH

mount -t proc none /proc


mount -t devpts -o uid=0,gid=5,mode=620 devpts /dev/pts

# Shell
exec /bin/ash </dev/tty1 >/dev/tty1 2>&1

cat linuxrc
cd ..
umount initrd
gzip initrd.img
umount /dev/sdb1
mount /dev/sdb1 pen
cp initrd.img.gz pen/micrord.gz
umount pen

#testar

7/13
# mini

gunzip initrd.img.gz
mount initrd.img initrd -o loop
cd initrd
mknod dev/sda b 8 0
mknod dev/sda1 b 8 1
mknod dev/sda2 b 8 2
mknod dev/hda b 3 0
mknod dev/hdb b 3 64
mkdir -p modules
cd modules
# extrair o conteúdo do ficheiro initrd_kmod.tgz
tar xzvf ../../initrd_kmod.tgz
chmod 755 ide.sh
cd ..
mkdir -p pendrive
mkdir -p proc
# Alterar linuxrc

#!/bin/ash
# Beep
echo -e "\007"
# Hello
echo ""
echo " Mini ARCOM Linux"
echo ""
echo " ISEP, 2009"
echo ""
echo " Nº dos Alunos"
echo ""

PATH=/bin
export PATH

mount -t proc none /proc


mount -t devpts -o uid=0,gid=5,mode=620 devpts /dev/pts

# Insert Modules
insmod /modules/usbcore.ko
insmod /modules/usb-libusual.ko
insmod /modules/usb-storage.ko
insmod /modules/ohci-hcd.ko
insmod /modules/fat.ko
insmod /modules/vfat.ko

#teste na ebox
#sleep 10
#mount -t vfat /dev/sda1 /pendrive
#teste no qemu
/modules/ide.sh
mount -t vfat /dev/hda /pendrive

# Shell
exec /bin/ash </dev/tty1 >/dev/tty1 2>&1

8/13
cat linuxrc
# Desmontar initrd
cd ..
ls -la
umount initrd
gzip initrd.img
# copiar initrd para pendrive
umount /dev/sdb1
mount /dev/sdb1 pen
cp initrd.img.gz pen/minird.gz
ls -la
# Desmontar Pendrive
umount pen

#testar.

###########################################################################
# full

mkdir -p pen_root
# montar pendrive em pen_root
umount /dev/sdb2
mount /dev/sdb2 pen_root
df
# fazer download do ficheiro sda2_files.tgz
#
cd pen_root
tar xzf ../sda2_files.tgz
cd ..
umount pen_root
# Montar initrd
gunzip initrd.img.gz
mount initrd.img initrd -o loop
cd initrd
ls

9/13
# Alterar linuxrc

#!/bin/ash
# Beep
echo -e "\007"
# Hello
echo ""
echo " Mini ARCOM Linux"
echo ""
echo " ISEP, 2009"
echo ""
echo " Nº dos Alunos"
echo ""

PATH=/sbin:/bin
export PATH

mount -t proc none /proc

# Insert Modules
insmod /modules/usbcore.ko
insmod /modules/usb-libusual.ko
insmod /modules/usb-storage.ko
insmod /modules/ohci-hcd.ko

############################################
#na ebox
#sleep 10
#echo 0x802 > /proc/sys/kernel/real-root-dev
#
#OU
#
#no qemu
/modules/ide.sh
echo 0x340 > /proc/sys/kernel/real-root-dev
############################################

umount /proc

cat linuxrc
# Desmontar initrd
cd ..
ls -la
umount initrd
gzip initrd.img
# copiar initrd para pendrive
umount /dev/sdb1; mount /dev/sdb1 pen
cp initrd.img.gz pen/fullrd.gz
ls -la
# Desmontar Pendrive
umount pen

#testar

10/13
Exercícios e questões adicionais

1) Verifique qual a memória ocupada pelo software do sistema. Use os comandos “free” ou
“cat /proc/meminfo”.

2) Teste o programa de escrita na porta-paralela na distribuição “full”. Deverá ser lançado em


background a partir do script de arranque (“/sbin/init”).

pisca_user.c:
//Compilar com opção -O e executar como root

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>

#define BASEPORT 0x378

int main(int argc, char** argv){


int i;

/* Get access to the ports */


if (ioperm(BASEPORT, 3, 1)) {
perror("ioperm"); exit(1);}

for( i=0 ; i<200 ; i++ ){


outb(255, BASEPORT);
usleep(500000);
outb(0, BASEPORT);
usleep(500000);
}

/* We don't need the ports anymore */


if (ioperm(BASEPORT, 3, 0)) {
perror("ioperm"); exit(1);}

exit(0);
}

11/13
3) Configure e compile o kernel de forma a obter uma imagem com dimensões mais
reduzidas do que a versão fornecida na página. O ficheiro de configuração do kernel
fornecido pode ser obtido na página das aulas. A opção “Local version - append to kernel
release” deverá ser preenchida com uma sequência de caracteres que identifique o grupo
(e.g., números dos alunos). Documente cada alteração e, após testar o seu correcto
funcionamento (no qemu e na ebox), registe as alterações do tamanho do ficheiro bzImage.

4) Usando as configurações do kernel escolhidas na alínea anterior (note que o kernel deverá
estar configurado para permitir o carregamento de módulos), compile o seguinte módulo de
kernel (“pisca-pisca”) e teste-o na ebox.

pisca.c:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/io.h>

struct timer_list my_timer;


char led_status = 0;
#define BLINK_DELAY HZ/2

static void my_timer_func(unsigned long ptr){


led_status = ~led_status;
outb(led_status, 0x378);
my_timer.expires = jiffies + BLINK_DELAY;
add_timer(&my_timer);
}

int init_module(void){
init_timer(&my_timer);
my_timer.function = my_timer_func;
my_timer.data = (unsigned long)&led_status;
my_timer.expires = jiffies + BLINK_DELAY;
add_timer(&my_timer);

return 0;
}

void cleanup_module(void){
del_timer(&my_timer);
}

makefile:
obj-m := pisca.o

KDIR := directório_do_codigo_do_kernel
PWD := $(shell pwd)

default:
$(MAKE) -C $(KDIR) M=$(PWD) modules

12/13
5) Configure a interface de rede do sistema.

##############################
#Configuração da rede no qemu:

cd /modules
#carregar módulos do kernel correspondentes ao driver da placa de rede
insmod af_packet.ko
insmod mii.ko
insmod 8139cp.ko

ifconfig eth0 10.0.2.15


route add default gw 10.0.2.2
#o comando ping não funciona no qemu, usar o wget para experimentar

################################
#Configuração da rede para ebox:
cd /modules
#carregar módulos do kernel correspondentes ao driver da placa de rede
insmod af_packet.ko
insmod mii.ko
insmod 8139too.ko

#utilizar o dhcpc do busybox para descobrir o ip atribuído à ebox


# ou utilizar a configuração de um dos Pcs do Lab.

6) Compile o executável busybox de forma a ter apenas os comandos necessários para a initrd
da distribuição “full”. Deverá escolher a opção para compilar estaticamente.
#Descompactar ficheiro busybox-1.14.1.tar.bz2. Aplicar os “patches”.
Exemplo:
patch -p0 < busybox-1.14.1-ash.patch
# Começar sen nenhuma opção seleccionada
make allnoconfig
# Invocar menu de configuração
make gconfig
#ou “make menuconfig”; poderá ser necessário instalar
# o pacote ncurses-devel (usar yum)
#
#escolher as opções, gravar e sair
make
#copiar para a initrd e testar

7) Uma forma comum de interface com sistemas embebidos é através do servidor web,
podendo-se assim dispensar mostradores e teclados no dispositivo. Adicione a applet do
servidor web ao busybox e crie uma nova versão do executável. Configure a distribuição
“full” de forma a que, quando consultada a partir de um browser, a ebox possa responder com
uma página html mostrando informação diversa (e.g., o nome dos alunos).

13/13

Você também pode gostar