miércoles, 27 de agosto de 2014

Modificación de Volúmenes lógicos

¿A quién no le ha pasado que se ha visto en la tesitura de tener que migrar un servidor a un disco duro distinto? Bueno tal vez no es muy común en estos tiempos, gracias a las máquinas virtuales pero aún así, nunca estamos a salvo de tener que realizar alguna migración.
Pero, ¿Qué pasa cuando la migración es por falta de espacio y se hará a un disco mas grande?
Si hiciéramos un volcado de información con el comando dd, las particiones en el disco destino serán iguales a las del disco origen, por lo tanto no ganaríamos espacio.
Para poder trabajar con diferentes particiones de diferentes tamaños es muy práctico el uso de volúmenes lógicos, y aquí intentaremos explicar como hacerlo desde cero.

Supongamos que tenemos un servidor cuyo disco duro es de 10GiB y queremos migrarlo a un disco de 100GiB.
El disco está particionado de la siguiente forma:


[root@saturno ~]# fdisk -l 

Disco /dev/vda: 10.5 GB, 10485760000 bytes 
16 heads, 63 sectors/track, 20317 cylinders 
Units = cilindros of 1008 * 512 = 516096 bytes 
Sector size (logical/physical): 512 bytes / 512 bytes 
I/O size (minimum/optimal): 512 bytes / 512 bytes 
Disk identifier: 0x000ad680 

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema 
/dev/vda1   *           3        1018      512000   83  Linux 
La partición 1 no termina en un límite de cilindro. 
/dev/vda2            1018       20318     9726976   8e  Linux LVM 
La partición 2 no termina en un límite de cilindro. 

Disco /dev/mapper/vg_centos-lv_root: 5729 MB, 5729419264 bytes 
255 heads, 63 sectors/track, 696 cylinders 
Units = cilindros of 16065 * 512 = 8225280 bytes 
Sector size (logical/physical): 512 bytes / 512 bytes 
I/O size (minimum/optimal): 512 bytes / 512 bytes 
Disk identifier: 0x00000000 


Disco /dev/mapper/vg_centos-lv_swap: 4227 MB, 4227858432 bytes 
255 heads, 63 sectors/track, 514 cylinders 
Units = cilindros of 16065 * 512 = 8225280 bytes 
Sector size (logical/physical): 512 bytes / 512 bytes 
I/O size (minimum/optimal): 512 bytes / 512 bytes 
Disk identifier: 0x00000000 


Como se puede observar tenemos un disco duro de 10GiB (vda) con 2 particiones, vda1 y vda2, vda1 es una particion Linux y vda2 es una partición Linux LVM.
Nos indica que tenemos 2 discos mas, pero que en realidad es el mapeo que está haciendo hacia lv_root y lv_swap del grupo de volumenes vg_centos.

Para ver los detalles del grupo lógico (VG) utilizamos vgdisplay.


[root@saturno ~]# vgdisplay 
  --- Volume group --- 
  VG Name               vg_centos 
  System ID             
  Format                lvm2 
  Metadata Areas        1 
  Metadata Sequence No  5 
  VG Access             read/write 
  VG Status             resizable 
  MAX LV                0 
  Cur LV                2 
  Open LV               2 
  Max PV                0 
  Cur PV                1 
  Act PV                1 
  VG Size               9,27 GiB 
  PE Size               4,00 MiB 
  Total PE              2374 
  Alloc PE / Size       2374 / 9,27 GiB 
  Free  PE / Size       0 / 0   
  VG UUID               0Dbw71-XvaN-JWkR-vgBg-veZ3-8V2M-Lxl6PR 


Tenemos el grupo lógico de 9,27GiB pero que está totalmente ocupado. Para hacer la migración añadiremos un segundo disco duro y en el, crearemos la misma estructura de particionado, pero con la segunda partición mas grande para poder contener el VG con el volumen lógico vg_root con mas espacio.


