Wyświetlanie danych przy logowaniu – skrypt

Po dość długiej przerwie nareszcie mam trochę czasu, zeby coś dodać na bloga :).

Poniższy skrypt uruchamiany jest u mnie przy kazdym logowaniu, ale można go takze ręcznie uruchomić. Wyświetla on kilka użytecznych informacji, tj. data ostatniego logowania, czas trwania sesji, ilość wolnego miejsca itp. Skrypt ten działa w powłoce linuksowej bash.

W trakcie opisywania tego skryptu, dojrzałem kilka błędów, które nie są zbyt uciążliwe, ale jakby ktoś chciał je poprawic, to zachęcam do tego. Jak ktoś podrzuci poprawki, to wrzucę je na bloga, lub jak sam znajde czas, to sprobuje to poprawić.

Znalezione błędy:
zmienna uptimeInt – po przekroczeniu roku (w sekundach), licznik się przekręca i pokazuje uptime 0d, 0h, 0m i 0s. Trzeba użyc innej funkcji (innej, niż strftime) do zamiany sekund, lub zrobić warunek, sprawdzajacy, czy minął juz rok i wykonać dodatkowe obliczenia, wyliczajace ilość lat.

Linia STILL LOGGED IN – jak użytkownik loguje się do X-ów (u mnie przy użyciu kdm), to zamiast numeru konsoli, pokazuje :0. Spowodowane to jest tym, ze polecenie last nie pokazuje w tej sytuacji kolumny z numerem konsoli i skrypt uważa następną kolumnę (kolumna z adresem ip, lub wpisem :0) za numer konsoli i wyswietla wpis :0 jako numer konsoli, do ktorej uzytkownik jest wciaz zalogowany

Poniżej zamieszczam zrzut ekranu po uruchomieniu skryptu podczas logowania, a także kod skryptu i skrypt do ściągnięcia w postaci archiwum tar:

skrypt_logowanie

Kod skryptu:

#!/bin/bash

#pobranie numeru konsoli na ktorej aktualnie jestesmy zalogowani(np. /dev/pts/8)
currentShell=`tty`

#Pobranie daty, kiedy ostatni raz byl zalogowany dany uzytkownik (np. Fri 22 Mar)
lastLoginDate=`last|grep $USER|head -n 2|tail -n 1|awk '{print $4 " " $6 " " $5}'`

#Pobranie czasu, kiedy ostatni raz byl zalogowany dany uzytkownik. W sytuacji, gdy dany uzytkownik wciaz jest zalogowany,
#to obok godziny zalogowania, wyswietla sie napis "still logged in" (np. 19:25   still logged in).
#Gdy uzytkownik nie jest juz zalogowany, to sie wyswietli godzina zalogowania,
#wylogowania i czas trwania sesji (np. 21:22 - 21:23  (00:00)). Czas trwania sesji nie jest zbyt dokladny,
#gdyz nie uwzglednia sekund
lastLoginTime=`last|grep $USER|head -n 2|tail -n 1|cut -c 51-`

#Pobranie numeru konsoli, na ktorej byl zalogowany dany uzytkownik podczas ostatniego zalogowania (np. pts/8)
lastLoginTty=`last|grep $USER|head -n 2|tail -n 1|awk '{print $2}'`

#Pobranie adresu IP, spod ktorego dany uzytkownik logowal sie podczas ostaniego zalogowania (np. 192.168.22.33).
#W sytuacji, gdy logowanie nastapilo z lokalnej konsoli, to zamiast adresu sieciowego, wyswietli sie napis ":0"
lastLoginAddress=`last|grep $USER|head -n 1|tail -n 1|awk '{print $3}'`


#UPTIME-sekcja odpowiedzialna za pobranie informacji odnosnie czasu, jaki uplynal od ostatniego uruchomienia
#pobranie daty i godziny o ktorej zostal uruchomiony komputer (np. 2013-03-22 17:49)
lastRestartTime=`who -b | awk '{print $3 " " $4}'`

