# Configurar un servidor APF con netatalk en una Raspberry Pi

## Introducción
Tras un rato con la configuración del **NFS v4** para conectarme desde mi Macbook Pro a mi raspberrypi (linux con[Hypriot](https://blog.hypriot.com/getting-started-with-docker-on-your-arm-device/), he visto que al final perderé el tiempo, la velocidad no es muy agraciada, y encima se me olvidó un detalle, necesito una partición en un de mis discos atados a la raspberry que tengo formato **hfsplus o apfs**. A este punto no encontre nada sobre APFS para linux excepto un repositorio de github [Apple File System for Linux](https://github.com/linux-apfs/linux-apfs-rw)
y yo soy friki pero no idiota como para perder mi tiempo, y menos cuando una de las particiones va a ser mi **Time Machine** o backup.


## Metodología
Debemos realizar los siguientes pasos:
Instalar el soporte de **HPFS+**
Instalar soporte **netatalk** para poder comunicarnos con el protocolo de red de Apple.
Particionar el disco con **parted** ya que el disco de **Time Machine** debe estar formateado y montado como una unidad HPFS+
Modificar el fichero de montaje fstab para que sea permanente
Editar la configuración de netatalk

Después ya podremos comprobar el trabajo realizado.

En el ejemplo vamos a usar un disco de 5TB con dos particiones, una para **hpfs+** y **xfs** 

## Soporte HPFS+
### Actualización del sistema de paquetes
```bash
sudo apt-get update
sudo apt-get upgrade
```
### Instalación de paquetes para HPFS+
Sin ellos no podremos dar soporte a nuestro linux para que lea y escriba en un sistema de ficheros HPFS+

```bash
sudo apt-get install hfsplus hfsutils hfsprogs gdisk
```

### Crear una particion HPFS+
Primero necesitamos crear una partición para usar con dicho sistema de ficheros.

En mi caso voy a formatear un disco duro de 5TB en dos particiones. Una para **xfs** y otra para **hpfs+* 

Es un disco que actualmente tenía dos particiones, una reservada que no borre y otra xfs. En el proceso voy a eliminar las dos particiones para luego crear dos particiones conforme a mis deseos, usando **parted**

Más información  [Parted mejor que fdisk](https://wiki.castris.com/books/tips-sobre-la-administracion-de-linux/page/parted-mejor-que-fdisk)

```bash
❯ sudo parted /dev/sdb
GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: Seagate Expansion Desk (scsi)
Disk /dev/sdb: 6001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name                          Flags
 1      17.4kB  134MB   134MB                Microsoft reserved partition  msftres
 2      135MB   6001GB  6001GB  xfs          BACKUP5T

(parted) rm 2
(parted) rm 1
(parted) print
Model: Seagate Expansion Desk (scsi)
Disk /dev/sdb: 6001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start  End  Size  File system  Name  Flags

(parted) quit
Information: You may need to update /etc/fstab.

❯ sudo parted -s /dev/sdb mkpart backupt3t 0% 50%
❯ sudo parted -s /dev/sdb mkpart timemachine 50% 100%

❯ sudo parted /dev/sdb
GNU Parted 3.2
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: Seagate Expansion Desk (scsi)
Disk /dev/sdb: 6001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name         Flags
 2      1049kB  3001GB  3001GB               backup3t
 1      3001GB  6001GB  3001GB               timemachine

(parted) quit

```

Que bien que ahora podemos formatear las dos particiones.

```bash
❯ sudo mkfs.hfsplus /dev/sdb2
Initialized /dev/sdb2 as a 2795 GB HFS Plus volume
❯ sudo mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=183141312 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=0
data     =                       bsize=4096   blocks=732565248, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=357697, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
```

## Crear las particiones de montaje
Creamos las particiones de montaje para ambos sistemas, y ya que van a aser usadas en un entorno personal le damos los permisos adecuados
```bash
❯ sudo mkdir /timemachine
❯ sudo mkdir /backup3t
```
## Probar el montaje manual
Primero probamos manualmente el montaje, y luego pasaremos a el montaje automático en cada reinicio. 
> Aconsejado cuando hacemos cosas con nuevos dispositivos, y sistemas de ficheros, para liberarnos de problemas en el montaje automático.

El comando de abajo, formateara la partición con las siguientes características (disponible la ayuda man de  man mkfs.hfsplus

- **s** Que creará un formato sensitivo al caso (distinguir mayúsculas de minúsculas) 
- **v** nombre del volumen

> Lo de Apple y las mayusculas y minusculas es que no me entra. Un sistema UNIX como es MacOSX basado en Darwin, en el que coexiste con otros UNIX, que por defecto te instala un sistema sin distinción de caso.

> La opción **J** Crearía el volumen con un fichero de diario o journal en este caso de 512M (máximo). Yo lo considero necesario pues en caso de un problema con el disco en un reinicio, corte de electricidad, es una garantía muy fuerte de que se recuperara la información, y en backups basados en rsync como los es el Time Machine, es más que necesario por la cantidad tan gigante de información que se genera en el journal. Lamentablemente a la fecha no conozco soporte para instalar el journal ya que al montaje, el disco se haria indisponible por un problema de permisos sobre el journal.


```bash
❯ sudo mkfs.hfsplus -s -v timemachine /dev/sdb1
Initialized /dev/sdb1 as a 2795 GB HFS Plus volume

❯ sudo fsck.hfsplus /dev/sdb1
** /dev/sdb1
** Checking HFS Plus volume.
** Detected a case-sensitive catalog.
** Checking Extents Overflow file.
** Checking Catalog file.
** Checking Catalog hierarchy.
** Checking volume bitmap.
** Checking volume information.
** The volume timemachine appears to be OK.
```

![Montaje hfsplus manual](https://multimedia.castris.com/imagenes/wiki/macos/mount-hfsplus.png)
### Montaje automatizado de los discos
Una vez montado podemos ver las opciones del montaje que estarán disponibles en el `/etc/mtab`

```
/dev/sdb1 /timemachine hfsplus rw,relatime,umask=22,uid=0,gid=0,nls=utf8 0 0
```

Editamos el fichero `/etc/fstab`
```bash
❯ sudo cat /etc/fstab |grep time
/dev/sdb1 /timemachine hfsplus rw,relatime,umask=22,uid=0,gid=0,nls=utf8 0 1
```
Con ellas ya tenemos una idea de que poner en el `/etc/fstab`

### Obtención del UUID
Suelo montar las particiones con UUID y con más razón cuando son discos externos, ya que un cambio, eliminación de dispositivo, error, en un reinicio puede cambiar las letras del dispositivo.

```bash
> sudo  blkid
```
![Comando blkid](https://multimedia.castris.com/imagenes/wiki/macos/blkid.png)

### Edición del fstab
```bash
UUID=6bc6f79f-c74f-35a1-b226-092396e3fed1 /timemachine hfsplus rw,relatime,umask=22,uid=0,gid=0,nls=utf8 0 1
UUID=c0f66c48-3a78-4c1a-bc7f-6d4ad854f284 /backup3t xfs  rw,noquota,nofail  0  1
```

## Configuración de netatalk
Una buen guía de netatalk es la [Guia de Archlinux | Netatalk](https://wiki.archlinux.org/title/Netatalk) aunque es bueno darse una leída al propio proyecto [Netatalk](https://netatalk.sourceforge.io/)

Abajo mi configuración 

```bash
❯ cat /etc/netatalk/afp.conf
;
; Netatalk 3.x configuration file
;

[Global]
; Global server settings
; mimic model = TimeCapsule6,106
 log level = default:warn
 log file = /var/log/afpd.log
 hosts allow = 192.168.1.0/24
 spotlight = yes

; [Homes]
; basedir regex = /home

[Pirate]
path = /home/pirate
valid users = pirate

[Backup10t]
path = /backup10t
valid users = pirate

[Backup3t]
path = /backup3t
valid users = pirate

[My Time Machine Volume]
path = /timemachine
time machine = yes
```

Reiniciar **netatatalk** con `sudo systemctl restart netatalk` ya tendremos disponibles nuestras particiones en el mac a través de las unidades de red.

> Nota: El reinicio de netatalk tras algún cambio o el inicio por primera vez, tardará dependiendo de la cantidad de contenidos de las unidades compartidas configuradas.

## Montaje de las particiones
Ya está, ya solo tenemos conectarnos al servidor y montar nuestras particiones.

Desde el Finder > Ir > Conectarse a un servidor (⌘)

![Conectarse a un servidor APF](https://multimedia.castris.com/imagenes/wiki/macos/conectarse-a-un-servidor-apf.png)
![Conectarse  un volumen de un servidor APF](https://multimedia.castris.com/imagenes/wiki/macos/conectar-a-un-volumen-apf.png)

> NOTA: La primera vez que se conecta a un servidor APF tardará un buen rato en terminar la conexión. Sé paciente, sobre todo si tus discos o particiones APF tiene un gran volumen de ficheros y enlaces, ya que este sistema de red, tiene una especie de journal, que tiene que completar. No te desesperes, en mi caso la primera vez tardó casi 10 minutos, ya que el disco `backup10t` tiene casi 8TB de backups con rsync de más de 2 años, lo que hace que su número de inodos usados en enlaces duros sea muy elevado.

## Configurar Time Machine
Ahora ya podemos configurar nuestro Time Machine 
**Preferencias > Time Machine** y disfrutar delo aprendido.

![Configurar Time Machine](https://multimedia.castris.com/imagenes/wiki/macos/mi-time-machine.png)

## Disclaimer o descargo de responsabilidad
Esto es un documento tipo “Yo lo hice así y me funciono”. Eso supone que cuando menos tienes conocimientos, gustas de leer la documentación y tratar de entenderla. Que eres un forofo de las copias de seguridad y que por supuesto, eres consciente de que si haces algo mal la puedes liar. No me vengas luego con llantos. Si te pasa algo yo no soy el culpable. ¿Entendido? Que los disfrutes.

##### Aviso
Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. 
También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad.
El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de [Castris](https://castris.com)

Si necesitas soporte profesional puedes contratar con Castris [soporte profesional](https://intranet.castris.com/cart.php?gid=18).