Ultrabooks con Linux económicos: Slimbook Essential
Hoy hago un hueco en la serie de artículos de la Akademy 2020 en línea que está ocupando el blog estos últimos días. Y es que me encanta publicar cosas de la compañía valenciana Slimbook. En este caso un poco más contento si cabe porque responden a una de las peticiones que le estoy haciendo a su gerente desde hace tiempo: unos ultrabook con linux económicos. Se trata de la serie Essential de 14 y 15 pulgadas.
Ultrabooks con Linux económicos: Slimbook Essential
Mucho han cambiado las cosas desde finales de la primera década de los 2000 cuando escribía artículos llamados «¡Quiero un netbook con linux» buscando mi compañero de fatigas ideal.
En la actualidad Tener un ultrabook (o portátil delgado y de bajo peso) con Linux es algo relativamente sencillo, tenemos alternativas de varias empresas, aunque si es verdad es que si tienes un presupuesto ajustado quizás pienses que no vale la pena invertir tanto dinero.

Y es que hasta la fecha, los ultrabook con Linux respondían un tipo de usuario que sabían bien que compraban una máquina de altas prestaciones con un precio acorde diseñados para durar mucho tiempo con un alto grado de utilización.
No obstante, para los usuarios menos experimentados en los aspectos del hardware de su computadora, un portátil de 15 es un portátil de 15, casi independientemente de qué placa base, procesador o tarjeta gráfica que tenga. No es una crítica, es una realidad, ya que piensan (posiblemente de forma acertada) que para el uso que le van a dar es una inversión económica demasiado elevada.
Este grueso de usuarios es elevado y hay que reconocer que en mi caso me cuesta mucho convencerles de qué en realidad a la larga compensa ya que no será la primera vez que tengo que «arreglar» algún portátil «nuevo» que no da la talla para lo que se pide. Y lo que se le pide es que abra una página web antes de que se ponga el sol.

Así que me es muy grato anunciar que Slimbook ha lanzado una serie de Ultrabooks que se ajusta a ese intervalo de usuarios, aquellos que quieren un portátil bueno de 15 pulgadas, que no les importa dar el salto a sistemas compatibles 100% con GNU/Linux, pero que no quieren gastarse 700€.

Esa es el motivo de la existencia de la gama Slimbook Essential que , en mi sincera opinión, van a tener una más que buena aceptación entre un sector de público que quiere un portátil bueno a un precio moderado. En otras palabras, es el ultrabook para aquellos usuarios que quieren prestaciones más que aceptables a un precio muy ajustado, con un diseño bonito y un peso reducido.

Las características de configuración básicas son las siguientes:
- Procesador Intel de décima generación
- Pantalla: 14 o 15’6 pulgadas FullHD de marco delagado
- Teclado: Español retro-iluminado RGB (modelo 15’6) y retro-iluminado Blanco (modelo 14)
- Material: Aluminio y ABS color titanio
- Apertura de 180º
- Puertos USB: 2 tipo 3.0, 1 tipo 3.1 y 1 tipo USB tipo C (para el modelo de 15’6)
- Memoria RAM: 8GB (ampliable) DDR4
- Disco duro M.2: 250GB SSD NVMe (ampliable)
- Batería de hasta 7 horas de autonomía
- Peso: 1,3 kg (modelo de 14) y 1,6 (modelo de 15’6)

Todo ello a partir de 499€ el modelo de 14 y de 549€ el de 15’6 pulgadas. Unos precios razonables para aquellas personas que no quieren gastarse mucho pero quieren asegurarse un portátil para mucho tiempo. ¡Ya tengo el portátil recomendado para mis compañeros del colegio!
Tarde del segundo día de Akademy 2020 en línea
Sigue adelante el evento más importante de la Comunidad KDE Internacional. Bienvenidos a la tarde del segundo día de Akademy 2020 en línea, un resumen de lo que ha dado de sí la jornada vespertina del sábado
Tarde del segundo día de Akademy 2020 en línea
Creo que voy a empezar todos los artículos dedicados a Akademy 2020 con este vídeo de bienvenida… me ha encantado la diversidad cultural que nos muestra.
El momento de KDE e.V.
Akademy 2020 se reanuda con la clásica presentación de la Junta de KDE e.V. y los informes de los Grupos de Trabajo, donde se rinden cuentas a todo lo que han hecho durante el año desde la última Akademy.
Entre los aspectos más destacados la Junta destaca el aumento del número de empleados remunerados de tres a cinco, la migración a GitLab y la financiación de más apoyo a los miembros de la comunidad.
Se puede leer todo el documento en este enlace, al que creo que le dedicaré todo un artículo.

Las charlas de la tarde
La tarde inicia con la emisión simultáneamente desde dos salas. De esta forma hablaremos de la Room 1 y la Room 2.
De esta forma nos encontramos en la Room 1 ponencias como:
- «Input Handling Update» por Shawn Rutledge, donde nos habla de lo que vendrá con Qt 6.
- «Native Desktop Styling Support for Qt Quick Controls 2″ a cargo de Richard Moe Gustavsen donde se habla de el trabajo para el soporte nativo de estilo de escritorio para Qt Quick Controls 2.
- Patrick Pereira presentó «QML Rapid Prototyping«, es decir, Desarrollando herramientas para mejorar los prototipos y el desarrollo del QML
- Tej Shah, un doctor en medicina dental de los Estados Unidos, nos habló de su proyecto Clear.Dental y su intento de mover la odontología al Código Abierto usando el poder de Linux, Qt y KDE.
- Rohan Garg dio a los asistentes una lección de Gráficos Linux 101 en la que explicó cómo la creciente popularidad de los dispositivos ARM ha dado lugar a arquitecturas de plataforma con hardware gráfico más extrañas.

