En este artículo puedes aprender que es posible montar un pequeño servidor web en una tarjeta Raspberry Pi, configurándolo además para que distintos usuarios puedan tener su propio espacio web, limitando su espacio de almacenamiento de la misma manera que nos podemos encontrar en hostings web de Internet.

Instalación del sistema operativo en la tarjeta SD

Desde la web de Raspberry se pueden descargar distintas versiones de sistemas operativos para la tarjeta. En este artículo se va a utilizar Raspbian, que es una versión de Debian, una reconocida distribución de Linux. Accediendo a la web http://www.raspberrypi.org/downloads/ puedes descargarlo usando un cliente Torrent o descarga directa del archivo ZIP.

Al descomprimir el archivo descargado podrás comprobar que contiene un único archivo, con la extensión IMG. Este tipo de archivos se utilizan para almacenar copias exactas de unidades de almacenamiento, y para volcar su contenido es necesario una aplicación específica para ello. Si se va a realizar la copia de la tarjeta SD desde Windows se puede usar la aplicación Win32DiskImager como recomiendan y explican su funcionamiento en http://www.raspberrypi.org/documentation/installation/installing-images/windows.md.

Localiza el archivo IMG usando el icono de la carpeta azul, selecciona la unidad donde se encuentre la tarjeta SD introducida usando la lista desplegable que se encuentra bajo la etiqueta Device en la parte derecha, y usa el botón Write para hacer el volcado del sistema operativo a la tarjeta.

Una vez finalizada la copia, extrae correctamente la tarjeta SD e insértala en la Raspberry antes de encenderla. 

Arranque y acceso remoto a la Raspberry

Tras introducir la tarjeta SD y conectar el cable de red, enchufa el conector de corriente para que se inicie la Raspberry. Incialmente se encenderá el led de Power (PWR), pero pasados unos segundos se encenderán los restantes de conexión de red.

El sistema operativo Raspbian viene con el servicio SSH preinstalado, por lo que podemos acceder a la Raspberry desde el PC usando un cliente SSH como puede ser Putty para Windows. Para poder hacer la conexión necesitamos conocer la dirección IP que ha tomado la Raspberry (estamos suponiendo que la red local que se esté usando tiene configurado el servicio DHCP para asignar direcciones IP dinámicamente). Una manera de localizar la dirección es usando el comando nmap que disponen todos los sistemas Linux, y que también se puede descargar una versión para Windows desde http://nmap.org/download.html#windows. Este comando del símbolo del sistema puedes usarlo con los parámetros -sn y la dirección IP de tu red para descubrir los equipos conectados a tu red local mostrando además su dirección IP y MAC.

Por ejemplo, si tu red se encuentra en la red 192.168.1.0 con una máscara de red de 24 bits, deberás usar:

nmap -sn 192.168.1.0/24

En unos instantes verás la lista de equipos conectados a la red, y entre ellos debería aparecer uno con la etiqueta (Raspberry Pi Foundation). La dirección IP que aparezca antes será la que haya tomado y antes de ese nombre verás su dirección MAC:

En este caso puedo ver que le ha asignado la dirección IP 192.168.1.200. Por tanto, para conectarme remotamente a la Raspberry se deberá usar esa dirección IP en el cliente SSH que vaya a utilizar.

Como es habitual en las conexión por SSH, la primera vez que se conecta a un host se mostrará un mensaje informando que es la primera vez que se hace esa conexión y que se almacenará la huella digital de ese equipo para ser reconocido en las siguientes ocasiones.

Una vez completada la conexión, solicita los datos de acceso (usuario y contraseña), que por defecto son pi con la contraseña raspberry.

En esta pantalla de bienvenida puedes observar que informa que el software no ha sido totalmente configurado por lo que se debería ejecutar el comando:

sudo raspi-config

Con esa utilidad puedes acceder a las siguientes funciones:

En la opción 8 puedes encontrar algunas opciones avanzadas:

Aunque en principio no es necesario realizar ningún cambio, quizá sí pueda ser interesante cambiar la contraseña del usuario por defecto para evitar accesos no deseados de otras personas. Esa opción la puedes encontrar como Change User Password.

Usa el tabulador para acceder al enlace Finish y pulsa Intro para finalizar esta configuración.

Cambiar tamaño de particiones

Inicialmente, la partición creada para el sistema operativo no ocupa la totalidad de la tarjeta SD, quedando espacio libre detrás de ella sin ocupar. Si se desea tener una única partición ocupando todo el espacio de la SD, lo más sencillo es utilizar la primera opción (Expand Filesystem) de la utilidad de configuración (raspi-config) vista anteriormente.

Pero en este artículo se va a cambiar manualmente el particionamiento de la SD al disponer de una tarjeta de 16GB, y se desea tener una partición reservada para la carpeta home y agrandar la partición del sistema.

La distribución de las particiones de la tarjeta se puede conocer con el comando:

sudo fdisk -l

Podemos ver que la unidad recibe el nombre /dev/mmcblk0 y que hay 2 particiones creadas. La primera de ellas (mmcblk0p1), con formato FAT32, se utiliza para el arranque del sistema, y la siguiente (mmcblk0p2) con formato Linux es la que contiene el sistema operativo Raspbian que se ha instalado.

