Páginas

lunes, 27 de septiembre de 2021

FreeBSD checkpoint ZFS


FreeBSD posee una característica muy interesante llamada 'zpool checkpoint'.

https://sdimitro.github.io/post/zpool-checkpoint/
https://oshogbo.vexillium.org/blog/79/
https://zedfs.com/zpool-checkpoints/

Los puntos de control de zpool o checkpoint, en lugar de tomar una única instantánea (snapshot) del conjunto de datos, toma una instantánea de todo el pool. Eso significa que no sólo se revierten los datos sino también todos los metadatos.

Esta característica es increíblemente útil, especialmente cuando se actualiza un sistema operativo, o cuando necesite experimentar con conjuntos de datos adicionales.

El punto de control zpool recuerda todo el grupo de transacciones (TXG). Eso significa que ningún dato desaparecerá mientras exista el punto de control.

Recuerda todo el estado del grupo en el momento en que fue tomado y el usuario puede volver a él más tarde o descartarlo. 

Un caso de uso genérico es un administrador/a que está a punto de realizar un conjunto de acciones destructivas para ZFS como parte de un procedimiento crítico. Ella toma un punto de control del grupo antes de realizar las acciones, luego retrocede a él si uno de ellos falla o pone el grupo en un estado inesperado.

# zpool status -x
all pools are healthy

# zpool list

NAME      SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
backups    37G  6.63G  30.4G        -         -     0%    17%  1.00x    ONLINE  -
zroot     109G  20.7G  88.3G        -         -     4%    18%  1.00x    ONLINE  -
Crear checkpoint
# zpool checkpoint zroot

# zpool list
NAME      SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
backups    37G  6.63G  30.4G        -         -     0%    17%  1.00x    ONLINE  -
zroot     109G  20.7G  88.3G     240K         -     4%    18%  1.00x    ONLINE  -

En el menú del cargador (loader menu) tiene una nueva entrada acompañada de un número, en este caso 8. Si pulsa la tecla 8 se revertirán los cambios y Rewind ZFS checkpoint pasará de Rewind ZFS checkpoint: NO a Rewind ZFS checkpoint: YES.

Todo estará tal y como estaba en el momento de la creación del checkpoint.

Listar zpool
# zpool list


Ahora no aparece el checkpoint, ya se ha utilizado. De lo contrario si no pulsa el número correspondiente en la mencionada entrada el checkpoint aún permanece.


Zpool Checkpoint funciones:


 Para crear un checkpoint:

# zpool checkpoint <pool>


 Retrocede el estado al punto de control y elimina el checkpoint:

# zpool import -- rewind-to-checkpoint <pool>


 Eliminar el checkpoint:

# zpool checkpoint --discard <pool> o zpool checkpoint -d <pool>

FreeBSD es genial!.

sábado, 25 de septiembre de 2021

Virtualizacion bhyve zfs FreeBSD 13.0

Virtualización BSD bhyve zfs FreeBSD 13.0

https://wiki.freebsd.org/bhyve
https://github.com/churchers/vm-bhyve

FreeBSD como anfitrión con bhyve

De forma predeterminada, bhyve proporciona acceso a la consola serie y no emula una consola gráfica. 

Comprobar si el procesador Intel soporta virtualización:

# dmesg | grep vt
[drm]   - kern.vt.fb.modes.DP-1
[drm]   - kern.vt.fb.default_mode
...

El primer paso para crear una máquina virtual en bhyve es configurar el sistema host cargando  el módulo del kernel de bhyve.

# kldload vmm

# kldstat|grep vmm
26    1 0xffffffff83200000   53a420 vmm.ko

El módulo se cargará automáticamente al iniciar el sistema agregando vmm a la linea kld_list del archivo /etc/rc.conf.

# sysrc kld_list+="vmm"

kld_list="fusefs /boot/modules/i915kms.ko vmm"

El siguiente paso es instalar bhyve virtual machine vm-bhyve, bhyve-firmware y grub2-bhyve. Este último para entornos linux o máquinas virtuales que requieran grub.

# pkg install vm-bhyve bhyve-firmware grub2-bhyve

Crear un conjunto de datos zfs llamado vm donde estarán almacenadas las máquinas virtuales. El grupo de almacenamiento se llama zroot.

# zfs create zroot/vm

# zfs list

