Archives pour la catégorie ‘Stockage’

Linux : tester les performances I/O

# hdparm -t -T /dev/sda
# dd bs=1M count=512 if=/dev/zero of=test conv=fdatasync
# bonnie++ -d /mnt -r 8000 -u toto

DRBD : optimisation des performances I/O

Quelques pistes pour améliorer les performances I/O de DRBD dans le but d’augmenter le débit ou  diminuer la latence.

Optimisation du débit

  • Désactiver les protections d’intégrité

Dans le cas où un contrôleur disque avec BBU est utilisé, les protections d’intégrité internes de DRBD peuvent directement être désactivées. Ne pas le faire autrement !

resource data {
  disk {
    no-disk-barrier;
    no-disk-flushes;
    no-md-flushes;
    ...
 }
 ...
}

Pour les systèmes de fichiers ext3/4, les barrières d’écriture seront aussi à désactiver dans /etc/fstab.

  • Augmenter la taille des buffers d’émission réseau

C’est une optimisation réseau basique. Depuis la version 8.2.7, l’auto-tuning est possible en fixant cette valeur à 0 mais son impact peut être négatif selon la charge I/O.

resource data {
  net {
    sndbuf-size 512k;
    ...
  }
  ...
}
  • Augmenter le nombre de buffers d’écriture disque

Cela permet d’optimiser les écritures disque effectuées sur le nœud secondaire. Les deux valeurs doivent être identiques.

resource data {
  net {
    max-buffers 8000;
    max-epoch-size 8000;
    ...
  }
  ...
}
  • Augmenter la taille de l’activity log

Une taille faible implique un grand nombre de mises à jour des méta-données. Dans le cas d’un environnement intensif en écriture, il vaut mieux l’augmenter pour ne pas pénaliser les performances d’écriture. Attention, le temps de resynchronisation sera impacté suite à un crash étant donné que plus de données seront à synchroniser. La valeur max possible est de 3833 pour la branche 8.3 et 6433 pour la 8.4.

resource data {
  syncer {
    al-extents 3833;
    ...
  }
  ...
}
  • Limiter / forcer le traitement des opérations I/O en attente

Selon le controleur disque utilisé, il convient de forcer le traitement des requêtes disque au plus tôt (peu de requêtes en attente) pour assurer les meilleures performances. Il convient donc de limiter cette valeur (valeur mini 16), ou l’augmenter (valeur max égale à max-buffers) si le contrôleur est plus performant avec un nombre de requêtes en attente plus important.

resource data {
  net {
    unplug-watermark 16;
    ...
  }
  ...
}

Optimisation de la latence

  • Utilisation du scheduler I/O deadline

Le scheduler deadline garantit le temps d’exécution des requêtes disque en imposant une durée d’échéance à chaque opération.

# echo deadline > /sys/block/sdc/queue/scheduler
# echo 0 > /sys/block/sdc/queue/iosched/front_merges
# echo 150 > /sys/block/sdc/queue/iosched/read_expire
# echo 1500 > /sys/block/sdc/queue/iosched/write_expire
  • Augmentation du MTU réseau

Augmenter le MTU permet de transférer de plus grosse trames réseaux (jumbo frames) et éviter ainsi la fragmentation des données.

# ip link set eth1 mtu 9000
  • Sélection de l’affinité CPU

Il est possible de dédier un ou plusieurs CPU pour l’utilisation de DRBD. Il faut veiller par la suite à ne pas les utiliser par un autre programme.

resource data {
  syncer {
    cpu-mask 1;
    ...
  }
  ...
}

Une fois les modifications effectuées, l’application peut-être effectuée à chaud :

# drbdadm adjust data

FreeBSD : stockage ZFS haute disponibilité avec HAST

Objectif : rendre hautement disponible un pool ZFS en le répliquant sur un second serveur grâce à HAST.

Configuration de node1

node1# cat /etc/rc.conf
hostname="node1"
keymap="fr.iso.acc"
zfs_enable="YES"

network_interfaces="lo0 em0 em1"
defaultrouter="192.168.0.254"
ifconfig_em0="inet 192.168.0.101 netmask 255.255.255.0 polling"
ifconfig_em1="inet 192.168.1.101 netmask 255.255.255.0 polling"