#Pobranie z pliku /proc/uptime informacji o ilosci sekund jakie uplynely od uruchomienia systemu (np. 15445.60)
uptimeSeconds=`cat /proc/uptime | awk '{print $1}'`
#Ilosc sekund pobrana z pliku /proc/uptime (np. 15445.60) musi zostac zamieniona na wartosc calkowita (np. 15445),
#gdyz wiekszosc programow konsolowych nie lubi liczb zmiennoprzecinkowych i moga pojawic sie problemy.
#Wartosc "15445.60" jest dzielona na dwie czesci oddzielone kropka i zapisywana do tablicy "seconds"
IFS=. read -r -a seconds <<< "$uptimeSeconds"
#Przypisanie do zmiennej secondsInt pierwszego elementu z tablicy "seconds".
#Jest to czesc calkowita (np. 15445) liczby zmiennoprzecinkowej pobranej z pliku /proc/uptime (np. 15445.60)
secondsInt=${seconds[0]}

#Zamiana sekund(np. 15445) na dni, godziny, minuty i sekundy.
#Szczegoly w dokumentacji: http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html (funkcja strftime)
#sekundy->sekundy(0-59)
uptimeSec=`echo | awk '{print strftime("%S", '$secondsInt' , 1)}'`
#sekundy->minuty(0-59)
uptimeMin=`echo | awk '{print strftime("%M", '$secondsInt' , 1)}'`
#sekundy->godziny(0-23)
uptimeHour=`echo | awk '{print strftime("%H", '$secondsInt' , 1)}'`

#sekundy->dni(1-365)
uptimeDayTmp=`expr echo | awk '{print strftime("%j", '$secondsInt' , 1)}'`
#Zmniejszenie o 1 zmiennej "uptimeDayTmp", zeby wskazywala wlasciwa ilosc dni
uptimeDay=`expr $uptimeDayTmp - 1`

#przypisanie do zmiennej "uptime" czasu jaki uplynal od uruchomienia systemu i daty kiedy system zostal uruchomiony.
#Tekst w zmiennej jest odpowiednio sformatowany. Minusem rozwiazania ktore zastosowalem, jest to, ze po przekroczeniu roku,
#licznik sie przekreci i bedzie pokazywal od 0, czyli po roku czasu, bedzie pokazywalo, ze uptime wynosi 0 dni, godzin, minut i sekund
uptime=`echo $uptimeDay"d "$uptimeHour":"$uptimeMin":"$uptimeSec `" ( last boot: "$lastRestartTime" )"
#UPTIME

#Ilosc otwartych konsol na ktorych jest zalogowany aktualny uzytkownik (np. 7)
numberOfUsers=`last| grep -P "^$USER[\S\s]{1,}still logged in{1}\s{1,}$"|wc -l`
#Numery konsol na ktorych jest zalogowany aktualny uzytkownik (np. pts/9 pts/7 pts/4 pts/3 pts/2 pts/1 pts/0)
tty=`last| grep -P "^$USER[\S\s]{1,}still logged in{1}\s{1,}$"|awk '{print $2}'|tr '\n' ' '`

#urzadzenia ktore chcemy monitorowac pod wzgledem ilosci wolnego miejsca.
firstDevice="/dev/sda5"	#partycja root
secondDevice="/dev/sda6"	#partycja home

#Pobranie ilosci wolnego miejsca dla pierwszego i drugiego urzadzenia. Ta wartosc bedzie wyswietlona bezposrednio,
#w formacie ulatwiajacym szybkie zrozumienie, bez koniecznosci konwersji. Bedzie pokazylo ilosc wolnego miejsca w GB,
#jak jest wolne conajmniej 1 GB dysku, natomiast jak jest mniej niz GB, to bedzie pokazywalo w MB i td
freeSpaceFirst=`df -h|grep $firstDevice|awk '{print $4}'`
freeSpaceSecond=`df -h|grep $secondDevice|awk '{print $4}'`

#Pobranie ilosci wolnego miejsca dla pierwszego i drugiego urzadzenia. Wartosc bedzie pokazana w bajtach.
#Uzyte to jest podczas rysowania paska postepu (program dbar). Pokazuje on ile jest wolnego miejsca w postaci znakow ASCII.
#Zrobione to jest tak, gdyz dane ze zmiennych "freeSpaceFirst" i "freeSpaceSecond" pokazuja dane mniej precyzyjnie,
#a co za tym idzie, pasek postepu by nie pokazywal zmian, gdyby zmiany byly zbyt male.
freeSpaceFirstByte=`df|grep $firstDevice|awk '{print $4}'`
freeSpaceSecondByte=`df|grep $secondDevice|awk '{print $4}'`


#Pobranie ilosci zajetego miejsca dla pierwszego i drugiego urzadzenia. Wartosc w bajtach. ZMIENNE OBECNIE NIE UZYWANE
usedSpaceFirstByte=`df|grep $firstDevice|awk '{print $3}'`
usedSpaceSecondByte=`df|grep $secondDevice|awk '{print $3}'`

####################################################################
#Obliczenie jaka sumaryczna pojemnosc ma dana partycja. Wersja dla nowszych i starszych wersji basha. ZMIENNE OBECNIE NIE UZYWANE

#Dodawanie/mnozenie itp liczb (dziala tylko na nowszych wersjach basha). w nawiasach mozna takze inkrementowac liczby(Sekcja "Wyrażenia") -> http://wazniak.mimuw.edu.pl/index.php?title=%C5%9Arodowisko_programisty/Bash_-_pisanie_skrypt%C3%B3w
#Jest to rozwiazanie szybsze i mniej pamieciozerne, gdyz jest interpretowane bezposrednio przez Basha, a nie jest uruchamiane osobne polecenie expr
#((totalSpaceFirstByte=$freeSpaceFirstByte\+$usedSpaceFirstByte))
#((totalSpaceSecondByte=$freeSpaceSecondByte \+ $usedSpaceSecondByte))


#Dodawanie/mnozenie itp liczb (wersja dla starszych wersji basha)
totalSpaceFirstByte=`expr $freeSpaceFirstByte + $usedSpaceFirstByte`
totalSpaceSecondByte=`expr $freeSpaceSecondByte + $usedSpaceSecondByte`
####################################################################

#Obliczenie  Ile jest zajetego miejsca na danej partycji i zamiana tej wartosci na wartosc procentowa. ZMIENNE OBECNIE NIE UZYWANE
#Wykonywanie operacji artmetycznych na liczbach zmiennoprzecinkowych
usedSpaceFirstBytePercent=`echo "($usedSpaceFirstByte/$totalSpaceFirstByte)*100" | bc -l`
usedSpaceSecondBytePercent=`echo "($usedSpaceSecondByte/$totalSpaceSecondByte)*100" | bc -l`

#Obliczenie  Ile jest wolnego miejsca na danej partycji i zamiana tej wartosci na wartosc procentowa.
#Wykonywanie operacji artmetycznych na liczbach zmiennoprzecinkowych
freeSpaceFirstBytePercent=`echo "($freeSpaceFirstByte/$totalSpaceFirstByte)*100" | bc -l`
freeSpaceSecondBytePercent=`echo "($freeSpaceSecondByte/$totalSpaceSecondByte)*100" | bc -l`


#######################
#Wyswietlenie zawartosci zmiennych poustawianych we wczesniejszych liniach.
#######################
#Linia DATE/TIME/WEEK - formatowanie daty zaczyna sie od znaku + (plusa) i dalej sie wpisuje zadane informacje jakie chce sie pobrac (godzina, minuta, sekunda, rok itp).
#Jak jakas zmienna moze miec wartosc dwu, lub trzycyfrowa, to wpisujac znak - (minus) pomiedzy znakiem % (procent), a zmienna (np zmienna "W" wyswietlajaca numer tygodnia moze miec dwie cyfry),
#nakazujemy programowani date wyswietlenie samej liczby, bez zer napoczatku, czyli jak jest np 7 tydzien, to wpisujac "%-W", wyswietli sie sama wartosc "7", a wpisujac %W, wyswietli sie "07"
#wiecej informacji na temat formatowania mozna uzyskac w manualu, wpisujac w konsoli "man date".

#echo -ne - parametr "-e" nakazuje poleceniu echo interpretacje znakow spcjalnych pomiedzy podwojnymi cudzyslowamia np. znak tabulacji (\t), znak powrotu karetki (\r).
#parametr "-n" nakazuje poleceniu echo usuniecie znaku nowej linii po wyswietleniu tekstu. Normalnie, echo po wyswietleniu tekstu przenosi kursor do nastepnej linii, a uzywajac "-n",
#kursor jest ustawiany po ostatnim wyswietlonym znaku, a co za tym idzie, uzywajac nastepnym razem polecenia echo, tekst wyswietli sie zaraz po poprzednim tekscie w tej samej linii

#Linia FREE SPACE - wyswietlenie ilosci wolnego miejsca na danej partycji pod postacia B/KB/MB/GB itd, a takze w postaci procentowej na pasku postepu.
#Pasek postepu wyswietla sie przy uzyciu programu dbar. Program dbar musi otrzymac dane z programu echo przez potok (znak | ). Wiecej informacji o programie dbar,
#mozna uzyskac w manualu, wpisujac w konsoli "man dbar"
echo " -------------------------------------------------------"
echo "    USER:			$USER ($currentShell)"
echo "    LAST LOGIN:			$lastLoginTty ( $lastLoginAddress ), $lastLoginDate, $lastLoginTime"
echo "    STILL LOGGED IN ($USER):	$numberOfUsers shells ( $tty)"
echo " --"
echo "    DATE:			`date '+%A %-d %B %Y'`"
echo "    TIME:			`date '+%k:%M:%S'`"
echo "    WEEK:			`date '+%-W'` tydzien `date '+%Y'` roku"
echo " --"
echo "    UPTIME:			$uptime"
echo " --"
echo -ne "    FREE SPACE(root):		$freeSpaceFirst \t| "; echo "$freeSpaceFirstBytePercent 0 100" | dbar -w 40 -s "="
echo -ne "    FREE SPACE(backup):		$freeSpaceSecond \t| "; echo "$freeSpaceSecondBytePercent 0 100" | dbar -w 40 -s "="
echo " -------------------------------------------------------"
echo

Skrypt do ściągnięcia:
logowanie.tar

Posted in Programowanie, Skrypty i programy | Tagged , , | Leave a comment

Lokalne repozytorium pakietów dla Debiana i pochodnych – skrypt

Jakiś czas temu ściągnąłem sobie kilka paczek pod Minta i chciałem je mieć dostępne poprzez program “apt-get” (program dba o spełnienie zależności itp), czy też “apt-cache” (wyszukiwanie pakietów i wyświetlenie informacji o pakietach).

Zapewne wiele osób powie, że lepiej poszukać odpowiednich repozytoriów PPA i je dodać. Na ogół tak jest najwygodniej i sam tak często robię, ale czasami się zdarza, że nie ma odpowiedniego repozytorium, lub w repozytorium nie ma odpowiednich wersji.

Wtedy najlepiej sciągnąć dany pakiet ze strony projektu i wrzucić do katalogu na dysku i z tego katalogu zrobić lokalne repozytorium.

Ja tak zrobiłem z katalogiem “/MOJE/REPOZYTORIUM”. Problem był jednak w sytuacji dodawania kolejnego programu, gdyż po skopiowaniu pakietu do tego katalogu, trzeba było odświerzyć zawartość pliku Packages.gz, a że nie robiło się tego zbyt często, więc zapominało się składni polecenia służacego do tego, a historia basha coś u mnie szwankuje i nie zawsze zapisuje wszystkie polecenia, zwłaszcza gdy jest otwartych kilka konsoli jednocześnie.

Poniżej zamieściłem skrypt, który robi te wszystkie operacje za nas. Można go skopiować ze strony i wkleić do pliku, lub ściągnąć gotowy skrypt i go uruchomić.
Możesz użyć tego samego katalogu co ja, lub użyć innego. Chcąc zmienić katalog, musisz zmienić tylko wartość zmiennej “rep_path” i uruchomić skrypt. Skrypt zrobi wszystko za ciebie, włącznie ze stworzeniem katalogu i aktualizacją pliku “Packages.gz”. Po skopiowaniu nowego pliku do naszego repozytorium, wystarczy ponownie uruchomić skrypt i wszystko zostanie uaktualnione.

Jedyne, co musisz zrobić ręcznie, to dodać jedną linię do pliku “/etc/apt/sources.list”. Linia ta wskazuje gdzie ma być szukane lokalne repozytorium.
Pamiętaj tylko, abyś dokładnie skopiował tą linię, bo program “apt-get” jest bardzo przewrażliwiony na punkcie literówek i nie lubi jak mu np brakuje jakiegoś znaku, który wydaje się być zbędny.

deb file:/MOJE REPOZYTORIUM/

 

#!/bin/bash

#Katalog w ktorym chcemy utworzyc nasze lokalne repozytorium pakietow.
#Do tego katalogu bedziemy wrzucac pliki deb ktore bedzie sie instalowac
#przy uzyciu programu "apt-get" lub podobnym
rep_path=/MOJE/REPOZYTORIUM/

mkdir -p $rep_path

#Dzielenie zmiennej $rep_path na czesci uzywajac separatora "/"
#W tym przypadku tekst "/MOJE/REPOZYTORIUM" zostanie podzielone na dwie czesci,
#czyli "MOJE" i "REPOZYTORIUM" i nastepnie wrzucone do tablicy dirs
IFS=/ read -r -a dirs <<< "$rep_path"

#Przypisanie zmiennej "lastelement" numeru elementu,
#ktory jest przechowywany jako ostatni w tablicy "dirs"
lastelement=`expr ${#dirs[@]} - 1`

#Przypisanie zmiennej "lastelementdir",
#elementu ktory jest ostatnim elementem tablicy "dirs"
lastelementdir=${dirs[$lastelement]}

rep_dir=$lastelementdir

cd $rep_path

cd ..

#Skanowanie katalogu "REPOZYTORIUM" w poszukiwaniu plikow "deb"
#i tworzenie pliku "Packages.gz" z lista plikow,
#ktore znajduja sie z katalogu "REPOZYTORIUM"
sudo dpkg-scanpackages $rep_dir /dev/null | gzip > $rep_dir/Packages.gz

#Aktualizacja bazy pakietow dla programu "apt-get" i podobnych
sudo apt-get update

Ściągnij skrypt (pamiętaj o rozpakowaniu (tar) i nadaniu odpowiednich uprawnień (chmod i chown)):

create_update_repo_deb.tar

Posted in Programowanie, Skrypty i programy | Tagged , , , , | Leave a comment

Zarządzanie energią w linuksie – pliki (3)

  • /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
  • w pliku tym są umieszczone czestotliwości z jakimi może pracować procesor. Wartości podane są w kHz.
  • cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
    2501000 2500000 2000000 1600000 1200000 80000

  • /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
  • w pliku tym są umieszczone polityki jakimi może się kierować kernel podczas zarządzania energią. Mogą to być:
  • cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
    conservative ondemand userspace powersave performance

  • conservative – częstotliwość CPU jest zwiększana, gdy jest na to zapotrzebowanie i zmniejszana, gdy system nie jest obciążony. Polityka ta jest podobna do ondemand, ale z tą różnicą, że ondemand lepiej się sprawuje, gdy komputer jest podłączony do zasilania, a conservative lepiej się sprawuje, gdy komputer chodzi na baterii. Różnica ta polega na tym, że przy użyciu tej polityki procesor wolniej wskakuje na wyższe częstotliwości i szybciej zmniejsza częstotliwość, gdy system nie potrzebuje większej mocy. Najniższą częstotliwość na jaką może wskoczyć procesor jest ustalona w pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq, natomiast najwyższą częstotliwość na jaką może wskoczyć procesor jest ustalona w pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq. Kernel będzie zmieniał częstotliwość skokowo używając częstotliwości dostępnych w pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
  • ondemand – częstotliwość CPU jest zwiększana, gdy jest na to zapotrzebowanie i zmniejszana, gdy system nie jest obciążony. Polityka ta jest podobna do conservative, ale z tą różnicą, że ondemand lepiej się sprawuje, gdy komputer jest podłączony do zasilania, a conservative lepiej się sprawuje, gdy komputer chodzi na baterii. Różnica ta polega na tym, że przy użyciu tej polityki procesor szybciej wskakuje na wyższe częstotliwości i wolniej zmniejsza częstotliwość, gdy system nie potrzebuje większej mocy. Najniższą częstotliwość na jaką może wskoczyć procesor jest ustalona w pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq, natomiast najwyższą częstotliwość na jaką może wskoczyć procesor jest ustalona w pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq. Kernel będzie zmieniał częstotliwość skokowo używając częstotliwości dostępnych w pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
  • userspace – ta opcja mówi kernelowi, że to użytkownik chce decydować o zarządzaniu energią. Dzięki tej opcji, użytkownik lub dowolny program może samemu ustalić częstotliwość (częstotliwość ta jest ustawiona na sztywno i nie zmienia się) z jaką ma pracować procesor. Najniższą częstotliwość jaką można ustawić jest ustalona w pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq, natomiast najwyższą częstotliwość jaką można ustawić jest ustalona w pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq. Częstotliwości które można użyć są dostępne w pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
  • powersave – kernel ustawia najniższą z dostępnych częstotliwości i nie zmienia jej przez cały czas, gdy ta polityka jest wybrana. Wartość ta pobierana jest z pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
  • performance – kernel ustawia najwyższą z dostępnych częstotliwości i nie zmienia jej przez cały czas, gdy ta polityka jest wybrana. Wartość ta pobierana jest z pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
  • /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
  • plik ten zawiera informację o częstotliwości z jaką powinien pracować procesor. Wartość ta może się zmieniać automatycznie, gdy wybrane są następujące polityki: ondemand lub conservative. Wartość tą ustawia kernel na podstawie wybranej polityki. Rzeczywista częstotliwość może się różnić od tej podanej w tym pliku. Rzeczywista wartość zapisana jest w pliku cpuinfo_cur_freq
  • cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

    800000

  • /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
  • opcja która ustawia maksymalną dozwoloną częstotliwość z jaką może pracować procesor. Wartość z tego pliku będzie się tyczyła wszystkich trybów (włącznie z polityką performance). Wartość z tego pliku w przypadku polityki ondemand i conservative będzie oznaczała, że kernel nie wskoczy na maksymalną dozwoloną częstotliwość procesora, tylko na częstotliwość podaną w tym pliku. W sytuacji, gdy użytkownik spróbuje ręcznie ustawić (w przypadku polityki userspace) wyższą częstotliwość niż ustawiona w tym pliku, to częstotliwość podana przez użytkownika zostanie zignorowana i ustawiona zostanie częstotliwość podana w powyższym pliku. Plik ten spełnia podwójną rolę. Jedna jest to rola informacyjna, czyli można zobaczyć jaka jest ustawiona maksymalna częstotliwość jaką można użyć, a także spełnia rolę sterującą, czyli można zapisać do tego pliku maksymalną częstotliwość z jaką chcemy, żeby pracował procesor.
  • Wyświetlenie maksymalnej dozwolonej częstotliwości:
  • cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
    1600000

  • Ustawienie maksymalnej dozwolonej częstotliwości:
  • echo “2500000” > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

  • /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
  • opcja która ustawia minimalną dozwoloną częstotliwość z jaką może pracować procesor. Wartość z tego pliku będzie się tyczyła wszystkich trybów (włącznie z polityką powersave). Wartość z tego pliku w przypadku polityki ondemand i conservative będzie oznaczała, że kernel nie wskoczy na minimalną dozwoloną częstotliwość procesora, tylko na częstotliwość podaną w tym pliku. W sytuacji, gdy użytkownik spróbuje ręcznie ustawić (w przypadku polityki userspace) niższą częstotliwość niż ustawiona w tym pliku, to częstotliwość podana przez użytkownika zostanie zignorowana i ustawiona zostanie częstotliwość podana w powyższym pliku. Plik ten spełnia podwójną rolę. Jedna jest to rola informacyjna, czyli można zobaczyć jaka jest ustawiona minimalna częstotliwość jaką można użyć, a także spełnia rolę sterującą, czyli można zapisać do tego pliku minimalną częstotliwość z jaką chcemy, żeby pracował procesor
  • Wyświetlenie minimalnej dozwolonej częstotliwości:
  • cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
    1600000

  • Ustawienie minimalnej dozwolonej częstotliwości:
  • echo “1200000” > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq

  • /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
  • plik w którym ustawia się politykę którą ma się kierować kernel podczas zarządzania energią. Oprócz ustawiania, można także wyświetlić, jaka polityka obecnie jest ustawiona. Dostępne polityki można pobrać z pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors.
  • Wyświetlenie obecnie ustawionej polityki:
  • cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
    conservative

  • Ustawienie polityki:
  • echo “ondemand” > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

  • /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
  • plik ten odpowiada za ręczne ustawienie częstotliwości procesora. Modyfikacja tego pliku możliwa jest tylko wtedy, gdy w pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor ustawi się politykę na userspace. Dzięki tej polityce, użytkownik lub dowolny program może samodzielnie sterować częstotliwością procesora bez udziału kernela. Gdy użytkownik będzie próbował zmienić wartość w tym pliku, pomimo ustawienia polityki innej niż userspace, to system zwróci błąd i zmiana nie zostanie wprowadzona. Oprócz ustawiania, można także wyświetlić, jaka jest obecnie ustawiona częstotliwość procesora (gdy ustawiona jest polityka userspace), lub tekst <unsupported>, gdy ustawiona jest polityka inna niż userspace. Wartość w tym pliku nie może być większa niż wartość z pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq i nie może być mniejsza niż wartość z pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq. Dodatkowo, w tym pliku mogą znajdować się tylko wartości dostępne w pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies. Gdy spróbuje się ustawić wartości inne niż są dostępne w pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies, to system ustawi częstotliwość najbliższą podanej, zaokrąglając w górę.
  • Wyświetlenie ustawionej częstotliwości (polityka: userspace):
  • cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
    1200000

  • Wyświetlenie ustawionej częstotliwości (polityka inna niż userspace):
  • cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
    <unsupported>

  • Ustawienie częstotliwości (polityka userspace):
  • echo “1200000” > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed

  • Ustawienie częstotliwości (polityka inna niż userspace):
  • echo “1200000” > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
    bash: echo: write error: Invalid argument

  • /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
  • w pliku tym jest zapisana informacja o aktualnej częstotliwości procesora. Ta informacja pobierana jest ze sprzętu i wskazuje rzeczywistą prędkość procesora, a nie częstotliwość jaka powinna być (/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq). Wartość w tym pliku może się zmieniać automatycznie, gdy ustawiona jest polityka ondemand lub conservative.
  • Wyświetlenie aktualnej (rzeczywistej) częstotliwości procesora:
  • cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
    1200000

  • /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq
  • Wyświetlenie minimalnej częstotliwości z jaką może pracować procesor. Wartość ta pobierana jest ze sprzętu i nie można jej zmieniac, jak ma to miejsce w przypadku pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq. Niezależnie od ustawień w innych plikach, nie można ustawić niższej częstotliwości niż jest podana w tym pliku.
  • Wyświetlenie minimalnej częstotliwości z jaką może pracować procesor:
  • cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq
    800000

  • /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
  • Wyświetlenie maksymalnej częstotliwości z jaką może pracować procesor. Wartość ta pobierana jest ze sprzętu i nie można jej zmieniac, jak ma to miejsce w przypadku pliku /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq. Niezależnie od ustawień w innych plikach, nie można ustawić wyższej częstotliwości niż jest podana w tym pliku.
  • Wyświetlenie maksymalnej częstotliwości z jaką może pracować procesor:
  • cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
    2500000

Posted in Zarządzanie energią | Tagged , , , | Leave a comment

Export i import schematów zasilania w systemie Windows

Po kolejnej reinstalce Windowsa, chciałem sobie ograniczyć ilość pracy jaka jest związana z przywracaniem ustawień programów i systemu. Tym razem wziąłem się za schematy zasilania. Z początku myślałem, że pójdzie łatwo i chcąc iść na łatwiznę modyfikowałem za każdym razem ten sam schemat zasilania i eksportowałem go do pliku pod inną nazwą. Po imporcie nieźle się zdziwiłem, jak się okazało, że po zmianie schematu poprzedni schemat znikał z listy i trzeba było przeklikywać się przez kilka okien, żeby dany schemat ponownie włączyć. Sporo czasu mi zajęło, zanim zorientowałem się w czym jest problem, ale udało się. Robiłem to na Viście, ale zakładam, że powinno zadziałać na wszystkich wersjach, a na pewno od XP w górę.

Jezeli chce sie, zeby nasze wszystkie 3 schematy pokazywaly sie w okienku otwieranym po kliknieciu w ikonke baterii w systrayu, to nalezy przed eksportem zmodyfikowac i dopasowac do naszych potrzeb wszystkie trzy schematy(Balanced, “Power saver” i “High performance”), a nastepnie zmienic im nazwe na taka jaka nam pasuje(np. Balanced – Custom, “Power saver – custom” i “High performance – custom”). Po tym nalezy wyeksportowac wszystkie trzy schematy do trzech plikow.

W pozniejszym czasie, gdy sie przeinstaluje system, to mozna bedzie zaimportowac te trzy schematy i jak sie wybierze te trzy schematy z “show additional plans”, to beda one widoczne caly czas w okienku po wcisnieciu ikony baterii w systrayu.

Gdyby sie robilo tak(operacje wykonywalo sie na tym samym schmacie):

  1. modyfikacja schematu np “Power saver”
  2. zmiana nazwy schematu z “Power saver” na “Power saver – custom”
  3. export schematu do pliku
  1. Powtorzenie operacji z punktu a, b i c
  1. modyfikacja schematu np “Power saver – custom”
  2. zmiana nazwy schematu z “Power saver – custom” na “wysoka wydajnosc”
  3. export schematu do pliku
  1. Powtorzenie operacji z punktu a, b i c
  1. modyfikacja schematu np “wysoka wydajnosc”
  2. zmiana nazwy schematu z “wysoka wydajnosc” na “wysoka wydajnosc – custom”
  3. export schematu do pliku

to po zaimportowaniu plikow, wyeksportowane schematy zasilania nie będą jednocześnie widoczne na liscie w okienku ktore sie pojawi po wcisnieciu ikony baterii w systrayu.

Jak sie wybierze np. “Power saver – custom”, a nastepnie np, “wysoka wydajnosc – custom”, to schemat “Power saver – custom” zniknie z tej listy i chcac go ponownie wybrac, to trzeba otwierac okno poprzez link “more power options”.

Jednoczesnie bedzie dostepny schemat Balanced (schemat windowsa), “High performance”(schemat windowsa) i jeden z naszych schematow. Jest to najprawdopodbiej zwiazane z GUID schematow.

  1. export:
  2. powercfg -export sciezka_dostepu_do_pliku.pow GUID
  3. import:
  4. powercfg -import sciezka_dostepu_do_pliku.pow
  5. listing:
  6. powercfg /l – listuje wszystkie schematy zasilania wraz z ich GUID
  7. usuwanie:
  8. powercfg -delete <GUID> – usuniecie schematu zasilania na podstawie jego GUID
  9. zmiana_nazwy:
  10. powercfg -changename GUID “Nowa nazwa” “Nowy opis” (powercfg -changename 017af26e-73bd-4847-9c46-18f8b4d979eb “Moj Schemat-high performance” “Moj schemat-opis”)
Posted in Zarządzanie energią | Tagged | Leave a comment

Zarządzanie energią w linuksie – katalogi (2)

  • /sys/devices/system/cpu/
  • w tym katalogu umieszczone są między innymi katalogi które się zaczynają od tekstu “cpu” i na końcu mają liczby od 0 do (ilość_rdzeni_cpu-1) np.: cpu0, cpu1 itd. Każdy z tych katalogów odpowiada jednemu rdzeniu w procesorze. Każdym rdzeniem można sterować indywidualnie (można ustawić osobne częstotliwości, jak i polityki). Nie wszystkie procesory obsługują tą funkcjonalność.
  • /sys/devices/system/cpu # ls -1
    cpu0
    cpu1
    cpufreq
    cpuidle
    kernel_max
    offline
    online
    possible
    present
    probe
    release

  • /sys/devices/system/cpu/cpu0/cpufreq/
  • w katalogu tym są umieszczone pliki odpowiedzialne za sterowanie zarządzaniem energii, jak i pliki w których są zapisane informacje o aktualnie ustawionych parametrach i parametrach, które można użyć.
Posted in Zarządzanie energią | Tagged , , | Leave a comment