tekologiablogi

seikkailut linuxien ja tekoälyjen ihmemaassa

📍 Hyvinkää

Linux-migraatio

MBR vs GPT ja osiointi eli partitiointi

Ennen kiintolevyn osiointia kannattaa valita käytettävä osiointimenetelmä sillä sitä ei voi levyn ollessa käytössä tosta noin vain enää vaihtaa. Jos kiintolevy on kooltaan yli 2 teratavua, M.2 NVMe SSD tai haluat riivata itseäsi Windows dual-boot hullutuksilla ainoa vaihtoehto on GPT, muussa tapauksessa kelpaa myös MBR.

gparted screenshot

Levyn partitiointi onnistuu kätevästi GPartedilla.

GPT-levylle on luotava erillinen osio joko EFI- tai BIOS-boottia varten. BIOS-partitiolle riittää 2 megatavua levyn alusta eikä sille valita tiedostojärjestelmää. Se on merkittävä flagilla bios_grub, tämän partition sisältö kirjoitetaan grubilla myöhemmin. EFI-partitiolle tarvitsee varata vähintään 100 megatavua, käytöstä riippuen mahdollisesti paljon enemmän. 512 megatavua on yleisesti suositeltu. EFI-partitiolla käytetään vfat/fat32-tiedostojärjestelmää ja se merkitään boot flagilla. Kuvasta poiketen GPT-juuripartitiolla ei tarvita flageja, ne taitavat olla jäänteitä levyllä olleesta Windowsista. Sen sijaan jos valitaan MBR niin juuripartitio tarvitsee boot flagin eikä erillistä boot-osiota tarvita vaan MBR-boot sector mahtuu levyn alkuun.

GPT ei ole huono idea, ext4 on klassinen valinta.

Linuxille tarvitaan yksi osio jonne juurihakemisto tulee mutta tapauskohtaisesti /home ja jokunen muukin voi olla viisasta sijoittaa erilliselle levylle tai partitiolle. Valitse tiedostojärjestelmä kuten ext4 ja formatoi linux-käyttöön tulevat partitiot. Myös swap kannattaa olla vaikka tuntuisi siltä ettei RAM voi koskaan loppua. Swapista on hyvä tehdä hieman suurempi kuin RAM-muistista, muuten hibernointi eli suspend-to-disk ei toimi.

Käytössä olevan Linuxin siirto toiselle levylle

Olet itse vastuussa syöttämistäsi komennoista! Kopioimalla sokeasti komentoja saatat aiheuttaa silmitöntä vahinkoa.

Tiedosto-konfliktien välttämiseksi siirto on parasta tehdä mahdollisimman lähellä yhden käyttäjän tilaa, esimerkiksi buuttaamalla recovery-moodiin mikä löytynee grub-valikosta Advanced optionsin alta ja sitten sieltä root shell.

mkdir /mnt/newhd
mount /dev/sdb2 /mnt/newhd
cp -ax /bin* /boot /dev /etc /initrd* /lib* /root /sbin* /snap /sys /usr /var /vmlinuz* /mnt/newhd

Parempi valita kaikki tarvitsemansa hakemistot. Tietyt tyhjät hakemistot on hyvä luoda, esim. /proc, /run ja /tmp on luotava uudelle levylle koska ilman niitä linux ei toimi.

cd /mnt/newhd
mkdir mnt proc run tmp

Uuden levyn /etc/fstab

UUID-tunnukset täytyy vaihtaa fstabiin. Koska recovery root shellissä ei toimi hiiri voi joko kirjoittaa lunttilapun tai kopioida tarvittavat tiedot fstabiin.

lsblk -f|grep sdb >>etc/fstab
nano etc/fstab

Kaikkia partitioita koskevien tietojen oikeellisuudesta on varmistuttava huolellisesti jotta buutti varmasti onnistuu. Lopuksi poistetaan lunttirivit fstabin lopusta.