Disco /dev/vdb: 104.9 GB, 104857600000 bytes 
16 heads, 63 sectors/track, 203174 cylinders 
Units = cilindros of 1008 * 512 = 516096 bytes 
Sector size (logical/physical): 512 bytes / 512 bytes 
I/O size (minimum/optimal): 512 bytes / 512 bytes 
Disk identifier: 0x00000000 


Vemos que hemos añadido un segundo disco duro de 100GiB y el sistema lo reconoció como /dev/vdb. Ahora tocar particionarlo.


[root@saturno ~]# fdisk /dev/vdb 

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to 
         switch off the mode (command 'c') and change display units to 
         sectors (command 'u'). 

Orden (m para obtener ayuda): p 

Disco /dev/vdb: 104.9 GB, 104857600000 bytes 
16 heads, 63 sectors/track, 203174 cylinders 
Units = cilindros of 1008 * 512 = 516096 bytes 
Sector size (logical/physical): 512 bytes / 512 bytes 
I/O size (minimum/optimal): 512 bytes / 512 bytes 
Disk identifier: 0xb67c25a6 

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema 

Orden (m para obtener ayuda): 


Como es de esperar, el disco no contiene una tabla de particiones, por lo tanto habrá que crearla. Para ello, usamos la opción n (añade una partición) que nos dará dos opciones mas, crear una partición extendida (e) o primaria (p).

Como el disco origen tiene 2 particiones, crearemos la primera de similar tamaño, nunca menor, a la original y la segunda con todo el espacio restante, para poder aprovechar todo el nuevo disco.

Para la primera partición seleccionamos n para crear una partición, después p para una partición primaria y 1 para que sea la primera.
Cuando nos pide el numero del primer cilindro seleccionamos la opción por defecto que es 1 y el final 1020, ya que el disco original tenía el final del cilindro en 1018.
Para la segunda partición los datos de los cilindros son 1021 (por defecto) y último 203174 (por defecto)


Orden (m para obtener ayuda): n 
Acción de la orden 
e   Partición extendida 
   p   Partición primaria (1-4) 
p 
Número de partición (1-4): 1 
Primer cilindro (1-203174, valor predeterminado 1): 
Se está utilizando el valor predeterminado 1 
Last cilindro, +cilindros or +size{K,M,G} (1-203174, 
        valor predeterminado 203174): 1020 

Orden (m para obtener ayuda): n 
Acción de la orden 
e   Partición extendida 
   p   Partición primaria (1-4) 
p 
Número de partición (1-4): 2 
Primer cilindro (1021-203174, valor predeterminado 1021): 
Se está utilizando el valor predeterminado 1021 
Last cilindro, +cilindros or +size{K,M,G} (1021-203174, 
        valor predeterminado 203174): 
Se está utilizando el valor predeterminado 203174 

Orden (m para obtener ayuda): 


Si después de crear las particiones hacemos un listado, nos muestra las dos particiones recién creadas, en este caso nos muestra vdb1 y vdb2.

Recuerda que estos cambios no han sido aplicados aún, de modo que si abandonásemos fdisk ahora, se perderían todos estos cambios y el disco no sufriría cambios. Para guardar los cambios seleccionaremos la opción w (escribe la tabla en el disco y sale). Siempre puedes usar la opción m para ver la lista de opciones completa.


Orden (m para obtener ayuda): p 

Disco /dev/vdb: 104.9 GB, 104857600000 bytes 
16 heads, 63 sectors/track, 203174 cylinders 
Units = cilindros of 1008 * 512 = 516096 bytes 
Sector size (logical/physical): 512 bytes / 512 bytes 
I/O size (minimum/optimal): 512 bytes / 512 bytes 
Disk identifier: 0xb67c25a6 

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema 
/dev/vdb1               1        1020      514048+  83  Linux 
/dev/vdb2            1021      203174   101885616   83  Linux 

Orden (m para obtener ayuda): 

Pero antes de grabar la tabla de particiones nueva, debemos indicar que la partición 1 será la partición de inicio (donde encuentre el cargador de arranque) para ello usaremos la opción a (Conmuta el indicador iniciable). Y luego guardaremos los cambios como se indicó anteriormente.


