Tu sei qui: Portale > AdminZone > Configurazione di iSCSI con LVM e GFS2
Accedi


Hai dimenticato la tua password?
« febbraio 2012 »
febbraio
lumamegivesado
12345
6789101112
13141516171819
20212223242526
272829
 

Configurazione di iSCSI con LVM e GFS2

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
— archiviato sotto: , , , , ,

Configurazione di un server iSCSI basato su Ubuntu LTS 10.04 e dei suoi client basati su CentOS 5.6 e Ubuntu LTS 10.04. In ultimo vedremo come creare un file system GFS2 (Global File System 2) su queste partizioni

Premessa

Se siete a corto di budget e non potete permettervi una soluzione di storage basata su fibre channel, allora iSCSI (Internet Small Computer System Interface) potrà fare al caso vostro, una soluzione economica e abbastanza scalabile, in quanto a seconda delle proprie possibilità si potranno avere prestazioni anche di tutto rispetto, basterà dotarsi di un buon controller SCSI, di dischi veloci e di un'interfaccia di rete adeguata come ad esempio una 10Gb.

Architettura utilizzata

Nel seguente esempio andremo ad utilizzare un server iSCSI, detto Target, su Ubuntu LTS 10.04, mentre i nostri client, che nella nomenclatura iSCSI vengono chiamati Initiator, saranno host basati sia su Ubuntu LTS 10.04, che su CentOS/Red Hat Enterprise Linux 5.x. Di seguito un semplice diagramma dell'architettura utilizzata

architettura-iscsi

Dove come potete vedere il nostro server iSCSI (Target) l64ubuntu01, conterrà i dischi di storage magari basata su array scsi e dischi da 10000 o 15000 rpm esportando alle macchine l64centos501, l64centos502 e l64ubuntu02 i comandi scsi su IP.
Di seguito per maggiore chiarezza una tabella riassuntiva delle informazioni di asset contenute in questo howto:


l64ubuntu01
l64ubuntu02 l64centos501
l64centos502
IP
192.168.1.100 192.168.1.64 192.168.1.60  192.168.1.62
S.O.
Ubuntu LTS 10.04
 Ubuntu LTS 10.04
CentOS 5.6
CentOS 5.6
Kernel
 2.6.32-31-server  2.6.32-31-server  2.6.18-238.9.1.el5  2.6.18-238.9.1.el5
Tipologia
 Target  Initiator  Initiator Initiator

 

Preparazione del disco in LVM

Prima di poter esportare lo strato SCSI su IP è opportuno configurare i dischi con LVM in modo che successivamente potremo ridimensionare a piacimento la dimensione stessa dei dischi.
Ipotizzando di avere a disposizione il device a blocchi /dev/sda possiamo procedere inizializzando il disco con LVM

root@l64ubuntu01:~# pvcreate /dev/sda
  Physical volume "/dev/sda" successfully created

Creazione del volume group ISCSI_VG0 con dimensione di 8Mb per extent

root@l64ubuntu01:~# vgcreate -s 8M ISCSI_VG0 /dev/sda 
  Volume group "ISCSI_VG0" successfully created

Adesso procediamo con il creare due logical volume, uno con il nome GFS_LUN0 di 400Mb che utilizzeremo per creare un file system gfs sulle nostre macchine CentOS 5 ed un'altro LOC_LUN1 da 200Mb che utilizzeremo come file system locale sul nostro initiator ubuntu.

root@l64ubuntu01:~# lvcreate -n GFS_LUN0 -l 50 ISCSI_VG0
  Logical volume "GFS_LUN0" created
root@l64ubuntu01:~# lvcreate -n LOC_LUN1 -l 25 ISCSI_VG0
  Logical volume "LOC_LUN1" created

Installazione e configurazione del Target

Installazione

Iniziamo con l'installazione delle componenti iSCSI Target sulla nostra macchina l64ubuntu01:

root@l64ubuntu01:~# apt-get install iscsitarget

Una volta installato il pacchetto iscsitarget di default questo è disabilitato, e per abilitarlo bisogna porre a "true" la variabile ISCSITARGET_ENABLE nel file /etc/default/iscsitarget. Per fare questo apritelo con l'editor che preferite e sostituite "false" con "true"

Il contenuto del file successivamente corrisponderà a:

root@l64ubuntu01:~# cat /etc/default/iscsitarget
ISCSITARGET_ENABLE=true

E si potrà avviare il servizio iscsitarget tramite il comando

root@l64ubuntu01:~# /etc/init.d/iscsitarget start

Configurazione del Target

Ora iniziamo la configurazione del nostro target andando ad editare il file principale che corrisponde a /etc/ietd.conf immettendo la seguente stanza:

Target iqn.2011-04.com.example:gfs.lun0
        IncomingUser iscsiuser iscsipassword
        OutgoingUser
        Lun 0 Path=/dev/ISCSI_VG0/GFS_LUN0,Type=fileio
        Alias LUN0

Target iqn.2011-04.com.example:loc.lun1
        IncomingUser iscsiuser iscsipassword
        OutgoingUser
        Lun 0 Path=/dev/ISCSI_VG0/LOC_LUN1,Type=fileio
        Alias LUN1

Dove con il Target iqn.2011-04.com.example:gfs.lun0 e iqn.2011-04.com.example:loc.lun1 definiremo il nome univoco con il quale esporteremo la nostra partizione; con IncomingUser deniremo l'utenza "iscsiuser" e la password "iscsipassword" con il quale i client si dovranno autenticare per poter esportare la partizione; in ultimo con la variabile Path definiremo il puntamento ai device LVM creati precedentemente /dev/ISCSI_VG0/GFS_LUN0 e /dev/ISCSI_VG0/LOC_LUN1.

Adesso andiamo a modificare il file /etc/initiators.allow definendo i client che si potranno collegare alla LUN appena create, immettendo le seguenti entry

...
iqn.2011-04.com.example:gfs.lun0 192.168.1.60
iqn.2011-04.com.example:gfs.lun0 192.168.1.62
iqn.2011-04.com.example:loc.lun1 192.168.1.64
...

In ultimo restartiamo il demone iSCSI

root@l64ubuntu01:~# /etc/init.d/iscsitarget restart

Configurazione del primo initiator su CentOS

Installazione

Verifichiamo prima che il software sia installato

[root@l64centos501 ~]# yum install iscsi-initiator-utils

E che il servizio iscsid parta in automatico

[root@l64centos501 ~]# chkconfig --list  iscsid
iscsid          0:off   1:off   2:off   3:on    4:on    5:on    6:off

Nel caso così non fosse impostare l'avvio automatico del servizio:

[root@l64centos501 ~]# chkconfig iscsid on
[root@l64centos501 ~]# service iscsid start

Discovery e login sulla partizione

Per prima cosa effettuiamo il discovery

[root@l64centos501 ~]# iscsiadm --mode discovery --type sendtargets --portal 192.168.1.100 --discover
192.168.1.100:3260,1 iqn.2011-04.com.example:loc.lun1
192.168.1.100:3260,1 iqn.2011-04.com.example:gfs.lun0

E procediamo con il configurare l'autenticazione

