Byla vydána verze 5.30 dnes již open source operačního systému RISC OS (Wikipedie).
V aktuálním příspěvku na blogu počítačové hry Factorio (Wikipedie) se vývojář s přezývkou raiguard rozepsal o podpoře Linuxu. Rozebírá problémy a výzvy jako přechod linuxových distribucí z X11 na Wayland, dekorace oken na straně klienta a GNOME, změna velikosti okna ve správci oken Sway, …
Rakudo (Wikipedie), tj. překladač programovacího jazyka Raku (Wikipedie), byl vydán ve verzi #171 (2024.04). Programovací jazyk Raku byl dříve znám pod názvem Perl 6.
Společnost Epic Games vydala verzi 5.4 svého proprietárního multiplatformního herního enginu Unreal Engine (Wikipedie). Podrobný přehled novinek v poznámkách k vydání.
Byl vydán Nextcloud Hub 8. Představení novinek tohoto open source cloudového řešení také na YouTube. Vypíchnout lze Nextcloud AI Assistant 2.0.
Vyšlo Pharo 12.0, programovací jazyk a vývojové prostředí s řadou pokročilých vlastností. Krom tradiční nadílky oprav přináší nový systém správy ladících bodů, nový způsob definice tříd, prostor pro objekty, které nemusí procházet GC a mnoho dalšího.
Microsoft zveřejnil na GitHubu zdrojové kódy MS-DOSu 4.0 pod licencí MIT. Ve stejném repozitáři se nacházejí i před lety zveřejněné zdrojové k kódy MS-DOSu 1.25 a 2.0.
Canonical vydal (email, blog, YouTube) Ubuntu 24.04 LTS Noble Numbat. Přehled novinek v poznámkách k vydání a také příspěvcích na blogu: novinky v desktopu a novinky v bezpečnosti. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 10. LTS verzi.
Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.
Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.
/dev
, vybírám zařízení s názvy sg<číslo>
, otevřu a přes ioctl
pošlu SCSI_INQUIRY a pak testuju vrácená inquiry data, byte 1, bity 0-5 na hodnotu 0x05.
Jenže prohledávání /dev
adresáře je docela pomalé, dochází tam k neustálému kopírování řetězců, a tak hledám nějaký lepší způsob.
Řešení dotazu:
/sys
musí stačit.
GetLogicalDrives()
dostanu zařízení a funkcí GetVolumeType()
dostanu info, jestli jde o CD-ROM, aniž by se požadavek posílal mechanice, protože to už Windows "ví".
Tak mi tedy řekněte, kde v /sys ty mechaniky najdu, sice něco najdu, ale ať tam hledám jak divej, nikde nenalézám symlink na zařízení /dev/sg*
find /sys/devices -name 'media' | while read media; do [[ "$(<$media)" == "cdrom" ]] && echo "$media" done
find /sys/devices -name 'media'
mi tu nenajde vůbec nic ...
hal-device $(hal-find-by-capability --capability storage.cdrom) | grep sysfs
tak mi cdrom najde podle "capabilities". Je jich více: { 'storage', 'block', 'storage.cdrom' }
Ve vygrepovaném adresáři v sysfs sice také existuje soubor capabilities, ale tam je jen "19". Kdyby to znamenalo cdrom (nedaří se mi najít význam toho souboru či čísla) tak by to mohlo pomoct:
find /sys/devices -name 'capability' | while read capability; do
[[ "$(<$capability)" == "19" ]] && echo "$capability"
done
ale bohužel jsem z toho jinak jelen :(
hal-device $(hal-find-by-property --key storage.drive_type --string cdrom) | grep sysfs
ale jinak tomu vůbec nerozumím (to asi nemusím říkat).
/sys/bus/scsi/
. Jsou tam adresy zařízení ve tvaru A:B:C:D. Když do toho kouknu, jsou tam mimo jiné i údaje z inquery struktury (vendor, model, rev, ...) včetně type (5 = CD-ROM). Dále v tom adresáři je adresář scsi_generic, v něm adresář sg1 atd. Jenže tam nikde nevidím link na soubor s zařízením, který bych byl schopen otevřít a posílat SCSI příkazy, což je můj cíl (tak trochu si hraju a chci se dopracovat ke smazání cédéčka).
/sys/devices
. HAL vám nenutím, měl sloužit jen k identifikaci problému.
Zatím je rozdíl v tom, že vy máte scsi
a já ide
cd-rom.
Chcete říct, že vám ten hal to zařízení v /sys/devices
nenašel?
Osobně mám v /sys/devices
jak ide tak scsi zařízení.
/sys/devices/pci0000:00/0000:00:1f.2/host1/target11:0:0/1:0:0:0/block/sr0
, ale z toho taky nedostanu cestu k zařízení. Navíc zařízení /dev/sr0 nemůžu SCSI příkazy posílat, jeho otevřením se totiž otevře to médium, co tam je, musí se otevřít generické scsi zařízení /dev/sgX.
Škoda, že se kvůli debilní licenci nemůžu podívat do zdrojáků cdrecordu nebo wodimu. Zkusím naně strace ... á, někdo si může stěžovat na můj přístup, co dělá wodim. Zkouší otevírat všechna zařízení /dev/hda až /dev/hdz, /dev/scd1 až /dev/scd255 a pokud se je podaří otevřít, posílá jim SCSI příkazy. Takže opravdu zůstanu u svého způsobu, když to jinak očividně nejde.
Taky nechápu, proč wodim používá flag O_EXCL pro volání open() bez O_CREAT, když manuálová stránka píše, že je pak výsledek nedefinovaný.
[petr@nt /sys/devices]$ hal-device $(hal-find-by-property --key storage.drive_type --string cdrom) | grep sysfs linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:11.0/host1/target1:0:0/1:0:0:0/block/sr0' (string) [petr@nt /sys/devices]$
Link tam nie je (pretoze moze byt lubovolny pocet suborov, ktore reprezentuju toto zariadenie) - ale v adresari block najdes subor dev, v ktorom je MAJOR a MINOR.vám sice následně ruply nervy, ale osobně nepovažuji za velký problém projít těch pár AKTIVNÍCH sg zařízení, otevřít pár souborů dev a přečíst si major a minor, čímž mám /dev/srX (v případě scsi). Zkuste mrknout na sg_map, v nové verzi pracuje se sysfs.
$ sg_map # Note: the devfs pseudo file system is present /dev/sg0 /dev/sda /dev/sg1 /dev/sr0 /dev/sg2 /dev/sr1Samozřejmě je pořád možnost dělat to postaru, pokud jste pod tlakem.
{,}
).
V Linuxové verzi jsem teď na 174 řádcích a teď zbývá ještě dopsat kód na prohledání celého /dev pro případ, že zařízení /dev/jméno_co_se_našlo_v_sysfs
neexistuje, nebo se jeho major/minor neshoduje s tím v /sys.
Kdyby někoho zajímalo, jak to vypadá ve Windows:
TSCSIDrive *drive; TSCSIDrive tmpDrive; uint8_t device_type; /* * Using GetLogicalDrives() could speed up things, but there is always * possibility, that drive has no letter assigned, is mounted to NTFS * folder or it is not even mounted. This way we handle all these cases. */ HANDLE hVolumeSearch; /* * Volume name is in "\\?\Volume{ITS_GUID}\" format, * GUID's format is AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA */ WCHAR volumeName[MAX_PATH]; hVolumeSearch = FindFirstVolumeW(volumeName, MAX_PATH); if (hVolumeSearch != INVALID_HANDLE_VALUE) { do { volumeName[MAX_PATH-1] = 0; if (GetDriveTypeW(volumeName) == DRIVE_CDROM) { tmpDrive._open_fn = volumeName; // remove trailing slash so that we open drive itself and not // the medium inserted if (tmpDrive._open_fn[tmpDrive._open_fn.size()-1] == '\\') { tmpDrive._open_fn.erase(tmpDrive._open_fn.size()-1); } if (tmpDrive.openDrive()) { tmpDrive.setTimeout(10); // request inquiry data and make sure OS didn't lie to us if (tmpDrive.inquiry(tmpDrive._inqData, TSCSIDrive::INQUIRY_DATA_SIZE)) { device_type = (tmpDrive._inqData[0] & 0x1F); if (device_type == 0x05 /* CD-ROM */) { drive = new TSCSIDrive(); tmpDrive.readScsiAddress(drive->_address); drive->_open_fn = std::move(tmpDrive._open_fn); memcpy(drive->_inqData, tmpDrive._inqData, TSCSIDrive::INQUIRY_DATA_SIZE); _drives.push_back(drive); } } tmpDrive.closeDrive(); } tmpDrive._open_fn.clear(); } } while (FindNextVolumeW(hVolumeSearch, volumeName, MAX_PATH)); FindVolumeClose(hVolumeSearch); }
system("lsscsi | grep ...")
:)
Documentation/sysfs-rules.txt
a další.
vojta|vojta-dell ~ $> pkg-config --list-all | grep -i cd
libcdt libcdt - Container DataType library
libudf libudf - UDF library of libcdio
libcdio++ libcdio++ - C++ OO Portable CD-ROM I/O library
libcdio libcdio - Portable CD-ROM I/O library
libiso9660++ libiso9660++ - C++ OO ISO-9660 library of libcdio
libiso9660 libiso9660 - ISO-9660 library of libcdio
gstreamer-cdda-0.10 GStreamer CDDA Library - CDDA base classes
libcdio_cdda libcdio_cdda - CD paranoia CD-DA library from libcdio
libcdio_paranoia libcdio_paranoia - CD paranoia library from libcdio
libcddb libcddb - CDDB server access library
vojta|vojta-dell ~ $> pkg-config --list-all | grep -i devic
libgphoto2_port libgphoto2_port - Device-independent access to serial, USB, and other ports
devkit-power-gobject devkit-power-gobject - DeviceKit-power is a system daemon for installing stuff.
gnome-bluetooth-1.0 gnome-bluetooth-1.0 - Widgets for Bluetooth device selection
usbutils usbutils - USB device database
libmtp libmtp - libmtp is a library for accessing Media Transfer Protocol devices
devmapper-event devmapper-event - device-mapper event library
pciaccess pciaccess - Library providing generic access to the PCI bus and devices.
libsynce libsynce - A helper library for SynCE, a framework to sync WinCE devices
libavdevice libavdevice - FFmpeg device handling library
DeviceKit-disks DeviceKit-disks - DeviceKit-disks daemon
blkid blkid - Block device id library
devmapper devmapper - device-mapper library
libv4l2 libv4l2 - v4l2 device access library
hal-storage hal-storage - hal library for storage devices and volumes
libudev libudev - Library to access udev device information
vojta|vojta-dell ~ $> pkg-config --list-all | grep -i dvd
dvdread libdvdread - Low level DVD access library
dvdnavmini libdvdnavmini - DVD Navigation mini library
libdvdcss libdvdcss - DVD access and decryption library.
dvdnav libdvdnav - DVD Navigation library
vojta|vojta-dell ~ $>
Především ta prostřední skupina mi přijde zajímavá./sys/devices
.
Utilita tu už taky byla, jmenuje se sg_map
. Nová verze sg_map26 překvapivě funguje nad /sys
... Takže pokud nepoužíváš jádro 2.4...
Hovoříš o linuxu a máš něco proti souborům? Dobré ráno. V linuxu je všechno důležité soubor, a pokud ne soubor, tak alespoň virtuální filesystém. sysfs
je standardní rozhraní a má světlou budoucnost (TM).
V linuxu to takto prostě funguje, filesystém a soubory jsou rozhraní k jádru, zařízením a dalším věcem. Je to základní princip fungování, ne něco špatného či nevhodného. Není lepší způsob, protože sysfs není špatný způsob.
Pět minut je fakt málo.
find
někde na /proc nebo /sys, to je prostě blbost.Tiskni Sdílej: