Creating an OPENSTEP Boot CD onion

From 흡혈양파의 인터넷工房
Jump to navigation Jump to search
OPENSTEP 을 booting 가능한 iso 로 만들기


준비물

  1. OPENSTEP iso
  2. OPENSTEP FDD image (boot and driver diskette)
  3. linux system


사용한 프로그램

  • vbindiff :: binary 파일을 diff 뜨는경우에 사용
  • mkisofs :: cdrtools 에 들어있는 프로그램. iso파일을 만드는경우에 사용
  • bless :: mono 기반으로 만들어진 Hexcode editor


주의사항

  1. OPENSTEP 의 영문버전과 일본어버전은 추출되는 label이 틀리다. 때문에 label은 새로 추출해야함
  2. 최소한 iso 를 만드는 프로그램과 환경에 따라 미묘하게 결과물이 차이가 있다. 때문에 offset 은 hexeditor 를 통해서 직접 다시 계산해줘야한다


작업내역

일단 주된내용은 아래쪽의 참고문서쪽을 보면되며 여기서는 간단하게 요약한 작업정보와 참고사항만 언급하도록 한다.


단계1-ufs추출

openstep 4.2j iso 에서 ufs 부분을 추출한다

dd bs=2048 if=OPESNTEPISO파일 of=UFS로만들파일이름 skip=80


단계2-lbl추출

아래의 과정을 통해서 lbl(disk label)을 추출한다.

dd bs=1 count=7680 if=OPESNTEPISO파일 of=lbl파일이름 skip=8192


단계3-iso만들기

명령어를 이용해서 iso 파일을 만든다. iso 파일 안에 들어갈 floppy image 와 ufs image 두가지를 Temp 라는 폴더안에 넣고 Temp 폴더 의 바로 윗 디렉토리 에서 다음과같은 과정을 거쳐 iso 파일을 만든다.

mkisofs -b 플로피이미지이름 -V OPENSTEP_4.2J -hide 플로피이미지이름 -J -R -o 결과로만들어질iso파일이름(확장자포함) Temp


단계4-플로피 이미지 만들기

참고문서1 에서 해당되는 부분을 읽고 이미지를 만든다. 본인의 경우에는 기본적으로 들어가있는 EIDE driver 대신 beta disk 1의 EIDE driver 를 넣었다


단계5-lbl파일에서는 어떤 부분을 손봐야하는건가요?

x86의 경우 추출한 disklabel(lbl) 에서 수정해야할 부분은 다음과 같다.

아래의 내용은 lbl 파일내의 offset 이므로 hex editor 로 관련된 부분을 찾아서 편집해야 한다.


offset 0x08 > 04 값을 00 으로 바꿔준다(iso9660 에서 1개 block은 2048 byte)
offset 0x70 > frontporch 주소의 16진수 계산값. 2개 바이트(int16)-(이유는 모르겠지만 실제 offset은 0x7c)
offset 0x22e > lbl 파일의 hash값. checksum 프로그램을 이용해서 산출한값을 넣어준다


이 값들에 대한 의미는 참고문서1 을 참고하면 된다.

관련된 자세한 내용은 bootblock.h 파일내용분석 부분을 참고.


단계6-lbl파일 엎어쓰기

편집이 끝난 lbl 파일을 만들어진 iso 파일에 덮어씌운다

dd bs=1 count=7680 if=lbl파일이름 of=결과로만들어진iso파일이름(확장자포함) conv=notrunc


이렇게 만들어진 파일을 가지고 설치를 진행하면 된다.


결과물

  • http://onion.onionmixer.net/os42jmkiso.rar
  • 압축파일안에는 다음과같은 내용들이 들어있다
    • OPENSTEP42JCD_makeafter.lbl :: OPENSTEP 4.2j 버전에서 추출해서 몇개값을 만져놓은 lbl 파일
    • F288C.img :: OPENSTEP 4.2J 버전에서 사용가능한 상태로 합쳐놓은 floppy image. BETA driver 1 디스켓의 EIDE driver 가 적용되어있다
    • OS42JCD.ufs :: OPENSTEP 4.2J iso 파일에서 추출한 ufs 파일
    • mkopenstepiso.sh :: iso 파일을 생성하는 mkiso 스크립트
    • writelabel.sh :: lbl 파일을 iso 에 덮어주는 스크립트
    • ns_checksum.c :: 원문에 들어있던 checksum 파일을 gcc 4.6 이상에서 compile 가능하도록 수정한버전