UUID=4b8623e2-942e-42f6-b09c-ed94d97df7f3    /   ext4    defaults,noatime,errors=remount-ro  0  1
UUID=5ef3024d-1c8a-438f-a04b-732b8289d7f8   none    swap    sw,pri=10   0    0
#UUID=3b717fde-30a3-4869-9c73-d450b867cb20  none    swap    sw,pri=1    0  0
UUID=a13df2d2-ea9e-4765-86af-3d30db8da26f   /home   ext4    defaults,relatime   0   2
UUID=fd6f06cb-fada-4d62-9d59-1c9dd720916e   /data   ext4    defaults,nofail,noatime,noexec,errors=remount-ro    0   2

Esimerkki /etc/fstab sisällöstä. SSD-systeemilevyn elämää pidentää noatime-optio. Mikäli käytössä on useita swappeja voi niiden prioriteetteja säätää pri-optiolla, mitä suurempi luku sitä ensisijaisempi swap.

Linux ei käynnisty jos /etc/fstab määrittelee juurihakemiston / väärin.

Käynnistäminen GPT-kiintolevyllä

Linux ei käynnisty uudelta levyltä ilman grubia, se täytyy päivittää.

Älä yritä muokata grub.conffia käsin 😬

GPT-osioidun levyn alussa oleva grub-partitio sisältää konfiguraatioita binäärisessä muodossa eikä pelkkien boot-conffien muokkaaminen johda haluttuun lopputulokseen.

grub-install --boot-directory=/mnt/newhd/boot /dev/sdb
update-grub
umount /dev/sdb

Jos käytössä olevalla levyllä on UEFI-boot ja grub-install herjaa jotain efiin liittyen, grub-installiin on lisättävä --target=x86_64-pc tai --target=i386-pc määrite. Kun grub on laitettu voi koneen sammuttaa ja vanhan levyn irrottaa. Sitten muutetaan buuttijärjestys ja muut tarvittavat asetukset biosista ja toivotaan parasta..

Manuaalinen käynnistys

multifail

Toisinaan lipsahtaa typotus, unohtuu jotain tai pääsee aivopieru. Käynnistysvaihe on hyvin anteeksiantamaton.

set root=(hd0,gpt2)
linux /boot/vmlinuz-6.8.0-40-generic root=/dev/sdb2
initrd /boot/initrd.img-6.8.0-40-generic
boot

Kukaan ei halua nähdä virheilmoitusta unknown filesystem, se tarkoittaa että koneeseen on kytkettävä levy tai usb-muisti jolta käynnistys onnistuu koska kiinni olevalta levyltä se ei onnistu. Sen sijaan jos vastassa on tavallinen grub-kehote ei hätää käynnistystä voi jatkaa manuaalisesti. Kehote tottelee ls-komentoa jolla voi selvittää miltä partitiolta /boot löytyy ja jopa tab-täydennys onnistuu, sen avulla tarvittavan kernel-version ja initrd-imagen valinta sujuu helposti.

fsck /dev/sdb2
mount -o remount,rw /dev/sdb2 /

Toisinaan epämääräisen buutin jälkeen levy saattaa olla likainen ja read-only, jolloin virheellisiä konffeja ei pysty muokkaamaan. Ongelmaan tarjoaa ratkaisun fsck.

Käynnistyksen suojaaminen salasanalla

Osaavissa käsissä grub-valikko tarjoaa vapaan pääsyn linux-järjestelmään rescue root shellin kautta, on syytä suojata salasanalla jollei koko käynnistystä niin ainakin edistyneet toiminnot ja toimintojen muokkaaminen.

grub-mkpasswd-pbkdf2
sudo nano /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# dont touch the tail
set superusers="naserume"
password_pbkdf2 naserume grub.pbkdf2.sha512.10000.???????

