Linux: Cum fac...?

Am testat intre timp X prin ssh direct pe PC, fara tunel ssh prin router si se misca marginal mai bine, dar tot inutilizabil. Am vazut ca era trafic de 5-6 MB/s timp de vreo 10s ori de cate ori se schimba ceva pe ecran. Compresia nu era activata.
Am testat si cu compresie. Merge muuult mai bine, dar operatiile gen scroll tot inutilizabile sunt.

Ce imi place la X este ca pot sa rulez "firefox ; acpitool -s" si daca imi moare internetul acolo unde ma aflu, calculatorul nu ramane deschis.
 
Last edited:
Mda, acu 40 de ani, când a fost creat X11, probabil nu se făcea scroll-ul la fel ca acum :smile:. Adică aplicațiile arătau așa https://upload.wikimedia.org/wikipedia/commons/d/d4/X-Window-System.png

Și nici tunelul SSH nu e făcut pentru transferuri mari de date, e optimizat pentru latență (TCP window size mic), dar asta înseamnă că te penalizează la orice transfer mai mare de date - latența rețelei o să influențeze foarte mult transferurile mari. Legat de asta, vezi că și SSH poate suporta compresie, dar depinde de hw dacă e mai bine sau mai rău cu compress. Și poți să te uiți și dacă alți algoritmi de criptare ajută la asta (mai ales ceva suportat de hardware).

Altă problemă cu X11 e că trebuie să trimită TOT ce se modifică, și asta e problema pe care o vezi la scroll - fiecare animație de scroll, cât de mică, se trimite, pentru că altfel nu mai știe ce să randeze. Pe când protocoalele gen VNC pot tăia latența prin skip, adică "ah, a făcut aplicația scroll, fac un screenshot, îl trimit, mai fac după X milisecunde unul și vedem". În firefox e posibil să te ajute să dai disable la smooth scroll.
 
Last edited:
find /lib/modules -name *.ko -exec echo "{}" \;
... imi printeaza toate fisierele .ko cu tot cu path

find /lib/modules -name *.ko -exec basename "{}" \;
... imi printeaza toate .ko fara path, doar numele fisierului

echo $(basename "/lib/modules/...ceva.ko")
... imi printeaza ceva.ko fara path, doar numele fisierului

Dar combinatia:
find /lib/modules -name *.ko -exec echo $(basename "{}") \;
... imi printeaza toate .ko cu tot cu path. De ce?

Pentru că:
Ai un sub-shell acolo, care se execută înainte de ce e în -exec.

Intre timp m-am mai luminat.
Pentru cei care isi bat capul cu subshell-uri in find -exec si pe net gasesc solutia cu -exec sh -c '<comanda>', exista si o varianta mai simpla, in special pentru scripturi unde trebuie executate mai multe comenzi
for i in $(find /dir -blabla) ; do <comanda $i> ; ... ; done
 
Diverse probleme btrfs:
[...]
2) Fac subvolume in root-ul curent. Fac snapshot-uri la root si subvolume. La un moment dat se duce naibii root-ul. Daca fac snapshot rw dupa unul din backup-uri si il setez root defaut, cum fac sa apara subvolumele care erau sub root-ul initial in asta nou? Trebuie sa tin minte care erau alea (am multe!) si prin ce directoare erau si sa le fac si lor snapshot-uri noi in root-ul nou? Dar cum le fac snapshot-uri daca nu le mai am in root-ul nou?
Nu trebuie snapshot la subvolume, dar trebuie facut manual:
btrfs sub set-default pentru noul root
in /etc/fstab facut mount cu optiunea subvolid=<id> pentru fiecare subvolum

Mai nou, nu mai folosesc subvolumul 5 ca default. In subvolumul 5 am direct directoarele/subvolumele din partitia respectiva, doar ele si backup-urile. Volumul default al partitiei este doar unul dintre ele. Toate subvolumele se monteaza din fstab cu subvol=path ca e mai usor decat cu id-uri. Daca stric vreun subvolum, pur si simplu montez subvolid=5 undeva si schimb directoarele intre ele.
 
