Top Banner
¿Cómo crear una distribución? Mauro Parra-Miranda [email protected]
64

Cómo crear una distribución Linux

Nov 07, 2014

Download

Technology

En esta plática vemos cómo se desarrolla una distribución linux.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Cómo crear una distribución Linux

¿Cómo crear una distribución?

Mauro [email protected]

Page 2: Cómo crear una distribución Linux

Índice

• ¿Qué es una distribución de linux?

• Circulo virtuoso de una distro.

• Distribuciones personalizadas

• Links

Page 3: Cómo crear una distribución Linux

¡Advertencia!

• Esta es solo un vistazo al estado del arte alrededor de la creación de una distribución.

• El demonio esta en los detalles.

• Su kilometraje puede variar - hay cosas que se omiten u obvian, podria ser que falten algunos pasos, depende de cada uno.

• Preguntas: [email protected]

Page 4: Cómo crear una distribución Linux

Distro Linux

Page 5: Cómo crear una distribución Linux

DistroWatch

• http://distrowatch.com/

• Ubuntu

• openSUSE

• Mint

• Fedora

• Debian

Page 6: Cómo crear una distribución Linux

Linux From Scratch

• Partamos de un sistema estable. Puede ser una distribución minima que cumpla con los requisitos de compilación.

• U olvide todo y boteé con este LiveCD: http://www.linuxfromscratch.org/livecd/

Page 7: Cómo crear una distribución Linux

Linux From Scratch

• Crear una nueva partición: (digamos la segunda primaria del primer disco IDE). $ fdisk> c> n> p> 2> t 83 (linux partition)> q

Page 8: Cómo crear una distribución Linux

Linux From Scratch

• Crear el filesystem:$ mkfs2.ext2 /dev/hda2

• Si hicimos una partición swap, necesitariamos hacer (pensando en que esta en la particion 3):$ mkswap /dev/hda3

• $ mkdir /mnt/lfs ; export LFS=/mnt/lfs$ mount /dev/hda2 /mnt/lfs

Page 10: Cómo crear una distribución Linux

Linux From Scratch

• $ echo $LFS

• $ export LFS=/mnt/lfs

• $ mkdir -v $LFS/tools

• $ sudo ln -sv $LFS/tools /

• groupadd lfs

• useradd -s /bin/bash -g lfs -m -k /dev/null lfs

Page 11: Cómo crear una distribución Linux

Linux From Scratch

• $ passwd lfs

• $ chown -v lfs $LFS/tools

• $ chown -v lfs $LFS/sources

• $ su - lfs

• $ cat > ~/.bash_profile << "EOF"exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bashEOF

Page 12: Cómo crear una distribución Linux

Linux From Scratch

• $ cat > ~/.bashrc << "EOF"set +humask 022LFS=/mnt/lfsLC_ALL=POSIXPATH=/tools/bin:/bin:/usr/binexport LFS LC_ALL PATHEOF

Page 13: Cómo crear una distribución Linux

Linux From Scratch

• $ source ~/.bash_profile

• Advertencia: El compilar todos estos paquetes puede tomar MUCHO tiempo, dependiendo de la maquina. Firefox en una Intel Core 2 Duo con 4 G de RAM, tarda 45 minutos, por ejemplo.

Page 14: Cómo crear una distribución Linux

Linux From Scratch

• binutils - 213 M (ld, as, largo ETC)

• $ patch -Np1 -i ../binutils-2.18-configure-1.patch$ mkdir -v ../binutils-build$ cd ../binutils-build$ export CC="gcc -B/usr/bin/" ../binutils-2.18/configure --prefix=/tools --disable-nls --disable-werror$ make

Page 15: Cómo crear una distribución Linux

Linux From Scratch

• $ make install$ make -C ld clean$ make -C ld LIB_PATH=/tools/lib$ cp -v ld/ld-new /tools/bin

• gcc - 1.1 G

• linux API headers - 341M

• glibc - 407 M

Page 16: Cómo crear una distribución Linux

Linux From Scratch

• Lo que ya se tiene compilado, nos genera un sistema básico, contra el cual ligaremos los binarios que a partir de este momento construyamos.