Lisätään 40_custom conffiin rivit joilla määritellään käyttäjänimi ja grub-mkpasswd-pbkdf2 komennolla saatu salasana-hash.

sudo nano /etc/grub.d/10_linux
echo "menuentry '$(echo "$os" | grub_quote)' --unrestricted ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"

Jotta normaali käynnistys ei kysyisi salasanaa etsitään 10_linux conffista gnulinux-simple ja lisätään tälle riville unrestricted määritys. Grub versiopäivityksen jälkeen tämän rivin voi joutua lisäämään uudelleen.

Käytä sellaista salasanaa jonka varmasti muistat.

Virtuaalinen Linux

Virt-manager ja QEMU

sudo apt install virt-manager
sudo usermod -aG libvirt,kvm artint

Virt-managerin asentaminen on varsin suoraviivaista ja QEMU asentuu siinä samalla dependenssinä. Käyttäjä on lisättävä ryhmiin libvirt ja kvm.

virt error

Välittömästä asennuksen jälkeen käyttäjä ei vielä näy tarvittavassa ryhmässä mistä seuraa virhetilanne. Tilanteen voi korjata rebootilla.

newgrp libvirt
virt-manager
exit

Mikäli on kiire päästä käyttämään virtuaalikoneita voi vaihtaa käyttäjäryhmän ja käynnistää virt-managerin tähän tapaan. Jotta käyttäjän luomat tiedostot eivät kirjautuisi ryhmätunnuksella libvirt komennetaan exit ennen kuin terminaalia käytetään muuhun.

Linux virtuaalikoneessa

vm setup

Uuden virtuaalikoneen luominen sujuu mutkattomasti asennusvelhon avulla. Valittaessa paikallinen asennusmedia käyttöjärjestelmä asennetaan joko iso-tiedostosta tai optiselta asemalta.

  • Nyrkkisääntönä voi pitää että viime vuosina julkaistut linuxit vaativat minimissään 1 ytimen, 2 gigaa muistia ja 20 gigaa levyä kevyeen työpöytäkäyttöön. Sujuvaan työpöytäkäyttöön tarvitsee 2 ydintä, 4 gigaa muistia ja yli 25 gigaa levyä.
  • Ydinten ja muistin määrää voi vaihdella mielin määrin myöhemmin jotenka asennusvaiheessa ei tarvitse turhaan säästellä.
  • Levynkin kokoa pystyy muuttamaan mutta se ei suju aivan yhtä käden käänteessä, jotenka on parempi harkita hieman paljonko levytilaa asennusvaiheessa varaa. 25-30 gigaa voi olla kaukonäköinen ratkaisu.
  • Virtuaalikoneeseen ei välttämättä kannata laittaa täyttä työpöytäasennusta vaan ainoastaan käytön kannalta olennaiset paketit.
snap fix

Tuore Ubuntu 22.04 Jammy sisältää hienosäädön tarvetta.

sudo snap refresh
snap-store --quit && sudo snap refresh snap-store
sudo apt install ubuntu-mate-core

Snap-store pitää sulkea jotta sen voi päivittää. Myös ikkunoissa havaitun gnome-pöhön voi korjata. Logout, login ja pöhö on pois silmistä.

cloning

Kun asennukset on päivitelty ja välttämättömät paketit lisätty, on viisasta ottaa varmuuskopio kloonaamalla virtuaalikone. Jos jokin menee pahasti pieleen voi halutessaan deletoida kuralle menneen virtuaalikoneen ja kloonata varmuuskopiosta uuden käyttökopion.

Tiedostojen kopiointi virtuaali- ja isäntäkoneen välillä

sudo apt install libguestfs-tools

Libguestfs työkalupakki sisältää useita käyttökelpoisia komentoja VM-levykuvien käsittelyyn.

