• 돌아가기
  • 아래로
  • 위로
  • 목록
  • 댓글
잡담

레드필 부트로더 하드디스크 이식 기능 구현 중간상황.

화정큐삼 화정큐삼 326

6

7

9일전에 공유를 드렸던 내용인데요.

 

 

기존에 DSM 6.1 에서 처리 가능한 가이드 입니다. MS 윈도우를 통해야 하고 여러가지로 좀 번거러운 작업이긴 합니다.

 

 

처음엔 GRUB2 에 부트 파티션 변경방법에 대한 개념이 정립이 안되서 1주일 정도를 허비했습니다.

그 뒤에서 부터는 속도가 붙여서 잠도 줄여가며 열심히 스크립트를 만들어 봤습니다.

 

tcrp-mshell 이 rr 과 조금 다른 부분은

tcrp 는 이름 그대로 tinycore linux 를 사용하는 redpill 로더이기에 이 커널이 한가지 더 포함이 되어 있습니다.

 

rr 과 tcrp 가 사용하는 커널은  아래와 같습니다.

  1. rr 커널 ( tcrp 는 friend 커널 )
  2. dsm 커널 ( tcrp 도 동일 )
  3. tc 커널 ( tcrp 전용 )

rr 은 rr 커널안에서 tc 커널과 friend 커널이 해야 하는 기능을 모두 포함하고 있습니다.

메뉴가 rr 커널 안에서 직접 ./menu.sh 로 시작하는것도 이런 이유 때문입니다.

 

이 커널들을 죽 설명드린 이유가 

결국은 이 커널파일 (커널당 2개) 을 하드에 이식을 해야 하는데요.

기존 DSM 6 Jun's 로더는 커널에 크기가 50M 에 불과 했기 때문에 맨 첫번째 하드의 맨 마지막에 남는 짜투리 공간 100M 로도 충분했습니다.

 

하지만, 레드필은 이렇게 여러가지 커널들을 탑재하고 있고 각 커널당 파일이 거의 100M 에 육박합니다.

 

  1. tc 커널 ( 20M , mydata.tgz 백업 파일이 가변적 )
  2. friend 커널 ( 61M 고정크기 )
  3. dsm 커널 ( ds3622xs+ 7.2.1-69057 기준 82M initrd-dsm 이 가변적 [ 각 모델별 드라이버 모듈 및 addon 포함 ] )

 

원래 USB 스틱의 로더에는 큰 여유공간이 있는 3번째 파티션에 모두 존재하고 있습니다.

이 모든것을 하드 1개의 100M 담는것은 불가능하구요.

 

포기할것은 좀 덜어내고 2, 3 번만 취해서 2개의 하드를 사용합니다.

Basic 또는 JBOD 타입으로 생성된 하드 2개가 필요합니다.

스토리지풀이 생성된 각 하드의 구조는 위 2가지 타입으로 가정했을때,

시스템 파티션  8G + 2G 와 데이터 파티션 ( 나머지 전체 영역 ) 으로 구성됩니다.

 

여기서 짜투리 공간은 데이터 파티션 뒤쪽에 약 100M 공간만 있는줄 알았는데,

잘 보시면 시스템 파티션과 데이터 파티션 사이에 약 128M 의 여유 공간이 더 존재합니다.

Start / End 섹터가 연결되지 않고 비어 있는게 보이실겁니다.

그 사이에 확장 파티션인 sd#4 를 만들고 부트로더 파티션들이 존재해야 할 로지컬 파티션을 각각 더 생성합니다.

이 캡쳐가 부트로더 파티션 1,2,3을 쪼개서 2개의 하드에 나눈 모습입니다.

 

스크린샷 2024-03-10 오후 12.20.12.png.jpg

스크린샷 2024-03-10 오후 12.20.22.png.jpg

 

1번째 파티션에는 98M 공간을 잡아서 

위 2번의 friend 커널을 담았습니다. 

커널의 위치가 바뀌였기 때문에 별도의 grub.cfg 에 수정을 가했고,

기존의 부트로더는 (hd0,msdos1) 을 찾아서 grub이 부팅하도록 설정되어 있는 부분도

grub-install 을 이용해서 (hd0,msdos5) = /dev/sd#5 를 가리키도록 재조정합니다.

