Kirjoittaja Aihe: Pythonin löytämät levyt  (Luettu 3044 kertaa)

ilkant

  • Käyttäjä
  • Viestejä: 1380
  • Kubuntu
    • Profiili
Pythonin löytämät levyt
« : 20.09.22 - klo:03.32 »
Koodasin FaceBookista napatun esimerkin, joka näyttää levyjen koot. Jätin pois sen kommentoidun 1e+9 kun siitä tuli virheilmoitus python 3.10:llä konsoli-ikkunsdds Kubuntu 22.04 -järjestelmässä.

Ihan nätisti tuo löysi koneessa olevat 2 levyä (sda ja sdb), mutta lisäksi se kertoi sdc:n olevan 0G. Koneessa on yksi M.2 -levy, jota tuo ohjelma ei ole löytänyt. Levyjen sda ja sdb levyjen koot tulivat tavuina eli pitkä numeroinen luku. Sitten katselin /mnt hakemistoa ja siellä oli sdc1 ja myös sdd1 päiväyksnä 30. tammikuuta 2022. Olen lisännyt nuo sda ja sdb manuaalisesti sinne /mnt -hakemistoon, mutta en sdc:tä enkä sdd:tä. Kummatkaan sdc eikä sdd ole /dev -(laite)hakemistossa. Nämä lienevät tulleet usb:n kautta liitetyistä levyistä tai muista laitteista. Muuta en oikein keksi. Kuitenkin jään ihmettelemään, miksi tuo python-ohjelma löytää toisen (sdc) kooksi 0G kun toista se ei näe ollenkaan.

Lisään vielä, että tämä ei ole ongelma, vaan haluan tietää lisää asiasta.

Koodia: [Valitse]
from pathlib import Path
disk = [p for p in Path('/sys/block').glob('sd[a-z]')]
disk_dict = {d.name: d.joinpath('size').read_text().strip() for d in disk}

for dev,size in disk_dict.items():
    print('{:15} {:.0f}G'.format('/dev/'+dev, int(size)*512))   # 512/1e+9
« Viimeksi muokattu: 20.09.22 - klo:03.36 kirjoittanut ilkant »

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11481
    • Profiili
    • Tomin kotisivut
Vs: Pythonin löytämät levyt
« Vastaus #1 : 20.09.22 - klo:08.09 »
M.2-levy lienee NVMe-levy, joka käyttää PCI Express -väylää ja siten eri ajuria. Tästä syystä sen nimi on erimuotoinen eikä tuo glob nappaa sitä. Kannattaa katsoa ihan päätteellä, mitä tuo /sys/block on syönyt:
Koodia: [Valitse]
ls -l /sys/block
Onko koneessasi muistikortinlukija, jossa ei ole muistikorttia paikallaan? Se voisi näkyä sd-lakuisena laitteena ja olla nollan tavun kokoinen.
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

ilkant

  • Käyttäjä
  • Viestejä: 1380
  • Kubuntu
    • Profiili
Vs: Pythonin löytämät levyt
« Vastaus #2 : 20.09.22 - klo:11.36 »
M.2-levy lienee NVMe-levy, joka käyttää PCI Express -väylää ja siten eri ajuria. Tästä syystä sen nimi on erimuotoinen eikä tuo glob nappaa sitä. Kannattaa katsoa ihan päätteellä, mitä tuo /sys/block on syönyt:
Koodia: [Valitse]
ls -l /sys/block
Onko koneessasi muistikortinlukija, jossa ei ole muistikorttia paikallaan? Se voisi näkyä sd-lakuisena laitteena ja olla nollan tavun kokoinen.

Kyllä on. Kiinalainen usb-jakaja, jossa SD-kortin ja TF-kortin lukija.

Sitten tuli muuten mieleen, että voisiko tuo sdc olla myös M.2 -levy? Nimittäin sitä ei tuon ohjelman löyrätmissä levyissä ollut. Koodin tekijä sanoi, että se löytää M.2 -levyt. Levy on 0,5 TB (500 GB), joten 0G voisi jollain tavalla olla jopa oikea luku. Se ei ole SATA-levy, vaan on PCIe-väylässä. Levy on Kingston A2000 M.2 2280 NVMe.

ls -l /sys/block
Koodia: [Valitse]
lrwxrwxrwx 1 root root 0 syys   20 09:31 nvme0n1 -> ../devices/pci0000:00/0000:00:1d.0/0000:04:00.0/nvme/nvme0/nvme0n1
lrwxrwxrwx 1 root root 0 syys   20 09:31 sdc -> ../devices/pci0000:00/0000:00:14.0/usb1/1-9/1-9.2/1-9.2.1/1-9.2.1.3/1-9.2.1.3:1.0/host6/target6:0:0/6:0:0:0/block/sdc

Tuon mukaan se sdc olisi hyvinkin usb-väylän kautta esim. tuo SD- tai TF- lukija. Mutta tuo löysi myös sen M.2 -levyn, jota ohjelma ei tulostanut. Eli ohjelma ei toimi tekijänsä väittämän mukaan.
« Viimeksi muokattu: 20.09.22 - klo:11.40 kirjoittanut ilkant »

ilkant

  • Käyttäjä
  • Viestejä: 1380
  • Kubuntu
    • Profiili
