Raspberry Pi - Instalación Ubuntu server


Índice:

      Información inicial

      Preparación de la tarjeta SD con el SO

         Usando Raspberry Pi Imager

      Iniciar por primera vez

      Configuración

         Configurar usuario principal (si es necesario)

         Conectar USB

         Script de configuración

         Configurar SSH ( /etc/ssh/sshd_config

         Configurar Firewal (UFW)

      Script configurar.sh

         Descripción script configurar.sh

         Configuración script configurar.sh

         Script configurar.sh (Versión 1.00)

      Script montar.sh

         Script montar.sh (Versión 1.00)

      Comandos útiles

      MOUNT.CIFS


Información inicial  ⮴  

Detalle: Configuración de un servidor Ubuntu 22.04.3 LTS en la Rasberry Pi

Versión: 1.02

Fecha  : 27 de septiembre de 2023


Preparación de la tarjeta SD con el SO  ⮴  

Usando Raspberry Pi Imager  ⮴  

SO: Ubuntu server 22.04.3 LTS (FULL)

Advabce options:

Enable SSH

Set username and password

Username: juanp

Contraseña: 252627


Iniciar por primera vez  ⮴  

Colocar la tarjeta SD en la raspberry pi y encenderla.


El acceso puede realizase desde consola o por ssh si se conoce la IP asiganda.

    ssh juanp@192.168.0.137


Si no se ha configurado el nombre del usuario y la contraseña, su valores por

defecto serán:

Usuario   : ubuntu

Contraseña: ubuntu


Configuración  ⮴  

Configurar usuario principal (si es necesario)  ⮴  

Crear y configurar el usuario principal (juanp) si no se ha hecho ya.


.- Crear usuario

.- Añadir al grupo sudo

.- Crear el archivo /root/.credenciales con dos líneas:

            username=invitado

            password=CONTRASEÑA      


Conectar USB  ⮴  

En un USB (FAT 32) se copia el scrip de configuración, el scrip para el

montaje y aquello que pueda ser necesario.


Ver/Leer los apartados sobre los script de configuracion y el de montaje.


Scripts:


Script configurar.sh

Script montar.sh


Tras conectar el USB se obtiene el nuevo dipositivo de almacenamiento en el

directorio /dev

      sudo fdisk -l    

      sudo fdisk -l | grep /dev


Crear en /mnt un directorio para montar el USB

      sudo mkdir /mnt/prv       


Montar el dispositivo USB

      sudo mount /dev/sdxxx /mnt/prv


Script de configuración  ⮴  

Ejecutar el scrip de configuración.

      sudo bash /mnt/prv/configurar.sh


Configurar SSH ( /etc/ssh/sshd_config  ⮴  

Habiliar exclusivamente a los usuarios creados a accecer via SSH al servi-

dor, copiar en /etc/ssh/sshd_config las siguientes lineas.


      # INICIO MODIFICACIONES REALIZADAS ####################################


      AllowUsers juanp diego pablo marisa


      # FIN MODIFICACIONES###################################################   


Editar configuración servidor

      sudo nano /etc/ssh/sshd_config


Reinciniar el servicio.

      sudo service ssh restart         


Configurar Firewal (UFW)  ⮴  

El cortafuegos por defecto estará deshabilitado, para configurar el corta-

fuegos usaremos ufw.


¡¡¡ Atención !!!


Antes de habilitar el cortafuegos, abir el puerto 22 para permitir el

acceso vía ssh.


      sudo ufw status

      sudo ufw app list

      sudo ufw app info OpenSSH

      sudo ufw allow "OpenSSH"

      sudo ufw enable


Script configurar.sh  ⮴  

Descripción script configurar.sh  ⮴  

Script para configurar el servidor ubuntu en la Raspberry PI.


.- Actualiza el sistema operativo _update_SO


.- Instala los paquetes necesarios cifs-utils


Debe existir el usuario principal (juanp)


.- Usuarios: Crea los usuarios en base a al información contenida en aUsers

aUsers -> [Usuario;Contraseña;]

Añade al usuario juanp a cada grupo principal de cada usuario

que se crea.


.- Extructura de carpetas en la que montará para cada usuario las carpetas de

red (NAS WD) a la que tendrán acceso.

Se crea en base a la información contenida en aFolders, la primera posición

de aFolders contiene la carpeta que contendrá las diferentes carpetas con

los recursos compartidos.


..- Folder base: Directorio en /mnt que contendrá las carpetas de cada

usuario.

..- Nombre folder a crear

..- Nombre Usuario

..- Nombre Grupo

..- Permisos en formato octal (0777)

..- Modo: read&write - rw / read only - ro  [fstab]

..- Origen: dirección al recursos           [fstab]


/mnt|

|user_1 |

|       |NameFolder_1

|       |NameFolder_2

|       |NameFolder_N


|user_2 |

|NameFolder_1

|NameFolder_2

|NameFolder_N


.- Lineas fstab: Crea las líneas necesarias montar las directorios de red en

los directorios creados.


Configuración script configurar.sh  ⮴  

La configuración se realiza cargando la información en las matrices:


.-  aPackages

.-  aUsers

.-  aCredenciales

.-  aFolders


Cada línea ha de finalizar con ;


.-  aPackages


Contiene el nombre de los paquetes que se desean instalar.



.-  aUsers


Contiene el nombre y contraseña de cada usuario que se va a crea.



.-  aCredenciales


Contiene el nombre y contraseña de cada usuario para acceser la NAS WD,

los nombres de los usuarios deben coincidir con los indicados en aUsers.



.- aFolders[]


El primer directorio se creará directamente en /mnt y de él colgarán los

directorios en los que se montarán los recursos. A este directorio el

usuario tendrá acceso exclusivamente de acceo y lectura (550) de forma

que no pueda crear directorios ni archivos en él y sólo pueda hacerlo en

los directorios en los que se montan los recursos.


.- Folder base

.- Nombre folder a crear

.- Nombre Usuario

.- Nombre Grupo

.- Permisos

.- Modo de acceso:

..- rw : read & write

..- ro : read only


Script configurar.sh (Versión 1.00)  ⮴  

    #!/bin/bash



    # Script para configurar el servidor ubuntu en la Raspberry PI.


    # .- Crea una copia de seguridad de /etc/fstab y /etc/ssh/sshd_config

    # .- Actualiza el sistema operativo _update_SO


    # .- Instala los paquetes necesarios cifs-utils


    # Debe existir el usuario principal (juanp)


    # .- Usuarios: Crea los usuarios en base a al información contenida en aUsers

    #              aUsers -> [Usuario;Contraseña;]

    #              Añade al usuario juanp a cada grupo principal de cada usuario 

    #              que se crea.


    # .- Extructura de carpetas en la que montará para cada usuario las carpetas de 

    #    red (NAS WD) a la que tendrán acceso.

    #    Se crea en base a la información contenida en aFolders, la primera posición 

    #    de aFolders contiene la carpeta que contendrá las diferentes carpetas con

    #    los recursos compartidos.      


    #     ..- Folder base: Directorio en /mnt que contendrá las carpetas de cada 

    #            usuario.

    #     ..- Nombre folder a crear

    #     ..- Nombre Usuario

    #     ..- Nombre Grupo

    #     ..- Permisos en formato octal (0777)

    #     ..- Modo: read&write - rw / read only - ro  [fstab]

    #     ..- Origen: dirección al recursos           [fstab]


    #    /mnt|

    #        |user_1 |

    #        |       |NameFolder_1

    #        |       |NameFolder_2

    #        |       |NameFolder_N                            


    #        |user_2 |

    #                |NameFolder_1

    #                |NameFolder_2

    #                |NameFolder_N                            


    # .- Lineas fstab: Crea las líneas necesarias montar las directorios de red en 

    #                  los directorios creados. 



    # Pendiente:


    #  Configurar usuario principal incluido su archivo de credenciales. Ver qué es 

    #  necesario si no se configura juanp como usuario en el instalador de PI


    #  Configurar ssh:


    #    .- Puerto

    #    .- Usuarios

    #    .- banner



    # Versión 1.01

    # Fecha: 02/12/22



    # Crear copia de seguridad

    _crear_backup(){


      local l_backup="$(dirname "$0")/backup"


      echo ""

      echo "Creando copias de seguridad de fstab y sshd_config"


      if [ ! -d "$l_backup" ]; then

        mkdir $l_backup

        if [ ! $? -eq 0 ]; then

          echo "Error al crear el directorio para guardar las copias de seguridad."

          echo "Se cancela el script"

          exit 1

        fi     

      fi


      cp /etc/fstab "$l_backup/fstab.bck"

      if [ ! $? -eq 0 ]; then

        echo "Error al crear la copia de seguridad de /etc/fstab"

        echo "Se cancela el script"

        exit 1

      fi     


      cp /etc/ssh/sshd_config "$l_backup/sshd_config.bck"

      if [ ! $? -eq 0 ]; then

        echo "Error al crear la copia de seguridad de /etc/ssh/sshd_config"

        echo "Se cancela el script"

        exit 1

      fi


      echo "Ok"

      echo ""





    # Instala paquete


    _install(){


      echo ""

      echo "-------------------------------------------------------------------------------"

      echo "Instalando $1"

      echo ""

      apt install $1

      if [ ! $? -eq 0 ]; then

        echo ""

        echo "Error en la instalción: apt install $1"

        echo ""

        exit 1

      fi





    _install_packages(){


      local -n l_array=$1

      local l_i


      for l_i in "${l_array[@]}" ; do

        _install $l_i

      done





    # Actualiza el SO


    _update_SO(){


      echo ""

      echo "-------------------------------------------------------------------------------"

      echo "Actualizando las listas de paquetes de los repositorios."

      echo ""

      apt update

      if [ ! $? -eq 0 ]; then

        echo ""

        echo "Error en la ejecución de: apt update"

        echo ""

        exit 1

      fi


      echo ""   

      echo "-------------------------------------------------------------------------------"

      echo "Instalando las versiones más recientes de todos los paquetes"

      echo "actualmente instalados en el sistema"

      echo ""

      apt upgrade -y  

      if [ ! $? -eq 0 ]; then

        echo ""

        echo "Error en la ejecución de: apt upgrade -y"

        echo ""

        exit 1

      fi


      echo ""   

      echo "-------------------------------------------------------------------------------"

      echo "Eliminando paquetes innecesarios."

      echo ""

      apt autoremove

      if [ ! $? -eq 0 ]; then

        echo ""

        echo "Error en la ejecución de: apt autoremove"

        echo ""

        exit 1

      fi





    _add_lines_fstab(){


      local l_r=1

      local l_f=$(mktemp)

      local l_fb="$(dirname "$0")/fstab.backup" 


      echo ""

      echo "-------------------------------------------------------------------------------"

      echo "Las líneas actuales del fstab son las siguientes:"

      sleep 1

      echo ""

      cat /etc/fstab

      echo ""

      echo "-------------------------------------------------------------------------------"

      echo "Las líneas a incluir en /etc/fstab son las siguientes:"  

      sleep 1  

      echo ""

      cat $1

      echo "-------------------------------------------------------------------------------"


      while true; do

        read -p "ATENCION:  ¿Incluir las líneas en /etc/fstab (Y/N) " yn

        case $yn in

          [Yy]* ) l_r=0;break;;

          [Nn]* ) echo 'No se incluyen las líneas';break;;

          * ) echo "La respuesta ha de ser yes o no.";;

        esac

      done  


      if [ $l_r -eq 0 ]; then

        echo "-------------------------------------------------------------------------------"

        echo ""

        echo "Se incluyen las nuevas lineas en /etc/fstab"

        echo ""

        echo "Se crea copia de seguridad de /etc/fstaba en $l_fb"

        echo ""

        cp /etc/fstab $l_f

        if [ ! $? -eq 0 ]; then

          echo "Error al copiar de /etc/fstab"

          echo "Se cancela"

          rm -f $l_f            

          exit 1

        fi

        cp /etc/fstab $l_fb

        if [ ! $? -eq 0 ]; then

          echo "Error al crear copia de seguridad de /etc/fstab"

          echo "Se cancela"

          rm -f $l_f            

          exit 1

        fi


        cat $1 >> $l_f

        if [ ! $? -eq 0 ]; then

          echo "Error al incluir las lineas en /etc/fstab"

          echo "Se cancela"

          rm -f $l_f            

          exit 1

        fi


        cp $l_f /etc/fstab

        if [ ! $? -eq 0 ]; then

          echo "Error al incluir las lineas en /etc/fstab"

          echo "Se cancela"

          rm -f $l_f      

          exit 1

        fi

        echo ""

        echo "-------------------------------------------------------------------------------"

        echo "El nuevo archivo /etc/fstab tiene las siguientes lineas:"

        echo ""

        sleep 2

        cat /etc/fstab

        echo ""

        echo "-------------------------------------------------------------------------------"

        echo "El nuevo archivo /etc/fstab tiene los siguientes premisos:"

        echo ""

        ls -l /etc/fstab

      fi 


      rm -f $l_f





    # aFolders[]


    #  .- Folder base

    #  .- Nombre folder a crear

    #  .- Nombre Usuario

    #  .- Nombre Grupo

    #  .- Permisos

    #  .- Modo

    #  .- Origen


    crear_linea_fstab(){


      local l_aDatos

      local l_i

      local l_org=""

      local l_des=""

      local l_cre=""

      local l_gid=""

      local l_uid=""

      local l_fil=""

      local l_dir=""

      local l_mod=""


      readarray -d ";" -t l_aDatos <<< "$1"


      if [ "${l_aDatos[6]}" != "" ]; then  

        l_org="${l_aDatos[6]}"

        l_des="${l_aDatos[0]}/${l_aDatos[1]}"

        l_cre="/root/.cre_${l_aDatos[2]}"

        l_gid="${l_aDatos[2]}"

        l_uid="${l_aDatos[3]}"

        l_fil="${l_aDatos[4]}"

        l_dir="${l_aDatos[4]}"

        l_mod="${l_aDatos[5]}"

        echo "#   $l_des   - modo: $l_mod"

        echo "$l_org $l_des cifs credentials=$l_cre,gid=$l_gid,uid=$l_uid,file_mode=$l_fil,dir_mode=$l_dir,iocharset=utf8,$l_mod 0 0"                

      fi 





    crear_lineas_fstab(){


      local -n l_array=$1

      local l_aDatos

      local l_i


      readarray -d ";" -t l_aDatos <<< "${l_array[1]}"

      echo ""

      echo "#-------------------------------------------------------------------------------"

      echo "# Recursos en disco WD para usuario ${l_aDatos[2]}"


      for l_i in "${l_array[@]}" ; do

        if [[ "$l_i" != "" ]]; then

          crear_linea_fstab "$l_i"

        fi

      done

      echo ""    





    # 1-> Usuario

    # 2-> Contraseña


    crear_file_cre(){


      l_file="/root/.cre_"$1

      l_i=0

      l_r=0



      while true; do

        read -p "El archivo de cerdenciales de [$1] existe, ¿sustituirlo? (Y/N) " yn

        case $yn in

        [Yy]* ) l_r=1;break;;

        [Nn]* ) echo 'No se incluyen las líneas';break;;

        * ) echo "La respuesta ha de ser yes o no.";;

        esac

      done


      if [ $l_r -eq 1 ];then  

        echo "username=$1">$l_file

        if [ ! $? -eq 0 ]; then

          echo "Error al crear el archivo de credenciales de $1"

          l_i=1

        fi  

        echo "password=$2">>$l_file

        if [ ! $? -eq 0 ]; then

          echo "Error al crear el archivo de credenciales de $1"

          l_i=1    

        fi  


        chown root:root $l_file

         if [ ! $? -eq 0 ]; then

          echo "Error al crear el archivo de credenciales de $1"

          l_i=1    

        fi  


        chmod 0600 $l_file

        if [ ! $? -eq 0 ]; then

          echo "Error al crear el archivo de credenciales de $1"

          l_i=1    

        fi  


        if [ $l_i -eq 0 ];then

          echo "Creado el archivo de credenciales de $1"  

          ls -l $l_file

        fi

      fi




    crear_files_cre(){


      local l_datos

      local -n l_array=$1

      local l_i


      for l_i in "${l_array[@]}" ; do

        readarray -d ";" -t l_datos <<< "$l_i"

        echo ""

        crear_file_cre "${l_datos[0]}" "${l_datos[1]}"

        echo ""

      done




    crear_user(){


      l_user_main=$1

      l_user=$2

      l_pswd=$3  


      echo ""

      echo "Creando usuario: $l_user"

      echo ""  

      # Si existe previamente

      if [ "$(cut -d: -f1 /etc/passwd | grep $l_user)" = "$l_user" ]; then

        if [ "$(cut -d: -f1 /etc/passwd | grep $l_user_main)" != "$l_user" ]; then

          # Eliminando usuario principal de los grupos de los usuarios

           deluser "$l_user_main" "$l_user" > /dev/null 2>&1

            if [ ! $? -eq 0 ]; then

              echo "Error al quitar el usuario $l_user_main del grupo $l_user"

            else

              echo "OK: Se ha elimiando el usuario $l_user_main del grupo $l_user"

            fi

        fi

        # Eliminar usuario y su archivos/configuración

        userdel -r "$l_user" > /dev/null 2>&1

        if [ ! $? -eq 0 ]; then

          echo "Error al eliminar $l_user"

        else

          echo "OK: Se ha elimiando $l_user"

        fi    

      fi


       # Crear usuarios y su home directory (-m)

       useradd -m "$l_user" > /dev/null 2>&1

        if [ ! $? -eq 0 ]; then

          echo "Error al crear el usuario $l_user"

          echo "Se cancela el script"

          exit 1

        else

          echo "OK: Se ha creado el usuario $l_user"

        fi


      # Asignar contraseña  


      chpasswd <<< "$2:$3" > /dev/null 2>&1

      if [ ! $? -eq 0 ]; then

        echo "Error al asignar la contraseña al usuario $l_user"

      else

        echo "OK: Se ha asignado correctamente la contraseña al usuario $l_user"

      fi 


      # Asignar el grupo del usuario creado como grupo secundario del 

      # usuario principal

      usermod -aG "$l_user" "$l_user_main" > /dev/null 2>&1

      if [ ! $? -eq 0 ]; then

        echo "Error al asignar $l_user_main al grupo $l_user"

      else

        echo "OK: Asignado $l_user_main al grupo $l_user"

      fi





    _check_read_only_directory(){


      if [ "$(grep "$1 ro" /proc/self/mountinfo)" != "" ]; then

        echo 1

      else

        echo 0

      fi





    crear_users(){

      local l_datos

      local -n l_array=$2

      local l_i


      for l_i in "${l_array[@]}" ; do

        readarray -d ";" -t l_datos <<< "$l_i"

        echo ""

        crear_user "$1" "${l_datos[0]}" "${l_datos[1]}"

        echo ""

      done




    #  .- 0 Folder base

    #  .- 1 Nombre folder a crear

    #  .- 2 Nombre Usuario

    #  .- 3 Nombre Grupo

    #  .- 4 Permisos


    crear_folder(){


      local l_aDatos

      local l_i

      local l_remount=0


      readarray -d ";" -t l_aDatos <<< "$1"

      echo ""

      echo "Creando directorio ${l_aDatos[0]}/${l_aDatos[1]}"

      # Crear directorio si no existe

      if [ ! -d "${l_aDatos[0]}/${l_aDatos[1]}" ]; then

        mkdir "${l_aDatos[0]}/${l_aDatos[1]}"

        if [ ! $? -eq 0 ]; then

          echo "Error mkdir"

          echo "Se cancela el script"

          exit 1

        fi   

      fi


      # Comprobar si es un punto de montaje de read only, en cuyo caso hay que des-

      # montarlo previamente para cambiar propietario y premisos.

      if [ $(_check_read_only_directory "${l_aDatos[0]}/${l_aDatos[1]}" ) -eq 1 ]; then

        umount "${l_aDatos[0]}/${l_aDatos[1]}"

        if [ ! $? -eq 0 ]; then

          echo "Error desmontando ${l_aDatos[0]}/${l_aDatos[1]}"

          echo "Se cancela el script"

          exit 1

        fi       

        l_remount=1   

        echo "Se ha desmontado ${l_aDatos[0]}/${l_aDatos[1]}" 

      fi  


      # Asignar propietario: Usuario y grupo

      echo "Asignando propietario y grupo"

      chown "${l_aDatos[2]}":"${l_aDatos[3]}" "${l_aDatos[0]}/${l_aDatos[1]}"

      if [ ! $? -eq 0 ]; then

        echo "Error chown: $output"

        echo "Se cancela el script"

        exit 1

      fi   

      # Asignar premisos Propietario / Grupo / Otros  

      echo "Asignando premisos"

      chmod ${l_aDatos[4]} "${l_aDatos[0]}/${l_aDatos[1]}"

      if [ ! $? -eq 0 ]; then

        echo "Error chmod"

        echo "Se cancela el script"

        exit 1

      fi  


      # Montar si previamente se desmontó.

      if [ $l_remount -eq 1 ]; then

        mount "${l_aDatos[0]}/${l_aDatos[1]}"

        if [ ! $? -eq 0 ]; then

          echo "Error montando ${l_aDatos[0]}/${l_aDatos[1]}"

          echo "Se cancela el script"

         exit 1

        fi       

        echo "Se ha montado ${l_aDatos[0]}/${l_aDatos[1]}"     

      fi





    crear_folders_users(){


      local -n l_array=$1

      local l_i


      for l_i in "${l_array[@]}" ; do

        if [[ "$l_i" != "" ]]; then

          crear_folder "$l_i"

        fi

      done






    # Inicio script




    declare -a aPackages

    declare -a aFolders

    declare -a aUsers

    declare -a aCredenciales



    if [[ ! "$EUID" = 0 ]]; then

      echo ""

      echo "Error: Es necesario ejecutar el script como root."

      echo "Se cancela."  

      echo ""  

      exit 1

    fi



    # Crear copia de seguridad

    _crear_backup


    # Actualización SO

    _update_SO



    # Instación de los paquetes necesarios

    aPackages[1]="cifs-utils"


    _install_packages aPackages



    # Crear usuarios [Usuario;Contraseña]

    # (finalizar cada elemento con ;)

    aUsers[1]="invitado;35;"

    aUsers[2]="pablo;36;"

    aUsers[3]="diego;37;"

    aUsers[4]="marisa;38;"


    crear_users "juanp" aUsers



    # Crear archivo de credenciales de los usuarios para acceder a WD

    # [Usuario;Contraseña]

    # (finalizar cada elemento con ;)

    aCredenciales[1]="invitado;xx;"

    aCredenciales[2]="pablo;xx;"

    aCredenciales[3]="diego;xx;"

    aCredenciales[4]="marisa;xx;"

    aCredenciales[4]="juanp;xx;"



    crear_files_cre aCredenciales



    # Crear estructura de directorio para los usuarios


    #eliminar_folder_advertencia


    # aFolders[]


    # El primer directorio se creará directamente en /mnt y de él colgarán los 

    # directorios en los que se montarán los recursos. A este directorio el usuario

    # tendrá acceso exclusivamente de acceo y lectura (550) de forma que no pueda

    # crear directorios ni archivos en él y sólo pueda hacerlo en los directorios

    # en los que se montan los recursos.


    #  .- Folder base

    #  .- Nombre folder a crear

    #  .- Nombre Usuario

    #  .- Nombre Grupo

    #  .- Permisos

    #  .- Modo de acceso:

    #     ..- rw : read & write

    #     ..- ro : read only


    echo "" > ft.txt


    aFolders[1]="/mnt;marisa;marisa;marisa;0550;ro;;"

    aFolders[2]="/mnt/marisa;marisa;marisa;marisa;0770;rw;//192.168.0.158/marisa;"

    aFolders[3]="/mnt/marisa;invitado;marisa;marisa;0770;rw;//192.168.0.158/invitado;"

    aFolders[4]="/mnt/marisa;multimedia;marisa;marisa;0550;ro;//192.168.0.158/multimedia;"


    crear_folders_users aFolders

    crear_lineas_fstab aFolders >> ft.txt



    aFolders[1]="/mnt;juanp;juanp;juanp;0550;ro;;"

    aFolders[2]="/mnt/juanp;juanp;juanp;juanp;0770;rw;//192.168.0.158/juanp;"

    aFolders[3]="/mnt/juanp;invitado;juanp;juanp;0770;rw;//192.168.0.158/invitado;"

    aFolders[4]="/mnt/juanp;multimedia;juanp;juanp;0770;rw;//192.168.0.158/multimedia;"


    crear_folders_users aFolders

    crear_lineas_fstab aFolders >> ft.txt



    aFolders[1]="/mnt;pablo;pablo;pablo;0550;ro;;"

    aFolders[2]="/mnt/pablo;pablo;pablo;pablo;0770;rw;//192.168.0.158/pablo;"

    aFolders[3]="/mnt/pablo;invitado;pablo;pablo;0770;rw;//192.168.0.158/invitado;"

    aFolders[4]="/mnt/pablo;multimedia;pablo;pablo;0550;ro;//192.168.0.158/multimedia;"


    crear_folders_users aFolders

    crear_lineas_fstab aFolders >> ft.txt


    aFolders[1]="/mnt;diego;diego;diego;0550;ro;;"

    aFolders[2]="/mnt/diego;diego;diego;diego;0770;rw;//192.168.0.158/diego;"

    aFolders[3]="/mnt/diego;invitado;diego;diego;0770;rw;//192.168.0.158/invitado;"

    aFolders[4]="/mnt/diego;multimedia;diego;diego;0550;ro;//192.168.0.158/multimedia;"


    crear_folders_users aFolders

    crear_lineas_fstab aFolders >> ft.txt


    aFolders[1]="/mnt;invitado;invitado;invitado;0550;ro;;"

    aFolders[2]="/mnt/invitado;invitado;invitado;invitado;0770;rw;//192.168.0.158/invitado;"

    aFolders[3]=""

    aFolders[4]=""


    crear_folders_users aFolders

    crear_lineas_fstab aFolders >> ft.txt



    _add_lines_fstab "ft.txt"


    echo ""

    echo ""

    mount -a

    if [ ! $? -eq 0 ]; then

      echo "Error al montar"

      exit 1

    fi

    echo "Proceso finalizado"

    exit 0


Script montar.sh  ⮴  

En ocasiones durante el arranque no se montan correctamente los recursos al

aparecer el error:

    mount error(101): Network is unreachable


Con el comando journalctl -u mnt-provi.mount podemos ver el error

    Nov 25 21:29:59 ubuntu systemd[1]: Mounting /mnt/provi...

    Nov 25 21:29:59 ubuntu mount[846]: mount error(101): Network is unreachable

    Nov 25 21:29:59 ubuntu mount[846]: Refer to the mount.cifs(8) manual page (e.g.>

    Nov 25 21:29:59 ubuntu systemd[1]: mnt-provi.mount: Mount process exited, code=>

    Nov 25 21:29:59 ubuntu systemd[1]: mnt-provi.mount: Failed with result 'exit-co>

    Nov 25 21:29:59 ubuntu systemd[1]: Failed to mount /mnt/provi.


Se crea un script que se carga en el crontab del root para comprobar que se

ha montado todo los recursos, y en caso contrario los monta.


Script montar.sh


Con sudo crontab -e cargamos la siguiente linea:

    @reboot bash /home/juanp/chk_mount/montar.sh 


Script montar.sh (Versión 1.00)  ⮴  

    #!/bin/bash




    #  Raspberry PI - Ubuntu Server



    # Este script se carga en el crontab del root para comprobar que se ha montado

    # todo los recursos, ya que en ocasiones durante el arranque no se montan co-

    # rrectamente los recursos al aparecer el error:


    #    mount error(101): Network is unreachable


    # Con el comando journalctl -u mnt-provi.mount podemos ver el error


    #  Nov 25 21:29:59 ubuntu systemd[1]: Mounting /mnt/provi...

    #  Nov 25 21:29:59 ubuntu mount[846]: mount error(101): Network is unreachable

    #  Nov 25 21:29:59 ubuntu mount[846]: Refer to the mount.cifs(8) manual page (e.g.>

    #  Nov 25 21:29:59 ubuntu systemd[1]: mnt-provi.mount: Mount process exited, code=>

    #  Nov 25 21:29:59 ubuntu systemd[1]: mnt-provi.mount: Failed with result 'exit-co>

    #  Nov 25 21:29:59 ubuntu systemd[1]: Failed to mount /mnt/provi.


    # Con sudo crontab -e cargamos la siguiente linea:


    #  @reboot bash /home/juanp/chk_mount/montar.sh    


    # Versión: 1.00

    # Fecha: 26/11/22





    _trap_exit(){

      rm -f $f_mounts

      rm -f $f_points

      rm -f $f_result   



    trap _trap_exit EXIT


    f_mounts=$(mktemp)

    f_points=$(mktemp)

    f_result=$(mktemp)


    f_file_log=$(basename -- "$0")

    f_file_log="${f_file_log%.*}"

    f_file_log="$f_file_log.log"

    f_file_log="$(dirname "$0")/$f_file_log"  


    echo "Fecha: "$(date) > $f_file_log

    echo ""




    _montar(){

      until ping -nq -c3 192.168.0.158; do

        # Waiting for network

        sleep 1

      done

      mount -a

      if [ ! $? -eq 0 ]; then

        echo "Error al montar"

        exit 1

      else

       echo "OK montaje"

      fi




    _check_mount(){


      ### Shows your current mounted points en /mnt

      mount | sed '/^#/d' | sed '/^$/d' | sed 's/  */ /g' | cut -d" " -f3 | sort | grep /mnt > $f_mounts


      ### Shows /etc/fstab mounted points en /mnt

      cat /etc/fstab | sed '/^#/d' | sed '/^$/d' | sed 's/  */ /g' | cut -d" " -f2 | sort | grep /mnt > $f_points


      ### Displays differences between the file mount points 

      ### (if a mount point has been changed since bootup

      ### - it will not catch it (say umount and mount-ing a different reference).

      if [ "$(diff $f_mounts $f_points)" != "" ]; then

        echo "Error: No está todo montado correctamente."

        echo "       Se va a proceder a montar de nuevo [mount -a]"

        diff $f_mounts $f_points > $f_result

        cat $f_result

        echo ""

        echo "Ejecutando mount -a"

        _montar

      else

        echo "Todo está montado correctamente."

        echo ""

        cat $f_mounts

        echo ""

      fi






    sleep 10


    _check_mount >> $f_file_log

    exit 0  


Comandos útiles  ⮴  

Reiniciar el servidor SSH

    sudo service ssh restart         


Editar configuración servidor

    sudo nano /etc/ssh/sshd_config


Quién está conectado

    who


MOUNT.CIFS  ⮴  

La utilidad mount.cifs asocia el nombre UNC (recurso de red exportado) especi-

ficado como servicio (utilizando la sintaxis //servidor/compartido, donde

"servidor" es el nombre del servidor o la dirección IP y "share" es el nombre

del recurso compartido) al punto de montaje del directorio local.


Las opciones de mount.cifs se especifican como una lista de pares clave=valor

separados por comas.


Instalación:

    sudo apt install cifs-utils


Manual:

    man mount.cifs


Sintaxis:

    mount.cifs {service} {mount-point} [-o options]


Ejemplo línea en el fstab:

    //192.168.0.158/multimedia /mnt/marisa/multimedia cifs credentials=/root/.cre_marisa,gid=marisa,uid=marisa,file_mode=0440,dir_mode=0550,iocharset=utf8,ro 0 0



.- //192.168.0.158/multimedia    : recurso de red exportado.

.- /mnt/_marisa/multimedia       : punto de montaje del directorio local.

.- cifs                          : montar un sistema de archivos CIFS

.- credentials=/root/.cre_marisa : archivo que contiene las credenciales

.- gid=juanp                     : establece el grupo propietario de todos

los archivos o directorios en el sistema de

archivos montado

.- uid=marisa                    : establece el usuario propietario de todos

los archivos o directorios en el sistema de

archivos montado

.- file_mode / dir_mode          : establecen los permisos del propietario,

grupo y otros

.- iocharset=utf8                : conjunto de caracteres utilizado para conver-

tir los nombres de las rutas locales a y des-

de Unicode.

.- rw                            : montado para lectura y escritura


La carpeta del servidor se puede montar con las opciones:


.- ro     mount read-only.

.- rw     mount read-write.


El acceso al servidor se realiza con el nombre y contraseña de usuario defini-

dos en el archivo credentials (en el ejemplo: /root/.cre_marisa). Seránlos

permisos que tenga este usuario en el NAS WD aquellos que se otrogen al usua-

rio (uid) y grupo (gid). Tanto el uid como el gid han de existir en el

sistema cliente.


A la carpeta (/mnt/_marisa/multimedia) en la que se monta la carpeta remota

(//192.168.0.158/multimedia) se le asina como propietario el indicado en uid

y como grupo al que se indica en gid.


Los premisos del usuario, grupo y otros se establecen según los valores indi-

cados en file_mode y dir_mode. Si no se especifican permisos son completos

para el usuario, lectura y acceso para el grupo y al resto les da acceso y

lectura.



La preeminencia de los premisos es:


1.- Premisos del usuario indicado en el archivo de credenciales.

2.- Modo de acceso indicado rw / ro

3.- Los premisos otorgados según lo indicado en file_mode y dir_mode