View previous topic :: View next topic |
Author |
Message |
Erdie Advocate
Joined: 20 May 2004 Posts: 2650 Location: Heidelberg - Germany
|
Posted: Sun Oct 20, 2024 10:07 am Post subject: Gentoo Update Skript |
|
|
Moin moin,
ich habe mir eine Update Skript für die routinemäßigen Updates gebastelt. Das möchte ich hier mal vorstellen. Vielleicht findet der eine oder andere das ja gut und möchte es haben. In meinem Fall heißt es "worldupdate":
Code: |
#!/bin/bash
# Fehlerfunktion für einheitliche Fehlerbehandlung
error_exit() {
local message="$1"
telegram "Beim Worldupdate auf Kellerkind ist ein Fehler aufgetreten: $message"
exit 1
}
# Funktion für das World-Update
do_world_update() {
if [[ $1 != "nosync" ]]; then
emaint sync -a || error_exit "emaint sync fehlgeschlagen"
fi
emerge -avuDN --with-bdeps=y @world && \
emerge @preserved-rebuild && \
emerge -a --depclean && \
revdep-rebuild -p && \
eix-update || error_exit "Ein Schritt des World-Updates ist fehlgeschlagen"
}
# Funktion für fstrim
do_fstrim() {
if fstrimcount; then
echo "fstrimcount erreicht, führe fstrim aus..."
fstrim -v /tmp && fstrim -v /var/tmp || error_exit "fstrim ist fehlgeschlagen"
else
echo "fstrimcount nicht erreicht, überspringe fstrim"
fi
}
# Hauptfunktion
main() {
do_world_update "$1" && \
do_fstrim && \
(
echo "eclean distfiles in 5s. Ctrl-c to interrupt .."
sleep 5
eclean distfiles
) || error_exit "Ein Schritt des Hauptprozesses ist fehlgeschlagen"
}
# Skript ausführen
main "$1"
|
Die Kommentare sind jetzt in deutsch, darüber kann man streiten und/oder es ändern. Das Kommando "telegram" sendet eine Nachricht auf meinen Telegram Bot, falls was schief gelaufen ist.
Das verwendete Skrip "fstrimdount", welches hier aufgerufen wird, sorgt dafür, dass fstrim nur bei jedem 20zigsten Update auf die SSDs, die unter /tmp und /var/tmp liegen ausgeführt wird. Für die root Platte mache ich das ab und wann manuelle, aber da spielt ja weniger Musik. Daher ist das selten nötig.
fstrimdount:
Code: |
#!/bin/bash
# Konfigurationsvariablen
CONFIG_DIR="$HOME/.config/counter"
COUNTER_FILE="$CONFIG_DIR/fstrimcount"
MAX_COUNT=19
# Funktion zum Erstellen des Konfigurationsverzeichnisses, falls es nicht existiert
create_config_dir() {
if [[ ! -d "$CONFIG_DIR" ]]; then
mkdir -p "$CONFIG_DIR" || { echo "Fehler: Konnte Verzeichnis $CONFIG_DIR nicht erstellen" >&2; exit 1; }
fi
}
# Funktion zum Lesen des Zählerstands
read_counter() {
if [[ ! -f "$COUNTER_FILE" ]]; then
echo 0 > "$COUNTER_FILE"
fi
COUNTER=$(cat "$COUNTER_FILE")
if ! [[ "$COUNTER" =~ ^[0-9]+$ ]]; then
echo "Fehler: Ungültiger Zählerstand in $COUNTER_FILE" >&2
exit 1
fi
}
# Funktion zum Aktualisieren des Zählerstands
update_counter() {
COUNTER=$((COUNTER + 1))
if [[ $COUNTER -gt $MAX_COUNT ]]; then
COUNTER=0
echo "fstrim wird ausgeführt .."
echo "$COUNTER" > "$COUNTER_FILE"
return 0
else
echo "Kein fstrim!"
echo "$COUNTER" > "$COUNTER_FILE"
return 1
fi
}
# Hauptfunktion
main() {
create_config_dir
read_counter
echo "Aktueller fstrim count: $COUNTER"
update_counter
exit $?
}
# Skript ausführen
main
|
Was haltet Ihr davon? _________________ Desktop AMD Ryzen 9 5900X 32GB RAM, Asus GF GTX 1060.
Notebook Tuxedo Pulse 15 Gen1 AMD Ryzen 7 4800H mit Radeon Vega 7
Raspberry Pi 1 + 2 + 3B+ + Zero W |
|
Back to top |
|
|
firefly Watchman
Joined: 31 Oct 2002 Posts: 5320
|
Posted: Sun Oct 20, 2024 10:30 am Post subject: |
|
|
Das eix-update direkt aufrufen kannst man sich sparen.
das eix paket liefert ein script mit was man als postsync aktion aktivieren kann.
Das script heißt "/usr/bin/eix-postsync"
Und wenn man das script als symlink unter "/etc/portage/postsync.d" verlinkt (z.b. mit namen 50-eix-postsync) dann wird die eix datenbank direkt nach dem sync via emaint/portage aktualisiert.
Ist bei dir /tmp auf einem Datenträger abgelegt? Meist ist das als tmpfs im RAM gemounted. Wobei man das im falle von systemd nicht selbst machen muss AFAIK aber wenn man openrc nutzt. (https://wiki.gentoo.org/wiki/Tmpfs)
Was ist dein gedanke dabei fstrim nur bei jedem 20. Update laufen zu lassen?
Es häufiger laufen zu lassen ist kein Problem für eine SSD. Da ich systemd nutze kann ich da jetzt nur davon reden wie es dort gelöst ist.
Für systemd gibt es einen timer (von sys-apps/util-linux bereitgestellt), welcher fstrim einmal pro woche laufen lässt.
Und hier wird fstrim für alle Dateisysteme, welcher in der fstab in "/proc/self/mountinfo" aufgeführt sind. _________________ Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn. |
|
Back to top |
|
|
Erdie Advocate
Joined: 20 May 2004 Posts: 2650 Location: Heidelberg - Germany
|
Posted: Sun Oct 20, 2024 11:02 am Post subject: |
|
|
Angeblich sollen SSDs bei zu häufigem fstrim schneller verschleißen. Evtl. ist diese Info ja falsch. Bis jetzt dachte ich es wäre so. /var/tmp und /tmp sind bei mir auf separaten SSDs gemountet. _________________ Desktop AMD Ryzen 9 5900X 32GB RAM, Asus GF GTX 1060.
Notebook Tuxedo Pulse 15 Gen1 AMD Ryzen 7 4800H mit Radeon Vega 7
Raspberry Pi 1 + 2 + 3B+ + Zero W |
|
Back to top |
|
|
firefly Watchman
Joined: 31 Oct 2002 Posts: 5320
|
|
Back to top |
|
|
sMueggli Guru
Joined: 03 Sep 2022 Posts: 497
|
Posted: Mon Oct 21, 2024 8:43 am Post subject: |
|
|
Fstrim würde ich auch nicht in ein Skript packen. Bei Dir würde Fstrim nur ausgeführt, falls vorher kein Fehler auftritt.
Ohne Systemd wäre ein CronJob wohl das einfachste: https://wiki.gentoo.org/wiki/SSD#Periodic_fstrim_jobs
Man sollte durchgehende Grossschreibung nur für System- und Umgebungsvariablen nutzen. Wenn Du für deine Skripte keine Syntaxhervorhebung nutzt, bist Du selber schuld. Und falls Du Syntaxhervorhebung nutzt, dann brauchst du die "GROSSSCHREIBUNG" der lokalen Variablen nicht, da Variablen farblich hervorgehoben werden.
Funktioniert "update_counter()" so wie erwartet?
Du definierst MAX_COUNT als Variable, aber vielleicht solltest/möchtest Du eine Konstante setzen? Dadurch wäre die Variable vor Veränderungen geschützt, ergo nicht mehr variabel, sondern konstant. Eine Möglichkeit ist am Schluss von https://openbook.rheinwerk-verlag.de/shell_programmierung/shell_004_000.htm zu finden.
Je nach System hast Du schon eine passende XDG_* Variable gesetzt und könntest dir "CONFIG_DIR" einsparen. |
|
Back to top |
|
|
Josef.95 Advocate
Joined: 03 Sep 2007 Posts: 4669 Location: Germany
|
Posted: Mon Oct 21, 2024 9:27 am Post subject: |
|
|
Vorschlag bezüglich Code: | emerge -avuDN --with-bdeps=y @world && \
emerge @preserved-rebuild && \
emerge -a --depclean && \
revdep-rebuild -p && \ | Nimm beim @world Update statt --newuse, -N besser --changed-use, -U
das spart viele unnötige rebuilds.
Und, --depclean sollte immer vorm @reserved-rebuild ausgeführt werden (nicht hinterher).
revdep-rebuild braucht man idR nicht mehr. |
|
Back to top |
|
|
Erdie Advocate
Joined: 20 May 2004 Posts: 2650 Location: Heidelberg - Germany
|
Posted: Wed Oct 23, 2024 6:15 pm Post subject: |
|
|
alles klar, ich werde das ändern! Danke fürs Feedback. _________________ Desktop AMD Ryzen 9 5900X 32GB RAM, Asus GF GTX 1060.
Notebook Tuxedo Pulse 15 Gen1 AMD Ryzen 7 4800H mit Radeon Vega 7
Raspberry Pi 1 + 2 + 3B+ + Zero W |
|
Back to top |
|
|
Erdie Advocate
Joined: 20 May 2004 Posts: 2650 Location: Heidelberg - Germany
|
Posted: Wed Oct 23, 2024 6:26 pm Post subject: |
|
|
sMueggli wrote: |
Funktioniert "update_counter()" so wie erwartet?
|
Ja, an sich schon, sollte es etwa nicht bzw. stimmt daran etwas nicht? _________________ Desktop AMD Ryzen 9 5900X 32GB RAM, Asus GF GTX 1060.
Notebook Tuxedo Pulse 15 Gen1 AMD Ryzen 7 4800H mit Radeon Vega 7
Raspberry Pi 1 + 2 + 3B+ + Zero W |
|
Back to top |
|
|
Erdie Advocate
Joined: 20 May 2004 Posts: 2650 Location: Heidelberg - Germany
|
Posted: Thu Oct 24, 2024 8:19 am Post subject: |
|
|
sMueggli wrote: | Fstrim würde ich auch nicht in ein Skript packen. Bei Dir würde Fstrim nur ausgeführt, falls vorher kein Fehler auftritt.
|
Das ist meine volle Absicht. fstrim ist ja, sagen wir mal, nice to have. Wenn man es nicht ausführt, machte es auch nichts. Ich habe es in den Skript gepackt, damit es gelegentlich ab und zu mal läuft weil ich es sonst vergesse. Eine Cronjob wäre eine Alternative. In diesem Fall wird es bei jedem 20zigsten wordupdate ausgeführt. Im Prinzip hängt ja die Notwendigkeit fstrim auszurführen von den Intensittät der Plattennutzung ab und da die Updates mit Abstand den größten IO machen, hängt hier nun die fstrim -Nutzung unmittelbar von der Frequenz der Updates ab, was ich nicht ganz falsch finde. Klar, man kann das auch anders machen, keine Frage.
Danke fürs Feedback. _________________ Desktop AMD Ryzen 9 5900X 32GB RAM, Asus GF GTX 1060.
Notebook Tuxedo Pulse 15 Gen1 AMD Ryzen 7 4800H mit Radeon Vega 7
Raspberry Pi 1 + 2 + 3B+ + Zero W |
|
Back to top |
|
|
sMueggli Guru
Joined: 03 Sep 2022 Posts: 497
|
Posted: Thu Oct 24, 2024 8:21 am Post subject: |
|
|
Erdie wrote: | sMueggli wrote: |
Funktioniert "update_counter()" so wie erwartet?
|
Ja, an sich schon, sollte es etwa nicht? |
Ja, funktioniert. Ich war verwirrt wegen
Code: | echo "$COUNTER" > "$COUNTER_FILE" |
und hatte das mit Code: | echo "$COUNTER > $COUNTER_FILE" | verwechselt. |
|
Back to top |
|
|
krelh n00b
Joined: 05 Jun 2024 Posts: 25
|
Posted: Fri Oct 25, 2024 8:05 am Post subject: |
|
|
Hat es einen Grund, dass Du den Sync mit emaint und nicht mit eix-Sync machst? Damit würdest Du Dir doch einen Schritt sparen oder? Sorry, ich bin noch recht frisch bei Gentoo… Es wundert mich allerdings, wie viele Sync Befehle es gibt:
emerge-websync
emerge —sync
eix-sync
emaint sync -a |
|
Back to top |
|
|
firefly Watchman
Joined: 31 Oct 2002 Posts: 5320
|
Posted: Fri Oct 25, 2024 9:53 am Post subject: |
|
|
krelh wrote: | Hat es einen Grund, dass Du den Sync mit emaint und nicht mit eix-Sync machst? Damit würdest Du Dir doch einen Schritt sparen oder? Sorry, ich bin noch recht frisch bei Gentoo… Es wundert mich allerdings, wie viele Sync Befehle es gibt:
emerge-websync
emerge —sync
eix-sync
emaint sync -a |
emerge —sync und emaint sync sind das gleiche. AFAIK wird bei emerge --sync intern emaint sync aufgerufen.
eix-sync braucht man nicht wenn man die entsprechenden postsync skripte, welche eix mitliefert, konfiguriert (wie ich schon geschrieben habe) _________________ Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn. |
|
Back to top |
|
|
Erdie Advocate
Joined: 20 May 2004 Posts: 2650 Location: Heidelberg - Germany
|
Posted: Fri Oct 25, 2024 5:04 pm Post subject: |
|
|
Anbei das Skript, welches die Nachticht auf den Telegram Bot sendet:
Code: |
#!/bin/bash
# Check, if a parameter ist given
if [ -z "$1" ]; then
echo "Please provide a message as parameter"
exit 1
fi
# Bot-Token and Chat-ID
BOT_TOKEN="<MeinToken>"
CHAT_ID="<MeineBotId>"
# Message to be sent
MESSAGE="$1"
# API-URL
API_URL="https://api.telegram.org/bot$BOT_TOKEN/sendMessage"
# Sending the message
curl -s -X POST -H 'Content-Type: application/json' -d "{\"chat_id\": \"$CHAT_ID\", \"text\": \"$MESSAGE\", \"disable_notification\": false}" $API_URL
echo "Fertig!"
|
Das könnte ja auch von Interesse sein. _________________ Desktop AMD Ryzen 9 5900X 32GB RAM, Asus GF GTX 1060.
Notebook Tuxedo Pulse 15 Gen1 AMD Ryzen 7 4800H mit Radeon Vega 7
Raspberry Pi 1 + 2 + 3B+ + Zero W |
|
Back to top |
|
|
|