하드 스스로 grub 부팅이 가능하도록 부트로더 1번째 파티션에 해당하는 /dev/sd#5 네 Active 를 활성화 합니다.

 

2번째 파티션에는 큰 공간이 필요 없지만,

중요한 부분이 원본 dsm pat 파일로 부터 추출된 rd.gz 을 담고 있고 

SmallFixVersion 의 업데이트가 감지되면 Ramdisk 자동패치를 통해 자동으로 Update 처리를 돕도록 되어 있습니다.

현재는 DSM 7.2.1-69057 U0 가 U4 로 자동 업데이트가 되도록 해주는데 필요한 파일입니다.

 

3번째 파티션에는 

각 모델별 dsm 커널이 담기게 됩니다.

이 파일은 로더를 재빌드 할 때마다 계속 바뀌고 재생성되는 커널 파일입니다.

중간파일인 custom.gz 파일 ( rd.gz 과 드라이버를 담고 있음 ) 도 

사이즈가 만만치 않기 때문에 최종 결과물인 initrd-dsm 가 동일한 내용을 거의 유사하게 담고 있어서

배제 시킬수 있는 방법을 찾아서 최근에 friend 커널의 버전업에도 미리 반영을 시켜둔 상태입니다.

 

rr 의 경우는 custom.gz 과 initrd-dsm 의 사이즈가 tcrp 에 비해 너무 많은 모듈 (예로 wifi 모듈등) 을 

담고 있어서 이대로는 2장의 하드만으로도 부족상 상황입니다.

이건 wjz304 님도 잘 알고 계셔서 이와 관련된 커널 사이즈 조정을 하고 계신건지는 잘 모르겠습니다.

 

이렇게 만 준비해둔 상태에서 2개의 BASIC 타입 하드만으로 부트로더가 이식된 상태로 부팅이 가능합니다.

이를위해 오리지널 부트로더인 USB나 SATA DOM 부트로더는 제거해 둡니다.

 

그런데, Redpill 개발 그룹인 TTG 에서 새로 시도한 방법이 USB 부터로더가 아닌

Sata DOM 부트로더의 사용이 가능하도록 개발한 부분 때문에 발목이잡히게 되었습니다.

Sata 디스크들중 맨 앞에 존재하는 디스크는 무조건 부트로더로 인식하도록 되어 있습니다.

그래서, 이 부트로더를 이식한 BASIC 타입 디스크도 부트로더인 Synoboot 파티션화 시키는 부분 때문에

맨 앞의 디스크가 사라져 버리는 현상이 있습니다. (데이터가 손상된 것은 아닙니다.)

 

이건 lkm 쪽에 구현되어 있는 사항인데, 일종의 Fake 기술이라고 보시면 됩니다.

그래서, 더미로 맨앞에 SATA 디스크를 하나 빼서 존재시키는게 가능하다면 이렇게 해보려고 노력중입니다.

 

어제 lkm 을 다시 컴파일해서 개선해 볼 생각으로 소스를 좀 들여다 보았는데,

TTG 그룹에서도 이 Sata DOM Fake 기능을 처음 구현할 때 미친짓이라고 생각하며 시작한 모양입니다.

하지만, 지금은 많이 안정화 되서 쓸만해 졌다고 마지막에 평을 넣어준것 같네요.

 

https://github.com/PeterSuh-Q3/redpill-lkm/blob/master/shim/boot_dev/fake_sata_boot_shim.c

 

SATA DOM을 지원하지 않는 시스템에서 SATA 디스크를 적절한 부팅 장치로 사용하려는 미친 시도
 
   [배경]
   syno 수정된 SCSI 드라이버(sd.c)에는 소위 부팅 디스크에 대한 지원이 포함되어 있습니다. 드라이브에 대한 논리적 지정입니다.
   일반 데이터 디스크와 분리됩니다. 일반적으로 해당 지정은 드라이브 공급업체 및 모델을 기반으로 합니다. 기본 SATA
   boot shim은 해당 사실을 사용하여 해당 공급업체 모델과 일치하고 부팅 가능한 것으로 간주되도록 사용자 제공 드라이브를 수정합니다.
   마찬가지로 USB 부팅 미디어에도 유사한 메커니즘이 존재합니다. 둘 다 완전히 분리되어 있으며 완전히 다르게 작동합니다.
   USB 저장소와 SATA는 모두 SCSI 기반 시스템이지만 장치를 식별하는 방식과 모양이 다릅니다.
   프로토콜을 제외한 거의 모든 것에서 그렇습니다.
 
 
   [어떻게 작동하나요?]
   이 심은 SATA 디스크(기본 SATA 부팅 심과 유사)를 잡고 수정하는 거의 수술적인 작업을 수행합니다.
   설명자는 잠시 동안 USB 드라이브처럼 보입니다. 설명자는 다음과 같은 상태로 둘 수 없습니다.
   "sd.c" 드라이버가 디스크 유형을 결정하는 즉시 되돌려야 합니다. 그 이유는 다른
   프로세스는 실제로 드라이브를 SATA 드라이브로 읽고 조사해야 합니다(예: SATA 장치와 통신할 수 없으므로).
   USB 스틱을 사용하면 됩니다).
   조감도에서 설명자는 sd_probe()가 호출되기 직전에 수정되고 ida_pre_get()이 호출될 때 제거됩니다.
   sd_probe()에 의해 호출됩니다. ida_pre_get()은 [sd.c 코드가 변경되더라도] 호출되는 것이 거의 보장됩니다.
   내부에서 생성된 구조를 사용하려면 다른 항목에 대해 ID 할당을 수행해야 하므로 프로세스 초기에 수행됩니다.
 
 
   [여기에 용이 있어라]
   이 코드는 매우 실험적이므로 언제든지 폭발할 수 있습니다. 이전에는 우리가 아무것도 할 수 없다고 생각했습니다.
   커널 지원 부족으로 인한 SATA 부팅(현재 사용자 영역 방법이 중단됨) 이 말도 안되는 아이디어는 실제로
   작동했고 여러 플랫폼에서 많은 테스트를 거친 후에 안정적인 것 같습니다. 그러나 USB인 경우에는 사용하지 않는 것이 좋습니다.
   옵션입니다. 여기에 있는 코드에는 많은 안전 확인 및 보호 장치가 있지만 우리는 이를 방탄이라고 생각하지 않습니다.
 
 
   참고자료:
    - https://www.kernel.org/doc/html/latest/core-api/idr.html (커널에서 ID 할당)
    - syno 커널 GPL 소스의 drivers/scsi/sd.c(sd_probe() 및 syno_disk_type_get() 참조)

 

 

아직도 넘어야할 산이 많네요.

rr 의 wjz304님 제안으로 시작했지만, 지금은 정말 이 기능이 꼭 필요한가 싶은 회의도 좀 듭니다. ㅎㅎ

 

 

 

 

 

 

 

 

신고공유스크랩
7

화정큐삼 화정큐삼
30Lv. 18104P
다음 레벨까지 1116P

1) Xpenology RedPill DS918+ FRIEND DSM 7.2.1-69057 Update 1, ASUS IOT H310i-IM-A R2.0 G5500 / Intel I211, I219-V / 16GB  / SilverStone ECS07 5포트 SATA M.2 NVMe PCIe 스토리지 확장 카드 / 3x4TB + 1x3TB SHR, 1x8TB 

 

2) Xpenology RedPill DS1823xs+ FRIEND DSM 7.2.1-69057 Update 1, Asus B150I PRO GAMING/AURA i3-7100T / Intel Gigabit LAN x 3 / 16GB  /  ASM1166 M.2 NVME PCIE 6 Port Sata 스토리지 확장 카드 / 6 x 3TB RAID6

profile image
화정큐삼 글쓴이 2024.03.11. 13:12

어제 저녁부터 연구하고 있는 사항인데요.

/dev/sda 로 인식시킬 dummy img 파일은 준비가 되었고
커널 부팅하는 시점에 제일먼저 로딩하도록 스크립트를 마쳤습니다.

https://github.com/PeterSuh-Q3/tcrpfriend/blob/main/buildroot/board/tcrpfriend/rootfs-overlay/etc/udev/rules.d/99-custom.rules

https://github.com/PeterSuh-Q3/tcrpfriend/blob/main/buildroot/board/tcrpfriend/rootfs-overlay/root/load-sda-first.sh

Friend 에서 1차 시험을 했는데, 루프 디바이스로는 잘 붙는것 같습니다.

그런데 정작 이 dummy img 가 /dev/sda 가 되어야 할 시점이 friend 커널이 아니라,

dsm 커널이 로딩되는 시점이라서 dsm 주니어 단계로 넘겨서 2차시험을 진행중입니다.

아래처럼 initrd-dsm 파일에 필요한 주입처리는 다 끝내두었고, 실행도 잘 되는것 같습니다.

https://github.com/PeterSuh-Q3/tinycore-redpill/commit/34ed365357820d7c54552ce2114208670805ff13


단, dsm 커널에서는 losetup 커맨드를 지원하지 않아서 이것 마져 포함시키는 방법을 또 연구 중입니다.

그리고, lkm 안에서 힌트가 될만한 사항을 찾았습니다.
내부적으로 Proxmox가 USB 소스로 /dev/loop0을 가리킨다는 것 입니다.
이걸 Proxmox 가 아닌 네이티브에도 적용해 볼 수 있을것 같아서요.

https://github.com/PeterSuh-Q3/redpill-lkm/blob/master/tools/inject_rp_ko.sh

Internally we use it something like this with Proxmox pointing to /dev/loop0 as the USB source
-> 내부적으로는 Proxmox가 /dev/loop0를 USB 소스로 지정하여 사용합니다.

profile image
화정큐삼 글쓴이 2024.03.12. 16:35

루트의 linuxrc.syno.impl 파일 추가패치 해서 loop0 생성에는 성공했습니다.

보시는것처럼 boot-image-dummy-sda.img.gz 가 boot-image-dummy-sda.img 로 압축도 잘 풀리고
loop0 에 losetup 되었네요.
그래도 synoboot 로 올라가지 않아서... 흠...

SynologyNAS> ll
drwx------ 2 root root 0 Mar 12 05:23 .
drwxr-sr-x 16 root root 0 Mar 12 05:23 ..
-rw-r--r-- 1 root root 1479 Mar 12 05:23 .pciids-cache
-rw-r--r-- 1 root root 1313 Apr 19 2023 .profile
-rw-r--r-- 1 root root 0 Apr 19 2023 FOR SYSTEM USE ONLY. DO NOT UPLOAD FILES HERE.
-rw-r--r-- 1 root root 23068672 Mar 10 10:46 boot-image-dummy-sda.img
-rwxr-xr-x 1 root root 200 Mar 12 05:18 load-sda-first.sh

SynologyNAS> blkid
/dev/synoboot1: UUID="c25e2818-28a6-4d98-05d9-49f7b0bbaec7" TYPE="linux_raid_member" PARTUUID="6e835feb-01"
/dev/synoboot2: UUID="ed6b224e-35a0-4a7f-05d9-49f7b0bbaec7" TYPE="linux_raid_member" PARTUUID="6e835feb-02"
/dev/synoboot3: UUID="1f9b31b1-35d1-47ed-727c-4977615d0743" UUID_SUB="88b601f1-2a84-3b3d-5383-9744cdd48451" LABEL="VM:2" TYPE="linux_raid_member" PARTUUID="6e835feb-03"
/dev/synoboot5: SEC_TYPE="msdos" UUID="3434-7A88" TYPE="vfat" PARTUUID="6e835feb-05"
/dev/synoboot6: SEC_TYPE="msdos" UUID="3434-9253" TYPE="vfat" PARTUUID="6e835feb-06"
/dev/sdc1: UUID="c25e2818-28a6-4d98-05d9-49f7b0bbaec7" TYPE="linux_raid_member" PARTUUID="6e835feb-01"
/dev/sdc2: UUID="ed6b224e-35a0-4a7f-05d9-49f7b0bbaec7" TYPE="linux_raid_member" PARTUUID="6e835feb-02"
/dev/sdc3: UUID="1f9b31b1-35d1-47ed-727c-4977615d0743" UUID_SUB="88b601f1-2a84-3b3d-5383-9744cdd48451" LABEL="VM:2" TYPE="linux_raid_member" PARTUUID="6e835feb-03"
/dev/sdc5: SEC_TYPE="msdos" UUID="6234-C863" TYPE="vfat" PARTUUID="6e835feb-05"
/dev/loop0p1: SEC_TYPE="msdos" UUID="F70B-A403" TYPE="vfat" PARTUUID="de7a6095-01"
/dev/loop0p2: SEC_TYPE="msdos" UUID="F772-859C" TYPE="vfat" PARTUUID="de7a6095-02"
/dev/md0: LABEL="1.44.1-69057" UUID="56d8c05b-929c-42db-b605-be687bc12aaf" TYPE="ext4"
/dev/loop0: PTUUID="de7a6095" PTTYPE="dos"
/dev/md1: TYPE="swap"

