git log --all --graph --decorate --oneline
Wymiana dysku RAID 1
Założenia
Załóżmy że dysk w macierzy RAID już mamy wymieniony na nowy, chociaż przed wymianą wypadałoby odpiąć stary – ale o tym innym razem.
Dysk nowy / pusty -> /dev/sdb,
Dysk istniejący -> /dev/sda
Kopiowanie partycji
Na początku trzeba skopiować partycje. Jeśli nie wiemy jaką tablicę partycji posiadamy możemy użyć sfdisk -l. Jeśli rzuci błędem:
WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util sfdisk doesn't support GPT. Use GNU Parted.
to znaczy że używamy GPT.
Tablica GPT
Dla tablicy GPT (czyli wszystko powyżej 2TB) należy użyć:
sgdisk -R=/dev/sdb /dev/sda
Spowoduje to skopiowanie partycji, następnie:
sgdisk -G /dev/sdb
aby zmienić identyfikatory GUID partycji, ponieważ powinny być jednoznaczne, a poprzednie polecenie skopiowało nam kompletną tablicę z wszystkimi identyfikatorami.
Tablica MBR
Dla MBR potrzebny jest następujący zestaw:
sfdisk -d /dev/sda | sfdisk /dev/sdb
oraz opcjonalnie:
sfdisk -R /dev/sdb
jeśli system nie wczytał automatycznie tablicy partycji na nowym dysku.
GRUB
Następnie wypada zainstalować gruba na nowym dysku:
grub-install /dev/sdb
Podpinanie partycji do macierzy
Najpierw sprawdzimy listę partycji, wywołując:
cat /proc/mdstat
Powinniśmy zobaczyć coś podobnego:
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md1 : active raid1 sda2[2] 523968 blocks super 1.2 [2/1] [U_] md0 : active raid1 sda1[2] 16768896 blocks super 1.2 [2/1] [U_] ....
Następnie dla każdej z partycji wykonujemy:
mdadm /dev/md1 -a /dev/sdb2
podmieniając nr partycji / urządzeń wyczytane z wyników cat /proc/mdstat.
Po wykonaniu powyższego cat /proc/mdstat powinien dać podobny wynik:
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md1 : active raid1 sda2[2] sdb2[1] 523968 blocks super 1.2 [2/2] [UU] md0 : active raid1 sda1[2] sdb1[1] 16768896 blocks super 1.2 [2/2] [UU] md3 : active raid1 sda4[2] sdb4[1] 2879277312 blocks super 1.2 [2/1] [_U] [>....................] recovery = 4.2% (121450880/2879277312) finish=413.1min speed=111251K/sec md2 : active raid1 sda3[2] sdb3[1] 33537920 blocks super 1.2 [2/1] [_U] resync=DELAYED unused devices: <none>
Oznacza to że poszczególne partycje są synchronizowane. Polecenie pokazuje też szacowany czas potrzebny na synchronizację poszczególnych partycji. Jest on oczywiście ściśle uzależniony od wielkości partycji i aktualnego obciążenia systemu.
Migracja / synchronizacja plików
Migrację / synchronizację plików pomiędzy serwerami można wykonać za pomocą rsync. Wywołanie:
rsync -a --info=progress2 -e ssh <użytkownik>@<zdalny serwer>:<zdalny katalog> <lokalny katalog>
spowoduje skopiowanie wszystkich plików z zdalnego katalogu na zdalnym serwerze do lokalnego katalogu. Dodanie opcji –delete spowoduje usunięcie plików które nie istnieją na zdalnym serwerze.
Migracja poczty e-mail
Aby zmigrować wiadomości e-mail potrzebujemy imapsync oraz dostęp do obu skrzynek za pomocą protokołu IMAP
Przykładowa komenda:
imapsync --host1 <host źródłowy> --user1 <email źródłowy> --passfile1 <nazwa pliku z hasłem> --host2 <host docelowy> --user2 <email docelowy --passfile2 <nazwa pliku z hasłem do skrzynki docelowej>
Hasła przechowywane są w plikach aby uniknąć wpisywania ich bezpośrednio do wywołania (pojawiałby się później w historii)
Immutable
Nie możesz zmodyfikować plików / katalogów mimo odpowiednich uprawnień? Prawdopodobnie dany obiekt ma ustawioną flagę immutable. Możesz ją usunąć za pomocą:
chattr -i <katalog/plik>
oraz dodać za pomocą:
chattr +i <katalogplik>
Flagę immutable może ustawiać tylko root lub proces z odpowiednimi uprawnieniami.
Konwersja plików wideo .flv do .mp4 i do mp3
Czas na html5 video. Aby skonwertować wszystkie pliki wideo w formacie flash do mp4 w danym katalogu potrzebujemy avconv oraz find.
find . -type f -name '*.flv' -exec bash -c 'avconv -i "$0" -strict experimental "${0/%flv/mp4}"' {} \;
Find tutaj wyszukuje wszystkie pliki .flv w katalogu i podkatalogach, następnie na każdym z nich wykonywane jest polecenie avconv konwertujące obraz do h264 oraz dźwięk do aac.
Wyrażenie regularne podmienia ostatnie wystąpienie flv w nazwie pliku na mp4.
W przypadku konwersji do mp3 (czyli pobrania samego audio) potrzebna będzie następująca komenda:
find . -type f -name '*.flv' -exec bash -c 'avconv -i "$0" -vn -c:a libmp3lame -q:a 2 "${0/%flv/mp3}"' {} \;
LXC czyli wirtualne kontenery
Podstawowe komendy:
lxc-ls --fancy
-> lista wszystkich kontenerów wraz z podstawowymi informacjami
lxc-info -n <nazwa kontenera>
-> status wybranego kontenera z podstawowymi informacjami
lxc-cgroups
-> ustawianie / wyświetlanie ograniczeń danego kontenera
lxc-console -n <nazwa kontenera>
-> logowanie się na wirtualny serwer
Konfiguracja:
Plik konfiguracyjny można znaleźć w /var/lib/lxc/<nazwa kontenera>/config
Generowanie paczki z commita git
Jak wygenerować paczkę z zmianami z commita git?
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT <commit_id> | tar -czf <nazwa pliku> -T -
Gdzie:
<commit_id> to identyfikator danego commita, można je wyświetlić za pomocą git log,
<nazwa pliku> to nazwa pliku wyjściowego,
W przypadku gdy chcemy stworzyć aktualizację z serii commitów, wystarczy dodać dodatkowy parametr – identyfikator pierwszego commita:
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT <first_commit_id> <commit_id> | tar -czf <nazwa pliku> -T -
Zależnie od potrzeb można też oczywiście zmodyfikować parametry tara itp.
Usuwanie starych plików
ionice -c 3 nice -n 20 find <katalog> -mtime +<dni> -type f -delete
katalog – ścieżka do katalogu w którym wyszukiwać
dni – liczba dni jaka upłynęła od czasu ostatniej modyfikacji
Polecenie usuwa wszystkie pliki (bez katalogów) starsze niż określona liczba dni.
Razem z nice powoduje, że „da się” korzystać z serwera w czasie przeszukiwania dużych katalogów, ionice ustala priorytet dla operacji we/wy, -c 3 -> trzecia, najniższa klasa procesów
Kopia wszystkich baz danych na serwerze
Skrypt bash do zrobienia kopii wszystkich baz danych na serwerze, każdej w osobnym pliku.
#! /bin/bash TIMESTAMP=$(date +"%F") BACKUP_DIR="<ścieżka do katalogu backupów>/$TIMESTAMP" MYSQL_USER="root" MYSQL=/usr/bin/mysql MYSQL_PASSWORD="<hasło>" MYSQLDUMP=/usr/bin/mysqldump mkdir -p "$BACKUP_DIR/mysql" databases=`$MYSQL --user=$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema)"` for db in $databases; do $MYSQLDUMP --force --opt --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $db | gzip > "$BACKUP_DIR/mysql/$db.gz" done