sshd_enable="YES"
hastd_enable="YES"
node1# cat /etc/hast.conf
resource disk1 {
	on node1 {
		local /dev/ada2
		remote 192.168.1.102
	}

	on node2 {
		local /dev/ada2
		remote 192.168.1.101
	}
}

resource disk2 {
	on node1 {
		local /dev/ada3
		remote 192.168.1.102
	}

	on node2 {
		local /dev/ada3
		remote 192.168.1.101
	}
}

Configuration de node2

node1# cat /etc/rc.conf
hostname="node2"
keymap="fr.iso.acc"
zfs_enable="YES"

network_interfaces="lo0 em0 em1"
defaultrouter="192.168.0.254"
ifconfig_em0="inet 192.168.0.102 netmask 255.255.255.0 polling"
ifconfig_em1="inet 192.168.1.102 netmask 255.255.255.0 polling"

sshd_enable="YES"
hastd_enable="YES"
node2# scp node1:/etc/hast.conf /etc/

Lancement de HAST

node1# hastctl init disk1
node1# hastctl init disk2
node1# hastctl create disk1
node1# hastctl create disk2
node1# hastctl role primary disk1
node1# hastctl role primary disk2
node2# hastctl init disk1
node2# hastctl init disk2
node2# hastctl create disk1
node2# hastctl create disk2
node2# hastctl role secondary disk1
node2# hastctl role secondary disk2
node1# hastctl status
disk1:
 role: primary
 provname: disk1
 localpath: /dev/ada2
 extentsize: 2097152 (2.0MB)
 keepdirty: 64
 remoteaddr: 192.168.1.102
 replication: fullsync
 status: degraded
 dirty: 0 (0B)
 statistics:
 reads: 19
 writes: 0
 deletes: 0
 flushes: 0
 activemap updates: 0
disk2:
 role: primary
 provname: disk2
 localpath: /dev/ada3
 extentsize: 2097152 (2.0MB)
 keepdirty: 64
 remoteaddr: 192.168.1.102
 replication: fullsync
 status: degraded
 dirty: 0 (0B)
 statistics:
 reads: 19
 writes: 0
 deletes: 0
 flushes: 0
 activemap updates: 0
node1# ls -l /dev/hast/
total 0
crw-r-----  1 root  operator    0, 106 Nov  1 17:20 disk1
crw-r-----  1 root  operator    0, 108 Nov  1 17:20 disk2
node1# zpool create data mirror /dev/hast/disk1 /dev/hast/disk2
node1# zpool status data
node1# zpool status data
  pool: data
 state: ONLINE
 scan: none requested
config:

	NAME            STATE     READ WRITE CKSUM
	data            ONLINE       0     0     0
	  mirror-0      ONLINE       0     0     0
	    hast/disk1  ONLINE       0     0     0
	    hast/disk2  ONLINE       0     0     0

errors: No known data errors

Bascule sur node2

node1# zpool export data
node1# hastctl role secondary disk1
node1# hastctl role secondary disk2
node2# hastctl role primary disk1
node2# hastctl role primary disk2
node2# zpool import data

Xen : sauvegarde d’un VM Windows par LVM + clonage NTFS

root@xen:~# apt-get install ntfsprogs kpartx

Sauvegarde

root@xen:~# lvcreate -s -L1G -nvm_backup /dev/vg/xen_vm
root@xen:~# kpartx -a /dev/vg/xen_vm_backup
root@xen:~# ls -l /dev/mapper/vg-xen_vm_backup*
lrwxrwxrwx 1 root root      7 Oct 24 12:21 /dev/mapper/vg-xen_vm_backup -> ../dm-6
lrwxrwxrwx 1 root root      7 Oct 24 12:22 /dev/mapper/vg-xen_vm_backup1 -> ../dm-9
root@xen:~# ntfsclone -s -o vm-20121024.img /dev/mapper/vg-xen_vm_backup1
root@xen:~# lvdisplay vg/xen_vm > vm-20121024.txt
root@xen:~# kpartx -d /dev/vg/xen_vm_backup
root@xen:~# lvremove vg/xen_vm_backup

Restauration

root@xen:~# kpartx -a /dev/vg/xen_vm
root@xen:~# ntfsclone -r -O /dev/mapper/vg-xen_vm vm-20121024.img
root@xen:~# kpartx -d /dev/vg/xen_vm

Debian : configuration iSCSI en mode target et initiator

Installation d’une target

root@target:~# apt-get install iscsitarget iscsitarget-source
root@target:~# module-assistant
root@target:~# cat /etc/iet/ietd.conf
Target iqn.2012-10.domain.my.target:data
    Lun 0 Path=/dev/storage/data,Type=blockio
    Alias data
    IncomingUser test blablablaaa
root@target:~# /etc/init.d/iscsitarget start
root@target:~# cat /proc/net/iet/volume
tid:1 name:iqn.2012-10.domain.my.target:data

Installation d’un initiator

root@init:~# apt-get install open-iscsi
root@init:~# /etc/init.d/open-iscsi start
root@init:~# iscsiadm -m discovery -t sendtargets -p 192.168.1.223
192.168.1.223:3260,1 iqn.2012-10.domain.my.target:data
root@init:~# iscsiadm -m node -T iqn.2012-10.domain.my.target:data -p 192.168.1.223 -o update -n node.session.auth.username -v test
root@init:~# iscsiadm -m node -T iqn.2012-10.domain.my.target:data -p 192.168.1.223 -o update -n node.session.auth.password -v blablablaaa
root@init:~# iscsiadm -m node -T iqn.2012-10.domain.my.target:data -p 192.168.1.223 -l
Logging in to [iface: default, target: iqn.2012-10.domain.my.target:data, portal: 192.168.1.223,3260]
Login to [iface: default, target: iqn.2012-10.domain.my.target:data, portal: 192.168.1.223,3260]: successful
root@init:~# tail -n 10 /var/log/messages
Oct 12 13:58:28 init kernel: [    9.742667] iscsi: registered transport (tcp)
Oct 12 14:03:47 init kernel: [  329.271809] iscsi: registered transport (iser)
Oct 12 14:07:21 init kernel: [  544.033813] scsi3 : iSCSI Initiator over TCP/IP
Oct 12 14:07:23 init kernel: [  545.116336] scsi 3:0:0:0: Direct-Access     IET      VIRTUAL-DISK     0    PQ: 0 ANSI: 4
Oct 12 14:07:23 init kernel: [  545.119073] sd 3:0:0:0: Attached scsi generic sg2 type 0
Oct 12 14:07:23 init kernel: [  545.130552] sd 3:0:0:0: [sdb] 2097152 512-byte logical blocks: (1.07 GB/1.00 GiB)
Oct 12 14:07:23 init kernel: [  545.130985] sd 3:0:0:0: [sdb] Write Protect is off
Oct 12 14:07:23 init kernel: [  545.131804] sd 3:0:0:0: [sdb] Write cache: disabled, read cache: disabled, doesn't support DPO or FUA
Oct 12 14:07:23 init kernel: [  545.134005]  sdb: unknown partition table
Oct 12 14:07:23 init kernel: [  545.145458] sd 3:0:0:0: [sdb] Attached SCSI disk
root@init:~# ls -l /dev/disk/by-path/ | grep sdb
lrwxrwxrwx 1 root root  9 Oct 12 14:07 ip-192.168.1.223:3260-iscsi-iqn.2012-10.domain.my.target:data-lun-0 -> ../../sdb
root@init:~# iscsiadm -m node -T iqn.2012-10.domain.my.target:data -p 192.168.1.223 -o update -n node.conn[0].startup -v automatic
root@init:~# /etc/init.d/open-iscsi
root@target:~# cat /proc/net/iet/session
tid:1 name:iqn.2012-10.domain.my.target:data
sid:281474997486080 initiator:iqn.1993-08.org.debian:01:9cfd28ac883
cid:0 ip:192.168.1.221 state:active hd:none dd:none
root@target:~# fdisk -l
root@target:~# fdisk /dev/sdb
root@target:~# mkfs.ext3 /dev/sdb1
root@target:~# echo "/dev/sdb1 /mnt ext3 defaults,_netdev 0 0" >> /etc/fstab

