Archiv rubriky: SmartOS

Jak v Solaris / SmartOS zjistit sériové číslo diskového řadiče

V Solarisu se na to hodí nástroj prtpicl. Ten však zobrazí poměrně hodně textu. Je proto lepší si jej omezit např. programem egrep na výrobce vašeho řadiče takto:

prtpicl -v | egrep -i "lsi|sas"

Tento nástroj se také dá využít na zjištění informací prakticky o všem, co v systému je dostupné.

Zdroj: https://www.thegeekdiary.com/how-to-identify-the-hba-cardsports-and-wwn-in-solaris/

Jak přesunout SmartOS image z jednoho serveru na druhý

Nedávno se mi stalo, že jsem potřeboval přesouvat SmartOS zónu z jednoho serveru na druhý. Zóna ale byla vyrobená z obrazu base-64-lts ve verzi 16.4.0. Tuhle verzi kvůli fatální chybě při upgradu stáhli z veřejného repozitáře.

Řešením by bylo dataset zóny povýšit pomocí zfs promote. Co když ale raději chceme origin zóny zachovat a přenést jej na nový server? Nástroj imgadm bohužel nic jako export neposkytuje. Naštěstí si ale můžeme poradit ručně.

Nejprve přeneseme dataset:

$ zfs send -Rep zones/08589eda-d64e-11e6-89a3-0b55371be927@final | ssh cilovy.server.tld zfs recv zones/08589eda-d64e-11e6-89a3-0b55371be927

Poté přesuneme konfiguraci pro imgadm:

$ scp /var/imgadm/images/zones-08589eda-d64e-11e6-89a3-0b55371be927.json cilovy.server.tld:/var/imgadm/images/

Nesmíme zapomenout na lock soubor, který imgadm používá, aby určil, zda je již daný image naimportovaný:

$ scp /var/run/img.08589eda-d64e-11e6-89a3-0b55371be927.import.lock cilovy.server.tld:/var/run/

A to je vše 🙂

Jak dostat ze SmartOS data o prostředcích VM

Na SmartOS nám spoustu věcí o VM prozradí příkaz vmadm. Např. základní limity zjistíme takto:

vmadm list -p -o uuid,alias,type,cpu_cap,cpu_shares,ram,vcpus -s -ram

Je ale docela otrava to pokaždé zadávat. Můžeme si na to samozřejmě udělat bash alias, což jsem také měl. Další užitečný alias mám např. na výpis VM:

alias vmlist='vmadm list -o uuid,type,ram,state,alias,nics.0.ip -s nics.0.ip'

Na výpis prostředků už mi ale pouhý alias nestačil. Sepsal jsem tedy jednoduchý skript. Ten krom toho, co vrací vmadm, zobrazí i kolik VM žere místa na disku v přehledné formě. Navíc je to pěkná ukázka, jak si můžete podobné užitečné skripty sepsat sami.

Rozhodl jsem se nejen skript vmusage, ale celý repozitář s pár dalšími užitečnými věcmi zveřejnit. Stahovat nebo forkovat repozitář smartos-scripts můžete na Githubu.

Jak vytvořit Ubuntu image pro SmartOS

Po nějaké době vás přestane bavit instalovat všechny nové VPS z ISO image. Nastal čas vytvořit si image pro imgadm. Jak na to?

Vytvoříme si prázdný VPS:

$ vmadm create <<EOF
{
	"alias": "ubuntu-14-04-3",
	"brand": "kvm",
	"autoboot": false,
	"vnc_port": 12300,
	"vcpus": 1,
	"ram": 1024,
	"cpu_cap": 100,
	"cpu_shares": 100,
	"zfs_io_priority": 100,
	"max_lwps": 2000,
	"quota": 10,
	"disks": [
		{
			"boot": true,
			"model": "virtio",
			"size": 10240

		}

	],
	"resolvers": ["8.8.8.8", "8.8.4.4"],
	"nics": [
		{
			"nic_tag": "admin",
			"model": "virtio",
			"ip": "x.x.x.x",
			"netmask": "255.255.255.0",
			"gateway": "y.y.y.y",
			"primary": true
		}
	]

}
EOF
Successfully created VM e736e906-5cca-49e8-a0e0-7a3367ee6841

