Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: ilkant - 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.
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
-
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:
ls -l /sys/block
Onko koneessasi muistikortinlukija, jossa ei ole muistikorttia paikallaan? Se voisi näkyä sd-lakuisena laitteena ja olla nollan tavun kokoinen.
-
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:
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
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.
-
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.
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))
$ python disk_size2.py
/dev/nvme0n1 500 GB
/dev/sdb 1000 GB
/dev/sdc 0 GB
/dev/sda 4001 GB
-
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.
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:
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}
-
Tai lyhyemmin:
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.
-
Tyyliäkin voi miettiä:
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ä:
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.)