Creating an OPENSTEP Boot CD onion
- OPENSTEP 을 booting 가능한 iso 로 만들기
준비물
- OPENSTEP iso
- OPENSTEP FDD image (boot and driver diskette)
- linux system
사용한 프로그램
- vbindiff :: binary 파일을 diff 뜨는경우에 사용
- mkisofs :: cdrtools 에 들어있는 프로그램. iso파일을 만드는경우에 사용
- bless :: mono 기반으로 만들어진 Hexcode editor
주의사항
- OPENSTEP 의 영문버전과 일본어버전은 추출되는 label이 틀리다. 때문에 label은 새로 추출해야함
- 최소한 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 를 변경해보려는 삽질
- linux에서 추출한 ufs를 readonly로 Mount한다. 내용을 tar 파일로 묶는다
- openstep 에서 추출한 ufs 파일을 복사한후 raw로 별도 drive-vmdk 로 mount 시킨다 <- 참고문서의 방법 참고
- vmdk를 openstep에서 format한다.
- vmdk로 인식된 drive에 tar 파일 압축을 푼다. 이후 EIDE driver를 교체
- vmdk-raw 를 linux에서 ufs 로 mount 시도한다.
- 정상적으로 read-only 로 mount가 되었기때문에 이미지를 이용해서 다시 iso를 만들고 설치테스트를 진행한다.
위의 과정에서 다루어지는 ufs 파일은 2개가 된다.
- iso 에서 추출한 ufs 파일
- rawdisk로 인식시킨다음 openstep 상에서 format 을 하고 tar 로 압축시킨 내용을 풀어낸 ufs 파일
두파일 모두 linux 에서 mount는 되지만... 두번째 파일을 실제로 iso 에서 사용했을때 openstep 부팅시 root mount 는 되지 않는다. 결과적으로 실패.
FreeBSD 에서 iso 에서 추출한 ufs 파일을 mount 해서 편집해보려는 삽질
안됨. 이런것따위 취급도 하지 않는다. 그냥 안됨. 어떤방법을 썼냐하면
- iso 에서 추출한 ufs 파일을 선택한다.
- sd 카드에 비슷한 용량의 파티션을 만든다
- dd 를 이용해서 ufs 파일을 sd카드에 만든 파티션으로 밀어넣는다
- FreeBSD 에 sd 카드 리더를 이용해서 sd 카드를 꼽는다
- FreeBSD 에서 dmesg 를 이용해서 device name 을 확인한다.
- mount 를 시도한다.
안된다......... 안된다.. 하지마라.. 안된다...