SynologyNAS> dmesg | grep loop
[ 0.000014] Calibrating delay loop (skipped), value calculated using timer frequency.. 5806.81 BogoMIPS (lpj=2903407)
[ 3.475485] loop: module loaded
[ 3.484039] loop0: p1 p2

SynologyNAS> blkid | grep msdos
/dev/synoboot5: SEC_TYPE="msdos" UUID="3434-7A88" TYPE="vfat" PARTUUID="6e835feb-05"
/dev/synoboot6: SEC_TYPE="msdos" UUID="3434-9253" TYPE="vfat" PARTUUID="6e835feb-06"
/dev/sdc5: SEC_TYPE="msdos" UUID="6234-C863" TYPE="vfat" PARTUUID="6e835feb-05"
/dev/loop0p1: SEC_TYPE="msdos" UUID="F70B-A403" TYPE="vfat" PARTUUID="de7a6095-01"
/dev/loop0p2: SEC_TYPE="msdos" UUID="F772-859C" TYPE="vfat" PARTUUID="de7a6095-02"

댓글 쓰기 권한이 없습니다. 로그인

취소 댓글 등록

cmt alert

신고

"님의 댓글"

이 댓글을 신고하시겠습니까?

댓글 삭제

"님의 댓글"

삭제하시겠습니까?


목록

공유

facebooktwitterpinterestbandkakao story

첨부 0

번호 분류 제목 글쓴이 날짜 조회 추천
공지 정보 DSM 7.2v) Mshell로 헤놀로지 부트로더 빌드하기. 62 달소 23.05.29.01:57 24768 +24
공지 정보 DSM 7.2v) ARPL-i18n(rr)으로 헤놀로지 부트로더 빌드하기. 73 달소 23.05.23.23:58 26339 +23
후기 asustor에서 나온 nas에 dsm 올렸습니다... 4 링츠링링 2일 전18:45 357 +2
질문 Wireguard 관련해서 질문 드립니다! 2 리준 4일 전12:25 175 +1
가이드 bitwarden 라이센스적용하기. 6 블랙앤해적 5일 전20:01 431 +2
520 잡담
normal
서맹 3일 전09:42 455 0
519 잡담
image
초보나스 6일 전12:21 204 0
518 잡담
normal
TheSTREET 6일 전23:50 424 +6
517 잡담
image
N4100 24.04.19.22:38 534 +1
516 잡담
image
estel1 24.04.15.23:51 619 +2
515 잡담
normal
아나나나나다 24.04.11.11:47 278 0
514 잡담
normal
아나나나나다 24.04.11.09:32 210 0
513 잡담
image
유니파트 24.04.08.23:40 246 0
512 잡담
image
유니파트 24.04.06.19:49 206 0
511 잡담
normal
서맹 24.04.06.11:26 529 0
510 잡담
normal
니즛 24.04.02.14:13 275 0
509 잡담
normal
화정큐삼 24.04.01.14:44 188 +1
508 잡담
image
kmw_ 24.03.30.11:42 331 +1
507 잡담
image
TheSTREET 24.03.29.20:46 974 +7
506 잡담
image
헤놀로지맨 24.03.29.18:31 576 +1
505 잡담
image
훔친수건 24.03.29.01:47 576 0
504 잡담
image
유니파트 24.03.25.21:28 436 +1
503 잡담
normal
니즛 24.03.24.12:38 164 0
502 잡담
normal
kmw_ 24.03.23.21:39 376 +1
501 잡담
image
kmw_ 24.03.22.11:59 545 0