sudo virt-copy-out -a /var/lib/libvirt/images/ubuntu22.qcow2 \
/home/artint/stable-diffusion.cpp/build/bin/sd ~/Downloads/
sudo virt-copy-in -a /var/lib/libvirt/images/ubuntu18.qcow2 ~/Downloads/ubuntu2004-cuda-11.2.2.tgz \
/home/artint/Downloads/

Esimerkissä virt-copy-out komennolla kopioidaan virtuaalikoneessa käännetty binääri isäntäkoneen käyttäjän Downloads hakemistoon ja virt-copy-in komennolla kopioidaan isäntäkoneella oleva CUDA 11.2.2 toolkit virtuaalikoneen käyttäjän Downloads hakemistoon. Virtuaalikonetta ei tarvitse sammuttaa tiedostoja kopioidakseen.

sudo guestmount -o allow_other -a /var/lib/libvirt/images/ubuntu22.qcow2 -m /dev/sda3 --ro /mnt/vm/
sudo guestunmount /mnt/vm

Esimerkissä mountataan guestmount komennolla osio virtuaalikoneen kiintolevyltä. Unmount tapahtuu komennolla guestunmount. Käynnissä olevan virtuaalikoneen osiot on mountattava read-only jotta tiedostojärjestelmän korruptoitumiselta vältytään. Guestmountin allow_other parametrin voi jättää pois jos muokataan /etc/fuse.conffia. Ilman tuota määritystä tai konffin muokkausta mountpoint on ainoastaan rootin käytettävissä.

sudo nano /etc/fuse.conf
user_allow_other

VM-levykuvan suurentaminen

sudo qemu-img info /var/lib/libvirt/images/ubuntu18.qcow2
sudo virt-filesystems -la /var/lib/libvirt/images/ubuntu18.qcow2 --blkdevs --extra
sudo qemu-img resize /var/lib/libvirt/images/ubuntu18.qcow2 +10G

Ennen levykuvan muokkaamista virtuaalikone täytyy pysäyttää, koska sen muokkaaminen virtuaalikoneen ollessa käynnissä voi aiheuttaa levykuvan tuhoutumisen. Levykuvan tiedot voi tarkistaa komennolla qemu-img info ja tarkempaa tietoa sen sisältämistä osioista saa komennolla virt-filesystems. Kokoa muutetaan komennolla qemu-img resize.

growing

VM-levykuvaan lisätty tila näkyy virtuaalikoneessa varaamattomana ja sen saa käyttöön suurentamalla olemassaolevaa partitiota tai luomalla vapaaseen tilaan uuden partition.

VM-levykuvan pienentäminen

cd-boot

Jotta virtuaalikoneen levyä voisi kutistaa tilan itselleen varaavaa osiota on ensin pienennettävä. Se ei onnistu virtuaalikoneen ollessa käynnissä, jotenka VM käynnistetään sellaiselta optiselta medialta jolta löytyy osiointityökalu kuten GParted. Iso-kuvan valitsemisen lisäksi buuttijärjestystä pitää muuttaa.

gparted

Minimalistinen GParted Live hoitaa asian siinä missä järeämmätkin live-Linuxit.

sudo qemu-img resize --shrink /var/lib/libvirt/images/ubuntu18.qcow2 -25G

Pienentäminen tapahtuu qemu-img resize komennolla käyttäen shrink-parametria.

Levykuvaa pienennetään ainoastaan varaamattomalta alueelta.

Näytönohjain on huono

Legacy näytönohjain ja stable-diffusion.cpp

AI-slop

Enempi tai vähempi kaupallista AI-sloppia katsellessa tulee väkisinkin mieleen että sitähän voisi tehdä kotikoneella maksamatta siitä kellekään, eikä sitten tarvitsisi kirota hirttosilmukkaakin tiukempiin corporate policyihin perustuvia omituisia safety filttereitä ja miettiä että kuka tai mikä niitä kokeiltuja kehotteita vielä käy läpi ja onko niillä hyvät mielessä. Fingerporiakin voisi käyttää lähtökuvana eikä kukaan valittaisi tekijänoikeudesta ainakaan niin kauaa kun pitää ethernet-piuhaa irti koneesta.

sudo apt install git cmake
git clone --recursive https://github.com/leejet/stable-diffusion.cpp
cd stable-diffusion.cpp/
mkdir build-cpu && cd build-cpu
cmake .. -DCMAKE_CXX_FLAGS="-mno-avx2"
cmake --build . --config Release

Helpointa on kääntää stable-diffusion.cpp pelkällä cpu-tuella ja vaikka vanhasta prosessorista puuttuisi avx2-tuki voi sen jättää pois cmake flagilla. Kääntäjän kieräyttämä binääritiedosto ilmestyy build-cpu/bin-hakemistoon josta sen voi ottaa talteen. Vanha näytönohjain joka ei tue modernia cudaa ei välttämättä toimi prosessoria nopeammin vulkanilla, GTX 670 2GB oli noin 4 kertaa hitaampi vulkanilla kuin pelkkä i7 josta avx2 uupuu🙃 Elikä jos ei saa cudaa toimimaan sen vulkanin voisi ehkä suosiolla unohtaa.

sudo apt install gcc-10 g++-10 nvidia-cuda-toolkit
cd ..
mkdir build-cuda && cd build-cuda
cmake .. -DSD_CUDA=ON -DCMAKE_CXX_FLAGS="-mno-avx2" -DCMAKE_CXX_COMPILER=/usr/bin/g++-10 \
-DCMAKE_CUDA_HOST_COMPILER=/usr/bin/g++-10
cmake --build . --config Release

Cuda-tuki vanhoille ohjaimille on vähän haasteellisempi mutta Ubuntu Jammyn kun on laitellut virtuaalikoneeseen ja siellä kääntelee saa suhteellisen kivuttomasti aikaiseksi binäärin jolle pitäisi kelvata Nvidian ohjaimet alkaen cuda-versiosta 8.6 ja alaspäin yhteensopien aina 3.5 saakka. Se mitä ohjaimia versionumerot käytännössä tarkoittaa ratkeaa helposti tutkiskelemalla oheista taulukkoa. Jos koneesta löytyy vaikkapa GTX 1060 3GB se toiminee --offload-to-cpu vipusen avulla vaikkakin turkasen hitaasti mutta GTX 670 on auttamattomasti liian vanha, sitä ei kerta kaikkiaan tueta. Aikaa voi säästää jättämällä nuijasodan aikaiset linuxit asentamatta virtuaalikoneeseen, ggml-cuda vaatii cuda17 kieltä joka lisättiin toolkitin versiossa 11.0 mutta sm30-tuki poistettiin siinä samaisessa.

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 110 --slave /usr/bin/g++ \
g++ /usr/bin/g++-11
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 100 --slave /usr/bin/g++ \
g++ /usr/bin/g++-10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g++ \
g++ /usr/bin/g++-9
sudo update-alternatives --config gcc

Uutta rautaa ja uutta koodia harrastavat eivät tälläistä kikkailua tarvitse. Sen sijaan vanhaa koodia kääntäessä huomaa pian asentaneensa lukuisia versioita c++-kääntäjästä. Dependenssihelvetti ei ota hellittääkseen ja cmake rivikin helposti venyy lukuisista -DCMAKE flageista, sen sentään saa trimmattua vaihtelemalla kääntäjää kätevästi update-alternativesilla.

Uusi näytönohjain ja stable-diffusion.cpp

Under construction

ingress scanner screenshot

herba da derbaca höfföpöffö pöö

This is an infobox with some placeholder text.

Develop a scalable e-commerce platform with React and Node.js by simply lorem ipsuming your dolor all the way to sit amet.

// This is a code snippet
console.log("Hello, world!");
  • Item 1
  • Item 2
  • Item 3
Write your textfile contents here...