HDDにおいて,MS社のOS環境では,ドライブ(c:等)毎に
8桁のHEX文字で,ボリュームシリアル番号が割り振られて
いますが,Linux-OSにもこの名前(Term 又は概念)は
あるのでしょうか?
ある場合には,アプリケーションプログラムから
この情報を取得(Readのみ)する方法について,
アドバイスを頂きたいのですが?
宜しくお願いします。
- - - - -
FM: 汐崎 廣義 < H.Shiozaki >
E-Mail: sio...@yahoo.co.jp
-----
29.1 VOLUME SERIAL NUMBER FORMAT
The volume serial number was introduced with DOS 4.0 as part of an extended
boot record and is created through you either FORMAT a disk or use DISKCOPY
to create another disk. The serial number is a function of the time/date
of the formatting or the diskcopying. Note that DISCOPY generates a new
volume serial number so a DISKCOPY is not an exact image of the source
diskette.
29.2 CALCULATING THE VOLUME SERIAL NUMBER
For example, say a disk was formatted on 26 Dec 95 at 9:55 PM and 41.94
seconds. DOS takes the date and time just before it writes it to the disk.
Low order word is calculated: Volume Serial Number is:
Month & Day 12/26 0c1ah
Sec & Hundrenths 41:94 295eh 3578:1d02
-----
3578h
High order word is calculated:
Hours & Minutes 21:55 1537h
Year 1995 07cbh
-----
1d02h
Note that DOS interrupt 21h Functions 2ah, Get DOS Date, and 2ch, Get DOS
Time, are particularily suited to getting the date and time for calculating
the Volume Serial Number.
29.3 READING AND SETTING THE VOLUME SERIAL NUMBER
To read the Volume Serial Number, use the IOCTL call, int 21h function
440dh Minor Code 66h, Get Media ID. To write the Volume Serial Number, use
the IOCTL call, int 21h function 440dh Minor Code 46h, Set Media ID.
WARNING! These IOCTL calls use a structure that also contain the volume
label and file system type. So that you do not create errors with these
values, I recommend that you always Minor Code 66h to initialize the
structure before setting the Volume Serial Number to a new value and
writing it back to the disk.
Contributor: Raymond Moon, ray...@moonware.dgsys.com
Last changed: 17 Feb 96
------------------------------
e2label は,上記*1のラベル相当を,表示,設定,変更するようです。
---
*2の情報を,リードだけで良いので得たかったのですが?
--
> ボリュームシリアル番号は,
...
> DosではInt21hを利用して,Readするようですが,
> LinuxやFreeBSDで,できるのかしら?
root 権限があればすぐにできると思います。
% sudo dd if=/dev/hda1 of=bootsector.bin bs=512 count=1
% od -t x1 bootsector.bin
で該当のバイト列を探せば場所はすぐにわかると思います。
FAT16、FAT32、NTFS4、NTFS5 でそれぞれ違う位置という可能性もありますが…
========================================================================
飯嶋 浩光 / でるもんた・いいじま http://www.ht.sakura.ne.jp/~delmonta/
IIJIMA Hiromitsu, aka Delmonta mailto:delm...@ht.sakura.ne.jp
IIJIMA Hiromitsu wrote:
> いいじまです。
>
>
>>ボリュームシリアル番号は,
>
> ...
>
>>DosではInt21hを利用して,Readするようですが,
>>LinuxやFreeBSDで,できるのかしら?
>
>
> root 権限があればすぐにできると思います。
>
> % sudo dd if=/dev/hda1 of=bootsector.bin bs=512 count=1
> % od -t x1 bootsector.bin
>
> で該当のバイト列を探せば場所はすぐにわかると思います。
> FAT16、FAT32、NTFS4、NTFS5 でそれぞれ違う位置という可能性もありますが…
とりあえず、こんな感じかしら...
#include <stdio.h>
#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#define SECSIZE 512 /* hardware sector size */
#define BOOTSIG0 0x55
#define BOOTSIG0_OFF 510
#define BOOTSIG1 0xaa
#define BOOTSIG1_OFF 511
#define EXB_OFF 36
#define EXB_OFF1 64
struct extboot {
int8_t exDrvNum;
int8_t exRsv;
int8_t exSig;
int8_t exVolID[4];
int8_t exLavel[11];
int8_t exType[8];
};
#define EXBOOTSIG 0x29
int
main(int argc, char **argv)
{
char *disk = 0;
char realname[12];
int fd;
u_char boot[SECSIZE];
struct extboot *ex50, *ex710;
u_char *VolID = 0;
if (argc < 2) {
printf("Usage: readvolid [-f] drive\n");
exit(-1);
}
if (argv[1][0] == '-' && argv[1][1] == 'f')
disk = argv[2];
if (disk == 0) {
if (strncmp(argv[1], "/dev", 4) == 0)
disk = argv[1];
else {
snprintf(realname, 12, "/dev/r%s", argv[1]);
disk = realname;
}
}
fd = open(disk, O_RDONLY);
if (fd == -1) {
printf("can't open %s\n", disk);
exit(-3);
}
if (read(fd, &boot, sizeof(boot)) < sizeof(boot)) {
printf("can't read bootsector\n");
exit(-4);
}
if (boot[BOOTSIG0_OFF] != BOOTSIG0
|| boot[BOOTSIG1_OFF] != BOOTSIG1) {
printf("No Boot Signature!\n");
exit(-5);
}
ex50 = (struct extboot *)&boot[EXB_OFF];
ex710 = (struct extboot *)&boot[EXB_OFF1];
if (ex50->exSig == EXBOOTSIG)
VolID = &ex50->exVolID[0];
if (ex710->exSig == EXBOOTSIG)
VolID = &ex710->exVolID[0];
if (VolID != 0) {
printf("VolumeID: %02x%02x-%02x%02x\n",
VolID[3], VolID[2], VolID[1], VolID[0]);
} else
printf("NO VolumeID\n");
exit(0);
}
これで、DOS窓からDIRしたものと比べてみましたが、
fploop,HDD,ディスクイメージをddで読みだした物で
ちゃんと読めているみたいです。
FreeBSD で確認しただけですけど、特定のOSに依存しない様に
書いたつもりですので、多分Linuxでもコンパイル出来る
んじゃないでしょうか。
--
稲川 史(ふひと) http://www.biwa.ne.jp/~fuhito/
~fuhito/rtmach/ (device_read_buffer()って何?)
ならば、(mtoolsに含まれる)mdirのソース見れば良いのでは?
単純にdiskのある位置の4Byteを16進数表示しているだけと
思われるので。
M$みたいに、金もうけの為にコピーコントロールする必要が
無ければ、ボリュームシリアル番号なんて不要な概念です。
結局、日付から生成したID番号に過ぎないんだし。
--
中村和志@神戸 <mailto:k...@kobe1995.net>
NAKAMURA Kazushi@KOBE <http://kobe1995.net/>
- Break the hate chain. No more kill!
administrator@127.1
大体の方針としては,
u_char boot-w [SECSIZE];
を別途用意して,情報をここに集め,
fd = open(disk, O_RDONLY);
をRead/Write型でオープンしておく,
または一旦クローズして,O_WRITEONLY(?)で再オープンし,
(本当の記述は,includeファイルを調べますが)
boot-w[512] を書き戻す。
この結果を出すのには,パーションを用意する為の時間が
相当時間がかかるとおもわれますので,時間をください。
---
稲川 史(ふひと) さんの http://www.biwa.ne.jp/~fuhito/
~fuhito/rtmach/ (device_read_buffer()って何?)
は私目には分かりませんが,RT-Mach のページをみさせてもらい
私にとって,有用な情報がありました。
重ねて御礼申し上げます。
気になったことは,FreeBSD-3.xがRTOSの世界(RT-Mach)では
使われている(?),話題になっていることです。
(私目の場合FreeBSD-4.4以降です)
--
FM: H.Shiozaki
E-Mail: sio...@yahoo.co.jp
H.Shiozaki wrote:
> ext2fs では,特にVSNを設定しない限り,VSNデータは無い
> ことが分かりました。 #これが普通でしょう。
というか、ext2fsではその部分に他の重要な情報が書き込まれている、
と考えた方がいいんじゃないでしょうか。
多分、boot codeが書かれてる気がしますので、ext2fs(やufs)の
パーティションに書き込まない様にした方がよろしいでしょう。
ですから...
> それで,最後の部分に,
> <<---
>> } else
>> printf("NO VolumeID\n");
>> <=
>> exit(0);
>
> <=
> の部分に,
ではなくて、<<--- の部分にwriteのためのコードを入れるのが
よろしいんじゃないですか?
でも、ボリュームシリアルナンバーがWindowsでどのように利用されて
いるのか知らないのですが、ひょっとして勝手に書き換えるとWindows
のほうで問題がおきたりしないんでしょうか?
> 大体の方針としては,
> u_char boot-w [SECSIZE];
> を別途用意して,情報をここに集め,
> fd = open(disk, O_RDONLY);
> をRead/Write型でオープンしておく,
> または一旦クローズして,O_WRITEONLY(?)で再オープンし,
> (本当の記述は,includeファイルを調べますが)
> boot-w[512] を書き戻す。
> この結果を出すのには,パーションを用意する為の時間が
> 相当時間がかかるとおもわれますので,時間をください。
うーん...
それよりも、中村和志さんが仰ってるように、mdirのソースを
みられたほうが、得る物は多いと思いますし、可能ならば、
それをボリュームシリアル番号を表示するように改造して
みられてはいかがですか?
> ---
> 稲川 史(ふひと) さんの http://www.biwa.ne.jp/~fuhito/
> ~fuhito/rtmach/ (device_read_buffer()って何?)
> は私目には分かりませんが,RT-Mach のページをみさせてもらい
> 私にとって,有用な情報がありました。
御覧いただきありがとうございます。
> 気になったことは,FreeBSD-3.xがRTOSの世界(RT-Mach)では
> 使われている(?),話題になっていることです。
> (私目の場合FreeBSD-4.4以降です)
というより、NTTが配布しているRT-MachはFreeBSD 2.2.8互換
のもので、それを私がFreeBSD3.x対応のコードをつっこんだ
だけでして、FreeBSD4.xに対応していないのは、私がFreeBSD
4.xに対応する作業をサボっているだけですし、やりたい事は
いっぱいあるんですけどね;-p
P.S.
殆ど公開私信ですみませんm(__)m>皆様方
--
稲川 史(ふひと) http://www.biwa.ne.jp/~fuhito/
~fuhito/rtmach/ (device_read_buffer()って何?)
--
FM: 汐崎 廣義 < H.Shiozaki >
Windowsではコピーコントロールに使っていたりするので、書換えると
不正コピーされたと見倣すものが存在するようです。ちなみに予備FAT
側にもVSNが書かれているかも知れません。
>そもそもの目的は,PCを1台毎区別するたの,
>「PC毎の固有の情報」を得たかったのですが。
やっぱり…思った通り。そもそも「PC固有の情報とは?」ということを
考えましたか?SUNの様なWorkStationなら固有のHost-IDがNVRAMに
書込まれて出荷されていますが、PCにはそんなものありません。
VSNにその代わりを求めようとしていた様ですが、diskの様に可動部
が有るメカ部品は寿命が短くすぐ壊れて交換しなければなりません。
特にPCの場合、diskどころかM/Bまで交換するのが日常茶飯事なので
IDを記録しておく部品が存在しません。
妥協策として、他の方も挙げられていたようにLANカードのMAC
アドレスを使うという手がしばしば使われています。RedHat
ならばhostidというコマンドでMACアドレスだか、IPアドレスから、
SUNのようなHost-IDを得ることが出来るのではなかったっけ?
Pentium III 以降にはCPUのシリアルNo.情報があるとのことです。
今回は,Pentium(I)以降ですので,断念。
NVRAM の未使用領域(を利用で)は,
電源再投入でリセットされるので?(全部調べたのではありませんが),断念。
> VSNにその代わりを求めようとしていた様ですが、diskの様に可動部
> が有るメカ部品は寿命が短くすぐ壊れて交換しなければなりません。
> 特にPCの場合、diskどころかM/Bまで交換するのが日常茶飯事なので
> IDを記録しておく部品が存在しません。
Disk交換は,NEWの使用と見なしても良いとの判断でした。
> 妥協策として、他の方も挙げられていたようにLANカードのMAC
> アドレスを使うという手がしばしば使われています。RedHat
> ならばhostidというコマンドでMACアドレスだか、IPアドレスから、
> SUNのようなHost-IDを得ることが出来るのではなかったっけ?
MACアドレスは,NICがないPCも対象なので,断念。
#いまどきNICが無い方が珍しいとは思いますが。
- - - - -