To jest kopia z pamięci podręcznej Google adresu http://forum.dug.net.pl/viewtopic.php?pid=157125. Zdjęcie przedstawia stan strony z 23 Wrz 2010 22:34:38 GMT. Aktualna strona może wyglądać inaczej. Więcej informacji

Wersja tekstowa
Te wyszukiwane hasła są podświetlone: paoolo  
[PARTIALLY-SOLVED] Jak spr. czy urządzenie jest partycją rozszerzoną? - Forum Debian Users Gang

Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je za darmo już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu.

Ogłoszenie

Zapraszamy do korzystania z komunikatora Jabber/XMPP w domenie DUG-a: jid.dug.net.pl.
Konto można zarejestrować przez forum: Profil > Jabber/XMPP. Szczegóły w wątku na forum.


Chcesz wspomóc DUG-a? Chcesz nowych ciekawych funkcji? Zapraszam do wątku :)

#1 2010-09-22 20:03:41

Minio
Użyszkodnik
Skąd: Poznań/ Dziwnów
Zarejestrowany: 2007-12-22
Serwis

[PARTIALLY-SOLVED] Jak spr. czy urządzenie jest partycją rozszerzoną?

Na wstępie uściślę terminologię, żeby nie popaść w zbędne spory o słowa:
- partycja podstawowa jest partycją bezpośrednio zapisaną w tablicy partycji dysku. Dysk twardy może mieć maksymalnie cztery takie partycje.
- partycja rozszerzona jest partycją podstawową w obrębie której mogą znajdować się dodatkowe partycje
- partycja logiczna jest partycją która funkcjonuje w obrębie partycji rozszerzonej

Jak łatwo się domyślić, ze względu na ograniczenie liczby partycji podstawowych, często tworzy się trzy partycje podstawowe i partycję rozszerzoną w obrębie której można utworzyć dowolną liczbę partycji logicznych, co oznacza że na jednym dysku można mieć więcej niż zaledwie 4 partycje.

I teraz pytanie za sto punktów:
jak sprawdzić czy dane urządzenie (/dev/whatever) jest partycją rozszerzoną?

file -s na partycji rozszerzonej daje pewne informacje, stosunkowo podobne do tych które daje file -s na partycji z systemem plików NTFS (jednak wystarczająco odmienne żeby choćby grepem zdecydować czy ma się do czynienia z partycją rozszerzoną czy partycją NTFS)
Można zrobić if [ $(fdisk -l /dev/whatever |awk ' /whateverX/ {print $5}') -eq 5 ]; then echo "rozszerzona" ; fi

Jest tylko jeden problem — oba te polecenia dadzą sensowne wyniki jeśli zostaną uruchomione jako root, tymczasem ja potrzebuję czegoś co może być uruchomione jako zwykły użytkownik. sudo jest ostatecznym rozwiązaniem.

Czego użyć w takiej sytuacji?

Ostatnio edytowany przez Minio (2010-09-22 23:41:00)

Online

 

#2 2010-09-22 20:11:00

paoolo
Łopatolog stosowany
Zarejestrowany: 2006-05-20

Re: [PARTIALLY-SOLVED] Jak spr. czy urządzenie jest partycją rozszerzoną?

Nie mam rozszerzonej (kiedyś tak) ale czy zapis

Kod:

brw-rw---- 1 root disk 8, 0 09-22 18:29 sda
brw-rw---- 1 root disk 8, 1 09-22 18:29 sda1
brw-rw---- 1 root disk 8, 2 09-22 18:29 sda2
brw-rw---- 1 root disk 8, 3 09-22 18:29 sda3
brw-rw---- 1 root disk 8, 4 09-22 18:29 sda4

a dokładnie 8,0, 8,1, itd. może coś dać? Wiem, że pierwszy znaczy co z jądra, a drugi jaki fragment, czy jakoś tak, mknod za to odpowiada.

EDIT:
Albo zapis ilość bloków z /proc/partitions,

Kod:

paoolo@student:~/temp$ cat /proc/partitions 
major minor  #blocks  name

   8        0   39070080 sda
   8        1     979933 sda1
   8        2    3903795 sda2
   8        3    9775552 sda3
   8        4   24410767 sda4

można permutować która z partycji jest zbiorem innych (ta rozszerzona czy jakoś tak) czyli której ilość bloków jest równa dokładnie dowolnemu podzbiorowi pozostałych ilość bloków partycji (złożoność: uff dużaaaa), hmm można by wykluczać niczym w nierównosci trójkąta, które nie mają prawa zachodzić ale i tak zachodzi cykl procesora by to policzyć ;/