위의 결과물을 이용하면....... 필요한 offset 만 잘 파악하면 부팅가능한 iso 를 만들 수 있다.

lbl 파일에서 offset 을 파악해서 다시 작업해주기만 하면 사용할 수 있다.


참고사항

  • 이유는 모르겠지만 기본적으로 bundle 되어있는 EIDE driver를 바로쓰면 ATAPI read error 로 인해 똑바로된 설치가 진행되지 않는다. 위의 결과물로 생성한 이미지를 사용하는경우 반드시 FDD diskett 또는 fdd beta disk 1 을 사용할 수 있는 가상drive 등을 준비해야한다.



linux에서 ufs image 를 read-only 로 mount하는법

mount -t ufs -o loop,ufstype=openstep 이미지이름 /mnt/마운트경로

기본적으로 kernel에서 ufs를 지원해야한다.

https://www.kernel.org/doc/Documentation/filesystems/ufs.txt

이 내용을 보면 openstep은 kernel에서 rw를 켜도 readonly 만 지원된다는걸 알 수 있다.

참고로 부가적인 삽질을 하기위해 FreeBSD까지 동원했으나 mount 실패.


OPENSTEP 의 iso에서 추출한 UFS에서 EIDE driver의 위치

  • ./private/Drivers/i386/EIDE.config
  • ./usr/template/client/Drivers/i386/EIDE.config

2개가 같은내용인건 맞는데.. 실제로 둘 다 쓰이는지는 잘 모르겠다


iso 파일의 섹터에 대한 정보와 시작지점에 대한 구성정보

위의 별도페이지를 참고한다.


추가적으로 진행했지만 실패한삽질

혹시나해서 ufs 안의 driver 를 변경해보려는 삽질

  1. linux에서 추출한 ufs를 readonly로 Mount한다. 내용을 tar 파일로 묶는다
  2. openstep 에서 추출한 ufs 파일을 복사한후 raw로 별도 drive-vmdk 로 mount 시킨다 <- 참고문서의 방법 참고
  3. vmdk를 openstep에서 format한다.
  4. vmdk로 인식된 drive에 tar 파일 압축을 푼다. 이후 EIDE driver를 교체
  5. vmdk-raw 를 linux에서 ufs 로 mount 시도한다.
  6. 정상적으로 read-only 로 mount가 되었기때문에 이미지를 이용해서 다시 iso를 만들고 설치테스트를 진행한다.


위의 과정에서 다루어지는 ufs 파일은 2개가 된다.

  • iso 에서 추출한 ufs 파일
  • rawdisk로 인식시킨다음 openstep 상에서 format 을 하고 tar 로 압축시킨 내용을 풀어낸 ufs 파일

두파일 모두 linux 에서 mount는 되지만... 두번째 파일을 실제로 iso 에서 사용했을때 openstep 부팅시 root mount 는 되지 않는다. 결과적으로 실패.


FreeBSD 에서 iso 에서 추출한 ufs 파일을 mount 해서 편집해보려는 삽질

안됨. 이런것따위 취급도 하지 않는다. 그냥 안됨. 어떤방법을 썼냐하면

  1. iso 에서 추출한 ufs 파일을 선택한다.
  2. sd 카드에 비슷한 용량의 파티션을 만든다
  3. dd 를 이용해서 ufs 파일을 sd카드에 만든 파티션으로 밀어넣는다
  4. FreeBSD 에 sd 카드 리더를 이용해서 sd 카드를 꼽는다
  5. FreeBSD 에서 dmesg 를 이용해서 device name 을 확인한다.
  6. mount 를 시도한다.

안된다......... 안된다.. 하지마라.. 안된다...


참고문서

  1. OPENSTEP Boot CD 만들기
  2. OPENSTEP Boot CD 만들기-t3RRa
  3. linux에서 사용할 수 있는 diff에 관한 몇가지 tip
  4. linux에서 사용할 수 있는 간단한 진수변환
  5. linux의 VirtualBox에서 특정파일을 사용하는 vmdk만들기
  6. FreeBSD 에서의 disk관리팁