Portál AbcLinuxu, 13. května 2025 23:08

Dotaz: Jak zjistit cestu k device z device number?

18.2.2010 21:07 kralyk z abclinuxu | skóre: 29 | blog:
Jak zjistit cestu k device z device number?
Přečteno: 343×
Odpovědět | Admin
Mám device number (buď holé v jednom čísle, nebo převedené do formátu major:minor, to je jedno), např 8:1 je u mně /dev/sda1 atd.

Jaký je "správný" způsob, jak se z tohohle čísla dostat ke konkrétní block device v /dev?
Koukal jsem např, že v /dev/block/ jsou odpovídají symlinky, ale dá se na tohle spolehnout, že to tak bude i na jiných linuxových strojích? Odpovídá to POSIXu?
Nebo budu muset hledat v /dev a statem zjišťovat, který device odpovídá?

"správným" způsobem mám na mysli způsob, který bude fungovat pokud možno všude pokud možno bez dependencí... ideálně POSIX conforming.

Díky moc za každou pomoc
SPD vůbec není proruská

Řešení dotazu:


Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Fuky avatar 19.2.2010 00:36 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Jak zjistit cestu k device z device number?
Odpovědět | | Sbalit | Link | Blokovat | Admin

major/minor number to device path translate

O /dev/block/ se stará udev, tak by to snad na Linuxových strojích s jádrem 2.6 neměl být problém.

$ vim /etc/udev/rules.d/50-udev.rules
SUBSYSTEM=="block",    SYMLINK+="block/%M:%m"

Jestli se nepletu, tak v POSIX žádná zmíňka o /dev/block není IEEE Std 1003.1, 2004 Edition, ISO/IEC 9945.

-- RÁMO: psí tábor , ETriatlon: Výuka plavání
19.2.2010 01:16 Delaunay | skóre: 17 | blog:
Rozbalit Rozbalit vše Re: Jak zjistit cestu k device z device number?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pochybuji že existuje nějaký "správný" způsob. Pokud se o tvorbu souborů zařízení na cílovém systému stará udev, tak bych zřejmě doporučil knihovnu libudev.
19.2.2010 12:39 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Jak zjistit cestu k device z device number?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ok díky,
vidím to tak, že použiju udev/libudev a jako fallback prolistování /devu statem.
SPD vůbec není proruská
22.2.2010 11:58 Ivan
Rozbalit Rozbalit vše Re: Jak zjistit cestu k device z device number?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zadny overeny zpusob bohuzel existovat nemuze, kernel jmena zarizeni nezna. pokud spustis "mknod /tmp/abc b 8 1" tak budes mit "sda1" klidne i v temp-u. Nejjstejsi reseni je opravdu ten find a stat.
22.2.2010 18:16 kralyk z abclinuxu | skóre: 29 | blog:
Rozbalit Rozbalit vše Re: Jak zjistit cestu k device z device number?
Moje současné řešení vypadá takhle:

string device_from_number(unsigned int major, unsigned int minor)
{
  const string devdir = "/dev/";
  const string devblockdir = "/dev/block/";
  stringstream ss;
  string result = "";

  ss << major << ':' << minor << flush;
  if (file_exists(devblockdir))
  {
    if (!dir_empty(devblockdir))
    {
      if (file_exists(devblockdir+ss.str())) result = devblockdir+ss.str();
    } else goto fallback;
  } else
  {
    fallback:
    DIR* dir;
    dirent* ent;
    dir = opendir(devdir.c_str());
    if (dir)
    {
      while (ent = readdir(dir))
      {
        struct stat finfo;
        string fn = devdir + ent->d_name;
        if (!stat(fn.c_str(), &finfo))
        {
          if (S_ISBLK(finfo.st_mode) && (makedev(major, minor) == finfo.st_rdev))
          {
            result = fn;
            break;
          }
        }
      }
    } else
    {
      ohshiT(errno, ERR_OPENING_DIR, "Could not open directory: '"+devdir+"'");
    }
    closedir(dir);
  }
  return result;
}
(Toho makra dole si nevšímejte, tím vyhazuju exceptions)
Pokud není device nalezen, je vrácen prázdný string.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.