Kurde wciągnęło mnie to :P Heh to podchodzi pod programowanie dynamiczne :)

Hmm bledne wyniki daje.. Chociażby przypadek gdy wszystkie mają po tyle samo :/ Hmm i w praktyce suma bloków nie musi być równa sumie reszcie, bo przypadki idealne rzadko istnieją.

EDIT: prymitywny kod

Kod:

#include <iostream>

using namespace std;

class queue {
private:
    struct node {
        int blocks;
        node* next;

        node(int blocks = 0, node* next = NULL) {
            this->blocks = blocks;
            this->next = next;
        }
        ~node() {
            delete this->next;
        }
    } ;

    node* top;
public:

    queue() {
        top = NULL;
    }
    ~queue() {
        delete top;
    }

    void insert(int blocks) {
        node** point = &top;
        while(point && *point && (*point)->blocks > blocks)
            point = &((*point)->next);
        *point = new node(blocks,*point);
    }
    void show() {
        node* point = top;
        while(point) {
            cout << point->blocks << endl;
            point = point->next;
        }
    }
    void check() {
        node *point = top;
        int order = 0;
        while(point) {
            if(check(0,point->blocks,point->next))
                cout << "Part #" << order << " is ext" << endl;
            point = point->next;
            order++;
        }
    }
    bool check(int sum, int limit, node* point) {
        if(point) {
            if(sum + point->blocks < limit) 
                return check(sum+point->blocks,limit,point->next);
            else if(sum + point->blocks == limit)
                return true;
            else
                return check(sum,limit,point->next);
        } else
            return false;
    }
} ;

int main() {
    queue obj;
    int blocks;
    cin >> blocks;
    while(blocks) {
        obj.insert(blocks);
        cin >> blocks;
    }
    obj.show();
    obj.check();
    return 0;
}

W sumie można wywalić sortowanie.

Poprawione, z uwzględnieniem kolejności zapisu w /proc/partitions, bo na podstawie ich można wnioskować coś niecoś o istnieniu rozszerzonych :)

Kod:

#include <iostream>

using namespace std;

class queue {
private:
    struct node {
        int blocks;
        node* next;

        node(int blocks = 0, node* next = NULL) {
            this->blocks = blocks;
            this->next = next;
        }
        ~node() {
            delete this->next;
        }
    } ;

    node *top, **last;
public:
    class isEmpty {} ;

    queue() {
        top = NULL;
        last = NULL;
    }
    ~queue() {
        last = NULL;
        delete top;
    }
    void insert(int blocks) {
        if(last) {
            *last = new node(blocks,*last);
            last = &((*last)->next);
        } else {
            top = new node(blocks,NULL);
            last = &(top->next);
        }
    }
    void check() {
        node *point = top;
        int order = 0;
        while(point) {
            if(check(0,point->blocks,point->next))
                cout << "Part #" << order << " is ext" << endl;
            point = point->next;
            order++;
        }
    }
    bool check(int sum, int limit, node* point) {
        if(point) {
            if(sum + point->blocks < limit) 
                return check(sum+point->blocks,limit,point->next);
            else if(sum + point->blocks == limit)
                return true;
            else
                return check(sum,limit,point->next);
        } else
            return false;
    }
} ;

int main() {
    queue obj;
    int blocks;
    cin >> blocks;
    while(blocks) {
        obj.insert(blocks);
        cin >> blocks;
    }
    obj.check();
    return 0;
}

Ostatnio edytowany przez paoolo (2010-09-22 21:03:08)

Online

 

#3 2010-09-22 22:40:00

Minio
Użyszkodnik
Skąd: Poznań/ Dziwnów
Zarejestrowany: 2007-12-22
Serwis

Re: [PARTIALLY-SOLVED] Jak spr. czy urządzenie jest partycją rozszerzoną?

paoolo: dzięki za zainteresowanie problemem. Faktycznie nie napisałem tego wcześniej, ale piszę w shellu i tworzenie własnego programu w C (chyba, bo ja znam tylko niektóre języki interpretowalne) byłoby dla mnie jeszcze gorszym rozwiązaniem niż użycie sudo ;) . Chodzi mi o maksymalną przenośność skryptu — nie chciałbym żeby działał on tylko na moim komputerze. A zarówno modyfikacja sudoers jak i tworzenie własnego programu pomocniczego do tego prowadzą.

Tylko widzisz:

Kod:

minio@pingwin ~ ]:-> cat /proc/partitions 
major minor  #blocks  name

   8        0  312571224 sda
   8        1     102400 sda1
   8        2   61337600 sda2
   8        3      88357 sda3
   8        4          1 sda4
   8        5   19535008 sda5
   8        6    3317391 sda6
   8        7  228179196 sda7
   8       32  312571224 sdc
   8       33  252927328 sdc1
   8       34   59641312 sdc2

Partycja rozszerzona najwyraźniej ma wielkość jednego bloku wg /proc/partitions (fdisk twierdzi inaczej), więc Twój sposób dla /proc/partitions się po prostu nie sprawdzi.

Mogę więc sprawdzać która partycja w /proc/partitions ma wielkość jednego bloku, ale wtedy pozostają dwie sprawy:
1. czy każda partycja rozszerzona ma w /proc/partitions wielkość jednego bloku?
2. false-positive w przypadku partycji podstawowych/logicznych mających wielkość jednego bloku (nie wiem po co komukolwiek mogłaby być taka potrzebna, ale trzeba jednak wziąć pod uwagę że ktoś może taką mieć).

Ostatnio edytowany przez Minio (2010-09-22 22:41:00)

Online

 

#4 2010-09-22 22:44:39

Yampress
Imperator
Skąd: /dev/null
Zarejestrowany: 2007-10-18
Serwis

Re: [PARTIALLY-SOLVED] Jak spr. czy urządzenie jest partycją rozszerzoną?

Kod:

fdisk -l /dev/sda[hda]

nie wystarczy ??

debian:/home/yampress# fdisk -l /dev/sda

Disk /dev/sda: 500.1 GB, 500106780160 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x1d4f9a43

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          13      102400    7  HPFS/NTFS
/dev/sda2              13       15298   122777600    7  HPFS/NTFS
/dev/sda3           15299       46178   248043569+   5  Extended
/dev/sda4           46179       60802   117460287   a5  FreeBSD
/dev/sda5           15299       18337    24410736   83  Linux
/dev/sda6           18338       18580     1951866   82  Linux swap / Solaris
/dev/sda7           18581       46178   221680903+  83  Linux
debian:/home/yampress#

czytasz i widzisz
/dev/sda3           15299       46178   248043569+   5  Extended 
ten ostatni wyraz oznacza rozszerzoną. Na niej siedza dyski logiczne sda5,6,7 . Patrzysz na pola start i end każdj partycji i widzisz że te dyski logiczne mieszcza sie w rozszerzonej... itp proste jak pogięty drut :D

Ostatnio edytowany przez Yampress (2010-09-22 22:47:08)


http://yampress.dug.net.pl/ZRZUTY/powered.jpg

Offline

 

#5 2010-09-22 23:11:54

Minio
Użyszkodnik
Skąd: Poznań/ Dziwnów
Zarejestrowany: 2007-12-22
Serwis

Re: [PARTIALLY-SOLVED] Jak spr. czy urządzenie jest partycją rozszerzoną?

Yampress: nie:

Kod:

root@pingwin:~# ls -lah $(which fdisk)
-rwxr-xr-x 1 root root 94K 06-20 16:19 /sbin/fdisk

Zwykły użytkownik nie ma dostępu do fdiska. Ja potrzebuję coś co może użyć zwykły użytkownik bez specjalnych uprawnień. Jak pisałem w pierwszym poście, sudo to ostateczność.

Online

 

#6 2010-09-22 23:39:31

Minio
Użyszkodnik
Skąd: Poznań/ Dziwnów
Zarejestrowany: 2007-12-22
Serwis

Re: [PARTIALLY-SOLVED] Jak spr. czy urządzenie jest partycją rozszerzoną?

Wyżej nie napisałem prawdy — zwykły użytkownik ma dostęp do fdiska, ale musi go uruchomić przez podanie ścieżki absolutnej (chyba że sobie do PATH dopisze /sbin). Ale problem leży zupełnie gdzie indziej:

Kod:

minio@pingwin ~ ]:-> ls -lah /dev/sd*
brw-rw---- 1 root disk   8,  0 09-22 21:31 /dev/sda
brw-rw---- 1 root disk   8,  1 09-22 21:31 /dev/sda1
brw-rw---- 1 root disk   8,  2 09-22 21:31 /dev/sda2
brw-rw---- 1 root disk   8,  3 09-22 21:31 /dev/sda3
brw-rw---- 1 root disk   8,  4 09-22 21:31 /dev/sda4
brw-rw---- 1 root disk   8,  5 09-22 21:31 /dev/sda5
brw-rw---- 1 root disk   8,  6 09-22 21:31 /dev/sda6
brw-rw---- 1 root disk   8,  7 09-22 21:31 /dev/sda7
brw-rw---- 1 root floppy 8, 16 09-22 21:31 /dev/sdb
brw-rw---- 1 root floppy 8, 32 09-22 21:31 /dev/sdc
brw-rw---- 1 root floppy 8, 33 09-22 22:44 /dev/sdc1
brw-rw---- 1 root floppy 8, 34 09-22 21:31 /dev/sdc2
minio@pingwin ~ ]:-> groups 
minio cdrom floppy audio dip video plugdev netdev