En ese resultado no se puede observar cómodamente el tamaño que tiene cada partición, así que usa el siguiente comando si quieres verlo más detallado:

df -h

La partición de arranque tiene un tamaño de 56M, de los cuales se ocupan 9.7M, y la partición del sistema operativo, que aparece como /dev/root, tiene un tamaño de 2.9GB de los que hay usado 2.3GB. Por tanto, si la tarjeta SD es de 16 GB queda mucho espacio sin utilizar por ninguna partición.

Para agrandar la partición del sistema se puede utilizar la herramienta fdisk indicando el nombre asignado a la unidad:

sudo fdisk /dev/mmcblk0

Esta utilidad requiere que se le indique mediante letras los comandos de las acciones a realizar, que serán las siguientes:

  • p: mostrar la lista actual de particiones
  • d > 2: eliminar la partición nº 2 (se acaba de ver en la lista anterior que la partición nº 2 contiene el sistema y es la que se desea agrandar).
  • p: volver a mostrar la lista de particiones en el estado actual (tras eliminar la partición 2).

A continuación se debe volver a crear la misma partición pero con otro tamaño. Hay que tener muy en cuenta que la partición debe comenzar en el mismo sector en el que se encontraba antes. En el listado se ha podido ver que en este caso era el 122880. Se le va a asignar un tamaño de 6 GB, por lo que se indica +6G.

  • n > p > 2 > 122880 > +6G: crear una nueva (n) partición primaria (p) con número 2, empezando en el sector 122880 y con tamaño de 6 GB.
  • w: guardar los cambios en la tabla de particiones.

Como se indica en el mensaje final obtenido, se debe reiniciar el dispositivo para que tengan efecto los cambios.

sudo reboot

Además, una vez iniciado de nuevo el sistema, se debe indicar que se redimensione la partición mmcblk0p2 para ocupe todo el espacio disponible para esa partición con la instrucción:

sudo resize2fs /dev/mmcblk0p2

Puedes ver el resultado final con el comando:

df -h

Observa que ahora aparece /dev/root con un tamaño total cercano a los 6 GB indicados.

Con la misma utilidad fdisk se va a crear una partición, nueva en este caso, para alojar en ella todo el contenido de la carpeta home que usarán los usuarios como su espacio de almacenamiento. Esta partición ocupará todo el tamaño restante de la tarjeta SD.

Deberás reiniciar de nuevo para que los cambios tengan efecto, y muestra la lista de particiones (sudo fdisk -l) de nuevo para ver si todo ha ido bien de momento.

Formatea la nueva partición con formato ext4 usando:

sudo mkfs.ext4 /dev/mmcblk0p3

Para que el sistema pueda seguir funcionando con normalidad se debe copiar el contenido de la carpeta /home actual a la nueva partición. Para ello, puedes crear una carpeta temporal como /mnt/home y montar en ella la partición creada:

sudo mkdir /mnt/home
sudo mount /dev/mmcblk0p3 /mnt/home

Copia todo el contenido de /home actual al punto de montaje que se acaba de crear (las opciones indicadas mantienen los enlaces simbólicos que hubiera, dueños y permisos, y se copiarán todos los subdirectorios)