Mientras que en la Room 2 tenemos:
- A Cornelius Schumacher hablando de la Fundación KDE Free Qt, que establecida en 1998 mantiene a las herramientas Qt libre para KDE y todos los demás proyectos de software libre.
- A Aleix Pol hablando de los productos KDE y cómo percibe su relación con los usuarios.
- A Johan Thelin introduciéndonos con su charla «Linux in Cars – So What?» desde su mismo coche.
- A Camilo Higuita hablando de su propio proyecto: Maui. Además nos resumió las actualizaciones del grupo de aplicaciones, servicios, bibliotecas y marcos de UI (Interfaz de Usuario) que Maui proporciona para producir aplicaciones de aspecto atractivo.
- A Amy Spark, participante de Google Summer of Code, mostró cómo integró el código abierto de Hollywood con las aplicaciones de KDE al portar una tecnología de animación de Disney a Krita.

Las charlas relámpago
No quiero olvidar las charlas relámpago que se realizaron en la Room 1:
- Flatpak, Flathub y KDE: A Quick Summary a cargo de Albert Astals Cid rl cual presentó a la audiencia qué es Flatpak, qué era Flathub y cómo KDE interactuaba con ambos.
- Nicolás Alvarez habló de la mejora de la infraestructura de los servidores de KDE, la formación del Grupo de Trabajo Sysadmin, y contó a los asistentes cómo el equipo de Sysadmin estaba haciendo más manejables los servidores de KDE al reducir la «deuda técnica», trasladando las tareas manuales a los scripts, mejorando la documentación y haciendo más cosas comprobables localmente antes de ponerlas en los servidores reales.
- David Edmundson dio consejos sobre cómo ganar una discusión con un mantenedor, habiendo participado y presenciado cientos de discusiones sobre Bugzilla y Phabricator que luego se convirtieron en argumentos que produjeron enojosos estancamientos. Compartió con la audiencia los métodos que había visto funcionar para lograr finales felices y advirtió contra las actitudes que convertían las situaciones en experiencias miserables para todos.