Vs: Pythonin löytämät levyt
« Vastaus #3 : 20.09.22 - klo:12.31 »
Vielä kysyisin M2-levyn laitenimestä /dev/nvme0n1 seuraavaa. Emolla on paikka toiselle M.2 -levylle. Sen laitenimi tulisi varmaan olemaan /dev/nvme0n2 ? Ja mistä tuo nolla nvme:n perään tulee? Emo on MSI Z490-A pro.

Tuon M.2 -levyn ykköspartitio on nvme0n1p1. Eli nvme0 säilynee siihen kakkoslevyyn, jos sellaisen asentaisi.
.
Tällä koodilla ainakin tuo yksi M.2 levy löytyi SATA-levyjen lisäksi.

Koodia: [Valitse]
from pathlib import Path
m2_disk = [p for p in Path('/sys/block').glob('nvme0n[0-9]')]
sata_disk = [p for p in Path('/sys/block').glob('sd[a-z]')]

disk_dict = {d.name: d.joinpath('size').read_text().strip() for d in m2_disk}
disk_temp = {d.name: d.joinpath('size').read_text().strip() for d in sata_disk}
disk_dict.update(disk_temp)

for dev,size in disk_dict.items():
    print('{:15} {:.0f} GB'.format('/dev/'+dev, int(size)*512/1000000000))

Koodia: [Valitse]
$ python disk_size2.py
/dev/nvme0n1    500 GB
/dev/sdb        1000 GB
/dev/sdc        0 GB
/dev/sda        4001 GB
« Viimeksi muokattu: 20.09.22 - klo:13.23 kirjoittanut ilkant »

nm

  • Käyttäjä
  • Viestejä: 16428
    • Profiili
Vs: Pythonin löytämät levyt
« Vastaus #4 : 20.09.22 - klo:13.46 »
Vielä kysyisin M2-levyn laitenimestä /dev/nvme0n1 seuraavaa. Emolla on paikka toiselle M.2 -levylle. Sen laitenimi tulisi varmaan olemaan /dev/nvme0n2 ?

Toinen NVME-levy olisi nvme1n1. "n1" tarkoittaa ensimmäistä nimiavaruutta (namespace). Tavallisesti levyllä on vain yksi nimiavaruus, ellet itse luo useampia.

Lisää aiheesta:
https://utcc.utoronto.ca/~cks/space/blog/linux/NVMeDeviceNames
https://www.drewthorst.com/posts/nvme/namespaces/readme/


Tällä koodilla ainakin tuo yksi M.2 levy löytyi SATA-levyjen lisäksi.

Koodia: [Valitse]
m2_disk = [p for p in Path('/sys/block').glob('nvme0n[0-9]')]
sata_disk = [p for p in Path('/sys/block').glob('sd[a-z]')]

disk_dict = {d.name: d.joinpath('size').read_text().strip() for d in m2_disk}
disk_temp = {d.name: d.joinpath('size').read_text().strip() for d in sata_disk}
disk_dict.update(disk_temp)

Tai lyhyemmin:

Koodia: [Valitse]
disk = [p for p in Path('/sys/block').glob('nvme*')]
disk += [p for p in Path('/sys/block').glob('sd[a-z]')]
disk_dict = {d.name: d.joinpath('size').read_text().strip() for d in disk}
« Viimeksi muokattu: 20.09.22 - klo:13.48 kirjoittanut nm »

ilkant

  • Käyttäjä
  • Viestejä: 1380
  • Kubuntu
    • Profiili
Vs: Pythonin löytämät levyt
« Vastaus #5 : 20.09.22 - klo:18.14 »
Tai lyhyemmin:

Koodia: [Valitse]
disk = [p for p in Path('/sys/block').glob('nvme*')]
disk += [p for p in Path('/sys/block').glob('sd[a-z]')]
disk_dict = {d.name: d.joinpath('size').read_text().strip() for d in disk}

Tuota += operaattoria aluksi yritinkin, mutta kun tein sen dictionarylle, niin tuli virheilmoitus. Noin se onkin kätevä tehdä. Aina oppii.

SuperOscar

  • Käyttäjä
  • Viestejä: 4060
  • Ocatarinetabellatsumtsum!
    • Profiili
    • Legisign.org
Vs: Pythonin löytämät levyt
« Vastaus #6 : 20.09.22 - klo:21.39 »
Tyyliäkin voi miettiä:

Koodia: [Valitse]
disk_dict = {d.name: (d / 'size').read_text().strip() for d in disk}
/-operaattorin valjastaminen osien yhdistämiseen on pathlibin hauskimpia ratkaisuja.

Muoks: Samoin tulostuksessa f-jonot ovat näppäriä:

Koodia: [Valitse]
size = int(size) * 512 / 1e+9
print(f'/dev/{dev:15} {size:.0f} Gt')

(Periaatteessa {…}-jonojen sisään voi sijoittaa muuttujan nimien lisäksi kokonaisia lausekkeita, mutta minusta noin on luettavampaa.)
« Viimeksi muokattu: 20.09.22 - klo:21.42 kirjoittanut SuperOscar »
pöytäkone 1, NUC: openSUSE Leap 15.6, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; RPi 1: FreeBSD 14-RELEASE; RPi 2: LibreELEC 11