Stáhneme instalační ISO a nabootujeme z něj VPS:

$ cd /zones/e736e906-5cca-49e8-a0e0-7a3367ee6841/root
$ wget -q http://releases.ubuntu.com/trusty/ubuntu-14.04.2-server-amd64.iso
$ vmadm boot e736e906-5cca-49e8-a0e0-7a3367ee6841 order=cd,once=d cdrom=/ubuntu-14.04.3-server-amd64.iso,ide
Successfully started VM e736e906-5cca-49e8-a0e0-7a3367ee6841

Získáme info o VNC a připojíme se na něj:

$ vmadm info e736e906-5cca-49e8-a0e0-7a3367ee6841 vnc

Nyní nainstalujeme Ubuntu (nebo jiný OS) jak jsme zvyklí. U ubuntu ještě doporučuji pomocí F4 zvolit volbu „Install a minimal virtual machine“.

Po instalaci uděláme aktualizaci systému a reboot:

$ sudo su
$ aptitude update
$ aptitude dist-upgrade
$ reboot

Po rebootu odstraníme staré kernely:

$ sudo su
$ dpkg -l|grep linux
ii  libselinux1:amd64               2.2.2-1ubuntu0.1                 amd64        SELinux runtime shared libraries
ii  linux-headers-3.19.0-25         3.19.0-25.26~14.04.1             all          Header files related to Linux kernel version 3.19.0
ii  linux-headers-3.19.0-25-generic 3.19.0-25.26~14.04.1             amd64        Linux kernel headers for version 3.19.0 on 64 bit x86 SMP
ii  linux-headers-3.19.0-26         3.19.0-26.28~14.04.1             all          Header files related to Linux kernel version 3.19.0
ii  linux-headers-3.19.0-26-generic 3.19.0-26.28~14.04.1             amd64        Linux kernel headers for version 3.19.0 on 64 bit x86 SMP
ii  linux-headers-generic-lts-vivid 3.19.0.26.13                     amd64        Generic Linux kernel headers
ii  linux-headers-virtual-lts-vivid 3.19.0.26.13                     amd64        Transitional package.
ii  linux-image-3.19.0-25-generic   3.19.0-25.26~14.04.1             amd64        Linux kernel image for version 3.19.0 on 64 bit x86 SMP
ii  linux-image-3.19.0-26-generic   3.19.0-26.28~14.04.1             amd64        Linux kernel image for version 3.19.0 on 64 bit x86 SMP
ii  linux-image-virtual-lts-vivid   3.19.0.26.13                     amd64        This package will always depend on the latest minimal generic kernel image.
ii  linux-virtual-lts-vivid         3.19.0.26.13                     amd64        Minimal Generic Linux kernel and headers
ii  util-linux                      2.20.1-5.1ubuntu20.6             amd64        Miscellaneous system utilities
$ aptitude purge linux-headers-3.19.0-25 linux-headers-3.19.0-25-generic linux-image-3.19.0-25-generic

Volitelně také můžeme vyhodit hlavičkové soubory, které ve většině případů nejsou potřeba, ale aktualizují se zbytečně s každým kernelem:

$ aptitude purge linux-headers-3.19.0-26 linux-headers-3.19.0-26-generic linux-headers-generic-lts-vivid linux-headers-virtual-lts-vivid linux-image-virtual-lts-vivid linux-virtual-lts-vivid

Můžeme doinstalovat nějaké balíky. Rozhodně ale nesmíme vynechat balík acpid:

$ aptitude install acpid arping htop mc

Některé přebytečné balíky se hodí vyhodit:

$ aptitude purge usbutils pppoeconf pppconfig ppp popularity-contest pciutils ntfs-3g laptop-detect apparmor libapparmor-perl

Dále nainstalujeme sdc-vmtools:

$ cd /usr/src
$ wget https://github.com/joyent/sdc-vmtools/archive/master.zip
$ aptitude install unzip
$ unzip master.zip
$ cd sdc-vmtools-master/src/linux
$ ./install-tools.sh -y
$ cd /usr/src
$ rm -r sdc-vmtools-master/ master.zip

Přihlásíme se přes VNC a ostraníme uživatele, kterého jsme vytvořili při instalaci systému:

$ sudo su
$ passwd
# Relogin jako root
$ userdel user
$ rm -r /home/user

Připravíme VPS na vypnutí:

$ /lib/smartdc/prepare-image

Rootovi můžeme nyní odebrat heslo:

$ passwd -d root

Shodíme VPS a vratíme se do SmartOS:

poweroff

Vytvoříme z VPS image:

$ zfs create zones/images
$ zfs snapshot `vmadm get e736e906-5cca-49e8-a0e0-7a3367ee6841|json disks.0.zfs_filesystem`@final
$ zfs send `vmadm get e736e906-5cca-49e8-a0e0-7a3367ee6841|json disks.0.zfs_filesystem`@final | bzip2 --best > /zones/images/ubuntu-14.04.3-server-amd64.zvol.bz2

A VPS smažeme:

$ vmadm destroy e736e906-5cca-49e8-a0e0-7a3367ee6841
Successfully deleted VM e736e906-5cca-49e8-a0e0-7a3367ee6841

Pro image potřebujeme vytvořit dsmanifest:

cd /zones/images
cat > ubuntu-14.04.3-server-amd64.dsmanifest <<EOF
{
	"uuid": "`uuid`",
	"creator_name": "organizace",
	"creator_uuid": "ef16d6fc-51a7-11e5-8793-67c0a6dc6ee3",
	"vendor_uuid": "ef16d6fc-51a7-11e5-8793-67c0a6dc6ee3",
	"name": "ubuntu64",
	"version": "14.04.3",
	"urn": "sdc:organizace:ubuntu64:14.04.3",
	"type": "zvol",
	"os": "linux",
	"description": "Ubuntu 14.04.3 LTS Server x86-64 VM image",
	"created_at": "2015-09-02T21:14:00Z",
	"updated_at": "2015-09-02T21:14:00Z",
	"files": [
		{
			"path": "ubuntu-14.04.3-server-amd64.zvol.bz2",
			"sha1": "`shasum ubuntu-14.04.3-server-amd64.zvol.bz2|awk '{print $1}'`",
			"size": `ls -l ubuntu-14.04.3-server-amd64.zvol.bz2|awk '{print $5}'`
		}
	],
	"image_size": "10240",
	"requirements": {
		"networks": [
			{
				"name": "net0",
				"description": "public"
			}
		],
		"ssh_key": true
	},
	"platform_type": "smartos",
	"cloud_name": "sdc",
	"cpu_type": "host",
	"disk_driver": "virtio",
	"nic_driver": "virtio",
	"generate_passwords": "true",
	"users": [
		{"name": "root"}
	]
}
EOF

UUID pro creator_uuid a vendor_uuid si můžete vygenerovat příkazem uuid.

Máme image a dsmanifest, teď image můžeme nainstalovat:

imgadm install -m ubuntu-14.04.3-server-amd64.dsmanifest -f ubuntu-14.04.3-server-amd64.zvol.bz2

A teď z image konečně vytvoříme VPS:


Nemá smysl dávat disku větší size, než je size image. Disk se stejně vytvoří podle image. Prozatím to řeším pomocí GParted. Jakmile budu vědět, jak to zautomatizovat, napíšu o tom další článek. Nebo můžete někdo poradit v diskuzi pod článkem 🙂

Dodatek: dá se to řešit takto:

# V global zóně
$ zfs set volsize=54G zones/7dc89552-48fd-4fb7-9dfa-470ee47502b3-disk0
# Ve VPS
$ fdisk /dev/vda

Command (m for help): d
Selected partition 1

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-113246207, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-113246207, default 113246207):
Using default value 113246207

# Reboot
$ resize2fs /dev/vda1
# Reboot

Jak připravit SmartOS na Ansible

Se SmartOS je po instalaci trochu problém. Aby na něm Ansible fungoval, je potřeba pár věcí udělat ručně.

Nainstalovat pkgsrc bootstrap do globální zóny:

$ cd /
$ curl -k http://pkgsrc.joyent.com/packages/SmartOS/bootstrap/bootstrap-2014Q4-x86_64.tar.gz | gzcat | tar -xf -
$ pkg_admin rebuild
$ pkgin -y up

Můžeme rovnou provést upgrade balíků:

$ pkgin full-upgrade

Doinstalujeme python:

$ pkgin in python27

Volitelně povolíme ssh klíč:

mkdir ~/.ssh
echo "" > ~/.ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/*

Pokud nechcete přidávat klíč, stačí spustit ansible-playbook s prametrem -k, aby se zeptal na heslo.

SmartOS chyba při spouštění /smartdc/bin/sdc-lastcomm cronem

Pokud už vás nebaví po přihlášení do SmartOS global zóny hláška You have new mail a vidíte ve /var/mail/root chybu:

find: stat() error ./20150420000000.not_terminated.host: No such file or directory

má to snadnou nápravu. Bude ale potřeba upravit soubor /smartdc/bin/sdc-lastcomm. Abych si to zjednodušil, vytvořil jsem patch:

--- /smartdc/bin/sdc-lastcomm	Fri May 30 03:16:17 2014
+++ /smartdc/bin/sdc-lastcomm	Tue Apr 21 11:23:16 2015
@@ -48,10 +48,19 @@
 		echo "-R is not valid with -d"
 		exit 1
 	fi
+	MAX_SLEEP=3
+	cd "$DIR" || exit 1
+	# Save the current audit log filename
+	AUDIT_LOG=`find . -name "*.not_terminated.*"`
 	# Rotate and trim the audit logs
 	audit -n
-	cd "$DIR" || exit 1
-	find . -type f -mtime +$DAYS -print0 2>/dev/null | xargs -0 rm -f
+	# Wait until old log is closed or MAX_SLEEP seconds
+	while [[ -f $AUDIT_LOG && $MAX_SLEEP ]]; do
+		MAX_SLEEP=$((MAX_SLEEP - 1))
+		sleep 1
+	done
+	# Find and delete $DAYS old files
+	find . -type f -mtime +$DAYS -print0 2>/dev/null | xargs -0 rm -f
 	exit 0
 fi
 

Patch nejlépe provede takto:

$ curl --insecure -s https://gist.githubusercontent.com/foxycode/f12e9bc4f7af24436e90/raw/22ff6087002c45893e35dea09aa55809ce2069aa/sdc-lastcomm.patch | patch /smartdc/bin/sdc-lastcomm

Více info v Github repozitáři SmartOS

Update: 15.10.2015 upraveno pro verzi 20151015T063628Z

SmartOS, route a IP adresy od OVH

Mám nyní u skvělého dodavatele serverů OVH jeden server, na kterém jsem chtěl vytvořit několik VPS. Nechal jsem si k serveru přidělit dodatečné IP adresy, ale ouha, po konfiguraci zóna nemá síť. Jak z toho ven?

Problém je v tom, že brána pro dodatečné IP je v jiném subnetu než přidělené IP adresy. Musíme tedy zóně nejprve dát vědět, kudy se do toho subnetu dostane. To provedeme spuštěním následujícího příkazu uvnitř VPS:

route -p add XXX.XXX.XXX.0/24 YYY.YYY.YYY.YYY -interface -ifp net0

XXX.XXX.XXX jsou první 3 octety IP adresy global zóny (fyzického serveru). YYY.YYY.YYY.YYY je dodatečná IP, nastavená VPS serveru.

Protože VPS při startu bránu nenašel, bude potřeba ručně přidat ještě tu:

route -p add default XXX.XXX.XXX.254

XXX.XXX.XXX jsou opět první 3 octety IP adresy global zóny. OVH jako bránu používá vždy poslední adresu z daného rozsahu, tedy 254.

Parametr -p (persist) v příkazech říká, že se má nastavení uložit. Nesmaže se vám tedy po restartu serveru.

Samotné nastavení se ukládá do souboru /etc/inet/static_routes

Ekvivalent pro Linux (Ubuntu):

route add -net XXX.XXX.XXX.0/24 gw YYY.YYY.YYY.YYY dev eth0
route add default gw XXX.XXX.XXX.254

SmartOS, PuTTY a klávesy HOME, END a DEL

Pokud vás také zdržuje, že ve SmartOS nefungují na konzoli klávesy HOME, END a DELETE, zde je způsob, jak to napravit.

V domovském adresáři vytvoříme soubor .inputrc s následujícím obsahem:

"\e[3~": delete-char
"\e[1~": beginning-of-line
"\e[4~": end-of-line

Díky tomuto souboru bude bash vědět, jakou funkci má pro dané klávesy použít. Změny se projeví až po opětovném přihlášení.

Co ale dělat v případě globální zóny, kdy se tento soubor po restartu ztratí? Vytvoříme si pro něj SMF službu!

Nejprve soubor .inputrc nakopírujte do adresáře /opt/custom. Pokud tento adresář nemáte vytvořen, tak jej vytvořte.

Poté vytvořte soubor /opt/custom/smf/inputrc_link.xml s následujícím obsahem:




    
        
        
        
            
        
        
            
        
        
        
        
        
            
            
        
        
        
        
    

SmartOS po restartu automaticky načítá XML soubory z tohoto adresáře, službu nám naimportuje a vyrobí link.

Malý tip na závěr: Ve SmartOS zónách je stejný problém, ačkoliv stačí jen nakopírovat soubor .inputrc do adresáře uživatele, není potřeba SMF služba. Dělat to pro každou zónu je ale otrava. Můžeme si to zjednudušit tím, že soubor nakopírujeme do šablony zóny stáhnuté přes imgadm. Např. takto pro uživatele root:

cp /root/.inputrc /zones//root/root/

Nastavení NTP v globální zóně SmartOS

V nedávné době se na internetu začala hojně zneužívat chyba v NTP serveru, který je na mnoha serverech defaultně povolen. SmartOS v tomto nebyl vyjímkou. V aktuální verzi (20140404T001635Z) je již chyba v konfiguraci NTP na SmartOS opravena, nejlepším řešením je tedy upgrade SmartOS. Pro ty, co si ale chtějí do NTP nastavit české servery tu mám krátký návod, jak ntp.conf přetížit.

Tento konfigurační soubor ntp.conf uložíme do souboru /usbkey/config.inc/ntp.conf

driftfile /var/ntp/ntp.drift
logfile /var/log/ntp.log

# by default act only as a basic NTP client
restrict -4 default ignore
restrict -6 default ignore

# allow NTP messages from the loopback address, useful for debugging
restrict 127.0.0.1
restrict ::1

# allow servers we are synchronizing with:
restrict -4 tik.cesnet.cz nomodify nopeer
restrict -4 tak.cesnet.cz nomodify nopeer
restrict -6 tik.cesnet.cz nomodify nopeer
restrict -6 tak.cesnet.cz nomodify nopeer

# server(s) we time sync to
server tik.cesnet.cz
server tak.cesnet.cz

Pokud složku config.inc ještě nemáte vytvořenou, tak ji vytvořte.

Config poté aktivujeme přidáním následujícího řádku na konec souboru /usbkey/config

ntp_conf_file=ntp.conf

Změny se projeví až po restartu stroje. Eventuelně můžete config nakopírovat do souboru /etc/inet/ntp.conf a restartovat NTP příkazem:

svcadm restart ntp

SmartOS, su a ENV proměnná HOME

Na Linuxu jsem byl zvyklý, že když zavolám su <user>, ENV proměnná HOME se nastaví na domovský adresář uživatele. Na SmartOS (nejsem si jist, jak na Solaris) se tohle ale nestane. Tohle chování mi vadilo hlavně při používání GITu. Dostal jsem tuto chybu:

fatal: unable to access '/root/.config/git/config': Permission denied

Řešení je jednoduché. Místo su použijeme příkaz sudo. Konkrétně takto:

sudo -s -u 

Abychom si to zjednodušili a nemuseli si nový příkaz pamatovat, můžeme si jej přidat jako alias do souboru ~/.bashrc

alias su='sudo -s -u'