DRBD : configuration master/master + cluster filesystem OCFS2

Réplication DRBD

root@node1#:~# apt-get install drbd8-utils
root@node1#:~# cat /etc/drbd.d/global_common.conf
global {
	usage-count no;
}

common {
	protocol C;

	handlers {
		pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
		pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
		local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
	}

	startup {
		wfc-timeout 0;
		degr-wfc-timeout 120;
		become-primary-on both;
	}

	disk {
		on-io-error detach;
	}

	net {
		cram-hmac-alg "sha1";
		shared-secret "blablablaaaaaaaaaaa";
		max-buffers 2048;
		ko-count 4;
		allow-two-primaries;
		after-sb-0pri discard-zero-changes;
		after-sb-1pri discard-secondary;
		after-sb-2pri disconnect;
	}

	syncer {
		rate 40M;
		verify-alg "crc32c";
	}
}
root@node1:~# cat /etc/drbd.d/r0.res
resource r0 {
        on drbd1 {
                device /dev/drbd0;
                disk /dev/vg/data;
                address 192.168.1.211:7788;
                meta-disk internal;
        }

        on drbd2 {
                device /dev/drbd0;
                disk /dev/vg/data;
                address 192.168.1.212:7788;
                meta-disk internal;
        }
}
root@node1:~# drbdadm create-md r0
root@node1:~# /etc/init.d/drbd start
root@node1:~# drbdadm syncer r0
root@node1:~# drbdadm connect r0
root@node2:~# apt-get install drbd8-utils
root@node2:~# scp root@node1:/etc/drbd.d/* /etc/drbd.d/
root@node2:~# drbdadm create-md r0
root@node2:~# /etc/init.d/drbd start
root@node2:~# drbdadm syncer r0
root@node2:~# drbdadm connect r0
root@node1:~# drbdadm -- --overwrite-data-of-peer primary r0
root@node1:~# drbdadm primary r0
root@node1:~# cat /proc/drbd
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757
0: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r----
ns:4300921 nr:3429 dw:110206 dr:8403592 al:39 bm:260 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
root@node2:~# drbdadm primary r0
root@node2:~# cat /proc/drbd
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757
0: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r----
ns:756 nr:825 dw:1581 dr:3131 al:2 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

Mise en place du filesystem OCFS2

root@node1:~# apt-get install ocfs2-tools
root@node1:~# cat /etc/ocfs2/cluster.conf
cluster:
    name = ocfs2
    node_count = 2

node:
    number = 1
    name = node1
    ip_address = 192.168.1.211
    ip_port = 7777
    number = 1
    cluster = ocfs2

node:
    number = 2
    name = node2
    ip_address = 192.168.1.212
    ip_port = 7777
    cluster = ocfs2
root@node1:~# /etc/init.d/ocfs2 start
root@node1:~# /etc/init.d/o2cb start
root@node1:~# mkfs.ocfs2 /dev/drbd0
root@node1:~# mount.ocfs2 /dev/drbd0 /mnt/
root@node2:~# apt-get install ocfs2-tools
root@node2:~# scp root@node1:/etc/ocfs2/* /etc/ocfs2/
root@node2:~# /etc/init.d/ocfs2 start
root@node2:~# /etc/init.d/o2cb start
root@node2:~# mount.ocfs2 /dev/drbd0 /mnt/

MySQL : script de sauvegarde par snapshot LVM

# cat mysql_backup.sh
#!/usr/bin/perl -w

my $host = 'localhost';
my $dbname = 'mysql';
my $user = 'backup';
my $passwd = 'kV6qcZUbH0';
my $vg = 'vg';
my $lv = 'sql';
my $size = '1G';
my $backupdir = '/home/backup/mysql';

### SCRIPT ###

use POSIX;
use DBI;

my $snapshot = $lv . "_" . strftime("%Y%m%d_%H%M%S", localtime);
print "Creating snapshot $snapshot...\n";

$dbh = DBI->connect("dbi:mysql:$dbname;host=$host", $user, $passwd)
or die "Connection error: $DBI::errstr\n";

$dbh->do("SET SESSION AUTOCOMMIT=0");
$dbh->do("FLUSH TABLES WITH READ LOCK");