• $ mv -v /tools/bin/{ld,ld-old}$ mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}$ mv -v /tools/bin/{ld-new,ld}$ ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld

Page 17: Cómo crear una distribución Linux

Linux From Scratch

• gcc es inteligente, por lo que revisa los headers y busca los que esten “mal”. Genera headers correctos y hace una copia “particular”. Esto puede generar problemas en el futuro, por lo que es necesario eliminar esos headers arreglados, porque generaremos los correctos en el futuro cercano.

Page 18: Cómo crear una distribución Linux

Linux From Scratch

• $ gcc -dumpspecs | sed 's@/lib/ld-linux.so.2@/tools&@g' > `dirname $(gcc -print-libgcc-file-name)`/specs

• $ GCC_FIXED=`dirname $(gcc -print-libgcc-file-name)`/include-fixed &&find ${GCC_FIXED}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' \; && rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_FIXED}/*` && unset GCC_FIXED

Page 19: Cómo crear una distribución Linux

Linux From Scratch• tcl - 36 MB (lenguaje de script)

• expect - 4 MB (herramienta para automatizacion)

• DejaGNU - 6.2 MB (Framework para testing)

• GCC (2da vuelta) - 865 M (con soporte a mas lenguajes)

• binutils (2da vuelta) - 177 MB (actualización del linker, con soporte a todo lo que hemos compilado ya)

Page 20: Cómo crear una distribución Linux

Linux From Scratch• ncurses - 30 MB (sistemas graficos en texto)

• bash - 22 MB (shell)

• bzip2 - 4.8 MB (herramienta para comprimir)

• coreutils - 83 MB (programas varios para manipular archivos, cat, chroot, etc.)

• diffutils - 6.2 MB (herramientas para hacer diff)

• E2fsprogs - 37 MB (utilidades para mantener ext2, ext3 y ext4)

Page 21: Cómo crear una distribución Linux

Linux From Scratch

• gawk - 19 MB (awk, lenguaje de programacion)

• gettext - 83 MB (soporte para localizacion)

• grep - 6.9 MB

• gzip - 2.2 MB

• M4 - 10 MB (lenguaje de marcado)

• make - 9.6 MB

• Patch - 1.6 MB

Page 22: Cómo crear una distribución Linux

Linux From Scratch

• Perl - 108 MB

• sed - 6.1 MB

• tar - 19.9 MB

• texinfo - 20 MB

• Util-linux-ng - 19 MB (utilidades varias)

Page 23: Cómo crear una distribución Linux

Linux From Scratch

• Stripping ... $ strip --strip-debug /tools/lib/*$ strip --strip-unneeded /tools/{,s}bin/*$ rm -rf /tools/{info,man}

• Cambie al usuario root y haga: $ chown -R root:root $LFS/tools

Page 24: Cómo crear una distribución Linux

Linux From Scratch

• Preparando sistema virtual de archivos: $mkdir -pv $LFS/{dev,proc,sys}

• Creando los nodos iniciales de dispositivos:$ mknod -m 600 $LFS/dev/console c 5 1$ mknod -m 666 $LFS/dev/null c 1 3

• Montando y poblando /dev :$ mount -v --bind /dev $LFS/dev

Page 25: Cómo crear una distribución Linux

Linux From Scratch

• Montando los sistemas de archivos virtuales: $ mount -vt devpts devpts $LFS/dev/pts$ mount -vt tmpfs shm $LFS/dev/shm$ mount -vt proc proc $LFS/proc$ mount -vt sysfs sysfs $LFS/sys

Page 26: Cómo crear una distribución Linux

Linux From Scratch

• Estrategia de administración de paquetes

• Ninguna. Todo esta en tu cabeza.

• Instalar en distintos directorios: /usr/package/foo-1 y /usr/package/foo-2 y despues crear enlaces simbolicos para usar uno u otro.

Page 27: Cómo crear una distribución Linux

Linux From Scratch

• Symlink:

• Tienes que usar un truco para que aunque el paquete se instale en /usr/pkg/foo, aparezca bajo /usr para que el linker funcione correctamente (hint: use DESTDIR)$ ./configure --prefix=/usr$ make$ make DESTDIR=/usr/pkg/libfoo/1.1 install

Page 28: Cómo crear una distribución Linux

Linux From Scratch

• Marcas de tiempo.

• Obten el timestamp actual (t0).

• Instala todo.

• Con find, busca todo archivo cuyo timestamp sea posterior a el time t0 -> Guarda eso en un archivo.

Page 29: Cómo crear una distribución Linux

Linux From Scratch

• Haciendo un seguimiento del “make install”; se puede hacer de dos formas:

• definir LD_PRELOAD con “algo” que vaya tomando nota cuando se ejecuten cp, install y/o mv.

• usar strace para ir cachando las llamadas de sistema.

Page 30: Cómo crear una distribución Linux

Linux From Scratch

• Creando una lista de cada paquete, con sus archivos relacionados.

• La instalación se lleva a cabo en un subdirectorio “fake”, como se vio en el estilo “Symlink” (hint: $DESTDIR).

• Asi funciona RPM, debian apt-get, el sistema de portage de Gentoo y pkg-utils.

Page 31: Cómo crear una distribución Linux

Linux From Scratch

• Hora de entrar a la jaula (corra como root):$ chroot "$LFS" /tools/bin/env -i \HOME=/root TERM="$TERM" \PS1='\u:\w\$ ' \PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \/tools/bin/bash --login +h

• Cuando entre, bash podria quejarse con el “I have no name!”. Que es normal, porque no tenemos /etc/passwd aun.

Page 32: Cómo crear una distribución Linux

Linux From Scratch

• Creemos los directorios “clasicos” de Linux:$ mkdir -pv /{bin,boot,etc/opt,home,lib,mnt,opt}$ mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}$ install -dv -m 0750 /root$ install -dv -m 1777 /tmp /var/tmp$ mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}$ mkdir -pv /usr/{,local/}share/{doc,info,locale,man}$ mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo}$ mkdir -pv /usr/{,local/}share/man/man{1..8}$ for dir in /usr /usr/local; do ln -sv share/{man,doc,info} $dirdone$ mkdir -v /var/{lock,log,mail,run,spool}$ mkdir -pv /var/{opt,cache,lib/{misc,locate},local}

Page 33: Cómo crear una distribución Linux

Linux From Scratch

• Crear algunos archivos básicos:$ ln -sv /tools/bin/{bash,cat,echo,grep,pwd,stty} /bin$ ln -sv /tools/bin/perl /usr/bin$ ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib$ ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib$ ln -sv bash /bin/sh$ touch /etc/mtab$ cat > /etc/passwd << "EOF"root:x:0:0:root:/root:/bin/bashnobody:x:99:99:Unprivileged User:/dev/null:/bin/falseEOF

Page 34: Cómo crear una distribución Linux

Linux From Scratch

• Crear /etc/group$ cat > /etc/group << "EOF"root:x:0:bin:x:1:sys:x:2:kmem:x:3:tty:x:4:tape:x:5:daemon:x:6:floppy:x:7:disk:x:8:lp:x:9:uucp:x:10:audio:x:11:video:x:12:utmp:x:13:usb:x:14:cdrom:x:15:mail:x:34:nogroup:x:99:EOF

Page 35: Cómo crear una distribución Linux

Linux From Scratch

• Arrancar el bash de nuevo, para no ver el anuncio de “no tiene nombre”:$ exec /tools/bin/bash --login +h

• Crear los archivos de log$touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}$ chgrp -v utmp /var/run/utmp /var/log/lastlog$ chmod -v 664 /var/run/utmp /var/log/lastlog

Page 36: Cómo crear una distribución Linux

Linux From Scratch

• Glibc usará el API del kernel. Tenemos que “limpiarlo” para la ejecución actual.$ make mrproper$ make headers_check$ make INSTALL_HDR_PATH=dest headers_install$ cp -rv dest/include/* /usr/include

Page 37: Cómo crear una distribución Linux

Linux From Scratch

• Para instalar las man pages, entrar al directorio y correr $make install

• Sigue el ajustar glibc para el ambiente actual. Esto será muy delicado, incluye muchisimos pasos. Vea las instrucciones a detalle en:

• http://www.linuxfromscratch.org/lfs/view/stable/chapter06/glibc.html

Page 38: Cómo crear una distribución Linux

Linux From Scratch

• Despues del paso de la muerte, es necesario ajustar nuestro toolchain a nuestro glibc final.$ mv -v /tools/bin/{ld,ld-old}$ mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}$ mv -v /tools/bin/{ld-new,ld}$ ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld

Page 39: Cómo crear una distribución Linux

Linux From Scratch

• Para revisar que TODO funciona bien, correr: $ echo 'main(){}' > dummy.c$ cc dummy.c -v -Wl,--verbose &> dummy.log$ readelf -l a.out | grep ': /lib'

• Revisar que el nuevo linker se usa: $ grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g’

Page 40: Cómo crear una distribución Linux

Linux From Scratch

• La salida debe ser algo como esto: SEARCH_DIR("/tools/i686-pc-linux-gnu/lib")SEARCH_DIR("/usr/lib")SEARCH_DIR("/lib");

• ¿usamos la libc adecuada? $ grep "/lib/libc.so.6 " dummy.logsalida:attempt to open /lib/libc.so.6 succeeded

Page 41: Cómo crear una distribución Linux

Linux From Scratch

• ¿usamos el linker dinamico correcto? $ grep found dummy.logsalida:found ld-linux.so.2 at /lib/ld-linux.so.2

• Con esto, ya podemos seguirnos con los demas fuentes, basicamente es ./configure, make, make install.

Page 42: Cómo crear una distribución Linux

Linux From Scratch

• ¿usamos el linker dinamico correcto? $ grep found dummy.logsalida:found ld-linux.so.2 at /lib/ld-linux.so.2

• Con esto, ya podemos seguirnos con los demas fuentes, basicamente es ./configure, make, make install.

Page 43: Cómo crear una distribución Linux

Linux From Scratch

• Ahora necesitamos poner los scripts de booteo.

• Hay que compilar/instalar el paquete LFS-Bootscripts-20081031

• Usaremos el bootscript al estilo SysVinit. Tenemos 6 tipos de funcionamiento:0: halt the computer1: single-user mode2: multi-user mode without networking3: multi-user mode with networking4: reserved for customization, otherwise does the same as 35: same as 4, it is usually used for GUI login (like X's xdm or KDE's kdm6: reboot the computer

Page 44: Cómo crear una distribución Linux

Linux From Scratch

• Los scripts se guardan en /etc/rc.d/init.d, los argumentos de los scripts son algo como: start - The service is started.stop - The service is stopped.restart - The service is stopped and then started again.reload - The configuration of the service is updated. This is used after the configuration file of a service was modified, when the service does not need to be restarted.status - Tells if the service is running and with which PIDs.

Page 45: Cómo crear una distribución Linux

Linux From Scratch

• Crear el /etc/hosts$ cat > /etc/hosts << "EOF"# Begin /etc/hosts (network card version)

127.0.0.1 localhost<192.168.1.1> <HOSTNAME.example.org> [alias1] [alias2 ...]# End /etc/hosts (network card version)EOF

Page 46: Cómo crear una distribución Linux

Linux From Scratch

• Configurando las interfaces de red:$ for NIC in /sys/class/net/* ; do INTERFACE=${NIC##*/} udevadm test --action=add --subsystem=net $NIC;done

