środa, 31 lipca 2019

Wake On LAN, czyli wybudzanie komputera po sieci

Solucja jest dla Ubuntu czy Mac, potrzebny jest jeden komputer z włączoną obsługą Wake On LAN i to będzie ten nasz śpiący.

Po stronie śpiącego komputera [tego co będziemy chcieli wybudzić]:
w terminalu
sudo apt install ethtool
ifconfig

z polecenia wybieramy interfejs ethernet, który chcemy wybudzić oraz mac adres i sekcję broadcast:
enp2s0f0: flags=4163  mtu 1500
        inet 192.168.1.123  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 ----::----:----:----:----  prefixlen 64  scopeid 0x20
        ether 98:f2:b3:e7:00:00  txqueuelen 1000  (Ethernet)
        RX packets 48  bytes 6817 (6.8 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 82  bytes 12600 (12.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 33  


z tego powyżej w naszym przypadku będzie to enp2s0f0 [nazwa interfejsu]broadcast 192.168.1.255 [rozgłaszanie], ether 98:f2:b3:e7:00:00 [czyli mac adres]

następnie tworzymy serwis/usługę do nasłuchiwania wybudzania, żeby była dostępna.
przechodzimy do 
/etc/systemd/system

w katalogu tworzymy plik o nazwie wol.service
poleceniem 
sudo nano wol.service
przepisujemy to poniżej oraz zmieniamy enp2s0f0 na własną z ifconfig:
---

[Unit]
Description=Configure Wake-up on LAN

[Service]
Type=oneshot
ExecStart=/sbin/ethtool -s enp2s0f0 wol g

#w ExecStart wpisujemy nazwę swojego interfejsu zamiast przykładowego enp2s0f0

[Install]
WantedBy=basic.target

---
ctrl-o [zapisujemy] ctrl-x [wychodzimy]

Dodajemy poleceniem naszą usługę:
systemctl daemon-reload
włączamy usługę:
systemctl enable wol.service
uruchamiamy:
systemctl start wol.service

==koniec zabaw po stronie śpiącego i po spisaniu nazwy interfejsu, adresu broadcast, mac adresu można go wyłączyć, po wyłączeniu lampka od ethernetu powinna się świecić [przynajmniej w moim przypadku tak jest i nie jest to wina usługi, a funkcji Wake On LAN zaszytej w BIOS]==

Po stronie wybudzacza potrzebujemy skrypt pythona tworzymy plik sudo nano wol.py lub dowolnym edytorem tekstu "dla ludzi", a w nim po hashu wyjaśniam co zmieniać:
---

#! /usr/bin/python

# wol
#
# Wake on LAN
#
# Use:
# wol computer1
# wol computer1 computer2
# wol 00:11:22:33:44:55
#
# Author: San Bergmans
#         www.sbprojects.net
#

import sys, struct, socket

# Configuration variables - z ifconfig pomiędzy '' wpisujemy nasz adres broadcast
broadcast = ['192.168.1.255', '192.168.0.255']
wol_port = 9

# w tej części wpisać nazwę komputera oraz jego mac adres format trzeba zachować czyli 'mariola' : 'ma:ca:dr:es:s0' nazwa komputera może być dowolna, mac musi być zgodny z tym komputerem co mamy wybudzić. jak widać poniżej takich komputerów można mieć 4 w tym skrypcie tj. mercury, venus, earth, mars

known_computers = {
    'mercury'    : '98:F2:B3:E7:00:00',
    'venus'      : '98:F2:B3:E7:00:00',
    'earth'      : '00:10:60:15:97:fb',
    'mars'       : '00:10:DC:34:B2:87',
    }

def WakeOnLan(ethernet_address):

    # Construct 6 byte hardware address
    add_oct = ethernet_address.split(':')
    if len(add_oct) != 6:
        print "\n*** Illegal MAC address\n"
        print "MAC should be written as 00:11:22:33:44:55\n"
        return
    hwa = struct.pack('BBBBBB', int(add_oct[0],16),
        int(add_oct[1],16),
        int(add_oct[2],16),
        int(add_oct[3],16),
        int(add_oct[4],16),
        int(add_oct[5],16))

    # Build magic packet

    msg = '\xff' * 6 + hwa * 16

    # Send packet to broadcast address using UDP port 9

    soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    soc.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST,1)
    for i in broadcast:
        soc.sendto(msg,(i,wol_port))
    soc.close()

if len(sys.argv) == 1:
    print "\n*** No computer given to power up\n"
    print "Use: 'wol computername' or 'wol 00:11:22:33:44:55'"
else:
    for i in sys.argv:
        if i[0] != '/':
            if ":" in i:
                # Wake up using MAC address
                WakeOnLan(i)
            else:
                # Wake up known computers
                if i in known_computers:
                    WakeOnLan(known_computers[i])
                else:
                    print "\n*** Unknown computer " + i + "\n"
                    #quit()

    if len(sys.argv) == 2:
        print "\nDone! The computer should be up and running in a short while."
    else:
        print "\nDone! The computers should be up and running in a short while."
    print

---
następnie zapisujemy i wychodzimy z edytora nano lub innego dozwolonego. Nadajemy prawa wykonywania naszego skryptu:
sudo chmod +x wol.py
Uruchamiamy skrypt poleceniem:
python wol.py mercury
lub
python wol.py ma:ca:dr:es:s0
lub
python wol.py mercury venus [wybudzi 2 komputery]

Parametry zależą od tego co wpisaliśmy w skrypcie wol.py w sekcji known_computers

Komputer z włączoną obsługą Wake On LAN powinien nam się wybudzić, oczywiście jak jest wyłączony. Skrypty nie są mojego autorstwa i pochodzą ze stron poniżej, ja jedynie pozmieniałem co jest dla mnie ważne czyt. dodałem polskie komentarze.

Jest jeszcze dostępny nieco prostszy skrypt pod tym adresem:
https://scripts.itarian.com/frontend/web/topic/wake-on-lan
wystarczy mac adres zmienić w sekcji list1 i powinno działać [oczywiście trzeba dać prawa wykonywania takiego skryptu].

źródła:

poniedziałek, 29 lipca 2019

Przywracanie fstab Ubuntu

Sposób na przywrócenie fstab [Ubuntu]. Niestety nie ma narzędzia dedykowanego do tego.
Plik powinien znajdować się w /etc/fstab.
!Uwaga
UUID to indywidualny numer urządzenia, także nie będzie się on zgadzał z tym poniżej co wrzuciłem i dlatego są pozmieniane końcówki.

Znajdujemy partycje poleceniem w terminalu blkid lub cat /etc/mtab lub fdisk -l lub lsblk -f [to ostatnie pokaże drzewo partycji]
w przypadku blkid dostaniemy coś ala to:
---
/dev/sda1: UUID="F565-9633" TYPE="vfat" PARTUUID="526efa7b-da04-4a12-adc9-712f49trtrtrtr"
/dev/sda2: UUID="fc2b3e95-4f28-42db-9822-b62d2745tututu" TYPE="ext4" PARTUUID="a4416012-502c-49fe-88dd-afc9txtxxttxtxtx"
/dev/sdb: UUID="021a4f38-c480-11e8-b8d1-98f2b3etyytyt" TYPE="ext4"
/dev/sdc: UUID="0b3cd536-c480-11e8-b8d1-98f2b3etytyty" TYPE="ext4"
/dev/sdd: UUID="14ac71ee-c480-11e8-b8d1-98f2b3etytyty" TYPE="ext4"
/dev/sde: UUID="32e575ec-a8aa-446d-9db1-814d7b6ytytyt" TYPE="ext4"
---
w przypadku cat /etc/mtab:
---
/dev/sde /media/hdd3 ext4 rw,relatime,errors=remount-ro 0 0
/dev/sdb /media/hdd1 ext4 rw,relatime,errors=remount-ro 0 0
/dev/sdc /media/hdd2 ext4 rw,relatime,errors=remount-ro 0 0
/dev/sdd /media/hdd4 ext4 rw,relatime,errors=remount-ro 0 0
---
i parę innych rzeczy interesują nas tylko partycje czyli /dev/sdX
w przypadku fdisk -l [małe L po myślniku]:
---
Disk /dev/sda: 111.8 GiB, 120034123776 bytes, 234441648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 52E4988F-88EA-4BEF-84B5-60644xtxtxtxtxt
---
i resztę dysków.

jak widać na powyższych [patrz mtab vs blkid] brakuje 2 dysków w mtab, zatem w naszym przypadku dysk sda jest startowym [bo brakuje go]
teraz trzeba wykluczyć jedną z partycji [mamy sda1 oraz sda2 do wyboru], partycja EFI w moim przypadku jest mniejsza i zawsze jest w formacie vfat i jest pierwsza zwykle. Także naszą partycją rozruchową jest sda2. 

Robimy fstab:
przechodzimy do folderu /etc/ poleceniem cd /etc/ w nim wpisać blkid >fstab dziobek robi przekierowanie wyniku polecenia do pliku. 
wspisujemy sudo nano fstab [ctrl o - zapisujemy, ctrl - x wychodzimy]
W przykładzie poniżej jest jak przerobić:
# /dev/sda1: EFI do ominięcia
# UUID="F565-9633" TYPE="vfat" PARTUUID="526efa7b-da04-4a12-adc9-712ttttttttttt"
# /dev/sda2: startowa
UUID="fc2b3e95-4f28-42db-9822-b62d2tutututu" / ext4 rw,errors=remount-ro 0 1
#TYPE="ext4" PARTUUID="a4416012-502c-49fe-88dd-afc96txtxtxtxtxt"
# /dev/sdb: 
UUID="021a4f38-c480-11e8-b8d1-98f2b3etytytyty" /media/hdd1 ext4 rw,errors=remount-ro 0 0
#/dev/sdc: 
UUID="0b3cd536-c480-11e8-b8d1-98f2b3etytytyty" /media/hdd2 ext4 rw,errors=remount-ro 0 0
# /dev/sde:
UUID="32e575ec-a8aa-446d-9db1-814d34tytytyty" /media/hdd3 ext4 rw,errors=remount-ro 0 0
# /dev/sdd: 
UUID="14ac71ee-c480-11e8-b8d1-98f2btytytytyty" /media/hdd4 ext4 rw,errors=remount-ro 0 0
# wyłączenie partycji swap
#/swapfile none swap sw 0 0
#partycja SWAP ma postać jeśli ma być aktywna:
#UUID="identyfikator" none swap sw 0 0

Czyli haszujemy na początku wierszy wszystkie niepotrzebne rzeczy zostawiamy ważne z UUID na początku
składnia: UUID= <ścieżka montowania w naszym przypadku /> rw,errors=remount-ro 0 1
rw służy do określenia czy można odczytywać/zapisywać [read write]

można też tworzyć bez UUID i będzie to wyglądało tak [w naszym przypadku]:
/dev/sda2/ / ext4 rw,errors=remount-ro 0 1
dla swap:
/dev/sdaX/ none swap sw 0 0

z cyframi na końcu: pierwsza oznacza użycie polecenia dump na partycji [robi kopię zapasową] dlatego jest na 0, druga odpowiada za sprawdzanie systemu plików i dla partycji głównej powinna mieć wartość 1, a dla innych 0 lub 2 [żeby nie sprawdzał]

w przykładowym pliku fstab są też odnośniki do innych partycji - spowoduje dopisanie wykrytych partycji jako automontowalnych [sdb, sdc, sde, sdd] odnoszą się do katalogu montowania [media/hddX] który trzeba utworzyć, bo fizycznie on nie występuje i w przypadku jego braku montowanie nie będzie możliwe. Poleceniem mkdir nazwa, tworzymy katalogi [w naszym fstab w media znajdują się hdd1 - hdd4, naturalnym miejscem na dyski jest katalog media [dla wymiennych typu cd-rom, pendrive] lub mnt [dla niewymiennych].

źródła:
https://wiki.archlinux.org/index.php/fstab
https://askubuntu.com/questions/435965/accidentally-deleted-etc-fstab-file