sudo cp -dpR /home/* /mnt/home

Ya puedes desmontar el punto de montaje anterior:

sudo umount /mnt/home

Y ahora deberás indicar que se monte esa partición en la carpeta /home cada vez que se inicie el sistema. Para ello edita el archivo /etc/fstab, añadiendo la última línea que se muestra:

sudo nano /etc/fstab

Aquí puedes ver el contenido de la última línea añadida:

/dev/mmcblk0p3 /home ext4 defaults,noatime 0 3

Tras reiniciar, comprueba el estado de las particiones, observando que la partición 3 está montada en la carpeta /home y que ha tomado el espacio que sobraba de la tarjeta SD:

Cuotas para usuarios

Puedes establecer el espacio máximo que puede ocupar cada usuario en su carpeta home utilizando la herramienta quota. Para usarla, lo primero que debes hacer es instalar el paquete correspondiente.

sudo apt-get install quota

Hay que indicar que la partición asociada a la carpeta home va a utilizar el sistema de cuotas. Para ello edita el archivo /etc/fstab:

sudo nano /etc/fstab

Debes modificar la línea que haga referencia a la partición en la que se monta /home. En esta caso es la partición 3 tras haber seguido todos los pasos anteriores. En esa línea hay que modificar los parámetros añadiendo usrquota y grpquota para indicar que se pueda establecer cuotas a nivel de usuarios y de grupos. La línea quedará así:

/dev/mmcblk0p3 /home ext4 defaults,noatime,usrquota,grpquota 0 3

Reinicia el sistema para que tengan efecto esos cambios.

sudo reboot

A hora se debe establecer la cuota deseada para cada usuario. Vamos a suponer que se va a establecer un límite de 250MB para cada usuario. Para establecer las quotas se usa el comando edquota seguido del usuario al que se quiere establecer la cuota.

sudo edquota usuario1

Se abre un editor donde puedes indicar el espacio máximo que puede ocupar el usuario. Las columnas soft y hard hacen referencia al espacio en bloques (1 KB) que puede ocupar el usuario. El dato de la columna soft se usará para avisar al usuario que está llegando a su máximo:

También se podría establecer un tope en cuanto al número de archivos pertenecientes al usuario usando las columnas inodes.

Una vez establecida la quota para un usuario, puedes copiarla a otros usuarios indicando la opción -p.

sudo edquota -p usuario1 usuario2 usuario3 usuario4

El comando repquota permite ver el estado actual de las quotas asociadas a un punto de montaje:

sudo repquota /home

Servidor web Apache

Se instala de la manera habitual:

sudo apt-get install apache2

En cuanto acaba la instalación puedes comprobar su funcionamiento indicando la dirección IP de la Raspberry en un navegador web.

El módulo userdir del servidor web Apache permite que cada usuario del sistema tenga su propio espacio web al que se accederá desde el navegador indicando la dirección del navegador seguido de /~ y el nombre del usuario. Por ejemplo, en el servidor que se encuentre en la IP 192.168.1.200, para el usuario1: http://192.168.1.200/~usuario1. El módulo se habilita ejecutando:

sudo a2enmod userdir

Cada usuario deberá tener una carpeta llamada public_html en su carpeta home. Para evitar que cada uno se lo tenga que crear, puedes crearla en la carpeta /etc/skel. Todo lo que ahí se encuentre se copiará a cada nuevo usuario que se añada al sistema a partir de este momento. Puedes también, por ejemplo, crear una página de inicio index.html que será inicialmente la página de presentación de cada usuario y que cada uno podrá modificar posteriormente.

sudo mkdir /etc/skel/public_html

Servidor FTP (proftpd)

Para que los usuarios puedan subir los archivos correspondientes a sus sitios web, habilitaremos un servidor FTP. En este caso vamos a instalar el servidor ProFTPD.

sudo apt-get install proftpd-basic

Durante la instalación se preguntará si se desea instalar como un servicio independiente o como parte de inetd. Se puede dejar como independiente (standalone) para no tener que configurar inetd.

Una vez finalizada la instalación, los usuarios que estén dados de alta en el sistema podrá acceder al servidor usando un cliente FTP. Por defecto, cualquier usuario podrá ver el contenido de carpetas que no son de su propiedad aunque no tendrá permisos para modificar su contenido. Si se desea que cada usuario quede encerrado en su carpeta home se debe editar el archivo /etc/proftpd/proftpd.conf decomentando la línea DefaultRoot ~.

sudo nano /etc/proftpd/proftpd.conf 

Reinicia el servidor ProFTPD y comprueba que los usuarios no pueden ver más allá de su carpeta personal.

sudo service proftpd restart

Limitar acceso por SSH

Por defecto, la tarjeta Raspberry Pi trae activado el acceso por SSH, pero esto implica que cualquier usuario del sistema puede usarlo. Si no se configura de otra manera, cualquiera de esos usuarios puede navegar por las carpetas de otros usuarios o del sistema. Una solución es limitar el acceso por SSH para que sólo el usuario principal (pi) pueda usar el servicio SSH. Para ello, edita el archivo /etc/ssh/sshd_config:

sudo nano /etc/ssh/sshd_config

Añade al final de ese archivo:

AllowUsers pi

Reinicia el servico ssh y comprueba que no puedes acceder con un usuario que no sea pi.

sudo service ssh restart

Instalación de PHP

Para muchas aplicaciones web es necesario disponer del lenguaje PHP instalado para que el servidor web pueda interpretar las páginas desarrolladas en ese lenguaje. Tan solo tienes que instalar el paquete php5

sudo apt-get install php5

Acceso FTP desde la web con net2ftp

Para facilitar que los usuarios puedan acceder a su contenido en el servidor desde el navegador web sin tener que usar una aplicación cliente FTP, se va a instalar la aplicación web net2ftp.

Descarga el paquete ZIP desde la dirección http://www.net2ftp.com/homepage/download.html y descomprímela en la carpeta /home/pi. Si no has cambiado la estructura de las carpetas, el contenido de este paquete habrá quedado en la carpeta /home/pi/net2ftp_v1.0/files_to_upload/.

Para que los usuarios puedan acceder a esta aplicación con una dirección cómoda como http://ip.del.servidor/net2ftp vamos a configurar un alias en el servidor web Apache. Edita el archivo /etc/apache2/sites-enabled/000-default:

sudo nano /etc/apache2/sites-enabled/000-default

Inserta el siguiente código entre dos secciones Directory, como se ve en la imagen siguiente (si los archivos de net2ftp han quedado en una ruta diferente deberás cambiarlo también en este código):

Alias /net2ftp /home/pi/net2ftp_v1.0/files_to_upload/
<Directory /home/pi/net2ftp_v1.0/files_to_upload/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>

Reinicia el servidor web y comprueba que puedes acceder a net2ftp desde el navegador web poniendo /net2ftp detrás de la dirección de la Raspberry:

sudo service apache2 restart