Subject: Re: iBook: dump/restore does not make it either From: Tsubai Masanari To: port-powerpc-ja@jp.netbsd.org Date: Thu, 24 Aug 2000 18:48:24 +0900 Mailing-List: contact port-powerpc-ja-help@jp.netbsd.org; run by ezmlm-idx > また初めからやり直せるのですが、NetBSD の disklabel を書いて内蔵 >の disk で起動(boot)する ことは、まだ出来ませんよね。 BSD disklabel をかいてブートするって話なら、たしかに配付セットだけでは できませんが、やるのは簡単です。 BSD disklabel に HFS をつくって (なんでもいいけど、とにかくどこかに HFS をつくって)、以下に付けるような簡単なプログラムで Apple Partition Map モドキを書くだけでできます。 私のディスクラベルは moeko# disklabel wd0 # /dev/rwd0c: ... 8 partitions: # size offset fstype [fsize bsize cpg] a: 166912 0 4.2BSD 1024 8192 16 # (Cyl. 0 - 63) b: 2315904 166912 swap # (Cyl. 64 - 951) c: 39876480 0 unused 0 0 # (Cyl. 0 - 15290*) d: 2670592 5158624 4.2BSD 1024 8192 16 # (Cyl. 1978 - 3001) e: 2880 2482816 HFS # (Cyl. 952 - 953*) f: 2670592 7829216 4.2BSD 1024 8192 16 # (Cyl. 3002 - 4025) g: 2670592 2488032 4.2BSD 1024 8192 16 # (Cyl. 954 - 1977) h: 29376512 10499808 4.2BSD 1024 8192 16 # (Cyl. 4026 - 15289) となっていて、HFS が 2482816 からの 1.4MB にあります。以下のプログラムで HFS_OFFSET をこの 2482816 にして (HFS_SIZE は見ない模様) # ./a.out /dev/rwd0c とやるとその HFS からブートするようになります。あとは hfsutils などで その HFS に ofwboot.elf を置いて 0 > boot hd:,ofwboot.elf とか。 注意: これをやると既存の(MacOS の)パーティション情報は壊れます。 #include #include #include #define HFS_OFFSET 2482816 /* XXX ここを変える */ #define HFS_SIZE 2880 void write_apm(); void usage(); u_int hfs_offset = HFS_OFFSET; u_int hfs_size = HFS_SIZE; int verbose = 1; main(argc, argv) int argc; char **argv; { int fd; char *dev; char fulldev[32]; char rawdev[32]; if (argc != 2) usage(); dev = argv[1]; if (dev[0] != '/') { sprintf(fulldev, "/dev/r%s", dev); dev = fulldev; } strcpy(rawdev, dev); rawdev[strlen(rawdev) - 1] = 'a' + RAW_PART; if (verbose) { printf("dev: %s\n", dev); printf("raw: %s\n", rawdev); } fd = open(rawdev, 2); if (fd == -1) err(1, "open"); write_apm(fd); } void usage() { extern const char *__progname; printf("usage: %s device\n", __progname); exit(0); } void write_apm(fd) int fd; { struct drvr_map block0; struct part_map_entry block1, block2; bzero(&block0, 512); bzero(&block1, 512); bzero(&block2, 512); if (lseek(fd, 0, SEEK_SET) != 0) err(1, "lseek(1)"); if (read(fd, &block0, 512) != 512) err(1, "read"); if (lseek(fd, 0, SEEK_SET) != 0) err(1, "lseek(2)"); /* block 0 */ block0.sbSig = DRIVER_MAP_MAGIC; block0.sbBlockSize = 512; block0.sbBlkCount = 0; /* XXX */ /* block 1: Apple Partition Map */ block1.pmSig = PART_ENTRY_MAGIC; block1.pmMapBlkCnt = 2; block1.pmPyPartStart = 1; block1.pmPartBlkCnt = block1.pmDataCnt = 2; strcpy(block1.pmPartName, "Apple"); strcpy(block1.pmPartType, "Apple_partition_map"); block1.pmPartStatus = 0x37; /* block 2: NetBSD partition */ block2.pmSig = PART_ENTRY_MAGIC; block2.pmMapBlkCnt = 2; block2.pmPyPartStart = hfs_offset; block2.pmPartBlkCnt = block2.pmDataCnt = hfs_size; strcpy(block2.pmPartName, "NetBSD"); strcpy(block2.pmPartType, "Apple_HFS"); block2.pmPartStatus = 0x3b; write(fd, &block0, 512); write(fd, &block1, 512); write(fd, &block2, 512); }