Más información: KDE
Material audiovisual Akademy 2020 en línea
Una de las cosas positivas de esta Akademy es que todo el material debe ser emitido digitalmente, lo cual hace que ya puede estar listo para ser compartido en diferido, aunque sea sin editar.
De esta forma, en caso de que te lo hayas perdido, las charlas de hoy ya están disponibles en línea en tres bloques – uno para la mañana y dos para cada una de las habitaciones utilizadas por la tarde. También se ha grabado grabado todas las charlas por separado y pronto podrás verlas en las plataformas de vídeo disponibles de KDE.
Minimal/custom install KDE
Setelah selesai melakukan minimal/custom install openSUSE dan membuat fitur factory reset, langkah selanjutnya adalah memasang Desktop Environment/Window Manager, Display Manager, aplikasi-aplikasi pendukung dan modul-modul YaST yang diperlukan. Tapi sayangnya saya cuma punya satu laptop, sehingga tidak bisa mencoba banyak Desktop Environment atau Window Manager. Jadi yang saya tuliskan di sini apa yang biasa saya gunakan saja, sesuai dengan judul tulisan.
Memasang paket dari installer
Ketika belum terhubung ke internet, jika kita tidak mematikan repositori online saat baru selesai instalasi openSUSE, zypper akan komplain bahwa repositori-repositori tersebut gagal diperbarui. Jadi sebaiknya kita matikan dahulu:
su -c "zypper modifyrepo -dt"
Lalu hidupkan repositori installer:
su -c "zypper modifyrepo -el"
Setelah itu masukkan piringan DVD atau flashdisk yang digunakan untuk instalasi openSUSE. Lalu pasang semua paket yang diperlukan dengan perintah:
su -c "zypper install <nama-paket>"
Paket-paket yang mungkin perlu adalah:
-
plasma5-sessionatauplasma5-session-wayland: Desktop Environment. Perbedaan dari kedua paket tersebut adalah, jika memasangplasma5-session-waylandakan ikut membawaplasma5-sessionsebagai dependensi, tapi tidak sebaliknya. Jika memasangplasma5-sessionkita hanya bisa login ke sesi X11 saja, tapiplasma5-session-wayland, selain bisa ke X11, juga bisa ke sesi Wayland dan Full Wayland. -
sddm: Display Manager. Setelah memasang paket ini saya bisanya mengganti service display-manager.service dengan sddm.service dengan perintah:su -c "systemctl disable display-manager.service && systemctl enable sddm.service". Jika perlu login otomatis, ubah parameterDISPLAYMANAGER_AUTOLOGINdi /etc/sysconfig/displaymanager dengan perintah:su -c "sed -i 's/DISPLAYMANAGER_AUTOLOGIN=\"/DISPLAYMANAGER_AUTOLOGIN=\"$USER/' /etc/sysconfig/displaymanager". -
plasma-nm5: NetworkManager applet. -
plasma5-pa: Volume Manager applet. -
dolphin: File Manager. -
konsole: Terminal Emulator. -
kate: Text Editor. -
okular: Document Viewer. -
gwenview5: Image Viewer. -
spectacle: Screen Capture, untuk mengambil screenshot desktop. -
ark: Archive Manager, untuk membuka file .zip, .tar, dan lain-lain. -
vlc: Multimedia Player, untuk memutar video dan musik. -
MozillaFirefox: Web Browser. -
libreoffice-writer: Word Processor LibreOffice. -
libreoffice-calc: Spreadsheet LibreOffice. -
libreoffice-impress: Presentation LibreOffice. -
libreoffice-qt5: Antarmuka Qt LibreOffice, supaya serasi dengan tampilan KDE.
Paket-paket pelengkap
-
kernel-firmwareatau di Tumbleweed adakernel-firmware-<perangkat>. Paket ini tergantung pada hardware yang digunakan. Jika ada hardware yang membutuhkankernel-firmwarebiasanya saat booting muncul peringatan sepertifail to load firmware brcm/bcm43xx-0.fw(ini yang muncul di laptop saya), atau bisa juga diperiksa dengan perintahdmesg | grep -i 'firmware'. Dari peringatan tersebut kita bisa menentukan firmware apa yang dibutuhkan dengan perintahzypper search --provides bcm43xx-0.fw. Dari hasil perintah tersebut akan munculkernel-firmwareataukernel-firmware-brcm(tergantung apakah Anda menggunakan Leap atau Tumbleweed). Maka pasang paket tersebut. -
glibc-localeatauglibc-locale-base. Ini adalah paket locale. Untuk menghilangkan peringatan-bash: warning: setlocale: LC_BLABLA: cannot change locale (BLABLA): No such file or directorysaat masuk mode CLI yang dibahas di tulisan minimal/custom install openSUSE dan peringatanFailed to set local. Fix your system.saat menjalankan perintahsnapperyang dibahas di tulisan membuat fitur factory reset. Jika Anda akan menggunakan bahasa selain Inggris (US), pasangglibc-locale. Tapi jika Anda hanya akan menggunakan bahasa Inggris standar sistem, cukup pasangglibc-locale-base. Jika Anda memilih memasangglibc-locale-basetapi lebih suka format 24 jam daripada AM/PM dan/atau lebih suka format tanggal bulan tahun daripada bulan tanggal tahun, Anda bisa mengubah bahasa darien_US.UTF-8keC.UTF-8dengan perintahsu -c "localectl set-locale LANG=C.UTF-8". -
ca-certificates-mozilla. Untuk mengakses jaringan aman, termasuk repositori https. -
deltarpm. Jika menggunakan openSUSE Leap. Supaya ukuran file yang diunduh ketika update lebih kecil. -
btrfsmaintenance. Jika menggunakan Btrfs, untuk scrub, balance dan trim otomatis dalam jangka waktu tertentu. -
alsa-plugins-pulse. Tanpa ini PulseAudio tidak bisa memutar suara dari lebih dari satu sumber secara bersamaan. -
usb_modeswitch,ModemManagerdanmobile-broadband-provider-info. Jika Anda menggunakan modem mobile broadband (operator selular atau sejenisnya). Bisa juga ditambahkanmodem-manager-guijika perlu. -
kdeconnect-kde. Untuk menghubungkan komputer dengan smartphone Android dan perangkat lain. Jangan lupa untuk memasangopensshuntuk bisa membuka tempat penyimpanan Android dari Dolphin. -
kio-extras5. Komponen tambahan KIO. Salah satu fungsinya supaya bisa menampilkan preview file di File Manager Dolphin atau Konqueror. -
ffmpegthumbs. Untuk menampilkan preview file video. -
libqt5-qtimageformats. Beberapa format gambar, seperti .webp, tidak bisa dibuka di Gwenview tanpa paket ini. -
xdg-desktop-portal-kde. Supaya open/save dialog jadi serasi di aplikasi non KDE. -
upower. Untuk manajemen daya yang nantinya bisa diatur dari System Settings. -
tlp-rdw. Otomatis membawa pakettlpsebagai dependensi. Untuk manajemen daya. -
smartmontools. Monitor perangkat SMART (Self-Monitoring, Analysis and Reporting Technology System). -
grub2-branding-openSUSE. Jika ingin menu Grub bling-bling. Tanpa paket ini tampilan Grub hanya layar hitam dengan tulisan putih. -
grub2-snapper-plugin. Supaya bisa boot ke read-only snapshot melalui menu Grub. -
plymouth. Jika ingin layar booting bling-bling. Tanpa ini, saat booting hanya layar hitam. -
command-not-found. Untuk mempermudah mencari paket yang harus dipasang. Ketika kita menjalankan suatu perintah mendapat responbash: command not found, cara termudah mencari paket yang harus dipasang adalah dengan perintahcnf <perintah>lewat paket ini. -
udisks2. Untuk mempermudah mounting perangkat internal atau eksternal (seperti flashdisk) dari File Manager Dolphin. -
ntfs-3g. Jika ada partisi dengan filesystem NTFS. -
man. Untuk membaca Manual. -
xdg-utils. Perintahxdg-open,xdg-sudan beberapa perintahxdg-<sesuatu>lainnya ada di paket ini. -
xdg-user-dirs. Untuk manajemen direktori standar (seperti Documents, Music, Videos, dll) di $HOME. -
fonts-config. Setelan antialiasing, hinting, mengatur default fonts Sans, Serif dan Monospace diatur lewat paket ini. Pengaturannya ada di /etc/sysconfig/fonts-config. Setelah mengubah isi dari file tersebut, jalankansu -c "fonts-config". - Font pelengkap. Bisa coba dengan
noto*fontsataugoogle*fonts. Tanda*supaya semua paket dengan awalannotoataugoogledan akhiranfontsikut dipilih untuk dipasang. -
plasma5-addons. Tambahan koleksi Widget Plasma. -
vimataunano. Jika butuh teks editor CLI. -
sudo. Untuk menggantisu -c "perintah"dengansudo perintah, jika Anda lebih terbiasa atau lebih nyaman dengansudo. - Modul-modul YaST. Cari dengan perintah
zypper search yast. Pasang sesuai dengan kebutuhan. Jangan lupa untuk memasanglibyui-qt-pkg*dan/ataulibyui-ncurses-pkg*jika tidak otomatis ikut terpasang. Ganti*dengan nomor yang sesuai dengan hasil pencarian menggunakanzypper search libyui. Setelah memasang YaST, jangan lupa untuk mengubah parameterUSE_SNAPPERdi /etc/sysconfig/yast2 menjadinodengan perintahsu -c "sed -i 's/USE_SNAPPER=\"yes/USE_SNAPPER=\"no/' /etc/sysconfig/yast2". Karena jika tidak diubah, YaST akan membuat Snapshot di konfigurasi root setiap kali kita membuka modul YaST yang akan membuat nomor Snapshot menjadi tidak serasi antara konfigurasi root dengan konfigurasi lainnya. - Dan lain-lain. Silakan cari dengan perintah
zypper search <keyword>jika ada paket yang dibutuhkan yang ada dalam installer.
Setelah semua paket yang dibutuhkan yang ada dalam installer dipasang, cabut/keluarkan piringan DVD atau flashdisk installer. Lalu matikan kembali repositori installer tersebut:
su -c "zypper modifyrepo -dl"
Hidupkan kembali repo-oss, repo-non-oss, repo-update dan repo-update-non-oss. Untuk repo-update-non-oss ini hanya ada di Leap, sedangkan di Tumbleweed tidak ada:
su -c "zypper modifyrepo -e repo-oss repo-non-oss repo-update repo-update-non-oss"
Tambahkan repositori Packman
Setelah selesai dengan semua proses instalasi paket dari installer, jalankan ulang (reboot) komputer, lalu hubungkan ke internet. Lanjutkan dengan menambahkan repositori Packman.
Untuk openSUSE Leap 15.2 (untuk Leap selain 15.2, sesuaikan angka versinya):
su -c "zypper addrepo --name 'Packman Repository' https://repo.opensuse.id/packman/openSUSE_Leap_15.2/ repo-packman"
Untuk openSUSE Tumbleweed:
su -c "zypper addrepo --name 'openSUSE-Tumbleweed-Packman' https://repo.opensuse.id/packman/openSUSE_Tumbleweed/ repo-packman"
Nama setelah opsi --name silakan ubah sesuai keinginan supaya mudah diingat atau supaya cocok dengan penamaan repositori lainnya. Untuk melihat daftar repositori, gunakan perintah zypper repos.
Jika tidak mau repositori otomatis melakukan refresh, tambahkan opsi --no-refresh. Untuk melakukan refresh secara manual, jalankan perintah su -c "zypper refresh".
Jika ingin paket yang diinstall tidak otomatis terhapus setelah paket terpasang, tambahkan opsi --keep-packages. Semua file paket ada di /var/cache/zypp/packages.
Untuk opsi-opsi lainnya silakan jalankan perintah zypper help addrepo.
Setelah repositori Packman ditambahkan, update paket ke repositori tersebut:
su -c "zypper dup --from repo-packman"
Setelah selesai, coba VLC untuk memainkan berbagai format audio/video. Seharusnya proses ini sudah cukup untuk menjalankan berbagai format standar audio/video, seperti .mp3 atau .mp4, tanpa harus memasang lagi codec khusus.
Pasang paket lain yang tidak tersedia di installer
Paket-paket yang mungkin perlu ditambahkan:
-
opi. Untuk memasang paket dari OBS. Pastikan untuk memasangsudojuga jika memasang paket ini. Cara mencari dan memasang paket dari OBS denganopiadalah dengan perintahopi <keyword>, lalu ikuti petunjuknya. -
falkon. Jika tidak suka dengan Firefox. -
mpv. Jika Anda menganggap VLC terlalu bloated atau terlalu overkill. -
elisaatauclementine. Jika ingin memisahkan player musik dengan player video. Jangan lupa untuk memasanggstreamer-plugins-libav,gstreamer-plugins-good,gstreamer-plugins-baddangstreamer-plugins-uglyjika Anda memasangclementine, jika paket-paket tersebut tidak otomatis ikut terpasang sebagai dependensi. - Dan lain-lain. Silakan cari dengan perintah
zypper search <keyword>jika ada paket yang dibutuhkan yang tidak ada di dalam installer.
Untuk pengguna Desktop Environment atau Window Manager lain
Jika Anda ingin menggunakan Desktop Environment atau Window Manager lain, buat semua paket yang ada di sini sebagai acuan dan ganti dengan alternatif di Desktop Environment/Window Manager yang Anda gunakan. Misalnya ganti dolphin dengan nautilus atau thunar dan seterusnya.
Untuk pengguna Plasma 5 pun tidak perlu mengikuti daftar ini, karena saya juga tidak memasang semua yang ada di sini. Anda bisa bereksperimen dengan mengurangi atau menambahkan paket lainnya sesuai kebutuhan. Jika ada yang salah atau dirasa kurang pas, lakukan factory reset dan mulai lagi dari awal sampai menemukan setelan yang pas dengan selera pribadi. “No pain, no gain.”
Jika ada paket penting yang tidak tercantum di sini, kabari saya.
Tulisan ini dapat dibaca juga di: https://kikisyahadat.github.io/2020/09/07/minimal-custom-install-kde.html
Digest of YaST Development Sprint 107
The last two weeks of August the YaST team has kept the same modus operandi than the rest of the month, focusing on fixing bugs and polishing several internal aspects. But we also found some time to start working on some mid-term goals in the area of AutoYaST and storage management. Find below a summary of the most interesting stuff addressed during the sprint finished a week ago (sorry for the delay).
- Making the AutoYaST profiles more flexible by means of Embedded Ruby (ERB). That’s still a work in progress and we will publish a separate blog post with more details and examples soon.
- When reporting errors in a certain element of an AutoYaST profile to the user, do it with the same syntax that is used when specifying ask-lists.
- Preliminary version of a menu bar for the Partitioner. Again, this is still in progress, so stay tuned for more news.
- Better handling of corrupted or completely incorrect AutoYaST profiles.
Although it doesn’t look like too much, the bright side is that we are already deep into the next sprint. So you will not have to wait much to have more news from us. Meanwhile, stay safe and fun!
Screensharing with MS Teams and KDE: Black Screen
In the day job we use Microsoft Teams. The good news is that it is running on the Linux Desktop, and specifically KDE. So far, so good, however, there was a problem with screensharing for me.
Whenever I tried to share my KDE screen, the screen became black, surrounded with a red rectangle as indicator for the shared area. The people who I shared with also just saw the black area, and also the mouse pointer as me.
The problem is described in a bugreport and there are two ways of solving it:
- Enable compositing: The red indicator rectangle requires that the window manager supports compositing. KWin can of course do that, and with that enabled, sharing works fine including the red rectangle.
- If compositing can or should not be used there is another workaround: As the bug report shows, renaming the file
/usr/share/teams/resources/app.asar.unpacked/node_modules/slimcore/bin/rect-overlayso that it is not used by teams fixes it as well. Obviously you wont have the red rectangle with this solution.
That said, it is of course preferable to use an open source alternative to Teams to help these evolve.
Raspberry Pi cluster with k3s & Salt (Part 1)
I have been running some workloads on Raspberry Pi’s / Leap for some time. I manage them using salt-ssh along with a Pine64 running OpenBSD. You can read more about using Salt this way in my Using Salt like Ansible post.
The workloads ran on containers, which were managed with systemd and podman. Salt managed the systemd service files on /etc/systemd, which start, monitor and stops the containers. For example, the homeassistant.sls state, managed the service file for mosquitto:
homeassistant.mosquito.deploy:
file.managed:
- name: /root/config/eclipse-mosquitto/mosquitto.conf
- source: salt://homeassistant/files/mosquitto/mosquitto.conf
homeassistant.eclipse-mosquitto.container.service:
file.managed:
- name: /etc/systemd/system/eclipse-mosquitto.service
- contents: |
[Unit]
Description=%N Podman Container
After=network.target
[Service]
Type=simple
TimeoutStartSec=5m
ExecStartPre=-/usr/bin/podman rm -f "%N"
ExecStart=/usr/bin/podman run -ti --rm --name="%N" -p 1883:1883 -p 9001:9001 -v /root/config/eclipse-mosquitto:/mosquitto/config -v /etc/localtime:/etc/localtime:ro --net=host docker.io/library/eclipse-mosquitto
ExecReload=-/usr/bin/podman stop "%N"
ExecReload=-/usr/bin/podman rm "%N"
ExecStop=-/usr/bin/podman stop "%N"
Restart=on-failure
RestartSec=30
[Install]
WantedBy=multi-user.target
service.running:
- name: eclipse-mosquitto
- enable: True
- require:
- pkg: homeassistant.podman.pkgs
- file: /etc/systemd/system/eclipse-mosquitto.service
- file: /root/config/eclipse-mosquitto/mosquitto.conf
- watch:
- file: /root/config/eclipse-mosquitto/mosquitto.conf
The Salt state also made sure the right packages and other details where ready before the service was started.
This was very simple and worked well so far. One disadvantage is that the workloads are tied to a particular Pi. I was not going to make the setup more complex by building my own orchestrator.
Another disadvantage is that I was pulling the containers into the SD card. I was not hoping for a long life of these. After it died, I took it as a good opportunity to re-do this setup.
My long term goal would be to netboot the Pi’s, and have the storage mounted. I am not very familiar with all the procedure, so I will go step by step.
I decided for the the initial iteration:
- k3s (Lightweight Kubernetes) on the Pi’s
- The k3s server to use a USB disks/SSDs with btrfs as storage
- The worker nodes to /var/lib/rancher/k3s from USB storage
- Applying the states over almost stock Leap 15.2 images should result in a working cluster
All the above managed with salt-ssh tree on a git repository just like I was used to
k3s installation
We start by creating k3s/init.sls. For the k3s state I defined a minimal pillar defining the server and the shared token:
k3s: token: xxxxxxxxx server: rpi03
The first part of the k3s state ensures cgroups are configured correctly and disables swap:
k3s.boot.cmdline:
file.managed:
- name: /boot/cmdline.txt
- contents: |
cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory
k3s.disable.swap:
cmd.run:
- name: swapoff -a
- onlyif: swapon --noheadings --show=name,type | grep .
As the goal was to avoid using the SD card, the next state makes sure /var/lib/rancher/k3s is a mount. I have to admit I wasted quite some time getting right the state for the storage mount. Using mount.mounted did not work because it is buggy and took different btrfs subvolume mounts from the same device as the same mount.
k3s.volume.mount:
mount.mounted:
- name: /var/lib/rancher/k3s
- device: /dev/sda1
- mkmnt: True
- fstype: btrfs
- persist: False
- opts: "subvol=/@k3s"
I resorted then to write my own state. I discovered the awesome findmnt command, and my workaround looked like:
k3s.volume.mount:
cmd.run:
- name: mount -t btrfs -o subvol=/@{{ grains['id'] }}-data /dev/sda1 /data
- unless: findmnt --mountpoint /data --noheadings | grep '/dev/sda1[/@k3s]'
- require:
- file: k3s.volume.mntpoint
This turned later to be a pain, as the k3s installer started k3s without caring much if this volume was mounted or not. Then I remembered: systemd does exactly that. It manages mount and dependencies. This simplified the mount state to:
k3s.volume.mount:
file.managed:
- name: /etc/systemd/system/var-lib-rancher-k3s.mount
- contents : |
[Unit]
[Install]
RequiredBy=k3s
RequiredBy=k3s-agent
[Mount]
What=/dev/sda1
Where=/var/lib/rancher/k3s
Options=subvol=/@k3s
Type=btrfs
cmd.run:
- name: systemctl daemon-reload
- onchanges:
- file: k3s.volume.mount
service.running:
- name: var-lib-rancher-k3s.mount
The k3s state works as follows: it runs the installation script in server or agent mode depending if the pillar k3s:server entry matches with the node where the state is applied.
{%- set k3s_server = salt['pillar.get']('k3s:server') -%}
{%- if grains['id'] == k3s_server %}
{%- set k3s_role = 'server' -%}
{%- set k3s_suffix = "" -%}
{%- else %}
{%- set k3s_role = 'agent' -%}
{%- set k3s_suffix = '-agent' -%}
{%- endif %}
k3s.{{ k3s_role }}.install:
cmd.run:
- name: curl -sfL https://get.k3s.io | sh -s -
- env:
- INSTALL_K3S_TYPE: {{ k3s_role }}
{%- if k3s_role == 'agent' %}
- K3S_URL: "https://{{ k3s_server }}:6443"
{%- endif %}
- INSTALL_K3S_SKIP_ENABLE: "true"
- INSTALL_K3S_SKIP_START: "true"
- K3S_TOKEN: {{ salt['pillar.get']('k3s:token', {}) }}
- unless:
# Run install on these failed conditions
# No binary
- ls /usr/local/bin/k3s
# Token changed/missing
- grep '{{ salt['pillar.get']('k3s:token', {}) }}' /etc/systemd/system/k3s{{ k3s_suffix }}.service.env
# Changed/missing server
{%- if k3s_role == 'agent' %}
- grep 'K3S_URL=https://{{ k3s_server }}:6443' /etc/systemd/system/k3s{{ k3s_suffix }}.service.env
{%- endif %}
- require:
- service: k3s.volume.mount
- service: k3s.kubelet.volume.mount
k3s.{{ k3s_role }}.running:
service.running:
- name: k3s{{ k3s_suffix }}
- enable: True
- require:
- cmd: k3s.{{ k3s_role }}.install
Workloads
The next step is to move workloads like homeassistant into this setup.
k3s allows to automatically deploy manifests located in /var/lib/rancher/server/manifests. We can deploy eg. mosquitto like the following:
homeassistant.mosquitto:
file.managed:
- name: /var/lib/rancher/k3s/server/manifests/mosquitto.yml
- source: salt://homeassistant/files/mosquitto.yml
- require:
- k3s.volume.mount
With mosquito.yml being:
---
apiVersion: v1
kind: Namespace
metadata:
name: homeassistant
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mosquitto
namespace: homeassistant
spec:
replicas: 1
selector:
matchLabels:
app: mosquitto
template:
metadata:
labels:
app: mosquitto
spec:
containers:
- name: mosquitto
image: docker.io/library/eclipse-mosquitto
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 1883
imagePullPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: mosquitto
namespace: homeassistant
spec:
ports:
- name: mqtt
port: 1883
targetPort: 1883
protocol: TCP
selector:
app: mosquitto
Homeassistant is no different, except that we use a ConfigMap resource to store the configuration and define an Ingress resource to access it from the LAN:
---
apiVersion: v1
kind: Namespace
metadata:
name: homeassistant
---
apiVersion: v1
kind: ConfigMap
metadata:
name: homeassistant-config
namespace: homeassistant
data:
configuration.yaml: |
homeassistant:
auth_providers:
- type: homeassistant
- type: trusted_networks
trusted_networks:
- 192.168.178.0/24
- 10.0.0.0/8
- fd00::/8
allow_bypass_login: true
name: Home
latitude: xx.xxxx
longitude: xx.xxxx
elevation: xxx
unit_system: metric
time_zone: Europe/Berlin
frontend:
config:
http:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: homeassistant
namespace: homeassistant
spec:
replicas: 1
selector:
matchLabels:
app: homeassistant
template:
metadata:
labels:
app: homeassistant
spec:
containers:
- name: homeassistant
image: homeassistant/raspberrypi3-64-homeassistant:stable
volumeMounts:
- name: config-volume-configuration
mountPath: /config/configuration.yaml
subPath: configuration.yaml
livenessProbe:
httpGet:
scheme: HTTP
path: /
port: 8123
initialDelaySeconds: 30
timeoutSeconds: 30
resources:
requests:
memory: "512Mi"
cpu: "100m"
limits:
memory: "1024Mi"
cpu: "500m"
ports:
- containerPort: 8123
protocol: TCP
imagePullPolicy: Always
volumes:
- name: config-volume-configuration
configMap:
name: homeassistant-config
items:
- key: configuration.yaml
path: configuration.yaml
---
apiVersion: v1
kind: Service
metadata:
name: homeassistant
namespace: homeassistant
spec:
selector:
app: homeassistant
ports:
- port: 8123
targetPort: 8123
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: homeassistant
namespace: homeassistant
annotations:
kubernetes.io/ingress.class: traefik
traefik.frontend.rule.type: PathPrefixStrip
spec:
rules:
- host: homeassistant.int.mydomain.com
http:
paths:
- path: /
backend:
serviceName: homeassistant
servicePort: 8123
Setting up Ingress was the most time consuming part. It took me a while to figure out how it was supposed to work, and customizing the Treafik Helm chart is not intuitive to me. While homeassistant was more straightforward as it is a simple HTTP behind SSL proxy service, the Kubernetes dashboard is already deployed with SSL inside the cluster. I am still figuring out how ingress.kubernetes.io/protocol: https, traefik.ingress.kubernetes.io/pass-tls-cert: "true" (oh, don’t forget the quotes!) or insecureSkipVerify work toghether and what is the best way to expose it to the LAN.
In a future post, I will describe the dashboards setup, and other improvements.
Reasons to hire inexperienced engineers
There are many reasons to consider hiring inexperienced software engineers into your team, beyond the commonly discussed factors of cost and social responsibility.
Hire to maximise team effectiveness; not to maximise team size. Adding more people increases the communication and synchronisation overhead in the team. Growing a team has rapidly diminishing returns.
However, adding the right people, perspectives, skills, and knowledge into a team can transform that team’s impact. Instantly unblocking problems that would have taken days of research. Resolving debates that would have paralysed. The right balance between planning and action.
It’s easy to undervalue inexperienced software engineers as part of a healthy team mix. While teams made up of entirely senior software engineers can be highly effective. There are many benefits beyond cost and social responsibility for hiring entry level and junior software engineers onto your team.
Fresh Perspectives
Experienced engineers have learned lots of so called “best practices” or dogma. Mostly these are good habits that are safer ways of working, save time, and aid learning. On the other hand sometimes the context has changed and these practices are no longer useful, but we carry on doing them anyway out of habit. Sometimes there’s a better way, now that tech has moved on, and we haven’t even stopped to consider.
There’s a lot of value in having people on the team who’ve yet to develop the same biases. People who’ll force you to think through and articulate why you do the things you’ve come to take for granted. The reflection may help you spot a better way.
To take advantage you need sufficient psychological safety that anyone can ask a question without fear of ridicule. This also benefits everyone.
Incentive for Simplicity and Safety
A team of experienced engineers may be able to tolerate a certain amount of accidental code complexity. Their expertise may enable them to work relatively safely without good test safety nets and gaps in their monitoring. I’m sure you know better ;)
Needing to make our code simple enough to understand for a new software engineer to be able to understand and change it exerts positive pressure on our code quality.
Having to make it safe to fail. Protecting everyone on the team from being able to make a change that takes down production or corrupts data helps us all. We’re all human.
Don’t have any junior engineers? What would you do differently if you knew someone new to programming was joining your team next week? Which of those things should you be doing anyway? How many would pay back their investment even with experienced engineers? How much risk and complexity are you tolerating? What’s its cost?
Growth opportunity for others
Teaching, advising, mentoring, coaching less experienced people on the team can be a good development opportunity for others. Teaching helps deepen your own understanding of a topic. Practising your ability to lift others up will serve you well.
Level up fast
It can be humbling how swiftly new developers can get up to speed and become highly productive. Particularly in an environment that really values learning. Pair programming can be a tremendous accelerator for learning through doing. True pairing, i.e. solving problems together, rather than spoonfeeding or observing.
Tenure
Amount of software engineering experience is one indicator for the impact an individual can have. Amount of experience within your organisation is also relevant. If you only hire senior people and your org is not growing fast enough to provide them with further career development opportunities they are more likely to leave to find growth opportunities. It can be easier to find growth opportunities for people earlier in their career.
A mix of seniorities can help increase the average tenure of developers in your organisation—assuming you will indeed support them with their career development.
Action over Analysis
Junior engineers often bring a healthy bias towards getting on with doing things over excessive analysis. Senior engineers sometimes get stuck evaluating foreseen possibilities, finding “the best tool for the job”, or debating minutiae ad nauseam. Balancing the desires to do the right things right, with the desire to do something, anything quickly on a team can be transformational.
Hire Faster
There’s more inexperienced people. It’s quicker to find people if we relax our experience and skill requirements. Some underrepresented minorities may be less underrepresented at more junior levels.
The inexperienced engineer you hire today could be the senior engineer you need in years to come.
To ponder
What other reasons have I missed? In what contexts is the opposite true? When would you only hire senior engineers?
The post Reasons to hire inexperienced engineers appeared first on Benji's Blog.
What would you like to see most in minix?
I’m working on a couple of presentations and I wanted to share this nugget of joy with anyone who hasn’t actually read it.
Path: gmdzi!unido!fauern!ira.uka.de!sol.ctr.columbia.edu!zaphod.mps. ohio-state.edu!wupost!uunet!mcsun!news.funet.fi!hydra!klaava!torvalds From: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds) Newsgroups: comp.os.minix Subject: What would you like to see most in minix? Summary: small poll for my new operating system Keywords: 386, preferences Message-ID: <1991Aug25.205708.9541@klaava.Helsinki.FI> Date: 25 Aug 91 20:57:08 GMT Organization: University of Helsinki Lines: 20 Hello everybody out there using minix - I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready. I'd like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things). I've currently ported bash(1.08) and gcc(1.40), and things seem to work. This implies that I'll get something practical within a few months, and I'd like to know what features most people would want. Any suggestions are welcome, but I won't promise I'll implement them :-) Linus (torvalds@kruuna.helsinki.fi) PS. Yes - it's free of any minix code, and it has a multi-threaded fs. It is NOT protable (uses 386 task switching etc), and it probably never will support anything other than AT-harddisks, as that's all I have :-(.
Mañana del segundo día de Akademy 2020 en línea
Sigue adelante el evento más importante de la Comunidad KDE Internacional. Bienvenidos a la mañana del segundo día de Akademy 2020 en línea, un resumen de lo que ha dado de sí la jornada matinal del sábado la cual ha sido muy fructífera y variada. Como es habitual, me gusta partir estas entradas en mañana y tarde para no tener artículos excesivamente largos. Mañana la jornada vespertina.
Mañana del segundo día de Akademy 2020 en línea
Tras el gran vídeo de presentación que espero que hayáis visto antes de empezar a leer estas líneas (sale un servidor, miembros de KDE España y un crisol de personas de todo el mundo que dan muestra de la diversidad de la Comunidad) hoy toca comentar lo que dio de sí las charlas de ayer.
Tenéis toda la información en la sección de noticias de la Comunidad KDE (el dot) así que aquí, por no repetir, solo voy a dar pinceladas:
Aleix Pol, Presidente de KDE, comenzó el día puntualmente a las 8:50 UTC reproduciendo un video hecho por Bhavisha Dhruve y Skye Fentras dando la bienvenida a todos al evento, que es el que habéis visto arriba.

Después, Aleix explicó las circunstancias muy especiales de la Akademy de este año y presentó a la primera oradora principal Gina Häußge.
El resto de la mañana se puede dividir en dos grandes bloques: Objetivos KDE y charlas relámpago.

De esta forma tuvimos a Jonathan Riddell, Niccolo Venerandi y Méven Car hablando cada uno sobre los objetivos de la Comunidad de KDE: las Aplicaciones, la consistencia y Wayland.
Fueron tres charlas independientes que confluyeron a una mesa redonda donde Niccolo Venerandi, Méven Car, Jonathan Riddell, Lydia Pintscher y Adam SzopaCreo hablaron largo tendido sobre dichos objetivos.
Creo que no se podía empezar mejor una Akademy que dejando sobre mesa qué quiere conseguir la Comunidad y cómo lo está haciendo.

Tras este primer bloque llegaron las charlas relámpago con:
- Andreas Cord-Landweh hablando de SPDX.
- Shawn Rutledge nos presentó «Editing Markdown with QTextDocument»
- Carl Schwan expuso «How to Create a Good Promotional Website for your Project.»
Y hasta aquí la mañana. Si no hay nada que lo impida mañana comento la jornada vespertina.
Material audiovisual Akademy 2020 en línea
Una de las cosas positivas de esta Akademy es que todo el material debe ser emitido digitalmente, lo cual hace que ya puede estar listo para ser compartido en diferido, aunque sea sin editar.
De esta forma, en caso de que te lo hayas perdido, las charlas de hoy ya están disponibles en línea en tres bloques – uno para la mañana y dos para cada una de las habitaciones utilizadas por la tarde. También se ha grabado grabado todas las charlas por separado y pronto podrás verlas en las plataformas de vídeo disponibles de KDE.
Mencoba Destop Pantheon pada openSUSE Tumbleweed

- Pasang openSUSE Tumbleweed
- Tambahkan repo Pantheon
sudo zypper https://download.opensuse.org/repositories/X11:/Pantheon:/Branch/openSUSE_Tumbleweed/ X11:Pantheon - Segarkan
sudo zypper ref - Pasang pola Pantheon
sudo zypper in -t pattern pantheon - Have Fun!