Page 47: Cómo crear una distribución Linux

Linux From Scratch

• Ejemplo de archivo ipv4 para una interfaz de red:$ cd /etc/sysconfig/network-devices$ mkdir -v ifconfig.eth0$ cat > ifconfig.eth0/ipv4 << "EOF"ONBOOT=yesSERVICE=ipv4-staticIP=192.168.1.1GATEWAY=192.168.1.2PREFIX=24BROADCAST=192.168.1.255EOF

Page 48: Cómo crear una distribución Linux

Linux From Scratch

• Creando el /etc/resolv.conf$ cat > /etc/resolv.conf << "EOF"# Begin /etc/resolv.confdomain <Your Domain Name>nameserver <IP address of your primary nameserver>nameserver <IP address of your secondary nameserver># End /etc/resolv.confEOF

Page 49: Cómo crear una distribución Linux

Linux From Scratch

• Haciendo booteable nuestro sistema. Crearemos primero un fstab. $ cat > /etc/fstab << "EOF"# Begin /etc/fstab# file system mount-point type options #dump fsck order/dev/<xxx> / <fff> defaults 1 1/dev/<yyy> swap swap pri=1 0 0proc /proc proc defaults 0 0sysfs /sys sysfs defaults 0 0devpts /dev/pts devpts gid=4,mode=620 0 0tmpfs /dev/shm tmpfs defaults 0 0# End /etc/fstabEOF