Orden (m para obtener ayuda): a 
Número de partición (1-4): 1 

Orden (m para obtener ayuda): p 

Disco /dev/vdb: 104.9 GB, 104857600000 bytes 
16 heads, 63 sectors/track, 203174 cylinders 
Units = cilindros of 1008 * 512 = 516096 bytes 
Sector size (logical/physical): 512 bytes / 512 bytes 
I/O size (minimum/optimal): 512 bytes / 512 bytes 
Disk identifier: 0xb67c25a6 

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema 
/dev/vdb1   *           1        1020      514048+  83  Linux 
/dev/vdb2            1021      203174   101885616   83  Linux 

Orden (m para obtener ayuda): w 
¡Se ha modificado la tabla de particiones! 


Lo que ahora tenemos es dos particiones Linux y si recuerdas el disco original tiene una particion Linux (que es donde se encuentra /boot) y otra Linux LVM.
Para que esto sea así en nuestro nuevo disco debemos crear un grupo lógico, pero los grupos lógicos deben estar contenido dentro de un volumen físico, para ello debemos crear estos últimos. Un volumen lógico puede ser un disco duro o una partición, en nuestro caso será la partición vdb2, lo crearemos del siguiente modo.


root@saturno ~]# pvcreate /dev/vdb2 
  Physical volume "/dev/vdb2" successfully created 


El siguiente paso es crear el grupo lógico que este a su vez contendrá los volúmenes lógicos.


