English ยท ๋ฌธ์ ํ ยท ์ฌ์ด ์ฉ์ด์ง
์ด ๋ฌธ์๋ ์ค์น๋ Debian rootfs์ systemd์ OpenSSH๋ฅผ ๊ตฌ์ฑํ๊ณ , BFU(Before First Unlock)์์ ๊ณ์ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
systemd๋ Debian์ ์๋น์ค ๊ด๋ฆฌ์์ ๋๋ค. SSH, D-Bus, Tailscale ๊ฐ์ ์๋น์ค๋ฅผ ์ ํด์ง ์์๋ก ์์ํ๊ณ ์ํ๋ฅผ ์ถ์ ํฉ๋๋ค. DawnShell์ ์ ์ฉ PID(Process Identifier) namespace ์์์ systemd๋ฅผ PID 1๋ก ์คํํฉ๋๋ค.
Debian 13 systemd + SSH ๊ตฌ์ฑ์ ๋ค์ ์์ ์ ์ํํฉ๋๋ค.
- rootfs์ ready marker๋ฅผ ํ์ธํฉ๋๋ค.
- Debian ํจํค์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ค๋นํฉ๋๋ค.
- systemd, D-Bus, OpenSSH๋ฅผ ์ค์นํ๊ณ ์ค์ ํฉ๋๋ค.
debian์ฌ์ฉ์๋ฅผ ์์ฑํฉ๋๋ค.- ํ์ฌ ์ฑ ๊ณต๊ฐ ํค๋ฅผ
authorized_keys์ ๋ฃ์ต๋๋ค. - ๋น๋ฐ๋ฒํธ SSH ์ธ์ฆ๊ณผ root SSH ๋ก๊ทธ์ธ์ ๋๋๋ค.
- ๋ถํ ์ฑ๊ณต์ ๊ธฐ๋กํ๋ proof service๋ฅผ ํ์ฑํํฉ๋๋ค.
- rootfs ๋ด๋ถ ํ์ผ ๊ถํ๊ณผ ์์ ๊ถ์ ๋ค์ ํ์ธํฉ๋๋ค.
์ด ์์ ์ Android ์ ๊ธ์ ํด์ ํ AFU(After First Unlock)์์๋ง ์์ํฉ๋๋ค. ๋น๋ฐ๋ฒํธ์ ๊ฐ์ธ ํค๋ ๋ก๊ทธ์ ๋จ๊ธฐ์ง ์์ต๋๋ค.
๋ฐ์ฒ๋ Debian์ ์ํด ๋ค์ Linux namespace๋ฅผ ์ค๋นํฉ๋๋ค.
- mount namespace: Debian ์ ์ฉ ๋ง์ดํธ๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค.
- PID namespace: systemd๋ฅผ Debian PID 1๋ก ๋ณด์ด๊ฒ ํฉ๋๋ค.
- UTS namespace: ํธ์คํธ ์ด๋ฆ
dawnshell์ ๋ถ๋ฆฌํฉ๋๋ค. - cgroup namespace: ์์๋ ์์ ๊ด๋ฆฌ ๊ณ์ธต๋ง ๋ณด์ฌ ์ค๋๋ค.
- network namespace: ๋ถ๋ฆฌํ์ง ์๊ณ Android ๋คํธ์ํฌ๋ฅผ ๊ณต์ ํฉ๋๋ค.
chroot(change root)๋ ํ๋ก์ธ์ค๊ฐ ๋ณด๋ /๋ฅผ Debian rootfs๋ก ๋ฐ๊พธ์ง๋ง ๊ฐ์
๋จธ์ ์ ์๋๋๋ค. ์ฉ์ด๋ ์ฌ์ด ์ฉ์ด์ง์
์ฐธ๊ณ ํด ์ฃผ์ธ์.
Debian ์์๋ /proc, /sys, /dev, /dev/pts, /run์ด ์ค๋น๋ฉ๋๋ค.
Android ํธ์คํธ /data ์ ์ฒด๋ฅผ ๋ค์ ๋ง์ดํธํ์ง ์์ต๋๋ค. rootfs ๋ด๋ถ์ /data๋
ํ์ํ ์ต์ ๊ฒฝ๋ก๋ง ๋ณด์ด๋๋ก ์ ์งํฉ๋๋ค.
Debian์ Android NIC(Network Interface Controller)๋ฅผ ์ง์ ๊ณต์ ํฉ๋๋ค. Wi-Fi, ๋ชจ๋ฐ์ผ ๋ฐ์ดํฐ, USB Ethernet, VPN ์ธํฐํ์ด์ค๊ฐ Android์์ ์ค๋น๋๋ฉด Debian๋ ๋ฐ๋ก ๋ณผ ์ ์์ต๋๋ค.
SSH ์๋ฒ๋ ์ฃผ์๊ฐ ์์ด๋ TCP 22์ ๋ชจ๋ ์ฃผ์์์ ๋๊ธฐํฉ๋๋ค. Android๊ฐ ๋์ค์ ์ฃผ์๋ฅผ ํ ๋นํ๋ฉด systemd๋ SSH๋ฅผ ๋ค์ ์์ํ์ง ์์๋ ๋ฉ๋๋ค.
DawnShell์ cgroup v2์ ์ฅ์น BPF(Berkeley Packet Filter)๋ฅผ ๋จผ์ ์ํํฉ๋๋ค.
์ฑ๊ณตํ๋ฉด ์ ์ฉ v2 ํ์ ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์คํจํ๋ฉด ์ํ ์์์ ์ ๋ฆฌํ ๋ค ๊ฒฉ๋ฆฌ๋
cgroup v1 devices์ name=systemd ๋ฐฉ์์ผ๋ก ์ ํํฉ๋๋ค.
์ด ๊ตฌ์กฐ๋ Debian๊ณผ Docker์ ํ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉด์ Android ์ ์ญ ์ฅ์น ์ ์ฑ ์ ์ง์ ๋ ธ์ถํ์ง ์๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
์ ์ฒด ๊ธฐ๋ฅ ๋ชจ๋๋ ์ปค๋์ด private PID ๋ฐ cgroup namespace๋ฅผ ๋ง๋ค ์ ์์ด์ผ ํฉ๋๋ค.
/proc/self/ns/pid๊ฐ ์๋ค๋ฉด ๋ณดํต ์ปค๋์ CONFIG_PID_NS๊ฐ ๊บผ์ ธ ์์ผ๋ฉฐ, ์ด ์ํ์์
systemd๋ฅผ Debian PID 1๋ก ์คํํ ์ ์์ต๋๋ค. cgroup ์ข
๋ฅ๋ฅผ ๋ฐ๊ฟ๋ ๋น ์ง ์ปค๋ ๊ธฐ๋ฅ์ด
์๊ธฐ์ง๋ ์์ต๋๋ค.
ํธ์คํธ PID ํธํ ๋์ฒด ๋ชจ๋ ํ์ฉ์ ๊ธฐ๋ณธ๊ฐ์ด ๊บผ์ง ๋ณ๋ ์ค์ ์
๋๋ค. ์ด ์ต์
์
์ผ๋ DawnShell์ ์ ์ฒด ๊ธฐ๋ฅ ๊ฒฝ๋ก๋ฅผ ๋จผ์ ๊ฒ์ฌํฉ๋๋ค. ํ์ PID/cgroup namespace๋ฅผ
์ค๋นํ ์ ์์ ๋๋ง mode=compat๋ฅผ ๊ธฐ๋กํ๊ณ , private mount/UTS namespace ์์์
/usr/sbin/sshd -D๋ฅผ ์ง์ ์์ํฉ๋๋ค. SSH listener๋ ๋ถํ
์ IP ์ฃผ์๊ฐ ์์ง
์์ด๋ ๊ณ์ ๋๊ธฐํ๋ฏ๋ก Wi-Fi๋ USB Ethernet์ด ๋ฆ๊ฒ ์ฐ๊ฒฐ๋์ด๋ ๋ค์ ์์ํ ํ์๊ฐ
์์ต๋๋ค.
| ๊ธฐ๋ฅ | ์ ์ฒด ๊ธฐ๋ฅ ๋ชจ๋ | ํธ์คํธ PID ๋์ฒด ๋ชจ๋ |
|---|---|---|
| TCP 22 OpenSSH | ssh.service |
sshd -D ์ง์ ์คํ |
| mount์ ํธ์คํธ ์ด๋ฆ | private | private |
| ํ๋ก์ธ์ค ๋ชฉ๋ก | private PID namespace | Android์ ๊ณต์ |
| systemd PID 1๊ณผ D-Bus | ์ฌ์ฉ ๊ฐ๋ฅ | ์ฌ์ฉ ๋ถ๊ฐ |
| ์์ cgroup๊ณผ Docker | ์ ํํ backend ๊ฒ์ฌ ์ฑ๊ณต ์ ์ฌ์ฉ | ์ฌ์ฉ ๋ถ๊ฐ |
| ๊ทธ ๋ฐ์ ํ์ฑํ๋ systemd ์๋น์ค | ์ ์ ์์ | ์์ํ์ง ์์ |
์ด ๊ธฐ๋ฅ์ ๊ฒฉ๋ฆฌ๊ฐ ์กฐ๊ธ ์ฝํ systemd ๋ชจ๋๊ฐ ์๋๋ผ ๋น์ SSH์ฉ ํธํ ๋ชจ๋์ ๋๋ค. Debian ํ๋ก์ธ์ค๊ฐ Android ํธ์คํธ PID ๋ชฉ๋ก์ ๋ณผ ์ ์์ผ๋ฏ๋ก, ์ปค๋์ ์ฌ๋น๋ํ๊ธฐ ์ด๋ ต๊ณ rootfs๋ฅผ ์ ๋ขฐํ ์ ์์ ๋๋ง ์ฌ์ฉํ์ธ์. ์ค์ ์ ์ ์ฅํ๋ฉด ์คํ ์ค์ธ Debian์ ํ ๋ฒ ์ฌ์์ํด ์ ํํ ์ ์ฑ ์ ์ ์ฉํฉ๋๋ค.
OpenSSH๋ ๋ค์ ์ ์ฑ ์ผ๋ก ๊ตฌ์ฑํฉ๋๋ค.
Port 22
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
PermitRootLogin no
SSH ๊ฐ์ธ ํค๋ ์ฑ CE(Credential Encrypted) ์ ์ฅ์์ ๋จ๊ณ ๊ณต๊ฐ ํค๋ง Debian์ ๋ค์ด๊ฐ๋๋ค. ํค๋ฅผ ๋ฐ๊ฟจ๋ค๋ฉด ๊ตฌ์ฑ ๋ฒํผ์ ๋ค์ ๋๋ฌ ์ ๊ณต๊ฐ ํค๋ฅผ ๋ฐ์ํฉ๋๋ค.
์ ์ฒด ๊ธฐ๋ฅ ๋ชจ๋์์ ์ค์ง๋ systemd์ ์ ์ ์ข ๋ฃ๋ฅผ ์์ฒญํ๊ณ , ์ ํ ์๊ฐ๊น์ง ๊ธฐ๋ค๋ฆฐ ๋ค ๋จ์ ์์ ํ๋ก์ธ์ค์ ๋ง์ดํธ, cgroup ํ์ ํธ๋ฆฌ๋ฅผ ์ ๋ฆฌํฉ๋๋ค. ํธํ ๋์ฒด ๋ชจ๋์์๋ ์ถ์ ์ค์ธ OpenSSH master๋ฅผ ์ข ๋ฃํ๊ณ private mount/UTS ์คํ ๊ณต๊ฐ์ ํด์ ํฉ๋๋ค. ์ด ๋ชจ๋์๋ systemd ์๋น์ค ์ข ๋ฃ ๋จ๊ณ๊ฐ ์์ต๋๋ค. ์ฌ์์์ ํ์ฌ ๋ชจ๋์ ๋ง๋ ์ ๋ฆฌ๋ฅผ ๋ง์น ๋ค ์ปค๋ ๊ธฐ๋ฅ์ ๋ค์ ๊ฒ์ฌํด ๋ชจ๋๋ฅผ ์ ํํฉ๋๋ค.
USER_UNLOCKED๋ ์ข
๋ฃ ์ ํธ๊ฐ ์๋๋๋ค. ์ฌ์ฉ์๊ฐ ์ ๊ธ์ ํ์ด๋ Debian๊ณผ SSH๋
๊ณ์ ์คํ๋ฉ๋๋ค.
์ฑ์ ์ํ๋ ๋ ๋ชจ๋ ๋ชจ๋ supervisor, ํ๋ก์ธ์ค ์คํ ํ์ผ, TCP 22, mount ๋ฐ namespace identity๋ฅผ ํ์ธํฉ๋๋ค. ์ ์ฒด ๊ธฐ๋ฅ ๋ชจ๋์์๋ ๋ค์ ํญ๋ชฉ๋ ํ์ธํฉ๋๋ค.
- systemd๊ฐ Debian PID 1์ธ์ง ์ฌ๋ถ
- D-Bus์ ๊ธฐ๋ณธ target
ssh.service- cgroup health
ํธํ ๋์ฒด ๋ชจ๋์ health ๊ฒฐ๊ณผ์๋ mode=compat, compat_ready=true๊ฐ ๋ช
์๋ฉ๋๋ค.
์ค๋ฅ๊ฐ ์์ผ๋ฉด ์๋ฒ ์๋ช ์ฃผ๊ธฐ์ ์์คํ ๊ตฌ์ฑ ๋ก๊ทธ๋ฅผ ํจ๊ป ํ์ธํฉ๋๋ค.
Debian root ์
ธ์์ systemctl reboot๋ฅผ ์คํํด๋ Android ์ ์ฒด๋ฅผ ์ฌ๋ถํ
ํ์ง
์๋๋ก ๊ฒฉ๋ฆฌํฉ๋๋ค. Android ์ ์ฒด ์ฌ๋ถํ
์ DawnShell์ด ์ ๊ณตํ๋ ๋ช
์์ bridge๋ฅผ
์ฌ์ฉํฉ๋๋ค.
reboot --check
reboot nowreboot now๋ ์ฆ์ ๊ธฐ๊ธฐ๋ฅผ ์ฌ๋ถํ
ํ๋ฏ๋ก ์ ์ฅ ์ค์ธ ์์
์ ๋จผ์ ๋๋ด ์ฃผ์ธ์.
์ด ๊ด๋ฆฌํ Android ์ฌ๋ถํ
bridge๋ ์ ์ฒด systemd ๋ชจ๋์์๋ง ๋์ํ๋ฉฐ SSH ์ ์ฉ ํธํ
๋์ฒด ๋ชจ๋์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.