[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);
}