[root@saturno ~]# vgcreate vg_centos /dev/vdb2 
  /dev/vg_centos: already exists in filesystem 
  New volume group name "vg_centos" is invalid 
  Run `vgcreate --help' for more information. 

Ops! Un error. Lo que nos está notificando es que no podemos crear un volumen lógico “vg_centos” puesto que ese nombre ya está siendo utilizado, y es que es el nombre del disco origen.
La solución sería renombrar el grupo de volúmenes original, pero corremos el riesgo de que si nos equivocamos, el sistema no vuelva a levantar. Una mejor solución es usar un nombre alternativo y una vez tengamos todos los pasos correctos, renombrar ambos grupos para que quede la copia como la original y la original con un nombre alternativo. Lo veremos mas adelante.

Por lo que usaremos un nombre alternativo para el disco duro nuevo. En este caso “vg_centos2”


[root@saturno ~]# vgcreate vg_centos2 /dev/vdb2 
  Volume group "vg_centos2" successfully created 


Ahora toca comprobar que el grupo de volúmenes está creado.


[root@saturno ~]# pvdisplay /dev/vdb2
  --- Physical volume --- 
  PV Name               /dev/vdb2 
  VG Name               vg_centos2 
  PV Size               97,17 GiB / not usable 1,67 MiB 
  Allocatable           yes 
  PE Size               4,00 MiB 
  Total PE              24874 
  Free PE               24874 
  Allocated PE          0 
  PV UUID               1yRkly-vydC-91cK-a9eI-atA8-lipu-h2n7MQ 


Como podemos comprobar estamos viendo que tenemos el grupo “vg_centos2” que tiene 97.17GiB (menos 1,67MiB) disponibles para asignar a los volúmenes lógicos.

Ahora crearemos los volúmenes, pero antes debemos saber los nombres.


[root@saturno ~]# lvdisplay 
  --- Logical volume --- 
  LV Path                /dev/vg_centos/lv_root 
  LV Name                lv_root 
  VG Name                vg_centos 
  LV UUID                1IfUf3-A5Vd-AeCV-9D66-p8gM-tN38-WbFUsl 
  LV Write Access        read/write 
  LV Creation host, time centos, 2013-08-12 16:12:00 +0200 
  LV Status              available 
  # open                 1 
  LV Size                5,34 GiB 
  Current LE             1366 
  Segments               1 
  Allocation             inherit 
  Read ahead sectors     auto 
  - currently set to     256 
  Block device           253:0 
   
  --- Logical volume --- 
  LV Path                /dev/vg_centos/lv_swap 
  LV Name                lv_swap 
  VG Name                vg_centos 
  LV UUID                QMqSBL-HwUL-ZXBj-J1VO-DIDQ-awh2-B1aei3 
  LV Write Access        read/write 
  LV Creation host, time centos, 2013-08-12 16:12:17 +0200 
  LV Status              available 
  # open                 1 
  LV Size                3,94 GiB 
  Current LE             1008 
  Segments               1 
  Allocation             inherit 
  Read ahead sectors     auto 
  - currently set to     256 
  Block device           253:1 


Serán lv_root de 94GiB y lv_swap con el resto de espacio. En este caso si se pueden repetir los nombres ya que estan contenido dentro de un grupo de volumenes diferente a “vg_centos”.


[root@saturno ~]# lvcreate -L94G -n lv_root vg_centos2 
  Logical volume "lv_root" created 
[root@saturno ~]# lvcreate -L3,16G -n lv_swap vg_centos2 
  Rounding up size to full physical extent 3,16 GiB 
  Logical volume "lv_swap" created 
[root@saturno ~]# 


Creamos un volumen lógico llamado “lv_root” dentro del grupo “vg_centos2” de 96GiB y después otro de 3,16GiB llamado “lv_swap”

Si hacemos un pvdisplay veremos que “vg_centos2” esta completo, o casi (Free PE).


[root@saturno ~]# pvdisplay /dev/vdb2 
  --- Physical volume --- 
  PV Name               /dev/vdb2 
  VG Name               vg_centos2 
  PV Size               97,17 GiB / not usable 1,67 MiB 
  Allocatable           yes 
  PE Size               4,00 MiB 
  Total PE              24874 
  Free PE               1 
  Allocated PE          24873 
  PV UUID               1yRkly-vydC-91cK-a9eI-atA8-lipu-h2n7MQ 


Ya tenemos las particiones, el volumen físico, el grupo de volumen y los volúmenes lógicos. Ahora falta pasar los datos.

Primero, por ser mas rápido copiaremos la partición /dev/vda1 a /dev/vdb1.


[root@saturno ~]# dd if=/dev/vda1 of=/dev/vdb1 
1024000+0 records in 
1024000+0 records out 
524288000 bytes (524 MB) copied, 3,09953 s, 169 MB/s 


Y haremos lo mismo con el volumen lv_root, lv_swap no hace falta al ser el área de intercambio.

Para hacer esto debemos saber antes que Linux carga los volúmenes como devices del siguiente modo:


/dev/GRUPOVOLUMEN/VOLUMENLOGICO

Que para nuestro ejemplo, lv_root del grupo vg_centos se accederá de la siguiente manera:

/dev/vg_centos/lv_root


Entonces para pasar los datos entre lv_root haremos lo siguiente:


[root@saturno ~]# dd if=/dev/vg_centos/lv_root of=/dev/vg_centos2/lv_root
11190272+0 records in 
11190272+0 records out 
5729419264 bytes (5,7 GB) copied, 164,968 s, 34,7 MB/s 


Si reiniciáramos el equipo con este disco duro, seguirá sin arrancar. El problema radica en que el sistema espera encontrar un grupo de volumenes llamado “vg_centos” y este no se encuentra, para evitar esto, debemos hacer una cosa mas antes de retirar el disco original del servidor.


[root@saturno ~]# vgrename vg_centos vg_centos3
  Volume group "vg_centos" successfully renamed to "vg_centos3"
[root@saturno ~]# vgrename vg_centos2 vg_centos
  Volume group "vg_centos2" successfully renamed to "vg_centos"


Renombramos vg_centos como vg_centos3 y vg_centos2 como vg_centos. (recuerda que no pueden haber dos grupos de volúmenes con el mismo nombre en el sistema)

Apagamos el servidor, quitamos el disco original y voilá, nuestro sistema arranca desde el nuevo disco.
Pero hay un pequeño inconveniente seguimos teniendo poco espacio, si hacemos


[root@saturno ~]# df -h
S.ficheros            Size  Used Avail Use% Montado en
/dev/mapper/vg_centos-lv_root
                      5,3G  5,1G     0 100% /
tmpfs                 435M     0  435M   0% /dev/shm
/dev/vda1             485M   37M  423M   9% /boot


Vemos que lv_centos sigue teniendo 5,3GiB en total y es que como lo hemos clonado, el volumen es una copia exacta del original.
Para corregir esto, debemos expandir el volumen para que ocupe todo el espacio disponible en su contenedor, mediante.


root@saturno ~]# resize2fs /dev/mapper/vg_centos-lv_root 
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/vg_centos-lv_root is mounted on /; 
        on-line resizing required
old desc_blocks = 1, new_desc_blocks = 6
Performing an on-line resize of /dev/mapper/vg_centos-lv_root to 
        24641536 (4k) blocks.
El sistema de ficheros en /dev/mapper/vg_centos-lv_root tiene ahora 
        24641536 bloques.


Si ahora volvemos a ver el espacio, observamos que lv_root tiene un total de 93GiB.


[root@saturno ~]# df -h
S.ficheros            Size  Used Avail Use% Montado en
/dev/mapper/vg_centos-lv_root
                       93G  5,1G   83G   6% /
tmpfs                 435M     0  435M   0% /dev/shm
/dev/vda1             485M   37M  423M   9% /boot
[root@saturno ~]# 


Listo, ya tenemos nuestro sistema funcionando desde un nuevo disco duro con mas espacio. Pero... un momento! Los mas observadores habrán notado que el area de intercambio no está funcionando y eso es debido a que fstab declara /dev/mapper/vg_centos-lv_swap como swap, pero dicho volumen no es del tipo swap, para convertirlo al tipo swap debemos hacer lo siguiente.


[root@saturno ~]# mkswap /dev/mapper/vg_centos-lv_swap 
mkswap: /dev/mapper/vg_centos-lv_swap: warning: don't erase
        bootbits sectors
        on whole disk. Use -f to force.
Setting up swapspace version 1, size = 3313660 KiB
no label, UUID=c21b81be-1bd6-45f1-913e-04c44ca13074


Si reiniciamos el servidor ahora, estaría funcionando el swap. Si no queremos reiniciar, podremos activarlo al vuelo mediante.


[root@saturno ~]# swapon /dev/mapper/vg_centos-lv_swap 


Bueno, esto es todo por ahora.

Saludos!

martes, 5 de agosto de 2014

Permisos de archivos

Linux, por su arquitectura, dispone de usuarios que pertenecen a grupos. Dichos usuarios poseen permisos para trabajar en el sistema y acceder, o no, a ciertas partes del sistema. A su vez los archivos del sistema pertenecen a usuarios y a grupos. Es por ello que se deben definir qué permisos tienen los diferentes usuarios sobre los diferentes archivos.

Para gestionar la pertenencia y los permisos de los archivos y directorios, existen los comandos chown y chmod, respectivamente.

chown (change owner, cambiar dueño) se utiliza para definir a que usuario y/o grupo pertenecerá el archivo y chmod (change mode, cambiar modo) para definir que permisos tienen los usuarios sobre los archivos.
Un archivo, cuando es listado tiene el siguiente aspecto

[picrobot@umbriel ~]$ ls -la /etc/passwd 
-rw-r--r--. 1 root root 992 ago  3 13:49 /etc/passwd

Junto con el tamaño que ocupa, la fecha de modificación y el nombre del archivo, nos está indicando que el archivo pertenece al usuario root, al grupo root y los permisos que poseen los usuarios sobre él. En este caso el usuario root puede leer y escribir en él, pero los demás usuarios solo podrán leerlo.

La forma que tiene Linux de representar los permisos de los archivos es un poco particular, lo que no significa que sea complicada una vez se explica.

Los permisos son, básicamente 3, permiso de lectura, de escritura y de ejecución. Y significan que, según los tenga activado o no, un usuario podrá, o no, leer, escribir o ejecutar dicho archivo.

En el ejemplo anterior, los permisos resultantes son rw-r--r--. Y se leen de la siguiente forma, las tres primeras letras representan los permisos que tendrá el propietario sobre el archivo, las siguientes 3, los permisos que tendrá el grupo al cual pertenece el archivo y las últimas 3, los permisos que tendrán el resto de usuarios, los que no sean ni el propietario ni pertenezcan al grupo propietario. Un guión, en lugar de la letra correspondiente, significa que ese permiso no está activado.

Veamos un ejemplo práctico:

[picrobot@umbriel ~]$ ls -l archivo.txt 
-rwxrw-r--. 1 picrobot lab 39 ago  3 13:49 archivo.txt

Suponiendo que tengamos una estructura de usuarios como sigue:

UsuarioGrupo
picrobotlab
juanlab
pedroinvitados

El usuario picrobot, podrá leer, escribir y ejecutar el archivo archivo.txt. El usuario juan podrá leerlo y modificarlo, mientras que pedro solo podrá leerlo.

Ahora bien, ¿cómo modificar esos permisos?, muy fácil, con el comando chmod, que se puede utilizar de la siguiente forma:

chmod MODO-OCTAL FICHERO

En MODO-OCTAL se debe poner un número de 3 dígitos, en el cuál cada dígito representa al usuario, al grupo y a otros usuarios respectivamente. Para entender como se forman esos números, primero hay que echar un vistazo a la siguiente tabla y sumar el valor correspondiente de cada atributo si se desea establecer ese permiso.

PermisoValor
Lectura4
Escritura2
Ejecución1

Respecto a la tabla anterior podemos generar el número correspondiente, sumando el número correspondiente al permiso que se desea asignar en cada cifra. De esta forma estamos dotando de los permisos necesarios a uno o varios archivos y/o directorios.

El fichero actualmente tiene los siguiente permisos

PermisoPropietarioGrupoResto de usuarios
Lectura444
Escritura22-
Ejecución1--
Total764


De modo que actualmente el valor de permisos de archivo.txt es 764. Pero para cambiarle los permisos, deberíamos hacer la suma de los valores con los nuevos permisos deseados.

Supongamos que necesitamos hacer que el propietario pueda leer, escribir y ejecutar el archivo, los usuarios pertenecientes al grupo propietario, solo puedan leerlo, mientras que el resto de usuario no pueda leerlo, ni modificarlo, ni ejecutarlo.

La tabla con los permisos, es la siguiente.

PermisoPropietarioGrupoResto de usuarios
Lectura44-
Escritura2--
Ejecución1--
Total740


Y sabiendo el número, podremos pasar a la acción, ejecutando el comando correspondiente.

[picrobot@umbriel ~]$ ls -l archivo.txt 
-rwxrw-r--. 1 picrobot lab 39 ago  3 13:49 archivo.txt 
[picrobot@umbriel ~]$ chmod 740 archivo.txt 
[picrobot@umbriel ~]$ ls -l archivo.txt 
-rwxr-----. 1 picrobot lab 39 ago  3 13:49 archivo.txt 

Primero hemos hecho un ls para poder ver los valores actuales de los permisos, después pasamos a cambiarle dichos permisos y hemos vuelto a realizar un ls para comprobar que, efectivamente se han realizado los cambios.

El comando chmod aparte de la representación octal de los permisos acepta otra, el modo caracter.

chmod [ugoa][-+=[rwx]] FICHERO

Todo lo que esté dentro de corchetes [] significa que es opcional.

Con esta sintaxis podremos establecer, quitar o añadir permisos a usuarios y/o grupos sobre los archivos indicados en FICHERO.

Primero debemos indicar a quien o que le asignaremos dichos permisos, puede ser el usuario propietario (u), al grupo propietario (g), a otros (o) o a todos (a).

Seguidamente indicaremos si deseamos asignarle permisos (=), quitárselos (-) o añadírselos (+) a los que ya tienen.

Y después qué permisos serán, que ya vimos cuales hay disponibles. Por ejemplo siguiendo con el archivo del ejemplo podríamos querer ahora quitarle el permiso de ejecución al propietario, lo haríamos del siguiente modo

[picrobot@umbriel ~]$ ls -l archivo.txt 
-rwxr-----. 1 picrobot lab 39 ago  3 13:49 archivo.txt
[picrobot@umbriel ~]$ chmod u-x archivo.txt 
[picrobot@umbriel ~]$ ls -l archivo.txt 
-rw-r-----. 1 picrobot lab 39 ago  3 13:49 archivo.txt

Hacemos un listado largo del archivo archivo.txt y vemos que el usuario propietario tiene todos los permisos activados, luego de ejecutar el comando chmod y hacer un nuevo ls, observamos que ahora el propietario del archivo ya no tiene permiso de ejecución (x).

Ahora queremos que todos los usuarios del sistema solo puedan leer el contenido del archivo. Para ello le estaríamos asignando un valor octal de 444, pero para el ejemplo lo haremos con el modo carácter. Podríamos asignarle directamente los permisos con el modo carácter, de una forma similar a como lo haríamos con el modo octal, pero para que sea mas didáctico, quitaremos el permiso de escritura al usuario propietario y le añadiremos el permiso de lectura al resto de usuarios. Para ello debemos poner dos opciones, separadas por una coma (,).

[picrobot@umbriel ~]$ ls -l archivo.txt 
-rw-r-----. 1 picrobot lab 39 ago  3 13:49 archivo.txt
[picrobot@umbriel ~]$ chmod u-w,o+r archivo.txt 
[picrobot@umbriel ~]$ ls -l archivo.txt 
-r--r--r--. 1 picrobot lab 39 ago  3 13:49 archivo.txt

Para completar la explicación de los permisos, falta aclarar el tema de la propiedad de los archivos. Como se dijo anteriormente, la propiedad de un fichero se establece con el comando chown, cuya sintaxis es la siguiente.

chown [PROPIETARIO][:[GRUPO]] FICHERO

Debemos especificar un usuario y/o un grupo al cual pertenecerá FICHERO. Por ejemplo, si quisiéramos cambiar el propietario del fichero archivo.txt deberíamos ejecutar la siguiente instrucción.

[root@umbriel picrobot]# chown pedro archivo.txt 
[root@umbriel picrobot]# ls -la archivo.txt 
-r--r--r--. 1 pedro lab 39 ago  3 13:49 archivo.txt

Obsérvese que la acción se ha hecho con el usuario root. Ahora mismo archivo.txt pertenece al usuario pedro, pero sigue perteneciendo al grupo lab, mientras que el usuario pedro pertenece al grupo invitados. Para el ejemplo no habría problemas ya que todos los usuarios del sistema tienen los mismos derechos sobre el archivo, pero imaginemos que los permisos del archivo vuelven a estar como al principio del artículo.

[root@umbriel picrobot]# ls -la archivo.txt 
-rwxrw-r--. 1 pedro lab 39 ago  3 13:49 archivo.txt

Esto último puede implicar un problema de seguridad, puesto que el propietario tiene plenos derechos sobre el archivo y los usuarios pertenecientes al grupo tienen derecho de lectura y escritura, mientras que el resto solo de lectura. Pero como el grupo del archivo es lab y no invitados como el del usuario, podemos estar dando permisos a otros usuarios sin querer. Para ello, seleccionaremos el grupo al cual pertenece el archivo del siguiente modo.

[root@umbriel picrobot]# chown :invitados archivo.txt 
[root@umbriel picrobot]# ls -l archivo.txt 
-rwxrw-r--. 1 pedro invitados 39 ago  3 13:49 archivo.txt

De mas está decir que se podría haber cambiado el usuario y grupo del archivo en un solo comando, simplemente con la siguiente instrucción.

[root@umbriel picrobot]# chown pedro:invitados archivo.txt 

Eso es todo por ahora.