Pop!_OS vanhalla Surface Laptopilla
Liki kymmenen vuotta vanha kannettava jatkaa päivittäisessä käytössä
Minulla oli joutilaana aikoinaan poikani käytössä ollut Surface Laptop 1 vuodelta 2017. Kuljen työmatkani junalla ja tarvitsin pienen kannettavan työmatkakäyttöön. Surface Laptop 1 on kevyt, alumiinikuorinen ja sen näyttö on nykystandardeillakin ensiluokkainen. Koneen Windows 10:n tuki päättyi lokakuussa 2025, eikä Windows 11 tue virallisesti 7. sukupolven Intel-prosessoria. Microsoftin mielestä kone oli valmis kierrätettäväksi. Minä olin eri mieltä.
Miksi Pop!_OS
Pop!_OS on Ubuntuun perustuva Linux-jakelu, jota kehittää amerikkalainen tietokonevalmistaja System76. Alunperin jakelu käytti Gnomea, mutta sittemmin System76 on kehittänyt oman COSMIC-työpöytäympäristön. Minulla oli aikoinaan Pop!_OS+Gnome -yhdistelmä käytössä vuosien ajan ja päätin nyt kokeilla, miten COSMIC toimii tällaisessa vanhemmassa laitteessa. Pop!_OS ei ollut mitenkään erityisen suositeltu Linux-jakelu juuri tähän koneeseen. Se osoittautui kuitenkin toimivaksi, joten ei ollut tarvetta kokeilla muita jakeluita.
Asennus ja linux-surface
Asennusohjetta seuraten Pop!_OS asentui Surface Laptop 1:een ongelmitta, ja melkein kaikki toimi välittömästi. Surface-laitteissa on kuitenkin osia, esimerkiksi kosketusnäyttö, joihin tavallisessa Linux-kernelissä ei ole tukea. Niitä varten on yhteisön ylläpitämä Linux Surface-projekti, joka tarjoaa Surfaceille paikatun kernelin ja tarvittavat apuohjelmat. Asennusohje löytyi projektin wikistä. Asennus sujui helposti ja nopeasti.
Kone esittäytyy nyt neofetchin mukaan näin:
OS: Pop!_OS 24.04 LTS x86_64
Host: Surface Laptop 1
Kernel: 6.19.8-surface-3
Packages: 1852 (dpkg)
Shell: bash 5.2.21
Resolution: 2256x1504
DE: COSMIC
Theme: adw-gtk3-dark [GTK3]
Icons: Cosmic [GTK3]
Terminal: cosmic-term
CPU: Intel i5-7200U (4) @ 3.100GHz
GPU: Intel HD Graphics 620
Memory: 2202MiB / 7866MiB
Kone käynnistyi väärällä kernelillä
Linux Surfacen asennuksen jälkeen kone käynnistyi edelleen Pop!_OS:n kernelillä. Käytössä olevan kernelin voi helposti tarkistaa oheisella komennolla.
uname -r
Tulos oli 7.1.5-generic, eli Pop!_OS:n oma kernel, vaikka koneelle oli asennettu myös Linux Surfacen kernel versio 6.19.8.
Syy on Pop!_OS:n käynnistyksessä. Se käyttää GRUBin sijaan systemd-bootia, ja sen kernelstub-työkalu kopioi käynnistysosioon vain uusimman kernelin. Pop!_OS:n oma kernel on lähes aina uudempi kuin Linux Surfacen, joten se valitaan joka kerta.
Asian voi korjata lisäämällä surface-kernelille oman käynnistysmerkinnän. Ensin kernel ja initrd kopioidaan EFI-osioon:
sudo mkdir -p /boot/efi/EFI/surface
sudo cp /boot/vmlinuz-6.19.8-surface-3 /boot/efi/EFI/surface/vmlinuz.efi
sudo cp /boot/initrd.img-6.19.8-surface-3 /boot/efi/EFI/surface/initrd.img
Sitten tehdään Linux Surfacen kernelistä merkintä tiedostoon /boot/efi/loader/entries/Pop_OS-surface.conf. Huom. viimeinen rivi kopioidaan sellaisenaan Pop!_OS:n omasta merkinnästä Pop_OS-current.conf, koska siinä on levyn tunniste:
title Pop!_OS (Surface-kernel)
linux /EFI/surface/vmlinuz.efi
initrd /EFI/surface/initrd.img
options root=UUID=… ro quiet splash
Lopuksi merkintä asetetaan oletukseksi:
sudo bootctl set-default Pop_OS-surface.conf
Pop!_OS:n oma kernel jää valikkoon varalle. Jos jokin menee pieleen, valikon saa näkyviin pitämällä välilyöntiä pohjassa käynnistyksen aikana.
Kopioidut tiedostot eivät kuitenkaan päivity itsestään, joten koneelle voisi jäädä vanha surface-kernel ilman tietoturvapäivityksiä. Siksi tarvitaan pieni skripti, joka kopioi uusimman surface-kernelin EFI-osioon aina kernelin tai initramfsin päivittyessä. Se tallennetaan nimellä /usr/local/sbin/surface-boot-update ja linkitetään kansioihin /etc/kernel/postinst.d/ ja /etc/initramfs/post-update.d/ nimellä zzz-surface-boot, jotta se ajetaan muiden vaiheiden jälkeen:
#!/bin/sh
# Kopioi uusimman linux-surface-kernelin EFI-osioon systemd-bootia varten.
set -e
latest=$(ls /boot/vmlinuz-*surface* 2>/dev/null | sort -V | tail -n 1)
[ -n "$latest" ] || exit 0
version=${latest#/boot/vmlinuz-}
initrd="/boot/initrd.img-$version"
[ -f "$initrd" ] || exit 0
dest=/boot/efi/EFI/surface
mkdir -p "$dest"
cp "$latest" "$dest/vmlinuz.efi.new" && mv "$dest/vmlinuz.efi.new" "$dest/vmlinuz.efi"
cp "$initrd" "$dest/initrd.img.new" && mv "$dest/initrd.img.new" "$dest/initrd.img"
Skriptille annetaan suoritusoikeus ja se linkitetään molempiin kansioihin. Lopuksi se ajetaan kerran käsin:
sudo chmod +x /usr/local/sbin/surface-boot-update
sudo ln -s /usr/local/sbin/surface-boot-update /etc/kernel/postinst.d/zzz-surface-boot
sudo ln -s /usr/local/sbin/surface-boot-update /etc/initramfs/post-update.d/zzz-surface-boot
sudo /usr/local/sbin/surface-boot-update
Lepotila ja horros
Surface-laitteet käyttävät Windowsin Modern Standby -lepotilaa, joka toimii Linuxilla huonommin kuin vanhempien koneiden syvä lepotila. Minulla akku tyhjeni lepotilassa parissa päivässä.
Mittasin kulutuksen laittamalla koneen tunniksi lepoon akkuvirralla ja vertaamalla akun varausta ennen ja jälkeen. Kone herää itse rtcwake-komennolla:
sudo rtcwake -m mem -s 3600
Lepotila kulutti 2,5–3 % akkua tunnissa. Ensin epäilin wifiä, ja yksi mittaus näytti lupaavalta, mutta se osoittautui mittausvirheeksi: kulutus oli sama Wi-Fin kanssa ja ilman. Intelin prosessorin säästötilalaskuri kertoi syyn suoraan. Kone ei päässyt syvimpään säästötilaan hetkeksikään.
Syyn etsimisen sijaan päätin kiertää ongelman horroksella. Horroksessa muistin sisältö tallennetaan levylle ja kone sammuu kokonaan, joten akkua ei kulu lainkaan. Herääminen kestää noin 10 sekuntia, ja kaikki ohjelmat ovat samassa tilassa kuin ennen kannen sulkemista.
Swap-tiedosto horrokselle
Pop!_OS luo asennuksessa salatun swap-osion, jonka avain arvotaan joka käynnistyksessä. Siitä ei voi palata horroksesta, koska tallennettua muistia ei voi enää purkaa. Osio oli lisäksi liian pieni, sillä swapia pitää olla vähintään keskusmuistin verran. Otin vanhan swapin pois käytöstä tiedostoista /etc/crypttab ja /etc/fstab ja tein tilalle swap-tiedoston:
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap defaults 0 0' | sudo tee -a /etc/fstab
Juuriosiotani ei ole salattu, joten salaamaton swap ei heikennä tietoturvaa. Salatulla levyllä tämä pitäisi tehdä toisin.
Mistä horros löytyy
Kernelille pitää kertoa, missä kohtaa levyä swap-tiedosto alkaa. Sijainnin saa selville näin:
sudo filefrag -v /swapfile | awk '$1=="0:" {print substr($4, 1, length($4)-2)}'
Tieto lisätään initramfsiin tiedostoon /etc/initramfs-tools/conf.d/resume riville RESUME=UUID=…, jossa UUID on juuriosion tunniste, ja käynnistysparametreihin resume=UUID=… resume_offset=…. Pop!_OS:n omaan merkintään parametrit lisätään kernelstub -a -komennolla ja surface-merkintään käsin options-rivin loppuun. Sen jälkeen ajetaan sudo update-initramfs -u -k all. Uudelleenkäynnistyksen jälkeen horrosta voi kokeilla komennolla systemctl hibernate.
Kansi horrokseen
Lopuksi kerrotaan, että kannen sulkeminen vie koneen suoraan horrokseen. Tiedosto /etc/systemd/logind.conf.d/lid-hibernate.conf:
[Login]
HandleLidSwitch=hibernate
HandleLidSwitchExternalPower=hibernate
HandleLidSwitchDocked=ignore
Asetus tulee voimaan ilman uloskirjautumista komennolla sudo systemctl kill -s HUP systemd-logind.
Harkitsin myös vaihtoehtoa, jossa kone on ensin hetken lepotilassa ja siirtyy vasta sitten horrokseen. Koska lepotila kuluttaa akkua joka tapauksessa, valitsin suoran horroksen.
Horros ei ollutkaan todellinen
Ensimmäisen yön jälkeen akku oli silti aamulla tyhjä. Oletusasetuksilla systemd käyttää horroksessa laiteohjelmiston omaa sammutustilaa (ACPI S4), mutta Surface Laptop 1 ei sammunut siinä kokonaan. Kone kulutti noin 8 % tunnissa, eli enemmän kuin lepotilassa.
Korjaus on käskeä systemd sammuttamaan kone tavallisesti, kun muistin sisältö on tallennettu. Tiedosto /etc/systemd/sleep.conf.d/hibernate-shutdown.conf:
[Sleep]
HibernateMode=shutdown
Nyt akku kuluu horroksessa käytännössä vain itsepurkautumisen verran.
Uusi elämä vanhalle koneelle
Lopputuloksena:
- Kosketusnäyttö: toimii Surface Linux -kernelillä
- Lepotila: toimii, mutta kuluttaa noin 3 % akkua tunnissa, joten kannen sulkeminen vie koneen horrokseen
- Wi-Fi, Bluetooth ja ääni: toimivat
- Kamera: ei toimi, koska Linux Surface ei tue Surface Laptop 1:n kameraa
- Akunkesto: peruskäytöllä näyttö 50 % kirkkaudella, Balanced-asetuksella n. 4 tuntia
Kannettavan tietokoneen elinkaaren ympäristökuormasta valmistuksen osuus on jopa 85 %. Siten laitteiden loppuun asti käyttäminen on jo itsessään ympäristöteko.
Näin vanhassa laitteessa akku on usein heikko lenkki. Microsoft on tehnyt tässä mallissa akun vaihtamisen vielä tavallista hankalammaksi. Omien testieni perusteella akunkäytön Balanced-asetuksella akku kestää edelleen hämmästyttävän hyvin, jopa 4 tuntia. Se on minulle enemmän kuin riittävästi.
Koneen ikä näkyy siinä, että siinä ei ole USB-C porttia. Ostin muutaman euron maksaneen Surface Connector - USB-C -sovittimen, ja voin nyt ladata akun USB-C laturilla.
Koneen suorituskyky on yllättävän hyvä. En juuri huomaa eroa uudempiin koneisiin netin selaamisessa, videotoistossa, toimistosovellusten käytössä ja kevyessä web-kehityksessä. Dockeria en ole kuitenkaan vielä kokeillut, vaan olen asentanut kehitysympäristön paikallisesti.