# Velkommen

Her kan du læse mere om, hvad du kan forvente af min samling af noter, tips og vejledninger.

Lad os snakke om **tekniske ting**, som f.eks. **linux**, **basis-netværk**, **dockers** og meget andet

Tanken er, at jeg løbende vil tilføje tips og tricks, ud fra de problemer jeg selv løber ind i, i hverdagen. Jeg har hverken stjerner på skuldrene, eller en længerevarende uddannelse indenfor feltet - men jeg håber og tror på, at mange andre kan søge de samme svar som mig.

Jeg vil forsøge at dele projekter, og simple "How to" guides. Bemærk venligst at jeg samtidig bruger sitet til at minde mig selv om, *hvordan det nu lige var det var*, at jeg satte *X* eller *Y* op.

### **Disclaimer**

Husk venligst på at det primære formål lige så vel er, at jeg selv kan huske hvordan *X* gøres, når *Y* pludselig ikke virker længere.

Sproget og kvaliteten kan derfor til tider varriere lige så meget, som det danske vejr.

Tak fordi du læser med.

### **Kontakt**

Har du spørgsmål, er du velkommen til at kontakte mig på: **til**(  s n a b e l a )**exeti**( p u n k t u m ).**co**.


# Spamhaus DNS blacklist fra en OVH VPS? (Debian med Webmin samt Virtualmin)

Sådan får du styr på opslag mod Spamhaus, hvis de fejler - primært hvis du f.eks. bruger Google's DNS, OVH, DigitalOcean - og meget mere.

## Indledning

