Extend FreeBSD ZFS inside KVM with virsh

## Example details:

# Disk is sized 15G, we will extend it to 25G.
# RAM is 2G, Swap is also 2G.
# First partition is freebsd-boot.
# Second and third is eigher freebsd-swap or freebsd-zfs. I will cover both cases below.

## From KVM Host:

# When extending a ‘raw’ device, it will warn you that it is dangerous.
# I just ignored that warning, but it might mean something to you.

virsh shutdown <host>
cd /var/kvm
qemu-img info <host>.img
qemu-img resize <host>.img +10G
virsh start <host>

## Inside host: (FreeBSD ZFS)

# The recover command is due to the last copy of GPT is not in the right place.
# This will fix the ‘CORRUPT’ error.

# If zfs partition is p3 and swap is p2:

gpart show
gpart recover vtbd0  
gpart show
gpart resize -i 3 -a 4k vtbd0
gpart show 
zpool list
zpool set autoexpand=on zroot
zpool online -e zroot vtbd0p3
zpool list
zfs list

# If the swap partition is p3 and zfs is p2, it is in the way. Delete it, resize with ‘-s <size>’ to make room for swap, and create it again.

gpart show
gpart recover vtbd0  
gpart show
swapoff /dev/vtbd0p3
gpart delete -i 3 vtbd0
gpart resize -i 2 -a 4k -s 23G vtbd0
gpart add -t freebsd-swap -a 4k vtbd0
gpart show
swapon /dev/vtbd0p3
zpool list
zpool set autoexpand=on zroot
zpool online -e zroot vtbd0p2
zpool list
zfs list

 

Udgivet i FreeBSD, Knowledge Base, Old Base, Zfs | Skriv en kommentar

PHP Function who returns linux processlist

function getProcessList()                                                                                                                                                    
{                                                                               
     exec("ps ax",$processes); unset($processes[0]);                         
                                                                                       
     foreach ($processes as $_)                                              
     {                                                                       
          preg_match("/[ ]*([0-9]+)[ ]*(.+? )[ ]*(.+? )[ ]*([0-9]+:[0-9]+)[ ]*(.+)/",$_,$matches);
          $return[] = array(                                              
                 "pid" => $matches[1],                                   
                 "tty" => $matches[2],                                   
                 "stat" => $matches[3],                                  
                 "time" => $matches[4],                                  
                 "command" => $matches[5]                                
          );                                                              
     }                                                                       
     return $return;                                                         
}

 

Udgivet i Knowledge Base, Old Base, Programmering | Skriv en kommentar

Et jubilæum nærmer sig, tid til en facelift!

Base nærmer sig 15 år … det er 15 år i drift med den samme skod-kode, 15 år med varierende aktivitet og 15 år hvor vi flere gange har overvejet at skodde eller omskrive projektet. Faktisk diskuterede vi at omskrive hele kodenbasen for et par uger siden, netop i forbindelsen med det kommende jubilæum. Men vi blev enige om at det var sjovere at sætte den gamle kode i stand!

Så dét er jeg gået igang med!

Jeg har:
– Tjekket koden ind i GIT
– Kodet et nyt login/session system
– Lavet et nyhedssystem.

Jeg planlægger at:
– Implementere mulighed for at indsætte kodeblokke med syntax highligting
– Implementere mulighed for at tilknytte og søge via tags.
– Uploade billeder til de enkelte indlæg.
– Optimere designet lidt og/eller meget samt. evt. med mulighed for at vælge selv.

Derudover har jeg selv blogget andetsteds, hvor mange af mine løbende tekniske artikler er endt – og det vil jeg lave om på, de bliver flyttet herover nu :-

Udgivet i Blog | Skriv en kommentar

KVM: Overførsel af images (sparse files) mellem servere

KVM og andre virtualiseringteknologier gør meget brug sparse-files, det drejer sig i bund og grund op at operativsystemet ikke allokerer mere plads på disken til den enkelte fil en der virkelig er behov for.

Det er smart når man gerne vil kunne tildele f.eks. 200GB til en virtual maskine for at fremtidssikre den, men reelt kun bruger 10-20GB.

root@kvm5:/var/kvm/images# du -h diskimage.qcow2 
4.8G	diskimage.qcow2
root@kvm5:/var/kvm/images# du -h --apparent-size diskimage.qcow2 
200G	diskimage.qcow2

Det kan dog godt overraske lidt når man vil forsøge at kopiere filerne fra en maskine til en anden og man forsøger at bruge et program der ikke understøtter sparse-files, for så kommer der pludselig en 200GB fil ud af det i den anden ende.

Hvis du allerede har gjort det, så kan de resparsifye den, hvis du er i tvivl kan du finde ud af det med qemu-img info:

root@kvm1:/var/kvm/images# qemu-img info diskimage.qcow2 
image: diskimage.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 52G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         Snapshot #1            260M 2017-06-09 02:52:54   00:06:57.333
2         Snapshot #2            884M 2017-06-10 20:02:33   41:16:33.744
Format specific information:
    compat: 1.1
    lazy refcounts: true
    refcount bits: 16
    corrupt: false

Første metode, libguestfs-tools:

apt-get / yum install libguestfs-tols

Mit diskimage fyldte 53G før og 1.5G efter, og processen tog 14 minutter:

root@kvm1:/var/kvm/images# virt-sparsify diskimage.qcow2 diskimage-sparsed.qcow2

En anden mulighed:

root@kvm1:/var/kvm/images# cp --sparse=always diskimage.img diskimage-sparsed.img

Jeg har ikke undersøgt forskellen på de to metoder grundigt, primært fordi jeg hellere ville bruge tiden på at finde en mere effektiv måde at flytte filerne på.

Første forsøg, rsync:

root@kvm5:/var/kvm/images# rsync -avSP diskimage.qcow2 root@kvm1:/var/kvm/images
sending incremental file list
diskimage.qcow2
 56,232,312,832 100%   92.89MB/s    0:09:37 (xfr#1, to-chk=0/1)

 sent 56,246,041,528 bytes  received 35 bytes  97,395,742.97 bytes/sec
 total size is 56,232,312,832  speedup is 1.00

Overførslen tog cirka 10 minutter, hvilket er cirka det samme som som en almindelige scp-overførsel, men filen havde tilgengæld den “rigtige” størrelse på destinationen – men som det tydeligt fremgår overfører den faktisk samtlige 56G … dvs en masse “tomme bytes”.

Mit næste forsøg var med tar, som eftersigende skulle kunne håndtere sparse-filer og dermed kræve mindre båndbrede.

Andet forsøg, tar + ssh:

root@kvm5:/var/kvm/images# time tar -Scf - diskimage.qcow2 | pv | ssh kvm1 "cd /var/kvm/images && tar xf -"
 3.59GiB 0:02:26 [25.1MiB/s] [                                                                                               <=>             ]

Overførslen tog pludselig kun 2,5 minutter – meget bedre, men der gik et minutstid før overførslen overhovedet gik igang, og den gennemsnitslige hastighed var også væsentligt lavere end med rsync. Så jeg gik i tænkebox, og vinderen blev

Tredie forsøg, cp + nfs:
Flere steder var jeg nemlig stødt på folk der lovpriste cp for at være effektiv med sparse filer og så tænkte jeg at såfremt det fungerede med nfs måtte det være måden at løse det på, og guess what, det fungerede:

root@kvm5:/var/kvm/images# mount kvm1:/test4 /test4

root@kvm5:/var/kvm/images# cp diskimage.qcow2 /test4/

Overførslen tog 1 minut og 32 sekunder!

Jeg ved godt hvordan jeg overfører mine diskimages fremover 😉

Udgivet i Knowledge Base, KVM, Linux, Old Base | Skriv en kommentar

KVM på Debian 8.0

Har du behov for at køre virtuelle maskiner og vil du gerne indgå alt muligt gui-shit og bare have ting der fungerer i en konsol … så er du kommet det rigtige sted hen! 😀

Vi starter med en frisk Debian 8 maskine med noget SSH og et friskt opdateret respository. Så skal vi bruge lidt pakker:

apt-get install qemu-kvm libvirt-bin virtinst bridge-utils vim

Kerne modulet “vhost_net” bruges til at styre netværket for de virtuelle maskiner med, den aktiveres således:

echo vhost_net >> /etc/modules 
modprobe vhost_net

Rediger /etc/network/interfaces og ret “eth0” til “br0”, eksempel:

TODO: Indsæt eksempel

Opsæt derefter default-netværk, et lukket nat netværk som vi typisk bruger til at installere maskiner på, det kan også bruges hvis du f.eks. skal arbejde med dine maskiner lokale eller bruge VPN til at nå dem med.

Jeg foretrækker descriptive navne derfor plejer jeg at køre en virsh net-edit default og rette virtbr0 til natbr0:

<network>
  <name>default</name>
  <uuid>38ec5232-8576-4dc0-acf0-d4f4e6cc9e12</uuid>
  <forward mode='nat'/>
  <bridge name='natbr0' stp='on' delay='0'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>

Og så starter du netværket:

virsh net-start default
virsh net-autostart default

Opret en mappe til kvm-images:

mkdir -p /var/kvm/images

Opret filen /root/install.sh med flg. indhold: (tilpasses selvfølgelig)

#!/bin/sh

virt-install \
--name test01.specialhosting.dk \
--ram 4096 \
--disk path=/var/kvm/images/test01.specialhosting.dk,size=30 \
--vcpus 2 \
--os-type linux \
--graphics none \
--network bridge=natbr0 \
--console pty,target_type=serial \
--location 'http://ftp.dk.debian.org/pub/debian/dists/Debian8.8/main/installer-amd64/' \
--extra-args 'console=ttyS0,115200n8 serial'

Nu kører du så install.sh:

bash install.sh

Dette vil tage dig igennem den sædvanlige Debian-installer … gennemfør den som normalt, lige indtil efter du genstarter det nye system. Her skal du lige redigere boot linien inden du kører videre, det gør du ved at trykke “E” når du kommer til Grub. Herefter skal du dine linux-kerne parametrene, scroll ned til du finder en linie der starter med “Linux” og tilføje så som følge:

linux        /boot/vmlinuz-3.16.0-4-amd64 root=UUID=0137c1e4-cec3-4\|
 |e26-bae2-32e23bd81fef ro  quiet console=ttyS0,115200n8

Herefter trykket du ctrl-x og så booter maskinen på den virtuelle serielle terminal som virt-install giver dig adgang til, dette er dog ikke en permanent løsning. Derfor logger du nu ind på maskinen og skriver flg. kommando:

systemctl enable getty@ttyS0

Tillykke, nu har du din førse KVM Maskine installeret 100% fra kommandoprompten 😉

Udgivet i Knowledge Base, KVM, Linux, Old Base | Skriv en kommentar

Begrænsning af kommandoer med SSH Keys

Ofte sker det at man har brug for at have sine brugere i lidt kortere snor end ellers, jeg sider f.eks. og implementerer en løsning hvor vi laver et API via SSH.

Her vil jeg gerne sikre mig at brugerne kun har adgang til de ting jeg syntes de skal have adgang til, heldigvis er der support for det i SSH. Du kan nemlig tilknytte paremetre til de enkelte SSH Nøgler. Det gøres ved f.eks. at skrive flg. foran ssh-rsai authorized_keys filen:

no-port-forwarding,no-X11-forwarding,no-pty,command="/opt/test.php" ssh-rsa AAA...

og så kunne man eksempelvis lave en /opt/test.php der ser således ud:

#!/usr/bin/php
<?php

switch(getenv("SSH_ORIGINAL_COMMAND"))
{
  case "janeway":
    print "Doing voyager stuff ...\n";
    break;
  case "kirk":
    print "Doing enterprise stuff ...\n";
    break;
  default:
    print "Sorry, no cigar!\n";
    break;
}

?>

Og det kunne så se således ud i en test:

test@PaddleBoat:~$ ssh root@web03.mikjaer.com kirk
Doing enterprise stuff ...
test@PaddleBoat:~$ ssh root@web03.mikjaer.com janeway
Doing voyager stuff ...

Enjoy 😉

Udgivet i Knowledge Base, Linux, Old Base | Skriv en kommentar

Using Curl as Wget replacement

While Wget and Fetch is rather easy to get an iso from the webs, curl is apparenly quite stoopid.
Not only will it happily spit out binary data on STDOUT, it will also happily spit out the Body of a 30x redirect, in stead of getting the damn file.

Solution: teach curl how to behave!

Normally:
wget <url>

In Curl:
curl -LO <url>
Udgivet i Knowledge Base | Skriv en kommentar

Setting default route in OpenVPN Client Config

Add this to the client config:

route 0.0.0.0 192.0.0.0 vpn_gateway
route 64.0.0.0 192.0.0.0 vpn_gateway
route 128.0.0.0 192.0.0.0 vpn_gateway
route 192.0.0.0 192.0.0.0 vpn_gateway


Of course it can be customized to add other routes.
Udgivet i Knowledge Base, Networking, OpenVPN | Skriv en kommentar

Styring af indlaeg i i3 og andre wm’s

wmctrl -r :ACTIVE: -N "MyWindowTitle"

mike@defiant:~$ wmctrl -l
0x0240000f  0 defiant MyWindowTitle

wmctrl -r 'MyWindowTitle' -b add,demands_attention
Udgivet i Knowledge Base | Skriv en kommentar

I3 Window Manager notification fra Irssi

Det her virker efter sigende også ved andre systemer end lige i3, men det er jeg ligeglad med for jeg bruger i3wm … and so should you 😉

Først opretter du “.Xresources”, indsætter flg. og genstarter din X:

xterm*bellIsUrgent: true

Det sørger for at en bell i en terminal fremhæver den som “urgent”, dvs. gør den rød i statusbaren 🙂

Det kan du evt teste ved at køre flg. i en terminal og så skifte over til et andet workspace:

sleep 3 && echo -e "\a"

Så sætter du IRSSI op til at give bell ved notifications:

/set bell_beeps on
/set beep_msg_level MSGS NOTICES DCC DCCMSGS HILIGHT
/save

Og så mangler vi bare at få screen til at smide “audible bell” videre, og det gør du ved at deaktivere visual bell, tilføj flg. i din .screenrc:

vbell off

Hvis du ikke lige har lyst til at genstarte din screen kan du opnå samme resultat med : ctrl + a , ctrl + g

Enjoy 🙂

Udgivet i Knowledge Base, Linux, Old Base, Workstation | Skriv en kommentar