Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je za darmo już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu.
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 :)
Strony: 1
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





Nie mam rozszerzonej (kiedyś tak) ale czy zapis
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,
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
#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 = ⊤
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 :)
#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
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:
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
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)

Offline
Yampress: nie:
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
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:
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





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
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
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)
Offline





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
paoolo:
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.
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
Strony: 1