Jak widać część urządzeń w /dev/ (konkretniej sda) może być czytana tylko przez właściciela lub członków grupy, natomiast domyślnie zwykły użytkownik nie należy do tej grupy (chciałbym wiedzieć dlaczego, ale google nie oferuje mi sensownych odpowiedzi). W tym wypadku żadne polecenie nie będzie w stanie sprawdzić czy sda* jest partycją rozszerzoną, ponieważ żadne polecenie nie będzie w stanie odczytać tego pliku.

Rozwiązania widzę cztery:
1. dodanie regułki udev żeby urządzenia sda* były własnością grupy floppy lub innej do której należy zwykły użytkownik -> jest inwazyjne dla systemu (znaczy wymaga ingerencji ze strony użytkownika zanim zacznie działać)
2. dodanie użytkownika do grupy disk -> jest inwazyjne dla systemu
3. modyfikacja pliku sudoers aby użytkownik mógł uruchamiać fdisk z uprawnieniami roota -> jest inwazyjne dla systemu
4. sprawdzanie /proc/ w poszukiwaniu odpowiednich informacji
  a) /proc/partitions z zastrzeżeniami z poprzedniego postu
  b) innego pliku, jednak nie wiem jakiego

Rozwiązanie 4B, o ile istnieje, byłoby najlepsze. Ja zdecydowałem się na 2. Tym samym problem ogłaszam w części rozwiązanym.

Ostatnio edytowany przez Minio (2010-09-22 23:39:49)

Online

 

#7 Wczoraj 06:56:03

paoolo
Łopatolog stosowany
Zarejestrowany: 2006-05-20

Re: [PARTIALLY-SOLVED] Jak spr. czy urządzenie jest partycją rozszerzoną?

Hmm nie wiedziałem jak patrzy partitions na rozszerzone partycje bo nie zaglądałem do niego gdy taka miałem a oznaczenie jej jako jeden blok nie daje szans na ustalenie czy to jest rozszerzona więc kicha ale jak wrócę pomyśle może co inne pozwoli ustalić. Te minory powyżej 30 są interesujące co to za partycje? Btw do wieczora.

Online

 

#8 Wczoraj 20:00:00

Minio
Użyszkodnik
Skąd: Poznań/ Dziwnów
Zarejestrowany: 2007-12-22
Serwis

Re: [PARTIALLY-SOLVED] Jak spr. czy urządzenie jest partycją rozszerzoną?

paoolo: sda to dysk twardy w laptopie, sdb to czytnik kart SD (przynajmniej tak twierdzi sginfo, ja jeszcze nie miałem okazji sprawdzić) a sdc to dysk zewnętrzny podłączany przez USB.

Zauważ że z każdym kolejnym urządzeniem (a -> b -> c) podstawa minor zwiększa się o 16 (2^4), co sugeruje że każdy dysk może pomieścić do 15 partycji (0,16,32,48 etc. są zarezerwowane dla nazwy urządzenia bez numeru, czyli pliku blokowego którego i tak nie da się zamontować). Myślę więc że jest to trop który nigdzie nie prowadzi. Być może tę podstawę (2^4) można zmienić gdzieś w konfiguracji kernela.

Online

 

#9 Wczoraj 20:17:31

winnetou
Wódz użyszkodnik
Skąd: Jasło/Rzeszów kiedyś Gdańsk
Zarejestrowany: 2008-03-31
Serwis

Re: [PARTIALLY-SOLVED] Jak spr. czy urządzenie jest partycją rozszerzoną?

Mino pozwolę sobie wtrącić troszkę na temat, troszkę obok. Co do ilości  partycji to częściowo masz rację (co trochę utrudni Ci rozwiązanie). Max 4 partycje można mieć jeżeli jako format tablicy partycji przyjmiesz msdos'owski. Ale już taki np GPT pozwala mieć ich trochę więcej... Swego czasu testowałem to cudo... Działa całkiem nieźle o ile nie masz windowsa....

Ostatnio edytowany przez winnetou (Wczoraj 20:40:20)


LRU: #472938 | PGP Pub Key
jabber: winnetou@jabster.pl
Zbieram spam spamcollector@valhalla.org.pl
http://winnetou.sh.dug.net.pl/thor.gif

Offline

 

#10 Wczoraj 20:39:48

paoolo
Łopatolog stosowany
Zarejestrowany: 2006-05-20

Re: [PARTIALLY-SOLVED] Jak spr. czy urządzenie jest partycją rozszerzoną?

Minio napisał(-a):

paoolo: sda to dysk twardy w laptopie, sdb to czytnik kart SD (przynajmniej tak twierdzi sginfo, ja jeszcze nie miałem okazji sprawdzić) a sdc to dysk zewnętrzny podłączany przez USB..

Czytałem z komórki (102x102) więc mogłem nie zauważyć że tam jest b zamiast a :) Hmm tak czy inaczej dobrze wiedzieć że tak jest.


EDIT: Mam mam mam patrz w /sys/dev/block/*:*/

Hmm jedyne co tam sensownego jest to:

cat /sys/dev/block/major:minor/sd*/start
cat /sys/dev/block/major:minor/sd*/size

Hmm i w sumie co tam masz w

cat /sys/dev/block/major:minor/sd[a|b|c|d]*/uevent

Ostatnio edytowany przez paoolo (Wczoraj 20:52:56)

Online

 

#11 Wczoraj 23:24:33

Minio
Użyszkodnik
Skąd: Poznań/ Dziwnów
Zarejestrowany: 2007-12-22
Serwis

Re: [PARTIALLY-SOLVED] Jak spr. czy urządzenie jest partycją rozszerzoną?

paoolo:

Kod:

minio@pingwin ~ ]:-> for i in /sys/dev/block/*/ ; do basename "$i" ; cat "$i"/uevent ; done
11:0
MAJOR=11
MINOR=0
DEVNAME=sr0
DEVTYPE=disk
7:0
MAJOR=7
MINOR=0
DEVNAME=loop0
DEVTYPE=disk
7:1
MAJOR=7
MINOR=1
DEVNAME=loop1
DEVTYPE=disk
7:2
MAJOR=7
MINOR=2
DEVNAME=loop2
DEVTYPE=disk
7:3
MAJOR=7
MINOR=3
DEVNAME=loop3
DEVTYPE=disk
7:4
MAJOR=7
MINOR=4
DEVNAME=loop4
DEVTYPE=disk
7:5
MAJOR=7
MINOR=5
DEVNAME=loop5
DEVTYPE=disk
7:6
MAJOR=7
MINOR=6
DEVNAME=loop6
DEVTYPE=disk
7:7
MAJOR=7
MINOR=7
DEVNAME=loop7
DEVTYPE=disk
8:0
MAJOR=8
MINOR=0
DEVNAME=sda
DEVTYPE=disk
8:1
MAJOR=8
MINOR=1
DEVNAME=sda1
DEVTYPE=partition
8:16
MAJOR=8
MINOR=16
DEVNAME=sdb
DEVTYPE=disk
8:2
MAJOR=8
MINOR=2
DEVNAME=sda2
DEVTYPE=partition
8:3
MAJOR=8
MINOR=3
DEVNAME=sda3
DEVTYPE=partition
8:32
MAJOR=8
MINOR=32
DEVNAME=sdc
DEVTYPE=disk
8:33
MAJOR=8
MINOR=33
DEVNAME=sdc1
DEVTYPE=partition
8:34
MAJOR=8
MINOR=34
DEVNAME=sdc2
DEVTYPE=partition
8:4
MAJOR=8
MINOR=4
DEVNAME=sda4
DEVTYPE=partition
8:5
MAJOR=8
MINOR=5
DEVNAME=sda5
DEVTYPE=partition
8:6
MAJOR=8
MINOR=6
DEVNAME=sda6
DEVTYPE=partition
8:7
MAJOR=8
MINOR=7
DEVNAME=sda7
DEVTYPE=partition

Jak widać ten plik również nie zawiera żadnych przydatnych informacji.

Kod:

minio@pingwin ~ ]:-> cat /sys/dev/block/8\:4/size # rozszerzona
2
minio@pingwin ~ ]:-> cat /sys/dev/block/8\:5/size # logiczna w rozszerzonej
39070017
minio@pingwin ~ ]:-> cat /sys/dev/block/8\:3/size # podstawowa
176715

Myślałem że może stat zawiera jakieś przydatne informacje, ale dokumentacja rozwiała moje nadzieje.

Obawiam sie ze ten trop tez nie jest trafiony...

Online

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson