[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: iBook: dump/restore does not make it either
> また初めからやり直せるのですが、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 <sys/types.h>
#include <sys/disklabel.h>
#include <unistd.h>
#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);
}