[root@l64centos501 ~]# iscsiadm -m node
192.168.1.100:3260,1 iqn.2011-04.com.example:loc.lun1
192.168.1.100:3260,1 iqn.2011-04.com.example:gfs.lun0
[root@l64centos501 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \
     --portal 192.168.1.100 --op=update --name node.session.auth.authmethod --value=CHAP
[root@l64centos501 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \
     --portal 192.168.1.100 --op=update --name node.session.auth.username --value=iscsiuser
[root@l64centos501 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \
     --portal 192.168.1.100 --op=update --name node.session.auth.password --value=iscsipassword

Fatto questo possiamo eseguire la login

root@l64centos501 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \
       --portal 192.168.1.100 --login
Logging in to [iface: default, target: iqn.2011-04.com.example:gfs.lun0, portal: 192.168.1.100,3260]
Login to [iface: default, target: iqn.2011-04.com.example:gfs.lun0, portal: 192.168.1.100,3260] successful.

E come possiamo vedere nel file speciale /proc/net/iet/session segnalerà la nostra sessione

root@l64ubuntu01:~# cat /proc/net/iet/session
tid:1 name:iqn.2011-04.com.example:gfs.lun0
        sid:281474997486080 initiator:iqn.1994-05.com.redhat:831f8bf7e68e
                cid:0 ip:192.168.1.60 state:active hd:none dd:none

E sulla nostra macchina client avremo un nuovo device SCSI

[root@l64centos501 ~]# fdisk -l /dev/sda 

Disk /dev/sda: 419 MB, 419430400 bytes
13 heads, 62 sectors/track, 1016 cylinders
Units = cylinders of 806 * 512 = 412672 bytes

Disk /dev/sda doesn't contain a valid partition table

Configurazione del secondo initiator su CentOS

Per poter configurare anche sulla seconda macchina CentOS 5 l'aggancio verso la partizione appena creata basterà ripetere i passi precedentemente utilizzati sulla prima, che sono:

[root@l64centos502 ~]# yum install iscsi-initiator-utils
[root@l64centos502 ~]# chkconfig iscsid on
[root@l64centos502 ~]# service iscsid start
[root@l64centos502 ~]# iscsiadm --mode discovery --type sendtargets --portal 192.168.1.100 --discover
192.168.1.100:3260,1 iqn.2011-04.com.example:loc.lun1
192.168.1.100:3260,1 iqn.2011-04.com.example:gfs.lun0
[root@l64centos502 ~]# iscsiadm -m node
192.168.1.100:3260,1 iqn.2011-04.com.example:loc.lun1
192.168.1.100:3260,1 iqn.2011-04.com.example:gfs.lun0
[root@l64centos502 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \
    --portal 192.168.1.100 --op=update --name node.session.auth.authmethod --value=CHAP
[root@l64centos502 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \
    --portal 192.168.1.100 --op=update --name node.session.auth.username --value=iscsiuser
[root@l64centos502 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \
    --portal 192.168.1.100 --op=update --name node.session.auth.password --value=iscsipassword
[root@l64centos502 ~]# iscsiadm -m node --targetname iqn.2011-04.com.example:gfs.lun0 \
    --portal 192.168.1.100 --login
Logging in to [iface: default, target: iqn.2011-04.com.example:gfs.lun0, portal: 192.168.1.100,3260]
Login to [iface: default, target: iqn.2011-04.com.example:gfs.lun0, portal: 192.168.1.100,3260] successful.

Configurazione del terzo initiator su Ubuntu

Non ci resta che configurare l'initiator sulla terza macchina ubuntu 10.04 e adesso vediamo i passi da seguire.

Installazione

Installiamo il pacchetto open-iscsi

root@l64ubuntu02:~# apt-get install open-iscsi

Di default il servizio viene avviato in automatico verificate che sia così con il comando chkconfig o sysv-rc-conf

root@l64ubuntu02:~# sysv-rc-conf --list open-iscsi
open-iscsi   0:on       1:on    6:on    S:on 
root@l64ubuntu02:~# chkconfig -l open-iscsi
open-iscsi                0:on   1:on   2:off  3:off  4:off  5:off  6:off  S:on

Adesso apriamo il file di configurazione /etc/iscsi/iscsid.conf con qualsiasi editor di testo e modifichiamo il valore della variabile node.startup da "manual" a "automatic" in modo che le sessioni iSCSI vengano avviate automaticamente. Il file conterrà la seguente valorizzazione:

...
node.startup = automatic 
...

In ultimo riavviamo il demone per fargli caricare la nuova configurazione

root@l64ubuntu02:~# /etc/init.d/open-iscsi restart

Discovery e login sulla partizione

Adesso è arrivato il momento di effettuare il discovery della partizione appena "locale"

root@l64ubuntu02:~# iscsiadm --mode discovery --type sendtargets --portal 192.168.1.100
192.168.1.100:3260,1 iqn.2011-04.com.example:gfs.lun0
192.168.1.100:3260,1 iqn.2011-04.com.example:loc.lun1

Impostiamo i parametri di autenticazione

root@l64ubuntu02:~# iscsiadm -m node
192.168.1.100:3260,1 iqn.2011-04.com.example:gfs.lun0
192.168.1.100:3260,1 iqn.2011-04.com.example:loc.lun1
root@l64ubuntu02:~# iscsiadm -m node --targetname iqn.2011-04.com.example:loc.lun1 \
    --portal 192.168.1.100 --op=update --name node.session.auth.authmethod --value=CHAP
root@l64ubuntu02:~# iscsiadm -m node --targetname iqn.2011-04.com.example:loc.lun1 \
    --portal 192.168.1.100 --op=update --name node.session.auth.username --value=iscsiuser
root@l64ubuntu02:~# iscsiadm -m node --targetname iqn.2011-04.com.example:loc.lun1 \
    --portal 192.168.1.100 --op=update --name node.session.auth.password --value=iscsipassword

Ed in ultimo eseguiamo la login

root@l64ubuntu02:~# iscsiadm -m node --targetname iqn.2011-04.com.example:loc.lun1 \
      --portal 192.168.1.100 --login
Logging in to [iface: default, target: iqn.2011-04.com.example:loc.lun1, portal: 192.168.1.100,3260]
Login to [iface: default, target: iqn.2011-04.com.example:loc.lun1, portal: 192.168.1.100,3260]: successful

Creazione del file system locale su l64ubuntu02

Di seguito i passi necessari per creare una partizione primaria con fdisk e poi un file system ext4

root@l64ubuntu02:~# fdisk /dev/sda
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x408a6f13.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

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').

Command (m for help): p

Disk /dev/sda: 209 MB, 209715200 bytes
7 heads, 58 sectors/track, 1008 cylinders
Units = cylinders of 406 * 512 = 207872 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x408a6f13

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1008, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1008, default 1008): 
Using default value 1008

Command (m for help): p

Disk /dev/sda: 209 MB, 209715200 bytes
7 heads, 58 sectors/track, 1008 cylinders
Units = cylinders of 406 * 512 = 207872 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x408a6f13

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1        1008      204595   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Ora non ci resta che creare il file system ext4 su /dev/sda1

root@l64ubuntu02:~# mkfs.ext4 -m 1 /dev/sda1 
mke2fs 1.41.11 (14-Mar-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
51200 inodes, 204592 blocks
2045 blocks (1.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
25 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks: 
        8193, 24577, 40961, 57345, 73729

Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 23 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

Non ci resta che procedere a con il montare la partizione appena creata ed utilizzarla

root@l64ubuntu02:~# mkdir /mnt/app1
root@l64ubuntu02:~# mount /dev/sda1 /mnt/app1

Creazione della partizione GFS2

Adesso procediamo con la parte più interessante ovvero con la creazione della partizione GFS2 in modo da poterla montare contemporaneamente sulle due macchine l64centos501 e l64centos502.

Installazione dei pacchetti necessari

Il Global File System sui sistemi Red Hat o derivati come CentOS fa parte della Red Hat Cluster Suite, pertanto per poterlo utilizzare andremo ad installare il gruppo di pacchetti Clustering e Cluster Storage.

Su l64centos501

[root@l64centos501 ~]# yum groupinstall Clustering
[root@l64centos501 ~]# yum groupinstall 'Cluster Storage'

Su l64centos502

[root@l64centos502 ~]# yum groupinstall Clustering
[root@l64centos502 ~]# yum groupinstall 'Cluster Storage'

Preparazione del disco con LVM

Adesso prepariamo anche sull'initiator la partizione LVM sul quale immettere il file system GFS2, attività da effettuare soltanto su un nodo

[root@l64centos501 ~]# pvcreate /dev/sda
  Physical volume "/dev/sda" successfully created
[root@l64centos501 ~]# vgcreate -s 8M GFS2_VG0 /dev/sda 
  Volume group "GFS2_VG0" successfully created
[root@l64centos501 ~]# lvcreate -l 49  -n GFS2_LV01 GFS2_VG0
  Logical volume "GFS2_LV01" created

Preparazione di un finto cluster

Essendo il file system GFS dipendente dalla clusterizzazione risulta mandatorio startare il servizio cman di clusterizzazione e per fare questo dobbiamo costruirci il file di configurazione /etc/cluster/cluster.conf dove metteremo i nodi l64centos501 e l64centos502.

Per prima cosa andiamo ad inserire nel file /etc/hosts le relative corrispondenze, queste devono essere immesse su tutti e i due nodi del cluster in modo tale che riescano a risolvere reciprocamente l'hostname in IP

...
192.168.1.60            l64centos501.example.com l64centos501
192.168.1.62            l64centos502.example.com l64centos502
...

Successivamente potete andare a costruire il file di configurazione del cluster tramite il tool system-config-cluster definendo soltanto i nodi interessati che sono l64centos501 e l64centos502, oppure copiare il seguente file cluster.conf nella directory /etc/cluster

[root@l64centos501 ~]# cat /etc/cluster/cluster.conf 
<?xml version="1.0" ?>
<cluster alias="CLUGFS" config_version="2" name="CLUGFS">
        <fence_daemon post_fail_delay="0" post_join_delay="3"/>
        <clusternodes>
                <clusternode name="l64centos501" nodeid="1" votes="1">
                        <fence>
                                <method name="1">
                                        <device name="fence-manual" nodename="l64centos501"/>
                                </method>
                        </fence>
                </clusternode>
                <clusternode name="l64centos502" nodeid="2" votes="1">
                        <fence>
                                <method name="1">
                                        <device name="fence-manual" nodename="l64centos502"/>
                                </method>
                        </fence>
                </clusternode>
        </clusternodes>
        <cman expected_votes="1" two_node="1"/>
        <fencedevices>
                <fencedevice agent="fence_manual" name="fence-manual"/>
        </fencedevices>
        <rm>
                <failoverdomains/>
                <resources/>
        </rm>
</cluster>

Successivamente trasferite lo stesso file sul secondo nodo l64centos02 ed una volta fatto questo avviare il servizio cman contemporaneamente sui due nodi

Su l64centos501

[root@l64centos501 ~]# service cman start

Su l64centos502

[root@l64centos502 ~]# service cman start

Creazione del file system GFS2

Non ci resta che creare il file system GFS2 e montarlo. Iniziamo con il crearlo con due journaling

[root@l64centos501 ~]# mkfs.gfs2 -p lock_dlm -j 2 -t CLUGFS:gfsdata1 /dev/GFS2_VG0/GFS2_LV01
This will destroy any data on /dev/GFS2_VG0/GFS2_LV01.
  It appears to contain a gfs2 filesystem.

Are you sure you want to proceed? [y/n] y

Device:                    /dev/GFS2_VG0/GFS2_LV01
Blocksize:                 4096
Device Size                0.38 GB (100352 blocks)
Filesystem Size:           0.38 GB (100349 blocks)
Journals:                  2
Resource Groups:           2
Locking Protocol:          "lock_dlm"
Lock Table:                "CLUGFS:gfsdata1"
UUID:                      B30FC4D3-1CDA-899C-FB04-E5F43EC7A204

Una volta creato ci sarà possibile montarlo.

Su l64centos501

[root@l64centos501 ~]# mkdir -p /gfs01
[root@l64centos501 ~]# mount /dev/GFS2_VG0/GFS2_LV01 /gfs01

Su l64centos502 sarà necessario effettuare uno scan dell'LVM ed eventualmente se la partizione fosse marcata come inattiva renderla available

[root@l64centos502 ~]# lvscan 
...
  inactive          '/dev/GFS2_VG0/GFS2_LV01' [392.00 MB] inherit
[root@l64centos502 ~]# lvchange -a y /dev/GFS2_VG0/GFS2_LV01
[root@l64centos502 ~]# mkdir -p /gfs01
[root@l64centos502 ~]# mount /dev/GFS2_VG0/GFS2_LV01 /gfs01

Ora provate a creare un file su un nodo e verificare che anche sul secondo si veda

[root@l64centos501 ~]# echo "Hello world! by $(hostname)" > /gfs01/foo.log

Dal secondo nodo

[root@l64centos502 ~]# echo "Hello world! by $(hostname)" >> /gfs01/foo.log

Verificate adesso il contenuto del file

[root@l64centos502 ~]# cat /gfs01/foo.log 
Hello world! by l64centos501.example.com
Hello world! by l64centos502.example.com

Mount automatico delle partizioni appena create

Vediamo come montare in automatico le partizioni appena create.

Lun Locale con file system dedicato

Il caso più semplice riguarda la macchina l64ubuntu02 che utilizza un device di storage dedicato, pertanto per poter montare la nostra partizione basterà inserire un puntamento nel file /etc/fstab allo special device /dev/sda1 oppure meglio ancora lo faremo puntare al suo UUID in modo tale che se varierà l'ordine di scansione degli special device non dovremo editare nuovamente il file /etc/fstab. Iniziamo a ricavarci l'UUID con il comando blkid:

root@l64ubuntu02:~# blkid 
...
/dev/sda1: UUID="9e9a69ca-65ba-4211-a45e-949b66b7aed6" TYPE="ext4"
...

Con questo valore possiamo andare ad editare il file /etc/fstab immettendo una entry di questo genere:

...
UUID="9e9a69ca-65ba-4211-a45e-949b66b7aed6"     /mnt/app1       ext4    defaults,_netdev        0       0
...

Si sconsiglia di porre nel predetto file il file system check abilitato, ma di lasciarlo a zero ed effettuare l'eventuale check manualmente.

Partizione GFS2 con LUN shared

Nel caso del Global File System il discorso è leggermente diverso infatti bisognerà abilitare il servizio cman ed gfs2

Su l64centos501

[root@l64centos501 ~]# chkconfig cman on
[root@l64centos501 ~]# chkconfig gfs2 on

Su l64centos502

[root@l64centos502 ~]# chkconfig cman on
[root@l64centos502 ~]# chkconfig gfs2 on

Adesso basta configurare il file /etc/hosts su ambo i nodi mettendo la seguente entry

...
/dev/GFS2_VG0/GFS2_LV01 /gfs01                  gfs2    defaults,_netdev        0 0
...

Anche qui il consiglio è impostare il file system check a zero (0).

Conclusioni

Abbiamo visto come configurare un iSCSI target e tre initiator basati su Red Hat/CentOS e Ubuntu. In aggiunta abbiamo anche visto come creare un file system shared basato su GFS2 e prossimamente vedremo come aggiungere un journaling per poter aggiungere un nuovo nodo ed anche come ingrandire i file system GFS. Mentre se siete interessati a vedere come estendere o diminuire la partizione ext4 appena creata potete leggere qui.

Azioni sul documento