system("lvcreate -s -L$size -n$snapshot $vg/$lv");

$sth = $dbh->prepare("SHOW MASTER STATUS");
$sth->execute();
while ($row = $sth->fetchrow_hashref) {
 foreach $col (keys %{$row}) {
 print "$col: " . $$row{$col}."\n";
 }
}

$dbh->do("UNLOCK TABLES");

system("mkdir -p $backupdir/tmp");
system("mount /dev/mapper/$vg-$snapshot $backupdir/tmp");
system("tar czf $snapshot.tar.gz -C $backupdir/tmp .");
system("umount /dev/mapper/$vg-$snapshot");
system("rm -fr $backupdir/tmp");
system("lvremove -f $vg/$snapshot");

print "Done.\n";

MySQL : script de sauvegarde par snapshot ZFS

# cat mysql_backup.sh
#!/usr/bin/perl -w

my $host = 'localhost';
my $dbname = 'mysql';
my $user = 'backup';
my $passwd = 'WD8Y2YOraM';
my $pool = 'rpool/sql';
my $backupdir = '/home/backup/mysql';

### SCRIPT ###

use POSIX;
use DBI;

my $snapshot = strftime("%Y%m%d_%H%M%S", localtime);
print "Creating snapshot $snapshot...\n";

$dbh = DBI->connect("dbi:mysql:$dbname;host=$host", $user, $passwd)
   or die "Connection error: $DBI::errstr\n";

$dbh->do("SET SESSION AUTOCOMMIT=0");
$dbh->do("FLUSH TABLES WITH READ LOCK");
system("zfs snapshot -r $pool\@$snapshot");
$sth = $dbh->prepare("SHOW MASTER STATUS");
$sth->execute();
while ($row = $sth->fetchrow_hashref) {
 foreach $col (keys %{$row}) {
 print "$col: " . $$row{$col}."\n";
 }
}

$dbh->do("UNLOCK TABLES");

system("zfs send -vR $pool\@$snapshot | gzip > $backup_dir/$snapshot.gz");
system("zfs destroy -r $pool\@$snapshot");

print "Done.\n"

FreeBSD : clean install ZFS avec support des BE

Les environnements d’initialisation – Boot Environment (BE) – est une fonctionnalité backportée de Solaris et liée au portage de ZFS sur FreeBSD. Son intérêt est de créer différentes versions du filesystem racine afin de garantir un démarrage sûr du système suite à une opération de maintenance comme l’installation, la mise à jour ou tout simplement une reconfiguration. Elle s’appuie intégralement sur des snapshots ZFS.

Techniquement, le pool racine ZFS doit respecter une organisation du type : <nom du pool>/ROOT/<nom du BE>. Ainsi pour un pool nommé rpool et le BE default, le fileystem racine est rpool/ROOT/default. La gestion des BE est ensuite effectuée grâce à la commande beadm qui permet de les créer et de sélectionner le BE à utiliser au prochain démarrage.

Cet article vise à présenter l’installation et l’utilisation d’un système supportant les BE.

Installation du système

Toute la procédure s’effectue depuis le CD de FreeBSD en mode live.

# gpart create -s gpt ada0
# gpart add -b 34 -s 94 -t freebsd-boot ada0
# gpart add -s 4G -t freebsd-swap -l swap0 ada0
# gpart add -t freebsd-zfs -l disk0 ada0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
# gpart create -s gpt ada1
# gpart add -b 34 -s 94 -t freebsd-boot ada1
# gpart add -s 4G -t freebsd-swap -l swap1 ada1
# gpart add -t freebsd-zfs -l disk1 ada1
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
# kldload geom_mirror.ko
# gmirror label -F -h -b round-robin swap /dev/gpt/swap0 /dev/gpt/swap1
# kldload opensolaris.ko
# kldload zfs.ko
# gnop create -S 4096 /dev/gpt/disk0
# gnop create -S 4096 /dev/gpt/disk1
# zpool create -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache rpool mirror /dev/gpt/disk0.nop /dev/gpt/disk1.nop
# zpool export rpool
# gnop destroy /dev/gpt/disk0.nop
# gnop destroy /dev/gpt/disk1.nop
# zpool import -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache rpool
# zfs set checksum=fletcher4 rpool
# zfs set atime=off rpool
# zfs create rpool/ROOT
# zfs create -o mountpoint=/ rpool/ROOT/default
# zfs set freebsd:boot-environment=1 rpool/ROOT/default
# zpool set bootfs=rpool/ROOT/default rpool
# zfs create -o mountpoint=/usr/local rpool/local
# zfs create -o mountpoint=/var rpool/var
# zfs create -o compression=lzjb -o exec=off -o setuid=off rpool/var/crash
# zfs create -o exec=off -o setuid=off rpool/var/db
# zfs create -o compression=lzjb -o exec=on -o setuid=off rpool/var/db/pkg
# zfs create -o exec=off -o setuid=off rpool/var/empty
# zfs create -o compression=lzjb -o exec=off -o setuid=off rpool/var/log
# zfs create -o compression=gzip -o exec=off -o setuid=off rpool/var/mail
# zfs create -o exec=off -o setuid=off rpool/var/run
# zfs create -o compression=lzjb -o exec=on -o setuid=off rpool/var/tmp
# zfs create -o mountpoint=/tmp -o compression=on -o exec=on -o setuid=off rpool/tmp
# zfs create -o mountpoint=/home rpool/home
# chmod 1777 /mnt/tmp
# chmod 1777 /mnt/var/tmp
# sh
# cd /usr/freebsd-dist
# export DESTDIR=/mnt
# for file in base.txz lib32.txz kernel.txz doc.txz;
> do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}); done
# zfs set readonly=on zroot/var/empty
# cp /var/tmp/zpool.cache /mnt/ROOT/default/boot/zfs/zpool.cache
# ee /mnt/etc/fstab
/dev/mirror/swap none swap sw 0 0
# ee /mnt/boot/loader.conf
geom_mirror_load="YES"
zfs_load="YES"
vfs.root.mountfrom="zfs:rpool/ROOT/default"
# ee /mnt/etc/rc.conf
hostname="freebsd9"
keymap="fr.iso.acc"
zfs_enable="YES"

network_interfaces="lo0 em0"
defaultrouter="192.168.0.1"
ipv6_defaultrouter="fdcb:9921:3552:afd7::1"
ifconfig_em0="inet 192.168.0.2 netmask 255.255.255.0 polling"
ifconfig_em0_ipv6="inet fdcb:9921:3552:afd7::2 prefixlen 64"

clear_tmp_enable="YES"
tcp_drop_synfin="YES"

moused_enable="NO"
sendmail_enable="NONE"
sshd_enable="YES"
syslogd_flags="-ss"
# ee /mnt/etc/resolv.conf
nameserver 192.168.0.254
search my.domain
# echo 'daily_status_gmirror_enable="YES"' >> /mnt/etc/periodic.conf
# echo 'daily_status_zfs_enable="YES"'' >> /mnt/etc/periodic.conf
# echo 'daily_status_smart_devices="/dev/ada0 /dev/ada1"' >> /mnt/etc/periodic.conf
# echo 'daily_status_mail_rejects_enable="NO"' >> /mnt/etc/periodic.conf
# echo 'daily_status_include_submit_mailq="NO"' >> /mnt/etc/periodic.conf
# echo 'daily_submit_queuerun="NO"' >> /mnt/etc/periodic.conf
# echo 'WRKDIRPREFIX=/usr/obj' >> /mnt/etc/make.conf
# chroot /mnt
# passwd
# tzsetup
# cd /etc/mail
# nano aliases
# make aliases
# exit
# zfs umount -a
# zfs set mountpoint=/rpool rpool
# zfs set mountpoint=/rpool/ROOT rpool/ROOT
# zfs set mountpoint=legacy rpool/ROOT/default
# shutdown -r now

Démarrage du système

# zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
rpool                687M  14.7G   152K  /rpool
rpool/ROOT           683M  14.7G   144K  /rpool/ROOT
rpool/ROOT/default   683M  14.7G   683M  legacy
rpool/home           144K  14.7G   144K  /home
rpool/local          144K  14.7G   144K  /usr/local
rpool/tmp            176K  14.7G   176K  /tmp
rpool/var           1.89M  14.7G   564K  /var
rpool/var/crash      148K  14.7G   148K  /var/crash
rpool/var/db         388K  14.7G   244K  /var/db
rpool/var/db/pkg     144K  14.7G   144K  /var/db/pkg
rpool/var/empty      144K  14.7G   144K  /var/empty
rpool/var/log        188K  14.7G   188K  /var/log
rpool/var/mail       144K  14.7G   144K  /var/mail
rpool/var/run        204K  14.7G   204K  /var/run
rpool/var/tmp        152K  14.7G   152K  /var/tmp
# zfs snapshot rpool/ROOT/default@clean

Création d’un nouvel environnement

On commence par installer la commande beadm :

# cd /usr/ports/sysutils/beadm
# make install

On peut dès lors vérifier que le BE default est bien détecté :

# beadm list
BE      Active Mountpoint  Space Created
default NR     /            1.8G 2012-10-08 04:33

La création d’un BE nécessite uniquement de spécifier son nom :

# beadm create upgrade
Created successfully
# beadm list
BE      Active Mountpoint  Space Created
default NR     /            1.8G 2012-04-19 15:05
upgrade -      -          136.0K 2012-10-08 06:25

Il est également possible de cloner un BE existant en spécifiant son nom.

Au niveau du pool ZFS, le BE se matérialise par un nouveau clone :

# zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
rpool               1.83G  13.6G   152K  /rpool
rpool/ROOT          1.68G  13.6G   144K  /rpool/ROOT
rpool/ROOT/default  1.68G  13.6G  1.68G  legacy
rpool/ROOT/upgrade   144K  13.6G  1.68G  legacy
rpool/home           144K  13.6G   144K  /home
rpool/local         4.14M  13.6G  4.14M  /usr/local
rpool/tmp            184K  13.6G   184K  /tmp
rpool/var            146M  13.6G   564K  /var
rpool/var/crash      148K  13.6G   148K  /var/crash
rpool/var/db         145M  13.6G   144M  /var/db
rpool/var/db/pkg     196K  13.6G   196K  /var/db/pkg
rpool/var/empty      144K  13.6G   144K  /var/empty
rpool/var/log        192K  13.6G   192K  /var/log
rpool/var/mail       144K  13.6G   144K  /var/mail
rpool/var/run        204K  13.6G   204K  /var/run
rpool/var/tmp        152K  13.6G   152K  /var/tmp

Reste enfin à activer ce BE et redémarrer le système :

# beadm activate upgrade
Activated successfully
# shutdown -r now

A présent, l’ensemble des opérations affecte le BE upgrade. En cas d’erreur, une réactivation du BE default permettra un redémarrage du système.

Solaris 11 : configuration du pool racine ZFS en miroir

Cette procédure détaille la configuration en miroir du pool racine ZFS d’une installation de Solaris 11 x86 et reproductible pour un Solaris 10. L’installation du système a été réalisée sur le premier disque dur c4t0d0. Voici  un mémo des commandes nécessaires.

root@solaris:~# cfgadm -s 'select=type(disk)'
Ap_Id                          Type         Receptacle   Occupant     Condition
sata7/0::dsk/c4t0d0            disk         connected    configured   ok
sata7/2::dsk/c4t2d0            disk         connected    configured   ok
root@solaris:~# fdisk -W -c c4t0d0p0

* /dev/rdsk/c4t0d0p0 default fdisk table
* Dimensions:
*    512 bytes/sector
*     63 sectors/track
*    255 tracks/cylinder
*   2088 cylinders
*

* Id    Act  Bhead  Bsect  Bcyl    Ehead  Esect  Ecyl    Rsect      Numsect
191   128  0      1      1       254    63     1023    16065      33527655
0     0    0      0      0       0      0      0       0          0
0     0    0      0      0       0      0      0       0          0
0     0    0      0      0       0      0      0       0          0
root@solaris:~# fdisk -B c4t2d0p0
root@solaris:~# fdisk -W - c4t2d0p0

