Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

ボリュームシリアル番号について

11 views
Skip to first unread message

H.Shiozaki

unread,
Sep 24, 2003, 12:39:58 PM9/24/03
to
汐崎と申します。

HDDにおいて,MS社のOS環境では,ドライブ(c:等)毎に
8桁のHEX文字で,ボリュームシリアル番号が割り振られて
いますが,Linux-OSにもこの名前(Term 又は概念)は
あるのでしょうか?

ある場合には,アプリケーションプログラムから
この情報を取得(Readのみ)する方法について,
アドバイスを頂きたいのですが?

宜しくお願いします。
- - - - -
FM: 汐崎 廣義 < H.Shiozaki >
E-Mail: sio...@yahoo.co.jp

S

unread,
Sep 25, 2003, 9:40:25 AM9/25/03
to
# /sbin/e2label デバイス名
でどうですか。

H.Shiozaki

unread,
Oct 4, 2003, 1:13:27 AM10/4/03
to
投稿者の自己フォローです。
Volume Serial Number でWebを検索すると,以下の情報が見つかりました。
ボリュームシリアル番号はMS社由来のものであるらしい。
(Pc_Unixのext2やufsのファイルシステムには,無い概念かもしれない?)
以下の文章からは,
ボリュームシリアル番号は,
1)Format, DiskCopy で生成される
2)その内容は,生成した日時を元に,作成される
ということから,結局,
ボリュームシリアル番号は,日時情報であった
ことが分かりました。
DosではInt21hを利用して,Readするようですが,
LinuxやFreeBSDで,できるのかしら?

- - - - -
FM: H.Shiozaki
E-Mail: sio...@yahoo.co.jp
URL: http://www.geocities.jp/sios_hp/

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

H.Shiozaki

unread,
Oct 4, 2003, 1:14:25 AM10/4/03
to
umu...@anet.ne.jp>様,応答有難う御座います。
"S" <umu...@anet.ne.jp> wrote in message
news:20030925224025....@anet.ne.jp...
> # /sbin/e2label デバイス名
> でどうですか。
Linux-2.4.19でやってみました。また。man e2label を調べました。
また,mdir a: , mdir c: をやってみました。
---
今 ,Win98‐DOS-BOXで,(zz file は存在しない)で以下を実効すると。
dir c: zz
ドライブ C: のボリュームラベルは 301F1_W98-C *1
ボリュームシリアル番号は 2EC5-56B8       *2
ディレクトリは C:\
上記結果が得られました。

e2label は,上記*1のラベル相当を,表示,設定,変更するようです。
---
*2の情報を,リードだけで良いので得たかったのですが?
--

IIJIMA Hiromitsu

unread,
Oct 4, 2003, 8:45:43 AM10/4/03
to
いいじまです。

> ボリュームシリアル番号は,
...
> 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

Fuhito Inagawa

unread,
Oct 4, 2003, 9:53:56 AM10/4/03
to
稲川です。

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()って何?)

NAKAMURA Kazushi

unread,
Oct 5, 2003, 8:05:19 AM10/5/03
to
In article <blll5m$347$2...@caraway.media.kyoto-u.ac.jp>

sio...@yahoo.co.jp writes:
>また,mdir a: , mdir c: をやってみました。
>---
>今 ,Win98‐DOS-BOXで,(zz file は存在しない)で以下を実効すると。
>dir c: zz
> ドライブ C: のボリュームラベルは 301F1_W98-C *1
> ボリュームシリアル番号は 2EC5-56B8       *2
> ディレクトリは C:\
>上記結果が得られました。
>
>e2label は,上記*1のラベル相当を,表示,設定,変更するようです。
>---
>*2の情報を,リードだけで良いので得たかったのですが?

ならば、(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

H.Shiozaki

unread,
Oct 8, 2003, 1:50:41 AM10/8/03
to
稲川 史(ふひと) 様
求めているものを教えて頂き深く感謝します。
稲川 様のコードを,rd-vsn-1-lx24.c として
Linux-2.4.19上で,実効しましたところ
# ./rd-vsn-1-lx24 -f /dev/hdb1 <- Fat16:Win98, mounted
# VolumeID: 2ec5-56b8
# ------
# ./rd-vsn-1-lx24 -f /dev/hda5 <- Linux-2.4.19
# NO VolumeID
# ------
# ./rd-vsn-1-lx24 -f /dev/hda7 <- Linux-ext2-fs-data-only
# No Boot Signature!
以上の様な結果が得られました。
ext2fs では,特にVSNを設定しない限り,VSNデータは無い
ことが分かりました。 #これが普通でしょう。
それで,最後の部分に,

> } else
> printf("NO VolumeID\n");
>  <=
> exit(0);
<=
の部分に,R/W 版をと思い,wt-vsn-1-lx24.cとして
printf(" ---- Now wt-vsn write your new VSN ----- \n");
printf("If you do not wish to write new VSN, type ^C ...exit\n");
printf("VSN format is 8 Hex characters like 1234-ABCD\n");
printf("Pleade type New-Volume_Serial_Number: \")
の様に追加していましたが。。。
ここではたと,
やっぱり書きこむコードを追加した場合,
デバッグするということは,多分再起動が出来ないことも
起きるのではと思い,中断しました。
デバッグするには,別のパーティションを作成(用意)して
起動できなくて良い,TMPなLinuxをインストールして,
それをデバッグ対象に準備してからで無いと,
相当危険を覚悟しないといけない。
それに,私目にはライトするコード作成は,自信はない。

大体の方針としては,
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

Fuhito Inagawa

unread,
Oct 9, 2003, 2:55:29 AM10/9/03
to
稲川です。

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()って何?)

H.Shiozaki

unread,
Oct 9, 2003, 5:53:46 AM10/9/03
to
汐崎です。
皆様アドバイス有難うございました。
やっぱり,Writeすることは,危険なことであるようなので
Volume Serial Numberを使うことを含めて,
断念することにしました。
なにか,Readだけで出来ることで,考えなおします。
したがって,このテーマ自身を断念します。
おさがわせして申し訳ありませんでした。
‐‐‐
そもそもの目的は,PCを1台毎区別するたの,
「PC毎の固有の情報」を得たかったのですが。
#VSNでも,再フォーマットしたら対応できない問題もありましたが
‐‐‐
#もし,上記にご回答頂けるならば,
#テーマ名を「PC毎の固有の情報を得る方法」とか
#別名の方が良いと思われますが。
##Newsの使い方には慣れていませんので,テーマ名を変えることや,
##別に投稿することが適当かは,不明です。

--
FM: 汐崎 廣義 < H.Shiozaki >

NAKAMURA Kazushi

unread,
Oct 13, 2003, 1:04:44 PM10/13/03
to
In article <bm3bcq$gjm$1...@caraway.media.kyoto-u.ac.jp>

sio...@yahoo.co.jp writes:
>やっぱり,Writeすることは,危険なことであるようなので
>Volume Serial Numberを使うことを含めて,
>断念することにしました。

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を得ることが出来るのではなかったっけ?

H.Shiozaki

unread,
Oct 14, 2003, 1:05:25 AM10/14/03
to
汐崎です。
"NAKAMURA Kazushi 様 wrote

> そもそも「PC固有の情報とは?」ということを
> 考えましたか?SUNの様なWorkStationなら固有のHost-IDがNVRAMに
> 書込まれて出荷されていますが、PCにはそんなものありません。

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が無い方が珍しいとは思いますが。


- - - - -

0 new messages