Jeg har en VPS ved OVH som virker efter hensigten, til mindre private foretagende - og en smule andet. Den bliver drevet af Debian m. hhv. Webmin og Virtualmin. Jeg har igennem tiden brugt lang tid på at få sat SPF, DKIM - og en masse andet op. Basic SSL-ting kan også virke besværligt, når man pludselig skal have styr på alle domæner. Det hele *spiler* efter sigende (med mit kendskab), med den ene undtagelse at [Spamhaus](https://app.gitbook.com/s/-M3zME959ItRvhvmqzXK/server/spamhaus.org) ikke vil *snakke* med mig. Jeg må indrømme at det er gået i glemmebogen, men da jeg i dag løb igennem et par logs, kunne jeg ikke undlade at stoppe op:

```
Aug 14 17:38:13 {{HOSTNAME-REMOVED}} postfix/smtpd[3855]: warning: a.2.8.0.0.0.0.0.0.0.0.0.0.0.0.0.f.1.e.f.0.0.4.f.1.1.1.0.1.0.a.2.zen.spamhaus.org: RBL lookup error: Host or domain name not found. Name service error for name=a.2.8.0.0.0.0.0.0.0.0.0.0.0.0.0.f.1.e.f.0.0.4.f.1.1.1.0.1.0.a.2.zen.spamhaus.org type=A: Host not found, try again
```

I praksis betyder det jo at mit spamfilter hvad blacklists angår, er helt og aldeles spild af tid og ressourcer, når jeg ikke kan lave et lookup mod [Spamhaus.org](https://app.gitbook.com/s/-M3zME959ItRvhvmqzXK/server/spamhaus.org).

## Er du en stor fisk?

Efter at have Googlet en del, kom jeg forbi dette indlæg v. [Digital Ocean](https://www.digitalocean.com/community/questions/how-to-query-spamhaus-dns-blacklist-from-a-droplet), hvor brugere *jks* spørger om hvorfor han ikke kan nå [Spamhaus.org](https://app.gitbook.com/s/-M3zME959ItRvhvmqzXK/server/spamhaus.org). Det viser sig at f.eks. DigitalOcean, OVH og mange andre ikke resolver DNS-request mod Spamhaus' zen-domain: `zen.spamhaus.org`

I praksis betyder det, at man ikke kan benytte deres tjeneste. Det er nemt at tjekke om du er berørt af et lignende tilfælde, ved at afvikle følgende kode: `dig +short 2.0.0.127.zen.spamhaus.org`

Såfremt du ikke når frem, vil resultatet være "tomt". Hvis du derimod får et svar, ved du at tjenesten virker.

Nedenfor ses et eksempel, hhv. før og efter ændringerne (*som vi kommer til om lidt*):

```
~# dig +short 2.0.0.127.zen.spamhaus.org
```

```
~# dig +short 2.0.0.127.zen.spamhaus.org
127.0.0.2
127.0.0.10
127.0.0.4
```

Som det kan ses, får jeg ingen resultat ud af min `dig` kommando i første forsøg. Løsningen er at benytte sig af en anden DNS server i stedet.

## Få adgang til zen.spanhaus.org vha. en alternativ DNS-server

**Disclaimer**: *Hvis du driver en mailserver er det som udgangspunkt "bad practice" at benytte en DNS-server fra nabolaget. Det er i stedet en god idé at drive sin egen. I nedenstående eksempel vil dette dog blive brugt som den tekniske løsning.*

For at få adgang til zen.spamhaus.org skal du blot ændre din DNS-resolver på din maskine. Det kræver kun et par enkelte steps. Normalt vil ændringer træde i kræft med det samme. Normalt vil det være nok at ændre en linje i `/etc/network/interfaces` men da min VPS modtager info via DHCP, er det desværre ingen brugbar løsning Vi skal i stedet overrule den mode DHCP-forhandlingen sker, og tilføje vores egen præference.

Dette gøres ved at tilføje en enkelt linje til: \`

Følgende kommando giver dig adgang til `/etc/dhcp/dhclient.conf`:

```
sudo nano /etc/dhcp/dhclient.conf
```

På sidste linje i filen, skriver du da:

```
supersede domain-name-servers 208.67.222.222, 208.67.222.220;
```

For at sikre at ændringerne træder i kræft, skal du genstarte netværksenhederne med:

```
service networking restart
```

Herefter vil du i `/etc/resolv.conf` kunne se, at den nye DNS-server er taget i brug (I dette tilfælde OpenDNS)

Når ændringerne er foretaget, kan du forsøge endnu engang med `dig +short 2.0.0.127.zen.spamhaus.org`. Denne gang skulle du gerne få et resultat retur.

God fornøjelse.


# DP 1.2 m. MST giver sort skærm på Linux Mint?

JDP 1.2 med MST (Multi-Stream Transport) med 2 stk. U2515H giver sort skærm på Linux Mint - og her er forklaringen

## Indledning

Min primære arbejdsmaskine på kontoret er drevet af en ældre generation af Intels i5-processor, med lidt hjælp fra et GTX 1050 Ti. Det kan ikke alverden, men heldgivis har det DP 1.2 (DisplayPort) og dermed understørrelse af MST, også kendt som Multi-Stream Transport. Desværre har jeg haft mange problemer med MST, da min ene skærm mere eller mindre altid har været sort ved opstart af min PC. Heldigvis fandt jeg efter mange måneder frem til fejlen. Før dette, benyttede jeg mig i stedet af et enkelt DP-kabel samt et HDMI-kabel til den anden skærm.

## Skærm hænger i Sleep-mode

Efter at have oprettet en tråd på [Linux Mint's forum](https://forums.linuxmint.com/viewtopic.php?f=47\&t=268369\&p=1462314#p1462314), håbede jeg på det bedste. Det var dog mange måneder efter, jeg for første gang havde stiftet bekendtskab med fejlen.

Det lykkedes dog samme dag, at finde frem til et [issue på StackExchange](https://askubuntu.com/questions/854754/monitor-stays-in-sleep-when-daisy-chained-via-displayport), efter brug af nye søgeord på Google. Jeg løb også ind i en anden tråd på [Ubuntu forums](https://ubuntuforums.org/showthread.php?t=2301503\&p=13576294).

Forklaringen skal findes ved at skærm nummer 2 bliver hængende i Sleep-mode, formentlig grundet en fejl bag kulisserne, når nu jeg aldrig har haft problemer på Windows 10.

## Hot-fiks (bl.a. til Linux Mint)

Løsningen er, tosset nok, at tvinge begge skærme til at sove, for herefter at vække dem - blot ved at flytte på musen.

Kommandoen der skal benyttes er:

```
xset dpms force off
```

Selv har jeg gjort det, at jeg i "Startup Applications", har tilføjet denne kommando. Således opstår problemet ikke under opstart - men det kræver dog at jeg lige dasker til musen, hvis skærmen bliver sort. Normalt er ens mus jo i brug under logon, men det kan smutte - særligt hvis ens kaffekop er tom.

![](https://i.imgur.com/F3Ky8FE.png)

Jeg er stadig på jagt efter en bedre løsning, men dette virker efter hensigten - og jeg kan nu slippe afsted med et enkelt kabel fra mit grafikkort til den første skærm, og endnu et kabel fra denne, videre til min anden skærm.


# Listen med mine foretrukne programmer (til Linux Mint)

Både laptop og workstation er drevet af Linux Mint - men hvilke programmer er det lige jeg bruger?

## Indledning

Selvom jeg tidligere næsten dyrkede en sport, for at undgå en formatering af min PC - så sker det alligevel stadig i ny og næ. Efter ens daily driver er blevet markant hurtigere end for bare få år siden, er det også blevet mindre tidskrævende. Så her får i listen over de programmer jeg normalt henter, når først Linux Mint står klar til brug.

Først listen over mine *Must have*, efterfulgt af andre programmer jeg som oftest når at hente ned, med tiden. Hvis et eller flere programmer giver anledning til en forklaring, er du mere end velkommen til at spørge løs i kommentar-sporet. Det kan tænkes at enkelte næsten passer til en særskilt post.

De fleste programmer tilføjer jeg blot via *Software Manager*. Bemærk dog at flere applikationer findes i "Flatpak"-kategorien, og denne udgave er som oftest nyere, og i de fleste tilfælde bedre - disse er markeret med en stjerne (\*). Dernæst er de fleste programmer som er nævnt, programmer med en brugerflade. Der findes utallige pakker jeg er glad for, når det kommer til shell/bash.

Jeg vil løbende tilføje, fjerne - og ændre ting, alt efter præferencer.

## Listen anno - Must have

* [zsh](https://en.wikipedia.org/wiki/Z_shell) inkl. [oh-my-zsh](https://ohmyz.sh/) (*Bedre shell, med mulighed for udvidelser, temaer og meget andet*)
  * theme: `robbyrussell` (Kan angives i filen `~/.zshrc`)
* [cerebro](https://cerebroapp.com/) (*Launcher som minder om macOS's Spotlight*)
* [Stacer](https://oguzhaninan.github.io/Stacer-Web/) (*Ressource-oversigt*)
* VLC Medier player\*
* Spotify\*
* Visual Studio Code\*
* Discord\*
* Firefox (*Standard applikation*)
* Shutter (*Screenshot-værktøj - Aktiver \_edit-muligheden* ved [at tilføje libgoocanvas-libs](http://ubuntuhandbook.org/index.php/2018/04/fix-edit-option-disabled-shutter-ubuntu-18-04/).
* [xnview](https://www.xnview.com/en/xnviewmp/#downloads) (Til visning af f.eks. raw-billeder)
* [Psensor](https://wpitchoune.net/psensor/) - Temperaturinformation af CPU etc.

## Andre muligheder

* GDebi (*.deb Debian-pakke understøttelse*)
* Shotcut (*Video-editor*)


# Sorte områder på Linux Mint-skrivebordet? "Flicker"-problemet kan løses med en simpel opdatering

Flere brugere melder om sorte områder på deres skærm, med Nvidia-kort i maskinen. Linux Mint har endnu ikke fået opdateret sources med nyeste udgave af Nvidia drivers - men du kan selv løse problemet.

## Indledning

Flere brugere melder i øjeblikket om problemer med sorte områder på deres skrivebord, når de i Linux Mint har mere end en énkelt skærm koblet til. Løsningen er blto at få opdateret til nyeste drivers fra Nvidia. Nedenfor kan du læse hvordan dette gøres, men også hvordan du via terminalen kan se hvilken version du benytter i øjeblikket.

![Eksempel af fejlen, hvor der er sorte områder](https://i.imgur.com/9Rc7iFi.png)

## Tjek hvilken NVIDIA driver-version du har installeret

Med følgende kommando kan du tjekke hvilken version af NVIDIA's driver, som pt. er installeret på din maskine: `modinfo nvidia|grep version`

Mens denne guide bliver skrevet, har jeg følgende version installeret:

```
version:        390.77
srcversion:     209B1D0CB123DE466F700AD
```

Jeg er dog bekendt med at man er helt oppe ved `415.23`, og fejlen burde være rettet et godt stykke før de nåede over 400.

## Hent og installer de nyeste drivers fra NVIDIA på Linux Mint

Med følgende kommando tilføjer du et repo, hvor de nyeste drivers findes. Dernæst opdateres pakkelisterne efterfølgende, så systemet ved, hvad der er nyt - og hvad der måske ikker er gyldigt mere.

```
sudo add-apt-repository ppa:graphics-drivers/ppa --yes
sudo apt update
```

Når opdateringen er fuldført, skal du gå til `Driver Manager` som kan findes i din program-menu. Herefter vælger du blot den nyeste version af nvidia's driver (`nvidia-driver-xxx`). *Bemærk at du `ikke`skal vælge xserver-xorg-video-nouveau\` medmindre du ønsker at benytte et open-source alternativ*.

![Terminal and nvidia version](https://i.imgur.com/ZBHjFdF.png)

Efter installationen er fuldført og du har genstartet maskinen, kan du med fordel tjekke versionen.

Nedenfor ses output af kommandoen, som vi brugte tidligere:

```
version:        415.23
srcversion:     08EF116EF9A54925D15BD2F
```

## /et/apt/sources.list

*Ja, måske kender du det - eller måske har du aldrig hørt om det før*.

Som bonus-information vil jeg lige nævne, at du når dutilføjer et nyt repo, findes disse efterfølgende under stien `/etc/apt/sources.list.d/`. Med `ls -al /etc/apt/sources.list.d/` kan du se de forskellige filer der er blevet tilføjet:

```
$ ls -al /etc/apt/sources.list.d/
total 40
drwxr-xr-x 2 root root 4096 Dec 15 21:13 .
drwxr-xr-x 6 root root 4096 Dec 15 21:41 ..
-rw-r--r-- 1 root root  103 Dec 15 21:13 additional-repositories.list
-rw-r--r-- 1 root root  170 Oct 20 13:56 freecad-maintainers-freecad-stable-bionic.list
-rw-r--r-- 1 root root  142 Dec 15 21:04 graphics-drivers-ppa-bionic.list
-rw-r--r-- 1 root root  514 Oct  4 21:21 official-package-repositories.list
-rw-r--r-- 1 root root  136 Dec 15 12:38 openscad-releases-bionic.list
-rw-r--r-- 1 root root 1509 Nov 19 18:14 teamviewer.list
-rw-r--r-- 1 root root  130 Dec 13 21:16 teejee2008-ppa-bionic.list
-rw-r--r-- 1 root root  193 Oct  5 20:28 vscode.list
```

Bemærk fx. at `graphics-drivers-ppa-bionic.list` fremgår.

Hvis du i fremtiden ender ud i problemer når du afviklet `sudo apt update` hvor systemet melder at et givent repo ikke længere er tilgængeligt, kan du slette dette ved at fjerne filen igen.

Havde vi ønsket at fjerne graphics-drivers-pp-bionic.list, skulle vi blot have afviklet kommandoen: `sudo nano /etc/apt/sources.list.d/graphics-drivers-ppa-bionic.list`, efterfulgt af `sudo apt update`- så burde alt virke igen.

**OBS.** Jeg anbefaler at du altid tager en backup inden oprydning i sources.list.d-mappen, medmindre du ved hvad du går ind til. Selvom du ikke kan ødelægge det store, vil du dog kunne bremse fremtidige opdateringer af de programmer du måtte have benyttet dig af, fra de enkelte repo's.

**PS.** Du kan også kigge forbi filen `sudo nano /etc/apt/sources.list`, hvor der også kan findes henvisninger til repos.


# Opdater Lenovo ThinkPad BIOS med Linux

Sådan bruger du Lenovo's ISO, til at få opdateret din Lenovo ThinkPad til nyeste version af BIOS

## Indledning

Min Lenovo ThinkPad X260 har altid gjort hvad den skulle, men jeg foretrækker alligevel at få opdateret BIOS løbende. Uden Windows på maskinen, kan det være lidt en rodet fornøjelse. Lenovo har heldigvis et ISO-image, som man kan hente ned. Herefter kan man med denne fil, udtrække de fornødne filer og gøre et USB flashdrive bootable.

**OBS**: Inden du starter, så anbefaler jeg at:

* Du har slået Secure Boot fra (Det er i forvejen op ad bakke med Linux, men uanset - slå det fra i dette tilfælde)
* Tillad Legacy-boot (Jeg har selv blot tilladt `Both` i BIOS, mens jeg lavede opdateringen. Herefter retur til UEFI)

## Hent ISO-image fra Lenovo.com

Det er ganske enkelt at hente den sidste BIOS-opdatering fra Lenovo. Jeg formoder at du selv kan finde frem hertil, så jeg vil blot gøre dig opmærksom på, at du skal hente **BIOS Bootable CD** fra deres side.

Nedenfor kan du se et par screendumps fra februar 2019:

![BIOS Bootable CD fra Lenovo.com](https://i.imgur.com/yUvc1kp.png) *Siden med det normale BIOS-opdateringsværktøj til Windows (.exe). Her vælges Bootable CD.*

![Tjek at det er "Bootable CD"](https://i.imgur.com/X8AIxSN.png) *Her ses sidne med "Bootable CD.*

Filen jeg har hentet fra Lenovo.com er døbt: `r02uj70d.iso`

## geteltorito

Med et *geteltorito* Perl-script, kan vi hurtigt få trukket vores .IMG-fil ud af .ISO-filen. Det er den fil vi skal have skrevet til vores USB flashdrive.

Gå til [userpages.uni-koblenz.de/\~krienke/ftp/noarch/geteltorito/](https://userpages.uni-koblenz.de/~krienke/ftp/noarch/geteltorito/) og hent den nyeste version. I skrivende stund er det `geteltorito-0.6.tar.gz`. Jeg har lavet en kopi som kan findes [her](https://ufile.io/o5yf1).

Nedenfor er step-by-step kommandoer til hvordan du får trukket .img-filen ud. Bemærk at guiden tager udgangspunkt i, at alle filer findes i `~/Downloads`.

```
tar -xzf geteltorito-0.6.tar.gz
./geteltorito/geteltorito -o ~/Downloads/bios.img ~/Downloads/r02uj70d.iso
```

Output burde nu være:

```
Booting catalog starts at sector: 20 
Manufacturer of CD: NERO BURNING ROM VER 12
Image architecture: x86
Boot media type is: harddisk
El Torito image starts at sector 27 and has 43008 sector(s) of 512 Bytes

Image has been written to file "/home/exetico/Downloads/bios.img".
```

Nu er bios.img-filen klar til at blive skrevet til vores USB flashdrive.

## Skriv .img-filer til en USB-enhed

**OBS:** Inden du går i gang, så husk at holde særligt øje med dine drev-navne. Laver du en fejl, kan du i værste fald overskrive en anden disk. Jeg fraskriver mig samtidig enhvert form for tab af filer, defekt hardware o.l.

Vi er nu klar til at skrive vores `bios.img` fil til vores USB flahdrive.

Jeg benytter selv `fdisk -l` til at finde frem til hvilket drev, som jeg vil benytte. I dette tilfælde er det et 16 GB USB stick, hvor der intet vigtigt findes. Når du starter nedenstående kommando, vil filerne som findes på drevet blive slettet (**!!!**). Mit USB stick er device: `/dev/sdb`

Kopier `bios.img` filen til vores drev: `sudo dd if=bios.img of=/dev/sdb`

For at sikre at alt er skrevet til USB-drevet, og at der ikke er bygget noget op i cachen, som endnu ikke er sendt til drevet, skal du afslutte med: `sudo sync`

Du er nu klar til at genstarte computeren.

Hvis du endnu ikke har skiftet fra UEFI til Both/Legacy boot, er det nu du skal gøre det. Jeg kunne ikke få maskinen til at boote op, med UEFI-only. Følg instrukserne på skærmen når du har valgt at boote op fra dit USB flashdrive, og husk at undlade at slukke computeren mens den arbejder med opdatering. Tilslut desuden altid din computer til fast-strøm (en adapter), og undlad at forsøge mens den kun får strøm fra batteriet i maskinen.

Hvis jeg husker rigtigt, skal du vælge valgmulighed nr. `2` i programmet.

Rigtig god fornøjelse med opdateringen.

*Credits til* [*tojaj.com*](http://tojaj.com/lenovo-biosuefi-update-from-usb-stick-i-e-without-bootable-cd/)*.*


# Opsætning af Linux Mint efter ren installation

Sådan opsætter jeg normalt Linux Mint, efter en ren installation. Her findes både anbefalede programmer, tips og tricks mm.

## Indledning

Vi har alle prøvet at starte "fra ny" - når det handler om styresystemet efter en formatering. Jeg har lavet denne blog-post for at gennnemgå de ting jeg normalt selv foretager mig, efter en ren installation.

Denne post er skrevet og lavet til `Linux Mint 19.1`, men kan muligvis sagtens bruges i andre sammenhæng- og nyere versioner af både Linux Mint og Ubuntu.

## Step-by-steps opsætning

De første ting jeg gør, efter Linux Mint er installeret, er...

* Fjern flueben fra "Show this dialog at start" i Welcome Screen
* På næste side findes "Driver Manager". Kør dette og installeret nødvendige drivers (dette burde primært være dit grafiikort). Genstart.
* Start Update Manager, og lad den køre alt igennem.
* Mens den arbejder starter jeg Firefox, og logger ind med Firefox Sync. Herefter installeret flere add-ons automatik.
* I Firefox åbner jeg [Search engines](https://www.linuxmint.com/searchengines.php) siden og klikker på Google-logoet i bunden under "Other engines", og klikker på "here", flueben i "Mark this the current search engine" > Add.
* Jeg åbner "Themes" sikre følgende valg fra toppen: Mint-Y-Dark, Mint-Y, Mint-Y-Dark, DMZ-White og Mint-Y-Dark.
* Updates er nu færdige, og jeg åbner derfor Software Manager og henter følgende (som **flatpaks**!). Brug "Flatpak" knapen som findes nederst til højre i billedet.
  * Discord
  * VLC
  * Spotify
  * Calibre
  * Psensor -*Ej flatpak*
  * gpick -*Ej flatpak*
* Mens Software Manager er i gang, finder jeg følgende frem på manuel vis. Fordi programmet ikke findes som flatpak, eller fordi jeg har bedst erfaring med programmet direkte fra source.
  * [Dropbox - `Ubuntu 64-bit versionen`](https://www.dropbox.com/install)
  * [Visual Studio Code - `.deb-udgaven`](https://code.visualstudio.com/download)
  * [XnView MP - `Linux DEB 62-bit versionen`](https://www.xnview.com/en/xnviewmp/#downloads)

Nu åbner jeg terminalen, og skriver `sudo apt install python3-gpg`, og efter dette er installeret, starter jeg Dropbox. Jeg logger ind, åbner deres installinger og går til fanen "Sync" og trykker "Selective Sync...". I denne popup fjerner jeg alle de mapper, som jeg ikke har behov for bliver synkroniseret og trykker "Update".

Herefter tilføjer jeg Dropbox som "bogmærke" i min file-manager, ved blot at trække denne over i venstre side.

![Dropbox som bogmækre](https://i.imgur.com/aB6zc7z.png)

Da jeg også har onboard-graphics, åbner jeg NVIDIA X Server Settings som gemmer sig nede i tray-menuen med ikoner, og vælger Intel. Jeg genstarter herefter computeren, for god ordens skyld.

Nu tager vi fat i et par programmer mere.

### Typora

Min foretrukne markdown-editor er Typora, hvis jeg blot skal lave nogle simple noter, eller er blotindlæg, før jeg skubber det afsted til [exeti.co](https://app.gitbook.com/s/-M3zME959ItRvhvmqzXK/desktop/exeti.co). Se evt [her](http://support.typora.io/Typora-on-Linux/) for mere omkring installationen. Nedenfor er dog en step-by-step guide.

```
wget -qO - https://typora.io/linux/public-key.asc | sudo apt-key add -
echo -e "\ndeb https://typora.io/linux ./" | sudo tee -a /etc/apt/sources.list
sudo apt-get update
sudo apt-get install typora
```

Mit foretrukne tema er i øjeblikket `Night` som findes under `Themes`-menuen.

### zsh og oh-my-shell

*Git er nødvendigt for at kunne hente oh my shell, og dernæst brugt i mange andre sammenhæng*

```
sudo apt install zsh git
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
```

Jeg er i øjeblikket glad for temaet `agnoster`. Du kan selv ændre det i filen `~/.zshrc`, men nedenfor er en "hurtig løsning" til at ændre dette. Bemærk at jeg i samme omgang henter skriftstypen `powerline`. I samme ombæring sikre jeg at zsh bruges som standard shell fremover, både for min normale bruger, og som root.

```
sudo apt install fonts-powerline
sudo sed -i 's/ZSH_THEME=\"robbyrussell\"/ZSH_THEME=\"agnoster\"/g' ~/.zshrc
chsh -s $(which zsh)
sudo chsh -s $(which zsh)
```

Ps. Temaer bor i mappen `~/.oh-my-zsh/themes/`, og overstående kan fx. tilpasses med kommandown `sudo nano ~/.oh-my-zsh/themes/agnoster.zsh-theme`, hvis du skal have ændret noget i teamet.

### Shutter

Til Screenshots mm. bruger jeg `Shutter`.

```
sudo apt install shutter
```

Shutter skal dog skal have en kærlig hånd fra start af. for at edit-funktionen virker. Løsningen er at hente tre forskellige pakker: [libgoocanvas-common](https://launchpad.net/ubuntu/+archive/primary/+files/libgoocanvas-common_1.0.0-1_all.deb), [libgoocanvas3](https://launchpad.net/ubuntu/+archive/primary/+files/libgoocanvas3_1.0.0-1_amd64.deb) og [libgoo-canvas-perl](https://launchpad.net/ubuntu/+archive/primary/+files/libgoo-canvas-perl_0.06-2ubuntu3_amd64.deb).

Min har være hhv. `libgoocanvas-common_1.0.0-1_all.deb`, `libgoocanvas3_1.0.0-1_amd64.deb` og `libgoo-canvas-perl_0.06-2ubuntu3_amd64.deb`. De kan installeres via Gdebi, men ellers også afvikles med kommandoen `sudo dpkg -i ~/Downloads/{navnetpådinpakkeher}.deb; sudo apt-get -f install`.

Når du nu starter Shutter, vil "Edit"-knappen virke. Har du startet Shutter inden du installerede overstående pakker, skal du lige lukke programmet helt, og herefter åbne det igen.

### Stacer

Bruges til optimeringer og indblik i ressource-forbrug.

```
sudo add-apt-repository ppa:oguzhaninan/stacer
sudo apt-get update
sudo apt-get install stacer
```

## Snapshots via Timeshift

Hvis din maskine er vigtig for dig, kan det være en god ide at få sat Timeshift op på din Linux Mint-distro. Bemærk dog venligst at Timeshift-løsningen er ganske kræsen hvad angår filsystemer. Selv har jeg oprettet et iSCSI lun, som jeg laver backup til. Læs hvordan du [forbindelse til et iSCSI-lun her](https://exeti.co/guide/iscsi-mount.html).

Timeshift er indbygget i Linux Mint, og findes ved blot at søge efter dette.

Jeg vil ikke gå i detaljer med hvordan dette sættes op - men jeg kan dog oplyse at jeg benytter Linux Mint's egne præfecenser hvad angår backup. Så derfor laver jeg snapshots på daglig basis, og gemmer dernæst 5 stk.

![Setup Wizard - Tmieshift](https://i.imgur.com/Lcp5t85.png)

Da jeg har backup af alle mine vigtige filer, tager jeg dog ikke backup af `root` og min egen `home`-folder.

![Timeshift Oversigt](https://i.imgur.com/LvTb80y.png)

## First World Problems - de små tricks

### Firefox

**Skift stavekontrol og ordbog til Dansk i Firefox** Hvis du som mig benytter Firefox på Engelsk, skal du et smut forbi [Danish Dictionary for the Spell Checker](https://addons.mozilla.org/en-US/firefox/addon/dansk-ordbog/) for at sikre at stavekontrollen er klar til det danske sprog. Herefter er Firefox klar til at rette dine slåfejl - på dansk.

**Undgå at lukke alt med Ctrl+Q (som jeg gør til tider...)** Rammer du tit Ctrl+Q som mig, så har du nok oplevet at det ikke altid er muligt at gendanne ens sesison efterfølgende. Efter skiftet fra Firefox til Chrome, og så tilbage til Firefox for kort tid siden, er der en ting jeg virkelig savner - og det er sikringen af at min session altid er gemt hvis jeg trykker noget forkert.

Når nu det fejler, så må vi i stedet gøre lidt ekstra for, at man ikke dummer sig med Ctrl+Q (som jeg i hvert fald gør...).

Opret en custom tastaturgenvej der blot afvikler kommandoen `null`, og bind denne til `Ctrl`+`q`. Således lukker Firefox ikke, hvor man rammer forkert. I skrivende stund er det **ikke** muligt at at slå genvejen fra i Firefox, desværre.

![Custom genvej til Ctrl+Q - Så lukker Firefox ikke ved slåfejl..](https://i.imgur.com/FbMp3CX.png)

En anden og ganske simpel ting du kan gøre, er at gå til `about:preferences` og her sætte flueben i de to punkter som vist nedenfor:

![about:preferences i Firefox](https://i.imgur.com/iHAFMaW.png)

Skulle du ved en fejl komme til at lukke alt, og virker gendannelsen ikke efter hensigten, kan du åbne stien `~/.mozilla/firefox/dormvqxr.default/sessionstore-backups`. `previous.jsonlz4` burde være de sidste adresser som du har besøgt. Du kan fx. [denne side](https://www.jeffersonscher.com/ffu/scrounger.html) trække URL'erne ud af filen. Firefox har desuden en god sektion til fejlfinding. Den kan du tilgå ved at gå til siden `about:support`, hvor der desudne også er en genvej til den sti, hvis du kigger under punktet "Profile Directory".

### Sudo

**Slip for at skrive kode hver gang.** Vil du gerne bruge sudo, uden at skulle skrive din kode hele tiden? Så kør `sudo visudo` og tilføj `{DITBRUGERNAVN} ALL=(ALL) NOPASSWD: ALL`.

### Visual Studio Code

**Tilføj egne genveje til Visual Studio Code.** Tilføj fx. en tastatur-genvej, således at Git Sync kan startes ved at trykke `Ctrl`+`k` efterfulgt af `Ctrl`+`s`.

Find `Git: sync` og dobbeltklik herpå. Herefter trykker du den ønskede genvej på dit tastatur, og afslutter herefter med et tryk på `Enter`.

Hvis du vil lære flere gode tips og tricks til Visual Studio Code, kan jeg anbefale siden <https://vscodecandothat.com/>.

### Dupletter i sources.list

Har du fået tilføjet det samme repository flere gange, kan du blot rydde op ved selv at besøge `/etc/apt/sources.list` med `sudo nano /etc/apt/sources.list`. Her fjerner du linjen som fremgår flere gange. Med editoren `nano` kan du fjerne en hel linje med genvejstasten `Ctrl`+`k`. Gem herefter med `Ctrl`+`o`, og afslut med `Ctrl`+`x`. Nano ville have spurgt om du vil gemme hvis du blot trykker `Ctrl`+`x`, hvor du så i stedet skulle have kvitteret med et `y` efterfulgt af `Enter`-tasten.

Afslutningsvis til jeg nævne, at hvis du benytter ssh meget, giver det samtidig rigtig god mening at få kopieret dine configs og keys over, og smidt dem ind i `~./ssh` hvor de normalt bor. Husk at [få ændret rettighederne til dine keys og configs](https://gist.github.com/grenade/6318301).

God fornøjelse med opsætningen af Linux Mint. Hvis du har anbefalinger eller tips og tricks, vil jeg meget gerne høre om dem. Se "Velkommen"-siden.


# Øg batteritiden på Linux Mint og Ubuntu med TLP

Med optimering og et værktøj, holder bærbaren pludselig længere på batteriet

## Indledning

Min Lenovo X260 er en fantastisk maskine, og på Windows holder den mange timer. Med Linux Mint er det dog en helt anden sag. Jeg skal oftest stille mig tilfreds med små to timers strøm, hvorefter jeg næsten tager mig selv i at flyve over stuegulvet, for at hente en oplader.

Der findes dog et program og et værktøjer, som kan hjælpe med batteriforbruget med hjælp fra en præ-defineret strømprofil. Du kab bruge guiden til andre end Lenovo-maskiner, men bemærk dog at denne guide har et enkelt step, som kun skal bruges på Lenovo Thinkpad-modeller.

## Powertop og TLP

Værktøjet Powertop kan bruges til at se hvilke processer som trækker mest strøm. Det hele giver en smule mere mening, hvis man blot kigger på et screenshot heraf: ![Powertop](https://i.imgur.com/BCHE4uKg.png)

Powertop er altså reelt blot et værktøj der kan hjælpe med at give et indblik i forbruget. TLP bringer den avanceret strømstyring til Linux, uden at du skal være eksperten som løfter opgaven. Du kan læse mere om værktøjet [her](https://linrunner.de/en/tlp/docs/tlp-linux-advanced-power-management.html). Derfor kan du reelt undlade at tilføje Powertop, men det er altid rart at have et redskab ved hånden.

## Installation og opsætning

Først skal vi have tilføjet `tlp` til vores software repository. Herefter indhenter vi seneste opdateringer, så vi kan installere programmet, og sidst men ikke mindst, installeres tlp, tlp-rdw og powetop.

```
sudo add-apt-repository ppa:linrunner/tlp
sudo apt-get update 
sudo apt-get install tlp tlp-rdw powertop
```

Hvis du har en **Lenovo ThinkPad**, anbefaler jeg at du dernæst tilføjer følgende: `sudo apt-get install tp-smapi-dkms acpi-call-dkms`

TLP starter automatisk op sammen med dit system, men du kan dog altid starte det manuelt med `sudo tlp start`, såfremt behovet skulle opstå.

Du kan tjekke om TLP er i gang, medd kommandoen `sudo tlp-stat -s`. Hvis `State = enabled` fremgår, er TLP aktiveret. I filen `/etc/default/tlp` vil der stå `TLP_ENABLE=1` såfremt TLP er aktiveret pr. default. Du kan læse meget mere om TLP, PowerSavingTweaks og meget andet lige [her](https://askubuntu.com/a/285681). Sidst men ikke mindst kan du skifte mellem batteri- og *tilsluttet strøm*-optimering med henholdsvis `sudo tlp bat` og `sudo tlp ac`, såfremt det skulle blive nødvendigt.

Powertop kan også ændre en del variabler, og dette kan gøres med: `sudo powertop --auto-tune`. Dog burde TLP gøre det samme, og derfor er kommandoen reelt overflødig, medmindre du har tænkt dig at slå TLP fra, fra tid til anden. Powetop bruges i stedet til at tjekke om de enkelte variabler er blevet sat som ønsket (*af TLP*).

Jeg vil anbefale at du genstarter din maskine, efter installationen er udført. Dette er dog ikke et krav, og reelt burde `sudo tlp start` være nok.

Rigtig god fornøjelse med optimeringen.

*Du kan læse mere om TLP og Powertop på* [*Reddit*](https://www.reddit.com/r/linux/comments/7ebqd8/tip_use_powertop_autotune/)*, hvor der neto findes en snak om hvorfor man reelt ikke har behov for Powertop.*


# Opdater Github-fork med sidste nyt fra den oprindelige kilde (source)

Sådan kan du med Git indlæse sidste nye ændringer fra den oprindelige kilde, hvor fra du har lavet et fork.

## Indledning

Det er ganske nemt at holde ens Github-fork opdateret med det nyeste fra det oprindelige repo. Det kræver kun et par få steps, som også kan findes på [GitHub's hjemmeside](https://help.github.com/categories/collaborating-with-issues-and-pull-requests/). Først skal du [tilføje en remote-path](https://github.com/johno/pixyll), og herefter skal du blot [indhente seneste nyt](https://help.github.com/articles/syncing-a-fork/).

For at kunne arbejde med git, er det nødvendigt at du har installeret dette. Git kan som udgangspunkt tilføjes med `sudo apt install git` på de fleste moderne destro's ala. Debian og Ubuntu. Kan du ikke finde `git` på denne måde, kan det være at du første skal indlæse sidste nyt. Dette gøres med `sudo apt update`.

## Tilføj remote repository

Først kan du se hvilke du allerede har tilføjet med: `git remote -v`

Eksempel på output før ændringerne:

```
git remote -v
origin    https://github.com/exetico/exetico.github.io (fetch)
origin    https://github.com/exetico/exetico.github.io (push)
```

Når det er gjort, kan du tilføje det nye med:

```
git remote add upstream https://github.com/johno/pixyll
```

Hvis du igen tjekker med `git remote -v` vil du bemærke at du nu har fået tilføjet upstream.

Eksempel på output efter ændringerne:

```
git remote -v
origin    https://github.com/exetico/exetico.github.io (fetch)
origin    https://github.com/exetico/exetico.github.io (push)
upstream    https://github.com/johno/pixyll (fetch)
upstream    https://github.com/johno/pixyll (push)
```

Bemærk at overstående kun er muligt, hvis du har navigeret til mappen for dit Git-repo befinder sig.

## Synkroniser med dit upstream fork

Nu er du klar til at indhente de sidste nye ændringer. Husk altid på at der kan være sket store ændringer fra du har forket, til at du vil indhente sidste nyt. Derfor skal du først sikre, at du ikke ender i problemer.

I dette tilfælde har jeg indhentet sidste nyt til temaet på denne blog, hvorfor jeg ikke frygter det store.

Kommandoerne indtastet en efter en. Bemærk at du desuden skal huske en commit-note, hvilket selv vil dukke op på din skærm, når du når dertil:

```
git fetch upstream
git checkout master
git merge upstream/master
git push
```

Nedenfor kan du se de enkelte kommandoer, da de blev afviklet på min maskine:

```
> ~ git fetch upstream
remote: Counting objects: 9, done.
remote: Total 9 (delta 5), reused 5 (delta 5), pack-reused 4
Unpacking objects: 100% (9/9), done.
From https://github.com/johno/pixyll
 * [new branch]      gh-pages   -> upstream/gh-pages
 * [new branch]      less-distracting-link-styling -> upstream/less-distracting-link-styling
 * [new branch]      master     -> upstream/master
 * [new branch]      remove-unnecessary-post-wrapper-for-page-layout -> upstream/remove-unnecessary-post-wrapper-for-page-layout

 > ~ git checkout master
Already on 'master'
Your branch is up to date with 'origin/master'.

 > ~ git merge upstream/master
Merge made by the 'recursive' strategy.
 LICENSE.txt        | 5 ++++-
 _sass/_tables.scss | 2 +-
 2 files changed, 5 insertions(+), 2 deletions(-)

 > ~ git push
Counting objects: 12, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (12/12), 2.88 KiB | 2.88 MiB/s, done.
Total 12 (delta 7), reused 0 (delta 0)
remote: Resolving deltas: 100% (7/7), completed with 6 local objects.
To https://github.com/exetico/exetico.github.io
```

Opleves du problemer med konflikter, kan du ofte løse det ved hjælp af disse kommandoer, kørt en efter en - men pas nu på. Du skulle nødigt komme til at overskrive noget vigtigt, eller tilsvarende.

```
git add .
git commit -m "Conflicts fix"
git checkout master
git push
```

God fornøjelse.


# OpenSSH daemon konfiguration (sshd config) - Hurtig forbindelse m. ssh

Således forbinder du hurtigt og nemt din ssh-klient, ved at lave en sshd-konfiguration.

## Indledning

Flere kender nok til problemstillingen, hvor man vil logge på en enhed via `ssh`. Desværre har man glemt ip-adresse, domæne, port - eller måske endda adgangskoden. I f.eks. Debian og Linux Mint (Ubuntu) er det dog muligt at lave din egen konfiguration, hvor du kan angive `Hostname`, `User`, `Port` og f.eks. `IdentityFile`.

Følgende kan naturligvis også bruges, hvis man blot har en intension om at spare tid. Der er rigtig mange muligheder, hvis du har lyst til at kigge i den [officielle dokumentation](https://linux.die.net/man/5/ssh_config).

## Konfiguration i .ssh/config

I filen \`\~/.ssh/config/ kan du tilføje forbindelser, som du ønsker at forbinde til, lidt hurtigere end normalt.

Strukturen i filen er ret simpel, og en enkelt ting kunne være:

```
Host minserver 10.0.0.10
        HostName 10.0.0.10
        User exetico
```

Overstående gør det muligt at forbinde ved blot at skrive `ssh docker`, fremfor at skulle skrive `ssh myusername@10.0.0.5`. Allerede der har man sparet et par anslag - og man slipper for at huske adressen.

Nedenfor vil jeg gennemgå de enkelte muligheder.

| Enhed        | Beskrivelse                                                                                                                                                                            | F.eks.                          |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- |
| Host         | Benyttes som "navn" til din enhed. Det er også muligt angive flere, hvis man f.eks. både vil kunne logge på m. et custom-navn, og f.eks. ip-adressen (som reelt blot er et eksra navn) | minserver                       |
| HostName     | Her defineres host, som f.eks. IP-adresse, domæne eller et kendt lokalt hostname                                                                                                       | 10.0.0.10                       |
| User         | Brugernavnet du vil forbinde med                                                                                                                                                       | exetico                         |
| Port         | Her kan port angives, hvis den ikke er default (22)                                                                                                                                    | 2222                            |
| IdentityFile | Her kan angives en key, hvis denne ikke blot er `id_rsa` (eller anden *default*-værdi                                                                                                  | \~/.ssh/id\_rsa\_ejdefaultvalue |
| LocalForward | Tillader dig at forwarde en port fra serveren - f.eks. port :80 fra serverem til port :8080 hvor du forbinder fra (klienten)                                                           | 8080 127.0.0.1:80               |

Hvis jeg f.eks. vil forbinde til `10.0.0.10` med brugeren `exetico` på port `2222` ved at skrive `ssh minserver`, skal filen opstilles således:

```
Host minserver 10.0.0.10
        HostName 10.0.0.10
        User exetico
        Port 2222
```

Hvis jeg samtidig ønsker f.eks. at lave en *LocalForward* fra port :8888, til port :8080 på min maskine, jeg forsøger at forbinde fra, kan det gøres således:

```
Host minserver 10.0.0.10
        HostName 10.0.0.10
        User exetico
        Port 2222
        LocalForward 8080 127.0.0.1:8888
```

Når jeg da har forbundet med `ssh minserver` vil kunne gå til `http://localhost:8080` (el. <http://127.0.0.1:8080>) via min klients webbrowser.

Du kan med fordel oprette en tunnel-forbindelse på denne måde, ved at forbinde med `ssh -f -N minserver`.

`-f` betyder at SSH-sessionen oprettes i baggrunden. `-N` betyder at der ikke bliver eksekveret kode på fjern-enheden.

**OBS**: Bemærk venligst at det kræver root-adgang, hvis man vil sende data til f.eks. port 80, da denne ses som en priviligeret port.

## Slip for at taste adgangskode, med ssh-copy-id

Du kan slippe for at indtaste din adgangskode, ved i stedet at forbinde med en nøgle. På dansk oversættes den bekendte løsning som "autorisering med offentlig nøgle", men du kan bl.a. læse meget mere om dette [lige her, ved SSH.com](https://www.ssh.com/ssh/public-key-authentication).

Du kan forbinde med en privat, eller en offentlig nøgle. Førstnævnte er beskyttet med en adgangskode.

### Lav en ny SSH nøgle

Først skal du lave en ny nøgle, som efterfølgende kan blive sendt til serveren.

Dette gøres ganske simpelt med `ssh-keygen`. Følg de enkelte steps.

Først angives et navn, inkl. evt. sti på hvor nøglen skal gemmes. Herefter indtaster du en ønsket kode, hvis nøglen skal være krypteret - alternativt under du dettee, men da vil sikkerheden være markant ringere, i og med at alle med nøglen, vil kunne logge på din server. Din adgangskode skal være på minimum 5 cifre.

```
ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/exetico/.ssh/id_rsa): min_noegle
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in min_noegle.
Your public key has been saved in min_noegle.pub.
The key fingerprint is:
SHA256:yCqTWTLb9DDDDE4GaHGgVD7+DdDD7Gt4t2eODFKEcFD exetico@linuxmint
The key's randomart image is:
+---[RSA 2048]----+
| .o.o... o       |
| . +    = o      |
|  o =  . =       |
| ..---------     |
|  ++*od S.       |
| . @f=. .        |
|. X go+. .       |
| o + +*o...      |
|    o=.....      |
+----[SHA256]-----+
```

Alt efter hvor du har gemt din key, og hvad den er blevet kaldt, kan du nu sende denne til serveren. I nedenstående eksempel har vi døbt denne `min_noegle`

Dette gøres med: `ssh-copy-id -i ~/.ssh/min_noegle exetico@10.0.0.10` Du kan med fordel også bruge oplysningerne fra din config-fil, hvis du allerede har sat den op: `ssh-copy-id -i ~/.ssh/min_noegle minserver`

Hvis du har lavet en kopi af din nøgle og flytter denne til en anden klient, efter du har flyttet nøglen til din server, vil du her kunne gøre brug af *IdentityFile* ved at angive den fulde sti til filen, på den pågældende klient, som f.eks. `IdentityFile ~/.ssh/min_noegle minserver`.

**OBS**: For at kunne bruge nøgler, skal du sikre at dine permissions er korrekte. Mapping skal være `700`, din public-key være `644`, mens din private-key helst skal være `600`. Det er lidt smag og behag med de sidste to. Har du problemer må du gerne stille spørgsmål i kommentar-sporet. Måske vil jeg gennemgå rettigheder en anden dag.

Du kan med fordel f.eks. læse mere [her](https://nerderati.com/2011/03/17/simplify-your-life-with-an-ssh-config-file/), hvis du skulle have lyst til at høre om flere tips. Har du fået blod på tanken, kan du evt. tage et kig på den [officielle dokumentation](https://linux.die.net/man/5/ssh_config), hvor der er mange flere tips, muligheder - og forklaring.


# Opret forbindelse til iSCSI target på f.eks. Linux Mint

Opret forbindelse til et iSCSI target, som f.eks. er hostet på en dedikeret server, eller en Synology NAS.

## Indledning

[iSCSI](https://da.wikipedia.org/wiki/ISCSI) bliver stadig mere populært, som tiden går. Mange private vil dog nok ikke se behovet for en sådanne løsning, medmindre de finder en guide som taler for et iSCSI target, fremfor f.eks. en delt mappe via en af de mange protokoller, som f.eks. NFS, SMB, CIFS Webdav - og hvad der ellers findes.

Jeg har personligt oprettet en volume med target på min Synology NAS. Dette er tildels gjort fordi jeg har mindre SSD'er i mine maskiner, uden ekstra plads på andre diske - og dels fordi jeg så har en backup på en anden enhed. I Linux Mint anbefales timeshift, hvilket bl.a nævnes i [instruktionerne ved opgradering til Linux Mint 19](https://community.linuxmint.com/tutorial/view/2416). Med Timeshift laver jeg backup en gang om ugen, til mit iSCSI target.

**OBS**: I denne guide kommer jeg kun forbi hvordan man opsætter tingene på klient-siden. Det betyder i praksis at du selv skal finde ud af hvordan du opretter en volume samt target på server-siden.

## Open-iSCSI installation og anvendelse

Den nemmeste måde at komme i gang, er ved at bruge Open-iSCSI. Jeg benytter selv dette, fordi det kun kræver et par enklete klik, før man er klar "til brug".

Først skal softwaren installeres (`-y` betyder at installationen ikke skal bekræftes - den startes i stedet automatisk).

```
sudo apt install -y open-iscsi
```

Når Open-iSCSI er installeret, kan man scanne efter targets. Det gøres med nedenstående kommando. Sidstnævnte er IP-adressen til min Synology NAS.

Scan for targets: `sudo iscsiadm -m discovery -t st -p 10.0.0.10`

Output:

```
exetico@linuxmint ~ $ sudo iscsiadm -m discovery -t st -p 10.0.0.10
10.0.0.10:3999,1 iqn.1337-69.NasName.Target-11.91******b
[fe**::**1:3**f:**4*:1**9]:3999,1 iqn.1337-69.NasName.Target-11.91******b
10.0.0.10:3999,1 iqn.1337-69.NasName.Target-OSX.91******b
[fe**::**1:3**f:**4*:1**9]:3999,1 iqn.1337-69.NasName.Target-OSX.91******b
10.0.0.10:3999,1 iqn.1337-69.NasName.Target-1.91******b
[fe**::**1:3**f:**4*:1**9]:3999,1 iqn.1337-69.NasName.Target-1.91******b
10.0.0.10:3999,1 iqn.1337-69.NasName.Target-12.91******b
[fe**::**1:3**f:**4*:1**9]:3999,1 iqn.1337-69.NasName.Target-12.91******b
10.0.0.10:3999,1 iqn.1337-69.NasName.Target-13.91******b
[fe**::**1:3**f:**4*:1**9]:3999,1 iqn.1337-69.NasName.Target-13.91******b
```

*Bemærk venligst at flere værdier er ændret.*

I overstående output findes flere forskellige targets, så herfra skal vi blot vælge det ønskede. Forbindelsen oprettes med følgende kommando (*i en linje*)

```
sudo iscsiadm -m node --targetname iqn.1337-69.NasName.Target-13.91******b -p 10.0.0.10 -l
```

Når kommandoen er afviklet, kan du f.eks. tjekke `/proc/partitions`, for at se om den nye volume er dukker op. Dette søges med: `cat /proc/partitions`

Output:

```
exetico@linuxmint ~ $ cat /proc/partitions 
major minor  #blocks  name

   7        0      88964 loop0
   7        1      88980 loop1
   7        2      88684 loop2
  11        0    1048575 sr0
   8        0  250059096 sda
   8        1     460800 sda1
   8        2     101376 sda2
   8        3      16384 sda3
   8        4  124739584 sda4
   8        5  108745728 sda5
   8        6   15993856 sda6
   8       16  125829120 sdb
```

I dette tilfælde er min volume `sdb`, hvilket nu skal have bestemt et filsystem, før det kan gøre nogen nytte. Der findes, alt efter ens linux distribution, utallige måder at gøre dette på. Linux Mint kommer med bl.a. værktøjet `Disks` (det engelske navn på applikationen). Selv benytter jeg dog GParted, fordi det som oftest blot går mere flydende - og så slipper man får at rode rundt i forskellige kommandoer og random fejl. Nogle filsystemer er mere flyvske end andre, på Unix-platforme.

## Opsætning af en partition til vores data (filsystem)

GParted installeres med følgende linje - og startes herefter: `sudo apt install gparted && sudo gparted`

Nu skal du selv tage de næste steps i programmet - for der er ingen guide til denne del. Du vælger blot hvilket filsystem du har tænkt dig, og trykker hefter `Apply`, i grove træk.

Nu er det tid til at lave en mount-lokation, hvilket jeg selv gør i `/media/exetico` hvor Linux Mint selv er glad for at mappe ens enheder. `sudo mkdir /media/exetico/backup"`

Inden vi mounter vores nye partiton, formateret som `ext4`, kan vi lige tjekke om den er blevet oprettet - og kan vælges. Dette gøres igen med `cat /proc/partitions`.

Output:

```
exetico@linuxmint ~ $ cat /proc/partitions 
major minor  #blocks  name

   8       16  125829120 sdb
   8       17  125828096 sdb1
```

*I overstående tilfælde har jeg fjernet alt undtagen linjerne med `sdb`.*

Vi ved nu at partitionen findes på `sdb1`, og samtidig at vi gerne vil mounte til mappen `/media/exetico/backup/`. Derfor kan vi nu mounte partitionen, med følgende kommando:

```
sudo mount /dev/sdb1 /media/exetico/backup/
```

Herefter kan den nye partition tages i brug. Hvis man vil være sikker på at alt er som det skal være, kan man forsøge at skrive en fil til enheden, men jeg plejer som ofte blot at benytte `df -h`, for at se om enheden optræder. `-h` står i dette tilfælde for at der bliver vist "humane" værdier, fremfor at værdien står i 1K-blocks. Det er noget nemmere at forholde sig G og M, fremfor rå værdier.

## Beskyttelse med CHAP

Ønsker du evt. at bruge password-beskyttelse, skal du have gang i CHAP-auth. I iscsid.conf skal vi nu have ændret et par ting: `sudo nano /etc/iscsi/iscsid.conf`

Samtidig sikre vi at vores iSCSI løsning starter sammen med systemet.

1. Find `node.startup = manual` og ændre dette til `node.startup = automatic`
2. Tilføj brugernacn og kodeord. Bemærk at der er flere valgmuligheder, men hvis du fx. benytter Synology's CHAP-løsning, skal du kun udfylde felterne: `node.session.auth.username` and `node.session.auth.password`. (Se screenshot nederst)
3. Fjern `#` fra linjen med `node.session.auth.authmethod = CHAP`

   ![Example from iscsid.conf](https://i.imgur.com/aQnpULv.png)

Nu genstartes servicen med: `service iscsi restart && service iscsid restart`

Find nu dit iSCSI target med Discovry-løsningen. Har du fejlagtigt udfyldt brugernavn og password ved `discovery`-punktet i iscsid.conf, vil dette nok fejle. `sudo iscsiadm --mode discoverydb --type sendtargets --portal 10.0.0.10 --discover` Hvor `10.0.0.10` er IP-adressen til dit iSCSI host.

Log nu på med: `sudo iscsiadm --mode node --targetname iqn.1337-69.NasName.Target-13.91******b --portal 10.0.0.10:3260 --login`


# Lad os bruge less +F, til at se filændringer

Tail-f er en dårlig vane som kun er opstået, fordi internettet siger "brug det". Less er langt bedre, så længe du kun vil følge ændringer i en enkelt fil.

### Indledning

Hvis du er en af dem der tit arbejder med applikationer hvor log-output er vigtigt, så kender du også til behovet for at se sidste nye ændringer i en given fil. Søger man på internettet, vil utallige anbefale `tail -f`, og det virker nu også - men det er en bedre måde at gøre det på.

### Farvel til tail -f

Der er et bedre alternativ til `tail -f`, og det er `less +F`. Fordelen ved less er en blanding af logik og muligheder. Kommandoen følger ændringer, men du har samtidig mulighed for at scrolle i filen. Samtidig har du mulighed for f.eks. at søge i filen.

Havde man brugt tail, var man endt i en situation hvor man desværre skulle åbne nano eller vim, for igen at benytte tail for at have sidste nye med.

Når du benytter Less, skal du blot angive filnavnet, som du ville have gjort med tail-f, ala: `less +F filenjegvilkiggemedi.log`

### Hvordan lukker jeg tail?

Less er en basic viewer, som blot har endnu en lækker funktion vi kan benytte os af, selvom vi måske ikke benytter less normalt.

Det kræver kun to steps at lukke less igen: 1. `Ctrl + C` 2. `:` efterfulgt af `q`

Programmet lukker herefter sig selv.

### Er der så ulemper?

Både ja og nej. `less +F` er ikke helt så god til at vise data for flere filer, på en gang.

Så hvis du skal overvåge flere filer på en enkelt gang, ja så vinder `tail -f *.txt` fortsat.

Har du feedback til denne artikel, så vil jeg meget gerne høre fra dig. Du kan som altid kontake mig ved at benytte \[kontakt(<https://exeti.co/contact/)-linket>. Alternativt så benyt glædeligt kommentarsporet, som findes nedenfor.


# Monter USB-devices til statiske navne, fremfor fx. ttyUSB1, ttyACM0 eller lign.

Opret et tilpasset USB-enhedsnavn, så du kan bruge f.eks. /dev/magiskenhed, fremfor /dev/ttyACM1.Rent teknisk kalder vi det, at lave et symlink til enheden.

## Indledning

Selvom vi nok alle sammen har forskellige argumenter, så er det altid rart at have styr på enhederne i `/dev` hvis de skal styre kritiske ting i ens hjem.\
\
For mit vedkommende benytter jeg begge i forbindelse med Home Automation-systemer, og her er det noget værre rod, hvis der pludselig bytte om på fx. `ttyACM1` og `ttyACM0`, fordi jeg har tildelt den pågældende enhed til en given container. På den måde virker mine knapper pludselig ikke, der er intet lys - og meget andet driller. Overstående er testet på Debian 8 - tjek din version med `cat /etc/issue`.

Ved at følge denne guide,  kan du sikre, at dine enheder får et valgfrit navn under `/dev` . I denne guide arbejder vi på, at få enheden til, altid at blive genkendt som `cc2531sniffer` , så den fremover kan benyttes som `/dev/cc2531sniffer`.

Dennne guide er lavet til Debian, men kan med al sandsynelighed benyttes på andre enheder.

## dmesg

dmesg kan bruges til at se mange forskellige aktiviteter hvad angår bl.a. devices, men særligt til USB er det fremragende.

Brug følgende kommando til at lave et udtræk af de sidste aktiviter, og skriv ttyACM eller ttyUSB alt efter behov: `dmesg | grep ttyACM`

{% hint style="info" %}
**OBS** Bemærk at der måske er  flere linjer med f.eks. `ttyACM0` og`ttyACM1`. Hver gang du kobler en enhed fra, og til igen, kan du opleve, at de har fået tildelt et nyt dynamisk navn. Der er **derfor**, at vi gerne vil oprette et tilpasset navn (*symlink*) til vores enhed. Du skal derfor sikre dig, at du bruger det sidste nye ttyACM eller ttyUSB-navn, i outputtet fra dmesg. Lad dig **ikke** forvirre af, at den samme enhed måske tidligere, har fået navnet ttyACM0, men nu ttyACM1.
{% endhint %}

## udevadm

Nu skal vi finde nogle unikke værdier som vi kan bruge til at matche op med USB-enheden en anden gang. \
\
I mit dmesg-resultet, kan jeg finde en del enheder, men den nyeste er `ttyACM1` . Nedenfor er et eksempel af, hvordan denne linje ser ud:\
`[142237.601540] cdc_acm 2-2.2:1.0: ttyACM1: USB ACM device` \
\
Nu kan vi altså benytte udevadm, til at få flere oplysninger om denne enhed: `udevadm info --name=/dev/ttyACM1 --attribute-walk`.

*Bemærk `ttyACM1` skal udskiftes, alt efter hvad din enhed har fået tildelt af navn.*

Nedenfor kan du se et udklip af resultatet. Bemærk at der vil være flere enheder, som "forældre-enhed" til din USB-enhed. Her bliver du nødt til at benytte din mavefornemmelse, og dernæst benytte dig af beskrivelsen af enheden. Der findes muligvis en bedre metode hvad dette angør, men det kommer jeg ikke til at afdække i denne guide.

```
> udevadm info --name=/dev/ttyACM1 --attribute-walk

...

    looking at parent device '/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-2/2-2.2':
    KERNELS=="2-2.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="2.2"
    ATTRS{idVendor}=="0451"
    ATTRS{speed}=="12"
    ATTRS{bNumInterfaces}==" 2"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="32"
    ATTRS{busnum}=="2"
    ATTRS{devnum}=="5"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="50mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="80"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="0"
    ATTRS{bcdDevice}=="0009"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{serial}=="__0X00124B0018ED38F8"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="199202"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Texas Instruments"
    ATTRS{removable}=="unknown"
    ATTRS{idProduct}=="16a8"
    ATTRS{bDeviceClass}=="02"
    ATTRS{product}=="TI CC2531 USB CDC"
    
...
```

Med et output som overstående, skal vi nu vælge to-tre ting, som gør denne enhed unik. Selv har jeg valgt `idVendor` og `idProduct`værdierne:

* `ATTRS{idVendor}=="0451"`
* `ATTRS{idProduct}=="16a8"`

## rules.d

Nu skal vi have oprette vores regel. Dette er ret ligetil.\
\
Benyt følgende kommando til at åbne filen: `sudo nano /etc/udev/rules.d/99-usb-serial.rules`

I filen indsætter vi nu vores regel, som indeholder både idVendor og idProduct.

```
SUBSYSTEM=="tty", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="16a8", SYMLINK+="cc2531sniffer"
```

Jeg har valgt at kalde min enhede for  `cc2531sniffer` , hvorfor denne er angivet som `SYMLINK+="cc2531sniffer"` . Du kan naturligvis kalde din enhed noget andet, men jeg vil anbefale at du undgår specialtegn.

Gem nu filen (med `Ctrl+X` > `Y`i Nano), og indlæs nu din nye regel med:\
`sudo udevadm trigger`

Tjek herefter om det har virket tilstrækkeligt med følgende kommando:\
&#x20;`ls -l /dev/ | grep 'cc2531'` \
\
Med denne ls-kommando, får du listet alle enheder under `/dev/`, og dernæst bruger du `grep` kommandoen til kun at finde linjer hvor "cc2531" fremgår, hvilket var en del af mit tilpassede enhedsnavn. Du skal altså søge efter noget andet, hvis du vælger et andet navn til din enhed.\
Du kan alternativt blot fjerne filteret, ved blot at fjerne alt fra og med `|` , såfremt du ikke ønsker dette.

Som det ses nedenfor, er min enhed nu blevet oprettet med et symlink til cc2531sniffer. Fremover vil enheden altså altid kunne blive genkendt som `/dev/cc2531sniffer`.

```
> ls -l /dev/ | grep 'cc2531'

lrwxrwxrwx 1 root root           7 Feb 14 18:18 cc2531sniffer -> ttyACM2
```

Du kan, såfremt du tænker at det er nødvendigt, benytte udevadm igen, til at se, om dit symlink virker efter hensigten - og dernæst, kan du indhente endnu flere oplysninger fra enheden - hvor vi samtidig tager det nye symlink i brug: `udevadm test -a -p $(udevadm info -q path -n /dev/cc2531sniffer)`

Laver du rod i noget, så prøv at køre `sudo udevadm control --reload-rules` efterfulgt af `sudo udevadm trigger` , og hvis det intet hjælper, så genstart din maskine.

## Understøttelse af flere forskellige enheder

Mens det måske *nok* er muligt at samle det hele i en enkelt fil, så kan jeg godt lide at holde denne form for regler opdelt.

Derfor har jeg oprettet regler, til hver enkelt USB-enhed, hvor jeg har et behov for altid at kende navnet. Med mine tilpassede enhedsnavne, har jeg nu altid styr på enhederne. Mine symlinks gør nemlig, at jeg altid ved, hvad min Z-Wave enhed, samt min C2531 grapper, har fået af navn. Dette er særligt nyttigt, hvis man genstarter ens maskine. Systemet kan nemlig finde på at give min Z-Wave enhed ttyACM0, og C2531 grapperen ttyACM01, og efter en kold genstart, kan det være byttet om.

*Nedenfor fremgår det, at jeg har oprettet en regel, til hver enkelt enhed.*

```
> ls /etc/udev/rules.d/99-usb-serial* -al

-rw-r--r-- 1 root root 94 Feb 14 18:27 /etc/udev/rules.d/99-usb-serial-c2531.rules
-rw-r--r-- 1 root root 86 Feb 14 18:27 /etc/udev/rules.d/99-usb-serial-zwave.rules
```

Rigtig god fornøjelse. Har du eventuelle spørgsmål, så se mere på "Velkommen" siden.

*Oprindeligt blev jeg inspireret af et indlæg af* [*RolfBly på unix.stackexchange.com*](https://unix.stackexchange.com/a/183492/215506)*.*


# Monter NFS-shares i Linux Mint

Sådan mounter (monteres) et NFS-share til Linux Mint både manuelt og automatisk. Guiden burde også virke på andre destros, som fx. Ubuntu.

## Indledning

Jeg har selv et par NFS-shares som jeg benytter ganske ofte. Derfor har jeg enkelte NFS-shares som automatisk bliver monteret, såfremt jeg forsøger at tilgå mit NFS-share.

Her gennemgår jeg derfor kort, hvordan dette sættes op i Linux Mint. Sidst vil jeg kort nævne, hvordan du manuelt kan montere et NFS-share.

## Automatisk montering med autofs

Linux Mint mangler nogle nødvendige redskaber, før man kan montere NFS-shares. Pakken "nfs-common" skal derfor installeres først. I samme ombæring tilføjer vi "auto-fs" som vi senere skal bruge, så vores NFS-share kan blive monteret automatisk når dette åbnes.

`sudo apt-get install nfs-common autofs`

Herefter skal vi have defineret, hvor vores NFS-shares skal monteres fremover, ved automatisk montering. Dette gøres i filen `auto.master`. Bemærk at du **ikke** skal afslutte adressen med en skråstreg `/`.

`sudo nano /etc/auto.master`

*Tilføj*

```
/media/{brugernavn}/nfs  /etc/auto.nfs --timeout=30 --ghost
```

Og i `auto.nfs` tilføjer vi vores NFS-share. Først skriver vi det ønskede navn, herefter typen af vores filsystem, og til sidst, hvor vores NFS-share behinder sig, i opbygningen IP-adresse://sti/til/indholdet.

`sudo nano /etc/auto.nfs`

*Tilføj*

```
MitNFSshareDokumenter   -fstype=nfs4,rw   10.0.0.2:/volume1/Dokumenter
```

Når du har tilføjet overstående, skal autofs blot genstartes. Dette gøres med:

`sudo systemctl restart autofs.service`

Herefter burde din mappe være at finde under den ønskede sti. Monteringen sker automatisk, når du forsøger at tilgå mappen. Tjek evt. med noget ala.:

`ls -al /media/{brugernavn}/nfs/MitNFSshareDokumenter`.

Oplever du problemer med monteringen, kan det skyldes at du ikke har fået tildelt klienten de nødvendige rettigheder til at tilgå dit NFS-share.

## Manuel montering (mount)

Det er ganske simpelt at lave en manuel montering, efter `nfs-common` er blevet installeret (`sudo apt install nfs-common`). Det gøres helt somlet med to kommandoer. Den første benyttes til at oprette den mappe, som vi vil montere vores NFS-share til, og dernæst kommandoen som laver monteringen.

```
sudo /media/{brugernavn}/MitNFSshareDokumenter
sudo mount -t nfs {IP}:/volume1/Dokumenter /media/{brugernavn}/MitNFSshareDokumenter
```

Hvis man senere ønsker at opbryde monteringen, kan det gøres med

`sudo umount /media/{brugernavn}/MitNFSshareDokumenter`.

Rigtig god fornøjelse med dine NFS-shares. Har du spørgsmål, er du mere end velkommen til at stille dem nedenfor.

*Credits til* [*blog.tinned-software.net*](https://blog.tinned-software.net/linux-mint-mount-an-nfs-share-automatically/)*.*


# Virtuelle maskiner med KVM og Virt-manager

Med KVM og Virt-manager kan du afvikle virtuelle maskiner på fx. Linux Mint 19 og Ubuntu.

## Indledning

Jeg formoder at vi alle har lidt forskellige behov for, at afvikle en virtuel maskine. I mit tilfælde har jeg indimellem et behov for adgangen til Microsoft Excel på farten, selvom jeg kun har min Linux-maskine med. Personligt har jeg dårlig erfaring med Wine, når det kommer til Microsoft Office-pakke, efter de flyttede til "skyen", så jeg benytter i stedet en virtuel maskine med Windows 7.

Inden vi går i gang med opsætningen af [KVM](https://www.linux-kvm.org/page/Main_Page) (Kernel Virtual Machine) og [Virt-Manager](https://virt-manager.org/), skal vi lige undersøge om din processor er klar til hardware virtualisering.

Din processor omtales som CPU i resten af denne how-to.

## VMX eller SVM? (Hardware virtualiserings tjek)

I `/proc/cpuinfo` kan du se om din CPU understøtter hardware virtualisering. Det er nemmest at kigge under `flags:`. Understøttes hardware virtualisering, vil der stå `svm` (Secure Virtual Machine) hvis du har en AMD-CPU, eller `vmx` (Virtual Machine Extensions) hvis du har en Intel-CPU.

Du kan hurtigt farve vmx eller svm med følgende kommando: `grep --color -E 'vmx|svm' /proc/cpuinfo`

![Output med VMX - Intel CPUI](https://i.imgur.com/WeL21B9.png)

Finder du hverken vmx eller svm-udtrykket, kan det skyldes at du endnu ikke har aktiveret *Hardware Virtulization* i BIOS. Opbygningen af menu-strukturen i BIOS er meget forskelligt, alt efter hvad der kommer med din computer. Jeg underlader derfor at guide yderligere herom, men du kan evt. læse mere [her](https://www.wikihow.tech/Enable-Hardware-Virtualization). Normalt tilgås BIOS ved klik på F2, ESC eller Delete under opstart af maskinen.

*Da vi nu ved at maskinen understøtter VT-x, kan vi fortsætte til næste step.*

## Installer KVM og Virt-manager

Vi er nu klar til at påbegynde installationen af henholdsvis KVM, Virt-Manager og andre påkrævede pakker. KVM styres via kommandoer i din terminal, men med Virt-Manager får du et grafisk interface der gør det hele lidt nemmere at gå til.

```
sudo apt install qemu-kvm libvirt-bin bridge-utils virt-manager ebtables dnsmasq qemu-utils gir1.2-spiceclientgtk-3.0
```

*ebtables* og *dnsmasq* benyttes til netværks-relaterede ting. *qemu-utils* indeholder bl.a. værktøjet *qemu-img* som skal benyttes, hvis man ønsker at lave non-raw file images. Jeg anbefaler selv at man laver raw-storage volumes, da disse har bedre performance, dog færre features. For at kunne vise grafisk output fra vores VM, skal *gir1.2-spiceclientgtk-3.0* installeres.

Herefter skal vi sikre at du har de tilstrækkelige rettigheder.

Brug først `sudo virsh -c qemu:///system list` til at tjekke, om virsh virker. Hvis dette virker, så fortsæt *uden* sudo for at tjekke om din bruger har rettigheder hertil.

![virsh med og uden sudo](https://i.imgur.com/jhStNx0.png)

Som udgangspunkt vil kommandoen fejle *uden* sudo. Løsningen er dog ganske ligetil, da vi hurtigt kan oprette en gruppe, og herefter tilføje vores bruger hertil. Normalt findes gruppen i forvejen, men hvis alle tre kommandoer afvikles, er du på den sikre side, hvis du efterfølgende vil rode mere med libvertd og kvm.

```
sudo addgroup libvirtd
sudo adduser {brugernavn} libvirtd
sudo adduser {brugernavn} kvm
```

Herefter skal du **genstarte** din computer.

## Virtual Machine Manager

Når KVM og Virt-manager er installleret og vi har rettigheder hertil, så skal du blot have oprettet din nye virtuelle maskine.

Første gang kan det være lidt rodet, hvis man kommer fra fx. [Oracle Virtual Box](https://www.virtualbox.org/), men det kræver blot lidt tilvænning.

Du er velkommen til at stille spørgsmål nedenfor, og så skal jeg nok forsøge at lave opdateringer til guiden, om nødvendigt. Du kan dog finde step-by-step guide til resten ved [howtogeek](https://www.howtogeek.com/117635/how-to-install-kvm-and-create-virtual-machines-on-ubuntu/). Dernæst findes endnu en guide på [dennisnotes.com](https://dennisnotes.com/note/20180614-ubuntu-18.04-qemu-setup/) hvor der også bliver nævnt væsentlige ting i forbindelse med opsætningen. Fx. raw-volume, fremfor non-raw. Caching metoder, valg af ISO-image, og opsætningen af det virtuelle netværksinterface (NIC).

### Første start og andre tips

#### Fejlbeskeder

I modsætningen til fx. VirtualBox, skal du indimellem arbejde lidt mere for at få tingene til at køre som smurt. Der kan forekomme fx. manglende biblioteker mm. Læs derfor altid fejlbeskederne når de forekommer. Du er velkommen til at spørge her, om nødvendigt.

#### Fanget cursor (mus)

Hvis du får "kabret" din cursor i en virtuel maskine, skal du blot bruge din venste `Ctrl` og `Alt` for at slippe cursoren fri fra din virtuelle maskine.

#### Manglende boot-device

Når du starter din VM første gang, skal du huske at have tildelt en .ISO fil til et diskdrev, og **dernæst også** at have ændret boot-order, så maskinen starter via dette drev. ![Boot Options i Virt-manager Virtual Machine Manager](https://i.imgur.com/RatSGUx.png)

#### Manglende drev ved Windows-installation

Benytter du guiden fra [dennisnotes.com](https://dennisnotes.com/note/20180614-ubuntu-18.04-qemu-setup/), skal du være OBS på, at der skal indlæses drivers under installationen af Windows - ellers kan drevet ikke findes. ![viostor.inf tilføjelse under installationen](https://i.imgur.com/cdaoVhW.png) ![Drivers indlæses](https://i.imgur.com/Hxub76M.png)

Find ISO-filen lige [her](https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso), og læs mere [her](https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/index.html).

#### Windows Gæste-drivers

Som med fx. VMWare og VirtualBox, findes der også gæste-drivers til Windows afviklet via KVM. Det kendes som *spice guest tool*, og kan findes [lige her](https://www.spice-space.org/download/binaries/spice-guest-tools/) - du kan hente nyeste version [her](https://www.spice-space.org/download/binaries/spice-guest-tools/spice-guest-tools-latest.exe).

Med gæste-driverne får du bedre understøttelse af grafik, copy/paste understørrelse, automatisk tilpasning af opløsing og en del andet. Se evt. mere [her](https://www.spice-space.org/download.html) under *Windows binaries*.

**OBS**: Med virtio-drivers og andet nævnt i *Manglende drev ved Windows-installation*, er du nødsaget til at hente en .ISO-fil med flere drivers på. På denne findes også *guest-agent* som du med fordel kan installere. Dernæst findes bl.a. mappen *NetKVM* hvor netværksdrivers findes. Derfor kan det være en fordel at hente dette image og mounte som disk nr. 2. ![Disk nr. 2 - IDE CDROM 2 i Virtual Machine Manager](https://i.imgur.com/ZvJkDGa.png) Du kan finde en glimrene guide til installation af driversne herfra på [redhat.com](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/virtualization_host_configuration_and_guest_installation_guide/form-virtualization_host_configuration_and_guest_installation_guide-para_virtualized_drivers-mounting_the_image_with_virt_manager).

![Billede af enheder uden drivers](https://i.imgur.com/QhUsWTo.png)

| Enhed                                | Driver fra image |
| ------------------------------------ | ---------------- |
| Ethernet Controller                  | NetKVM           |
| PCI Device                           | Balloon          |
| PCI Simple Communications Controller | vioserial        |

#### Ingen netværk

Med `virsh net-list --all` kan du se, om du har fået sat NAT-baseret netværk op som standard. Output skal være:

```
Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes
```

Har du ikke det, kan du læse mere [her](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/virtualization_host_configuration_and_guest_installation_guide/chap-virtualization_host_configuration_and_guest_installation_guide-network_configuration)

Du kan desuden angive virsh til at starte automatisk med dit system, med kommandoen `virsh net-autostart default`. Og hvis du vil angive det som standard, kan det gøres med `virsh net-start default`. Du skal dog sikre at netværket er afbrudt, når du afvikler denne kommando.

Når `libvirt`'s default netværk er kørende, vil du se et isoleret bro-netværk på din værts-maskine. Du kan se bro-interfaces med `brctl show`.

```
ridge name    bridge id            STP enabled        interfaces
virbr0        8000.52540067346d    yes            virbr0-nic
                                            vnet0
```

Hvis du stadig ikke har adgang til internettet via Internet Exporer, så forsøg at ping google.com via CMD. Lykkedes dette, så skal du forsøge med en anden browser. Kopier .exe-filen via et USB-stick, hvis du ikke har fået oprettet et netværk-share, eller alternativt så inkluder det i din .ISO-fil med drivers.

#### Hvor er min .xml-fil som der henvises til?

Konfigurationsfilen til din VM findes oftest under `/etc/libvirt/qemu/`. Det kunne fx. være `/etc/libvirt/qemu/windows7.xml`.

## Mulighederne med KVM

KVM kan rigtig mange ting, og i modsætning til andre løsninge, så er det stort set ingen begrænsninger. Selv har jeg kigget på fx. [Looking Glass](https://looking-glass.hostfission.com/) der tillader pass-through af et grafikkort, skærm, tastatur og mus. Du kan reelt slippe for dual-booting og fx. Wine. Bemærk dog at dette kræver at du har et andet grafikkort til rådighed, og at et dedikeret grafikkort i en bærbar, ikke nødvendigvis er nok. Disse kort er rent teknisk omtalt som *muxless/non-MXM Optimus kort*, og har ikke deres eget display output. Læs meget mere om det lige [her](https://github.com/jscinoz/optimus-vfio-docs). Hvis det har fanget din interesse og har du en bærbar hvor du alligevel vil forsøge dig frem, så kig forbi [dette issue på Github](https://github.com/jscinoz/optimus-vfio-docs/issues/2#issuecomment-453873173). En verden åbner sig for iOOMU, initramfs, vfio\_pci og meget andet.

God fornøjelse med opsætningen af KVM og Virt-manager. Jeg beklager at denne how-to er **ganske rodet**. Det skyldes at jeg undervejs har indsamlet en masse links samt erfaringer undervejs.

![Windows 7 installationen er i gang med QEMU/KVM Virtual Machine Manager](https://i.imgur.com/4R7nyw6.png)


# Tilføj Webcam til OctoPrint i DietPi

Sådan bruger du mjpg\_streamer, så du kan bruge dit (Logitech C310) webcam i OctoPrint

## Indledning

Jeg har en Ender 3 stående, som er koblet til en PC. Denne PC har pt. fået installeret DietPi, og med DietPi, har jeg installeret OctoPrint. Normalt har jeg førhen brugt en Raspberry Pi 3, men da den fik strømproblemer, skiftede jeg til en Intel NUC, med en smule flere kræfter. Jeg har dernæst koblet et Logitech C310 til NUC'en, så jeg kan følge mine prints.

Men for at OctoPrint kan følge med, skal man bruge fx. [mjpg-streamer](https://github.com/jacksonliam/mjpg-streamer/tree/master/mjpg-streamer-experimental), som laver et netværksstream, med billeder fra dit webcam.

Du kan finde en liste over testede webcams inkl. `camera_usb_options` på OctoPrint Wiki-siden [Webcams known to work](https://github.com/foosel/OctoPrint/wiki/Webcams-known-to-work). `camera_usb_options` kan være nyttige at kigge på, hvis du vil have optimeret kvaliteten, eller blot finde ud af, hvordan du får dit kamera til at virke med `mjpg-streamer`. Alt afhængig af hvad du ender ud med, skal du være OBS PÅ, at det kan have indflydelse på kvaliteten af dine 3D-prints, såfremt `mjpg-streamer` bruger for mange af dine CPU-kræfter. På nettet anbefaler de fleste, at man har mindst en Raspberry Pi 3 kørende, hvis man vil koble et webcam til.

Der findes desuden mange guides på nettet til selv samme, men her får du det på dansk. Vil du blot løbe igennem de enkelte kommandoer, kan du evt. kigge på [denne Wiki-side](https://github.com/cncjs/cncjs/wiki/Setup-Guide:-Raspberry-Pi-%7C-MJPEG-Streamer-Install-&-Setup-&-FFMpeg-Recording#ffmpeg-compile-install--setup).

## Hent og compile

Først skal du hente mjpg-streamer, og compile dette med make:

```
sudo apt install subversion libjpeg62-turbo-dev imagemagick ffmpeg libv4l-dev cmake
git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
export LD_LIBRARY_PATH=.
make
```

## Test

Inden vi tilføjer vores nye program til systemet, vil jeg anbefale dig at teste om dit webcam virker efter hensigten.

På [Webcams known to work-Wikisiden](https://github.com/foosel/OctoPrint/wiki/Webcams-known-to-work), kan du finde de anbefalede `camera_usb_options` til dit webcam.

I mit tilfælde vil jeg forsøge med: `camera_usb_options="-r VGA -f 10"`

Og herefter starter jeg programmet, hvor jeg har `$camera_usb_options`-variablen med i kommandoen:

`./mjpg_streamer -i "input_uvc.so $camera_usb_options" -o "output_http.so -w ./www"`

Du kan stoppe programmet ved at bruge genvejen `Ctrl` + `C` (*normalt kendt som `SIGINT`-signalet*), som bruges til at afbryde den nuværende eksekvering.

Herefter kan du tilgå dit stream via:

`http://{DietPi-IPAdresse}:8080/?action=stream`

### Permissions til /dev/video0

Har du permissions-problemer ala. dem som ses nedenfor, skal vi lige have rettet et par ting:

```
> ./mjpg_streamer -i "input_uvc.so $camera_usb_options" -o "output_http.so -w ./www"
MJPG Streamer Version: git rev: ---
 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 640 x 480
 i: Frames Per Second.: 10
 i: Format............: JPEG
 i: TV-Norm...........: DEFAULT
ERROR opening V4L interface: Permission denied
```

Det nemmeste du kan gøre, er at tilføje din bruger til `video`-gruppen på dit system, såfremt `/dev/video0` er ejet af `root:vdeo`, som det fremgår nedenfor:

```
> ls -alh /dev/video0
crw-rw---- 1 root video 81, 0 Feb 27 12:49 /dev/video0
```

#### Tilføj din bruger til `video`-gruppen.

Tilføj din bruger til `video`-gruppen, såfremt ejerskabet er tildelt `root:video`.

I dette eksempel kunne man forestille sig, at din bruger er `dietpi`. Kør derfor følgende kommando:

`sudo usermod -aG video dietpi`

Log nu **af din bruger**, og log på igen.

Nu burde du havde fået tildelt rettighederne til gruppen, og kan derfor køre kommandoen igen - **uden** brug af `sudo` foran.

#### Har du fortsat problemer? Prøv at lave en udev-regel

Hvis det ikke virker, blot at tilføje din bruger til `video`-gruppen, kan det tænkes at `/dev/video0` ikke har fået tildelt de ønskede rettigheder. Dette kan du rette op på, med en udev-regel.

Skift til din root-bruger med `sudo su`, og kør følgende:

`echo 'SUBSYSTEM=="video0", GROUP="video", MODE="0660"' > /etc/udev/rules.d/10-webcam.rules`

Genstart herefter med `sudo reboot`, og prøv igen, med din normale bruger.

### Installer (Flyt programmet) med make

Er du nået hertil, formoder jeg, at dit sciprt virker, og at du har fået rettet evt. permissions-problemer.

Mens du fortsat står i mappen: `~/mjpg-streamer/mjpg-streamer-experimental`, skal du blot installere programmet med:

`sudo make install`

Programmet bliver gemt som:

`/usr/local/bin/mjpg_streamer`, og kan køres som `mjpg_streamer`

Indholdet af `www`-mappen bliver gemt under stien `/usr/local/share/mjpg-streamer/www`, og sidst men ikke mindst bibliotekerne, som bliver gemt under `/usr/local/lib/mjpg-streamer`.

Test evt. om det virker med:

`mjpg_streamer -i "input_uvc.so" -o "output_http.so -w ./www"` *Bemærk at jeg her, har undladt at have `camera_usb_options` med*.

Nu kan du, såfremt du ønsker det, fjerne `mjpg_streamer`-mappen, som du har gemt i `~`.

### Auto-start

På [denne side](https://github.com/cncjs/cncjs/wiki/Setup-Guide:-Raspberry-Pi-%7C-MJPEG-Streamer-Install-&-Setup-&-FFMpeg-Recording) finder du et script, til at state programmet med, helt automatisk.

Er du doven, kan du hente et dump fra Pastebin med:

`curl -o mjpg-streamer.sh https://pastebin.com/raw/Qx8PDuhp`

Herefter åbner du scriptet:

`nano ~/mjpg-streamer.sh`

Hvis du har et behov for fx. flere frames, ændre kvaliteten, eller andet, gøres det i toppen af scriptet. Du kan også ændre fx. porten.

Virker dit webcam uden `-y` parameteret med mjpg\_streamer, skal du desuden huske at ændrer `YUV="yes"`til `YUV="no"cu`, da du ikke har et behov for at starte programmet med `-y`-flagget, som vil kræve ekstra kræfter af din Raspberry Pi.

Tillad at scriptet kan eksekveres:

`chmod +x /home/dietpi/mjpg-streamer.sh`

Jeg oplevede at der var enkelte karakterer (CR-karakterer), som skabte problemer, så jeg fjernede dem med:

`sed -i -e 's/\r$//' mjpg-streamer.sh`

Åben crontab for din bruger:

`crontab -e`

Tilføj linjen:

`@reboot /home/dietpi/mjpg-streamer.sh start`

Inden du genstarter, kan du evt. selv prøve sciptet med:

`./mjpg-streamer.sh start`

Nu kan du tilgå streamet via:

`{DietPi-IPAdresse}:8081/?action=stream`

God fornøjelse med opsætningen af dit webcam. Hvis du har anbefalinger eller tips og tricks, vil jeg meget gerne høre om dem. Se "Velkommen"-siden.


# Nulstil Philips Hue-pærer uden smart kontakt

Det er rent faktisk muligt at nulstille ens Philips Hue belysning ved brug af bro'ens API - det kræver dog naturligvis, at belysningen allerede er tilføjet til din bro.

## Indledning

Nulstilling af Philips Hue-lamper kan ske via Hue's API, hvis man ikke har en fjernbetjening fra dem eller fx. Ikea. Det er en smule mere omstændigt, men på den måde slipper du for at skulle købe ekstra udstyr for at udføre en nulstilling. Jeg mener selv at Philips burde have ændret proceduren så der kunne nulstilles v. flere gange tænd/sluk efter hinanden, som man fx. ser på Ikea's.

Nuvel, lad os så styr på et par detaljer.

*Denne guide er skrevet "on the go", mens jeg selv var i gang at nulstille en enhed. Der kan derfore optræde slåfejl undervejs. Tip mig meget gerne i kommentarsporet. Tak!*

## Detaljer

Følgende ting ønskes nulstillet (ID):

* 13
* 14
* 15
* 16

Disse kan findes via Hue App'en. Jeg benytter dog selv Hue Essentials.

Rent praktisk kan jeg oplyse at min Hue Bod/Bridge i skrivende stund har Softwareversion `1810251352`, den benytter ZigBee-kanal `15`, har API-udgave `1.28.0` og er model nr. `BSB002`.

I guiden benytte CLIP API Debugger som er hostet på Hue Bridgen selv. I praksis kunne du dog sagtens benytte `CURL` eller lign.

*For at skære en smule af længden, er username-værdien ændret til {USERNAME}.*

Synes du der mangler detaljer undervejs, kan jeg anbefale beskrivelserne som findes på [http://thingsthataresmart.wiki](http://thingsthataresmart.wiki/index.php?title=How_to_Reset_Philips_Hue_Bulbs) samt [huelights.com](http://huelights.com/faq.html#faq-touchlink-commands).

Tak fordi du har lyst til at læse med. Kom gerne med input og andre ønsker i kommentar-feltet.

Og, lige et sidste **PS**: Hvis du blot vil forsøge at koble din Philips Hue-lampe til fx. Ikea's bro, så kan det oftest blot gøres ved at du fjerner lampen fra din Hue Bro, og herefter tilføjer den til din Ikea bro. Her er det altså ikke nødvendigt at nulstille enheden.

**OBS:** Husk at ændre IP-adressen undervejs, hvor der står `10.0.0.108`.

## Step-by-step guide

1. Start med at finde den IP-adresse, din Hue Bro har fået tildelt. På [meethue.com/api/nupnp](https://www.meethue.com/api/nupnp) burde du kunne finde ip-adressen efter teksten `internalipaddress`. Teksten du kigger på, er datatypen man kalder for `JSON`. Normal starter ens IP-adresse med fx. `192.168.1.x`, `192.168.0.x` eller lign.

   Selv har min Hue Bro fået tildelt IP-adressen: `10.0.0.108`.
2. Gå til <http://10.0.0.108/debug/clip.html> *Husk at ændre IP-adressen til det, du har fundet frem til. Dette er sidste gang jeg nævner det!*
3. Indsæt værdierne som det er opsat nedenfor. BODY er `Message Body`, men vil fremover blive omtalt som `BODY`. URL: `http://10.0.0.108/api`

   BODY: `{"devicetype": "HueLights#API"}`
4. Tryk på knappen på din Hue Bro
5. Tryk på **POST**-knappen

![Eksempel inden tryk på post](https://i.imgur.com/uyumt3E.png)

*Respons som fremgår i Command Response:*

```javascript
[
    {
        "success": {
            "username": "{USERNAME}"
        }
    }
]
```

1. `username`-værdien skal nu benyttes. Indsæt værdierne som er nævnt nedenfor. Husk at udskifte username.

   URL: `http://10.0.0.108/api/{USERNAME}/lights`

   BODY: `{"devicetype": "HueLights#API"}`

   Tryk på **GET**, når du har ændret værdierne.

*Respons - Bemærk at alle lamper er fjernet fra responsen, med undtaglese af ID `15`:*

```javascript
{
    "15": {
        "state": {
            "on": false,
            "bri": 254,
            "ct": 366,
            "alert": "none",
            "colormode": "ct",
            "mode": "homeautomation",
            "reachable": true
        },
        "swupdate": {
            "state": "noupdates",
            "lastinstall": "2018-12-11T13:42:37"
        },
        "type": "Color temperature light",
        "name": "DoubleLivingroom1",
        "modelid": "LTW013",
        "manufacturername": "Philips",
        "productname": "Hue ambiance spot",
        "capabilities": {
            "certified": true,
            "control": {
                "mindimlevel": 1000,
                "maxlumen": 250,
                "ct": {
                    "min": 153,
                    "max": 454
                }
            },
            "streaming": {
                "renderer": false,
                "proxy": false
            }
        },
        "config": {
            "archetype": "spotbulb",
            "function": "functional",
            "direction": "downwards",
            "startup": {
                "mode": "safety",
                "configured": true
            }
        },
        "uniqueid": "00:17:88:01:04:e8:21:96-0b",
        "swversion": "1.46.13_r26312",
        "swconfigid": "1742FA88",
        "productid": "Philips-LTW013-1-GU10CTv1"
    }
}
```

1. Inden du fortsætter, skal du sikre at dine pære er **tæt på din Hue Bro**!
2. Nu skal pæren med ID `15` nulstilles. Igen vil jeg nævne at du skal sikre, at din pære er tæt på din Hue Bro. Nedenfor ses eksemplet, med ID 15. Dette skal naturligvis ændres, alt efter hvilket ID din pære har.

   URL: `http://10.0.0.108/api/{USERNAME}/config/lights/15`

   BODY: `{"touchlink":true}`

   Tryk på **PUT**, når du har ændret værdierne.
3. Nedefor kan du se fremgangsmetoden for dette step. Hvis du får samme svar i `Command Response`, burde din lampe været nulstillet herefter. Din lampe vil blinke et par gange, efter at den er nulstillet. Herefter burde du kunne finde den ved at søge.

   ![Steps til Reset i CLIP API Debugger](https://i.imgur.com/7ses8ug.png)