NAME                               USED  AVAIL     REFER  MOUNTPOINT
zroot                             16.9G  88.6G       96K  /zroot
zroot/ROOT                        8.60G  88.6G       96K  none
zroot/ROOT/default                8.60G  88.6G     8.56G  /
zroot/ROOT/system_freebsd_180921     8K  88.6G     8.53G  /
zroot/export                       416K  88.6G       96K  /zroot/export
zroot/tmp                          312K  88.6G      192K  /tmp
zroot/usr                         7.65G  88.6G       96K  /usr
zroot/usr/home                    6.84G  88.6G     1.76G  /usr/home
zroot/usr/home/carlos             3.40G  88.6G     3.40G  /usr/home/carlos
zroot/usr/ports                    832M  88.6G      832M  /usr/ports
zroot/usr/src                      104K  88.6G       96K  /usr/src
zroot/var                         1.78M  88.6G       96K  /var
zroot/var/audit                    104K  88.6G       96K  /var/audit
zroot/var/crash                    104K  88.6G       96K  /var/crash
zroot/var/log                     1.10M  88.6G      752K  /var/log
zroot/var/mail                     216K  88.6G      128K  /var/mail
zroot/var/tmp                      164K  88.6G      100K  /var/tmp
zroot/vm                           686M  88.6G      133M  /zroot/vm
Habilitar vm-bhyve en /etc/rc.conf y configurar el conjunto de datos que se utilizará

# sysrc vm_enable="YES"
# sysrc vm_dir="zfs:zroot/vm"

En este punto guardar y reiniciar el sistema.

Debe tener los módulos vmm ejecutándose en segundo plano:

# kldstat | grep vmm
26    1 0xffffffff83200000   53a420 vmm.ko

Ejecutar el comando vm init crea los directorios necesarios en $vm_dir.

# vm init

Crear un directorio llamado .templates

# mkdir -p /vm/.templates
# ls /vm/.templates/

Listando los archivos de configuración para todos los posibles sistemas operativos compatibles que pueden ejecutarse como invitado:
# ls /usr/local/share/examples/vm-bhyve/
alpine.conf       coreos.conf       freepbx.conf      ubuntu.conf
arch.conf         debian.conf       linux-zvol.conf   windows.conf
centos6.conf      default.conf      netbsd.conf
centos7.conf      dragonfly.conf    openbsd.conf
config.sample     freebsd-zvol.conf resflash.conf

Crear un conmutador virtual (switch) llamado public y adjuntar la interfaz de 
red Ethernet a él.
# vm switch create public # vm switch add public re0 # vm switch list NAME TYPE IFACE ADDRESS PRIVATE MTU VLAN PORTS public standard vm-public - no - - re0

Firewall IPFW:

Permitir el paso de paquetes bhyve

net.link.bridge.ipfw=1
# sysctl net.link.bridge.ipfw=1

Hacer el cambio permanente
net.link.bridge.ipfw=1

Instalar y ejecutar sistemas operativos invitados virtualizados

FreeBSD virtualizacion vm-bhyve - Arch Linux

Descargar Arch Linux

# vm iso https://mirror.cyberbits.eu/archlinux/iso/2022.06.01/archlinux-2022.06.01-x86_64.iso

Copiar la plantilla para Arch Linux - arch.conf
# cp /usr/local/share/examples/vm-bhyve/arch.conf /zroot/vm/.templates/

# vm iso
DATASTORE           FILENAME
default             archlinux-2022.06.01-x86_64.iso
default             fetch.out

Importante: Cambiar los parámetros vmlinuz, archiso y archisobasedir a sus valores correctos:

# cat /zroot/vm/.templates/arch.conf
loader="grub"
cpu=1
memory=512M
network0_type="virtio-net"
network0_switch="public"
disk0_type="virtio-blk"
disk0_name="disk0.img"
grub_install0="linux /arch/boot/x86_64/vmlinuz-linux archisobasedir=arch archisolabel=ARCH_202206 ro"
grub_install1="initrd /arch/boot/x86_64/initramfs-linux.img"

Crear vm -t template -s size nombre
# vm create -t arch -s 9G arch

Instalar en primer plano vm -f dentro de arch una vm con arhivo iso
# vm install -f arch archlinux-2021.09.01-x86_64.iso

Particionar el disco:

# cfdisk
Elegir dos para BIOS

 
root@archiso ~ # fdisk -l
Disk /dev/vda: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 131072 bytes
I/O size (minimum/optimal): 131072 bytes / 131072 bytes
Disklabel type: dos
Disk identifier: 0xae1d35ff

Device     Boot    Start      End  Sectors  Size Id Type
/dev/vda1  *        2048  1050623  1048576  512M 83 Linux
/dev/vda2        1050624 16779263 15728640  7.5G 83 Linux
/dev/vda3       16779264 17827839  1048576  512M 82 Linux swap / Solaris

Disk /dev/loop0: 662.69 MiB, 694882304 bytes, 1357192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Crear los sistemas de ficheros:

root@archiso ~ # mkfs.ext2 /dev/vda1
mke2fs 1.46.4 (18-Aug-2021)
Creating filesystem with 262144 1k blocks and 65536 inodes
Filesystem UUID: 0b6850ec-379f-4be5-ac4f-fcafae08fbbc
Superblock backups stored on blocks: 
	8193, 24577, 40961, 57345, 73729, 204801, 221185

Allocating group tables: done                            
Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done 

root@archiso ~ # mkfs.ext4 /dev/vda2
mke2fs 1.46.4 (18-Aug-2021)
Creating filesystem with 2555648 4k blocks and 638976 inodes
Filesystem UUID: 34353334-88c2-40b9-930a-8c788705545e
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done 

root@archiso ~ # mkswap /dev/vda3
root@archiso ~ # swapon /dev/vda3

Montando las particiones:

root@archiso ~ # mount /dev/vda2 /mnt
root@archiso ~ # mkdir -p /mnt/boot
root@archiso ~ # mount /dev/vda1 /mnt/boot

El comando pacstrap para indicar donde queremos instalar los paquetes desde los repositorios arch, y lo que queremos instalar

root@archiso ~ # pacstrap /mnt base base-devel grub ntfs-3g networkmanager xdg-user-dirs linux linux-firmware vim dhcpcd openssh

Generar fstab
root@archiso ~ # genfstab -pU /mnt >> /mnt/etc/fstab

Entrar en arch chroot

root@archiso ~ # arch-chroot /mnt
[root@archiso /]#

Establecer la zona horaria:
[root@archiso /]# ln -sf /usr/share/zoneinfo/Europe/Madrid /etc/localtime

[root@archiso /]# echo rioarch > /etc/hostname

[root@archiso /]# nano /etc/locale.gen
es_ES.UTF-8 UTF-8

[root@archiso /]# echo LANG=es_ES.UTF-8 > /etc/locale.conf

Generar el archivo locale.gen con el siguiente comando:
[root@archiso /]# locale-gen

Cuando GNU/Linux arranca, el sistema está configurado para leer el reloj interno del equipo, después el reloj del sistema, que es independiente. Usaremos el comando hwclock -w para ajustar el reloj interno.
[root@archiso /]# hwclock -w

Configurar distribución de teclado
[root@archiso /]# echo KEYMAP=la-latin1 > /etc/vconsole.conf

Instalar grub

Ahora procedamos a instalar el grub y usar el comando correcto, sin UEFI
[root@archiso /]# grub-install /dev/vda
Installing for i386-pc platform.
Installation finished. No error reported.

Actualizar grub

Creamos el archivo grub.cfg
[root@archiso /]# grub-mkconfig -o /boot/grub/grub.cfg

[root@archiso /]# passwd
New password:
Retype new password:
passwd: password updated successfully

Agregar usuario no privilegiado
useradd -m -g users -G storage,wheel,power -s /bin/bash carlos

Establecer contraseña del usuario
[root@archiso /]# passwd carlos

Antes de salir de root:

[root@arch ~]# cat /boot/grub/grub.cfg |grep vmlinuz-linux
	linux	/vmlinuz-linux root=UUID=781ccb0f-c524-402e-a2a8-e32a50371223 rw  loglevel=3 quiet
		linux	/vmlinuz-linux root=UUID=781ccb0f-c524-402e-a2a8-e32a50371223 rw  loglevel=3 quiet
		linux	/vmlinuz-linux root=UUID=781ccb0f-c524-402e-a2a8-e32a50371223 rw  loglevel=3 quiet


Este UUID lo necesitará:
781ccb0f-c524-402e-a2a8-e32a50371223 rw
para sustituirlo por el creado por la vm en esta ruta /zroot/vm/arch/arch.conf en el host FreeBSD.

root@freebsd:/zroot/vm/arch # cat arch.conf

loader="grub"
cpu=1
memory=512M
network0_type="virtio-net"
network0_switch="public"
disk0_type="virtio-blk"
disk0_name="disk0.img"
grub_install0="linux /arch/boot/x86_64/vmlinuz-linux archisobasedir=arch archisolabel=ARCH_202109 ro"
grub_install1="initrd /arch/boot/x86_64/initramfs-linux.img"
uuid="a923082e-1deb-11ec-9f91-fc3fdbd15275"
network0_mac="58:9c:fc:0e:36:e4"
grub_run0="linux /vmlinuz-linux root=UUID=781ccb0f-c524-402e-a2a8-e32a50371223 rw"
grub_run1="initrd /initramfs-linux.img"
uuid="9eb191c3-1e01-11ec-a508-fc3fdbd15275" 
Saliendo de chroot
Ya terminado esto, salimos de chroot
[root@archiso /]# exit

Desmontar particion /boot
# umount /mnt/boot/

Desmontar particion Raíz
# umount /mnt

# dhcpcd enp0s5

dhcpcd-9.4.0 starting
DUID 00:04:a9:23:08:2e:1d:eb:11:ec:9f:91:fc:3f:db:d1:52:75
enp0s5: waiting for carrier
enp0s5: carrier acquired
enp0s5: IAID fc:0e:36:e4
enp0s5: adding address fe80::f2ad:f194:fe94:3e97
enp0s5: soliciting a DHCP lease
enp0s5: soliciting an IPv6 router
enp0s5: offered 192.168.88.165 from 192.168.88.1
enp0s5: probing address 192.168.88.165/24
enp0s5: leased 192.168.88.165 for 600 seconds
enp0s5: adding route to 192.168.88.0/24
enp0s5: adding default route via 192.168.88.1
forked to background, child pid 242
Reiniciar
# reboot

[root@arch ~]# ip addr
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s5:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 58:9c:fc:0e:36:e4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.88.165/24 brd 192.168.88.255 scope global dynamic noprefixroute enp0s5
       valid_lft 329sec preferred_lft 254sec
    inet6 fe80::f2ad:f194:fe94:3e97/64 scope link 
       valid_lft forever preferred_lft forever










FreeBSD es genial!

martes, 14 de septiembre de 2021

Firewall IPFW Freebsd

 https://docs.freebsd.org/en/books/handbook/firewalls/#firewalls-ipfw

Nota: Extensiones imprescindibles Firefox 78.14.0 esr (64-bit)

IPFW - proteger una estación de trabajo freeBSD y permitir acceso remoto vía SSH.

IPFW es un cortafuegos stateful escrito para FreeBSD que soporta tanto IPv4 como IPv6. Está formado por varios componentes: el procesador de reglas de filtrado del kernel y su función integrada de contabilidad de paquetes, la función de registro, NAT, el conformador de tráfico dummynet(4), una función de reenvío, una función de puente y una función ipstealth.

# sysrc firewall_enable="YES"
# sysrc firewall_script="/etc/ipfw.rules"
# sysrc firewall_logging="YES"
# echo "net.inet.ip.fw.verbose_limit=5" >> /etc/sysctl.conf
# sysrc firewall_logif="YES"
# service ipfw start
# sysctl net.inet.ip.fw.verbose_limit=5
% cat /etc/ipfw.rules
###################################
#!/bin/sh
ipfw -q -f flush

LAN="192.168.88.0/24"
cmd="/sbin/ipfw -q add"
pif="re0"

$cmd 00100 allow ip from any to any via lo0
$cmd 00200 deny ip from any to 127.0.0.0/8
$cmd 00300 deny ip from 127.0.0.0/8 to any
$cmd 00400 deny ip from any to ::1
$cmd 00500 deny ip from ::1 to any
$cmd 00600 allow ipv6-icmp from :: to ff02::/16
$cmd 00700 allow ipv6-icmp from fe80::/10 to fe80::/10
$cmd 00800 allow ipv6-icmp from fe80::/10 to ff02::/16
$cmd 00900 allow ipv6-icmp from any to any icmp6types 1
$cmd 01000 allow ipv6-icmp from any to any icmp6types 2,135,136
$cmd 01100 check-state :default
$cmd 01200 allow tcp from me to any established
$cmd 01300 allow tcp from me to any setup keep-state :default
$cmd 01400 allow udp from me to any keep-state :default
$cmd 01500 allow icmp from me to any keep-state :default
$cmd 01600 allow ipv6-icmp from me to any keep-state :default
$cmd 01700 allow udp from 0.0.0.0 68 to 255.255.255.255 67 out
$cmd 01800 allow udp from any 67 to me 68 in
$cmd 01900 allow udp from any 67 to 255.255.255.255 68 in
$cmd 02000 allow udp from fe80::/10 to me 546 in
$cmd 02100 allow icmp from any to any icmptypes 8
$cmd 02200 allow ipv6-icmp from any to any icmp6types 128,129
$cmd 02300 allow icmp from any to any icmptypes 3,4,11
$cmd 02400 allow ipv6-icmp from any to any icmp6types 3
$cmd 02500 allow tcp from $LAN to me 22 in via $pif setup limit src-addr 2
$cmd 65000 count ip from any to any
$cmd 65100 deny { tcp or udp } from any to any 135-139,445 in
$cmd 65200 deny { tcp or udp } from any to any 1026,1027 in
$cmd 65300 deny { tcp or udp } from any to any 1433,1434 in
$cmd 65400 deny ip from any to 255.255.255.255
$cmd 65500 deny ip from any to 224.0.0.0/24 in
$cmd 65500 deny udp from any to any 520 in
$cmd 65500 deny tcp from any 80,443 to any 1024-65535 in
$cmd 65500 deny ip from any to any
$cmd 65535 deny ip from any to any
###################################




FreeBSD es genial!.