Last edited:
Montarea cu ID are o logică, chiar dacă reinstalezi/dai reset acel ID se păstrează, pe când volumele/subvolumele cum le spui tu se pot schimba foarte ușor ca path. Și nu este deloc "mai ușor" cu path, este doar mai riguros by ID.
 
E mai usor cu path, ca pot sa redenumesc directorul volumului vechi, sau sa il sterg, si fac in locul lui un snapshot din backup. Cu chestia asta nu trebuie sa mai modific fstab-ul cu id-ul nou.
 
1)
Gentoo Linux cu openrc (dar nu conteaza). Booteaza lent (vreo 10s de la init). Incerc sa trec la un sistem f. simplu bazat doar pe inittab.
Am dat peste chestia asta:
Code:
am::sysinit:echo TEST1a ; echo TEST1b
an::sysinit:echo TEST2a && echo TEST2b
ao::sysinit:echo TEST3a || echo TEST3b
Apare:
Code:
TEST1a
TEST2a
TEST3a
De ce?

Ca alternativa, merge asta:
Code:
ap::sysinit:sh -c "echo TEST1a ; echo TEST1b"

2)
Pornesc "udevd", rulez "udevadm trigger ...", astept sa termine "udevadm settle", si totusi /dev/disk/by-partuuid/* nu au aparut inca!
Astept sa apara (< 1s, cu "while ! ls ... sleep" ), apoi incerc sa montez /home cu PARTUUID din fstab si obtin acest strace :
Code:
mount("PARTUUID=58bcaddb-02", "/home", "btrfs", MS_NOATIME|MS_SILENT, "noacl,compress=lzo,autodefrag,co"...) = -1 ENOENT (No such file or directory)
Evident, vreo 3 secunde mai tarziu merge fara nici o problema.
Mai precis, ce anume trebuie sa mai astept sa se intample si cum fac asta?

PS: Teoretic as putea incerca direct cu "while ! mount ... sleep", eventual si un "timeout", dar ... e o peticeala sinistra.
 
Last edited:
1) presupunerea că toate shell-urile funcționează la fel poate să te muște de fund destul de rău. Presupunerea că shell-ul default (mai ales la init) e ceea ce crezi tu te mușcă la fel de rău de fund.

Știu pe unii care au făcut un măreț script de backup zilnic, care folosea sintaxă bash dar nu au pus shebang de bash în el. Și script-ul a mers perfect până s-au resetat niște utilizatori (era o chestie mai complicată, profilul userilor venea dintr-un LDAP) și dintr-o dată script-ul făcut pentru bash a ajuns să se execute cu sh. Iar script-ul era făcut să șteargă backup-uri vechi, doar că rulat cu sh nu se mai inițalizau corect niște variabile și a ajuns să șteargă mult mai multe backup-uri decât trebuia. Fun times, că backup-urile erau folosite și la un fel de istoric. (another fun stuff: în general în linux sh = bash, dar în debian sh poate fi dash, o implementare minimală)

Nu mai zic că am niște clienți dubioși, care au setat ksh default pentru toate sistemele lor (linux), pentru că au niște unix greybeards care nu acceptă nimic inferior.

2) vezi dacă nu cumva udev creează device-urile în altă parte și e altceva care le mută în /dev; vezi și ce filesystem are /dev și dacă are vreo metodă de sync
 
1)
Pai din moment ce nu mai folosesc nimic altceva decat /sbin/init si ce am scris in inittab, nu poate sa ma muste de fund decat ce am scris cu mana mea sau default-urile.
In speta:
Code:
[    7.997834] Run /sbin/init as init process
[    8.000042]   with arguments:
[    8.002267]     /sbin/init
[    8.004434]     auto
[    8.006574]   with environment:
[    8.008689]     HOME=/
[    8.010775]     TERM=linux
[    8.012861]     BOOT_IMAGE=M95D0

# equery belongs /sbin/init
 * Searching for /sbin/init ...
sys-apps/sysvinit-3.09 (/sbin/init)

# equery belongs /bin/sh
 * Searching for /bin/sh ...
app-alternatives/sh-0 (/bin/sh -> bash)
app-shells/bash-5.1_p16-r6 (/bin/bash)

Ia adauga-ti sysinit-ul ala in inittab-ul tau sa vezi ca face exact la fel.

2)
Am gasit partial buba: mount-ul din busybox nu coopereaza, dar n-am stat sa investighez de ce, am folosit mount-ul din util-linux-2.39.3 si merge.
 
Uite rezultatul aproape final.
Mai am de adaugat wifi-ul si posibil ceva cu tastatura.

Code:
# FILE FORMAT:
# <id>:<runlevels>:<action>:<command>
# id: 2-4 characters, unique.
# runlevels: 0:shutdown 1:single 2:offline 3:ethernet 4:wifi 5:public-wifi abc:ondemand 6:reboot
# action: off, sysinit, boot, bootwait, initdefault, once, wait, respawn, ondemand, powerfail, powerwait, powerokwait, powerfailnow, ctrlaltdel, kbrequest
# command: command to be executed. Does not support ; or || or && as separation of multiple commands. Use instead: sh -c "command ; command"
# command: @ executes command as is (no path search). + does not record utmp/wtmp (for processes which do that themselves).
# MAX LINE LENGTH ----------------------------------------------------------------------------------------------------------->|

# INIT STARTS: Sets umask and path, hooks ctrl-alt-del and kbdrequest, truncates wtmp, executes emergency if requested, then sysinit list.
00:12345:ctrlaltdel:/sbin/shutdown -r 10
#01:12345:kbrequest:wall "Test: KBREQUEST"

# SYSINIT: each process has the console as input and output
a0::sysinit:/bin/busybox mount -nvt proc none /proc -o nodev,noexec,nosuid
a1::sysinit:/bin/busybox mount -nvt sysfs none /sys -o nodev,noexec,nosuid
a2::sysinit:/bin/busybox echo 5000 > /sys/module/block/parameters/events_dfl_poll_msecs
a3::sysinit:/bin/busybox mount -nvt devtmpfs none /dev -o remount,noexec,nosuid,mode=0755,size=1M
a4::sysinit:/bin/busybox mkdir -m 0755 /dev/pts
a5::sysinit:/bin/busybox mount -nvt devpts none /dev/pts -o noexec,nosuid,mode=0620
a6::sysinit:/bin/busybox mkdir -m 1777 /dev/mqueue
a7::sysinit:/bin/busybox mount -nvt mqueue none /dev/mqueue -o noexec,nosuid,nodev
#a8::sysinit:/bin/busybox mdev -sf
a9::sysinit:/bin/busybox hwclock -l --systz
aa::sysinit:/bin/busybox mount -nvt tmpfs none /run -o mode=1777,size=4M
ab::sysinit:/bin/busybox mount -nvt tmpfs none /tmp -o mode=1777,size=64M
ac::sysinit:/bin/busybox mkdir -m 1755 /run/udev
ad::sysinit:/bin/busybox mkdir -m 1777 /run/lock

# SINGLE: Writes utmp/wtmp boot time, executes single if requested, then boot list.
03:s:wait:/bin/busybox su

# BOOT: Each wait process has console as input and output. The rest have only console output with no controlling input.
b0::bootwait:/sbin/udevd -d
b1::boot:/sbin/udevadm trigger --type=subsystems --action=add
b2::boot:/sbin/udevadm trigger --type=devices --action=add
b3::boot:/bin/busybox klogd -c 8
b4::boot:/usr/sbin/acpid
b5::boot:/usr/bin/kbdrate -r 20 -d 250
b6::boot:@/bin/busybox sh -c 'for i in 1 2 3 4 \; do /usr/bin/setleds -D +num < /dev/tty$i \; done'
b7::boot:ifconfig lo add 127.0.0.1 netmask 255.0.0.0 up
b8::boot:/bin/busybox mount -v / -o remount,rw,noatime
b9::bootwait:/usr/sbin/dmraid -ay
ba::bootwait:/sbin/btrfs device scan -d
bb::bootwait:/bin/busybox echo "Waiting for udev... (max. 10s)"
bc::boot:/bin/busybox timeout 10 ash -c 'while ! /bin/mount -at nonfs ; do sleep 1 ; done'
bd::boot:/etc/init.d/m95d-tmp-dirs
be::boot:/etc/init.d/m95d-hw-profile

# RUNLEVEL: Enters requested runlevel (1-5) or the default one.
04:3:initdefault:

# RUNLEVELS: Execute the list of the requested runlevel.
c0:2345:respawn:/usr/sbin/gpm -m /dev/input/mice -t imps2
c1:2345:once:/usr/sbin/alsactl restore --pedantic
c2:2:wait:/bin/busybox umount -aft nfs
c3:234:wait:/bin/busybox sh -c '[ -e /sys/class/net/wg0 ] && ifconfig wg0 down'
c4:23:wait:/bin/busybox sh -c '[ -e /sys/class/net/wlan0 ] && ifconfig wlan0 down'
c5:245:wait:/bin/busybox ifconfig eth0 down
c6:3:wait:/bin/busybox ifconfig eth0 add 172.27.143.10 netmask 255.255.255.0 mtu 9000 up
c7:3:wait:/bin/busybox ip route add default via 172.27.143.1
c8:45:wait:echo "DO WLAN"
c9:45:wait:echo "DO DHCP"
ca:5:wait:/usr/bin/wg-quick up wg0
cb:345:once:/bin/busybox ntpd -q -N -S "hwclock -l -w"
cc:345:respawn:/sbin/rpcbind
cd:345:once:/bin/busybox mount -at nfs
ce:345:respawn:+/usr/sbin/dropbear -v -R -p 10022

# HALT & REBOOT
z0:0:wait:/sbin/poweroff -w
z1:6:wait:/sbin/reboot -w
z2:06:wait:/sbin/telinit u
z3:06:wait:/usr/sbin/alsactl store
z4:06:wait:/bin/busybox kill $(cat /run/acpid.pid) $(cat /run/klogd.pid)
z5:06:wait:/bin/busybox dmesg >> /var/log/syslog.$(date -I)
z6:06:wait:/bin/busybox mount / -o ro,remount
z7:0:wait:/sbin/poweroff -dhn
z8:6:wait:/sbin/reboot -dkn

# CONSOLES
#x1:12345:respawn:/sbin/agetty 38400 console linux
t1:12345:respawn:/sbin/agetty 38400 tty1 linux --noclear --autologin root
t2:2345:respawn:/sbin/agetty 38400 tty2 linux
t3:2345:respawn:/sbin/agetty 38400 tty3 linux
t4:2345:respawn:/sbin/agetty 38400 tty4 linux --autologin marius95
#s0:12345:respawn:/sbin/agetty -L 115200 ttyS0 vt100
#s1:12345:respawn:/sbin/agetty -L 115200 ttyS1 vt100
 
Last edited:
Cum as putea sa setez promptul bash astfel incat sa faca un beep dupa terminarea comenzilor care dureaza mai mult de x minute? Automat, nu <comanda> ; beep.
 
Presupun că ai putea folosi o variabilă env în care să ții când s-a afișat prompt-ul și un script care să bage beep dacă s-a depășit. Adică o funcție definită în bash care ia ultimul epoch din env var (care e per sesiune deci nu te calci cu alte chestii), verifică dacă diferența față de current epoch e > X, bipăie dacă da, exportă current epoch în env var.

Pe urmă export PS1='$(functie) șicemaivreitupe-aici >'

Funcția se va evalua la fiecare afișare de prompt.
 
Back
Top