* /dev/rdsk/c4t2d0p0 default fdisk table
* Dimensions:
*    512 bytes/sector
*     63 sectors/track
*    255 tracks/cylinder
*   2088 cylinders
*

* Id    Act  Bhead  Bsect  Bcyl    Ehead  Esect  Ecyl    Rsect      Numsect
191   128  0      1      1       254    63     1023    16065      33527655
0     0    0      0      0       0      0      0       0          0
0     0    0      0      0       0      0      0       0          0
0     0    0      0      0       0      0      0       0          0
root@solaris:~# prtvtoc /dev/rdsk/c4t0d0s0 | fmthard -s - /dev/rdsk/c4t2d0s0
root@solaris:~# format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
0. c4t0d0 <ATA-VBOX HARDDISK-1.0 cyl 2085 alt 2 hd 255 sec 63>
/pci@0,0/pci8086,2829@d/disk@0,0
1. c4t2d0 <ATA-VBOX HARDDISK-1.0 cyl 2085 alt 2 hd 255 sec 63>
/pci@0,0/pci8086,2829@d/disk@2,0
Specify disk (enter its number): 0
selecting c4t0d0
[disk formatted]
/dev/dsk/c4t0d0s0 is part of active ZFS pool rpool. Please see zpool(1M).

format> verify

Primary label contents:

Volume name = <        >
ascii name  = <ATA-VBOX HARDDISK-1.0 cyl 2085 alt 2 hd 255 sec 63>
pcyl        = 2087
ncyl        = 2085
acyl        =    2
bcyl        =    0
nhead       =  255
nsect       =   63
Part      Tag    Flag     Cylinders        Size            Blocks
0       root    wm       1 - 2084       15.96GB    (2084/0/0) 33479460
1 unassigned    wm       0               0         (0/0/0)           0
2     backup    wu       0 - 2086       15.99GB    (2087/0/0) 33527655
3 unassigned    wm       0               0         (0/0/0)           0
4 unassigned    wm       0               0         (0/0/0)           0
5 unassigned    wm       0               0         (0/0/0)           0
6 unassigned    wm       0               0         (0/0/0)           0
7 unassigned    wm       0               0         (0/0/0)           0
8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
9 unassigned    wm       0               0         (0/0/0)           0

format> disk

selecting c4t2d0
[disk formatted]

format> verify

Primary label contents:

Volume name = <        >
ascii name  = <DEFAULT cyl 2085 alt 2 hd 255 sec 63>
pcyl        = 2087
ncyl        = 2085
acyl        =    2
bcyl        =    0
nhead       =  255
nsect       =   63
Part      Tag    Flag     Cylinders        Size            Blocks
0       root    wm       1 - 2084       15.96GB    (2084/0/0) 33479460
1 unassigned    wu       0               0         (0/0/0)           0
2     backup    wu       0 - 2086       15.99GB    (2087/0/0) 33527655
3 unassigned    wu       0               0         (0/0/0)           0
4 unassigned    wu       0               0         (0/0/0)           0
5 unassigned    wu       0               0         (0/0/0)           0
6 unassigned    wu       0               0         (0/0/0)           0
7 unassigned    wu       0               0         (0/0/0)           0
8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
9 unassigned    wu       0               0         (0/0/0)           0
root@solaris:~# zpool  status
pool: rpool
state: ONLINE
scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          c4t0d0s0  ONLINE       0     0     0

errors: No known data errors
root@solaris:~# zpool attach -f rpool c4t0d0s0 c4t2d0s0
Make sure to wait until resilver is done before rebooting.
root@solaris:~# zpool status
pool: rpool
state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Mon Oct  1 23:30:04 2012
921M scanned out of 5.90G at 19.6M/s, 0h4m to go
921M resilvered, 15.23% done
config:

        NAME          STATE     READ WRITE CKSUM
        rpool         ONLINE       0     0     0
          mirror-0    ONLINE       0     0     0
            c4t0d0s0  ONLINE       0     0     0
            c4t2d0s0  ONLINE       0     0     0  (resilvering)

errors: No known data errors
root@solaris:~# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c4t2d0s0
stage2 written to partition 0, 282 sectors starting at 50 (abs 16115)
stage1 written to partition 0 sector 0 (abs 16065)
Haut de page