Page 50: Cómo crear una distribución Linux

Linux From Scratch

• Instalar el kernel:$ make mrproper$ make LANG=<host_LANG_value> LC_ALL= menuconfig$ make$ make modules_install$ cp -v arch/x86/boot/bzImage /boot/lfskernel-2.6.27.4$ cp -v System.map /boot/System.map-2.6.27.4$ cp -v .config /boot/config-2.6.27.4$ install -d /usr/share/doc/linux-2.6.27.4$ cp -r Documentation/* /usr/share/doc/linux-2.6.27.4

Page 51: Cómo crear una distribución Linux

Linux From Scratch

• Instalando grub:$ dd if=/boot/grub/stage1 of=/dev/fd0 bs=512 count=1$ dd if=/boot/grub/stage2 of=/dev/fd0 bs=512 seek=1$ grub> root (hd0,3)> setup (hd0)> quit

Page 52: Cómo crear una distribución Linux

Linux From Scratch

• Añadir entrada pal host: cat >> /boot/grub/menu.lst << "EOF"title Red Hatroot (hd0,2)kernel /boot/kernel-2.6.5 root=/dev/hda3initrd /boot/initrd-2.6.5EOF

Page 53: Cómo crear una distribución Linux

Linux From Scratch

• Y si quieres que funcione windows: $ cat >> /boot/grub/menu.lst << "EOF"title Windowsrootnoverify (hd0,0)chainloader +1EOF

• echo 6.4 > /etc/lfs-release

• Reiniciar -> $ shutdown -r now

Page 54: Cómo crear una distribución Linux

Linux From Scratch

• Creando el bonito menu: $ cat > /boot/grub/menu.lst << "EOF"# Begin /boot/grub/menu.lst# By default boot the first menu entry.default 0# Allow 30 seconds before booting the default.timeout 30# Use prettier colors.color green/black light-green/black# The first entry is for LFS.title LFS 6.4root (hd0,3)kernel /boot/lfskernel-2.6.27.4 root=/dev/hda4EOF

Page 56: Cómo crear una distribución Linux

T2 SDE

Page 57: Cómo crear una distribución Linux

T2 SDE

• Arquitecturas soportadas:

• Alpha, ARM, AVR32, Blackfin, IA64, Motorola 68k, MIPS, MIPS64, PowerPC, PowerPC64, SPARC, SPARC64, SuperH, x86, x86-64

• Puppy Linux esta basado en T2. http://www.puppylinux.org/

Page 58: Cómo crear una distribución Linux

Gentoo

• Una opción para instalar Gentoo es desde cero, es decir, tu únicamente instalas la base minima y de ahi compilas todo. Tambien conocida como Stage 1.

• En el proceso, aprendes mucho de lo que requieres para tener un linux completo.

• http://en.wikipedia.org/wiki/Gentoo_Linux

Page 59: Cómo crear una distribución Linux

Moblin

• Proyecto de Intel para optimizar Linux, especialmente pensado para las netbooks.

• http://moblin.org

• http://moblin.org/documentation/test-drive-moblin

Page 60: Cómo crear una distribución Linux

Moblin

• Menos uso de memoria

• Tamaño minimo en el disco

• Ahorro de bateria.

• Eficiencia optima, asi como boteo rapido.

Page 61: Cómo crear una distribución Linux

Moblin

• Crea un proyecto

• Crear un target, especifico a una netbook

• proveer de los “fsets” que desea el usuario que tenga la imagen, lo que magicamente se incluiran los archivos que te interesan.

• Selección de la interface grafica

• Herramientas para poner esto en un usb o un CD.

Page 62: Cómo crear una distribución Linux

Moblin

Page 64: Cómo crear una distribución Linux

Masuto Studioshttp://www.masutostudios.com