SECURITY/OpenWrt

OpenWrt: Package ํŒจํ‚ค์ง€ ๋นŒ๋“œ :: Hello, world!

\b\t 2021. 7. 22. 01:46

๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ฒซ ์‹œ์ž‘์€ Hello, world! ๋žฌ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ ์ง€๊ธˆ ํฌ์ŠคํŒ…ํ•  ๋‚ด์šฉ๋„ OpenWrt ์— helloworld ๋ผ๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ์„ค์น˜ํ•˜๋Š” ๋‚ด์šฉ์ด๋‹ค.

 

์•„๋ž˜ ๋‚ด์šฉ์€ OpenWrt helloworld ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

https://openwrt.org/docs/guide-developer/helloworld/start

 


Part 1. helloworld ํŒจํ‚ค์ง€ ์ž‘์„ฑํ•˜๊ณ  ๋นŒ๋“œํ•˜๊ธฐ

 

๋จผ์ € SDK ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋‚˜์˜ ๊ฒฝ์šฐ, OpenWrt SDK ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋กœ ํ•ด๋‹น ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ž์‹ ์˜ ๊ธฐ๊ธฐ์— ๋งž๋Š” ์†Œ์Šค ์ฝ”๋“œ์—์„œ SDK ํŒŒ์ผ ๋˜ํ•œ ์ œ๊ณตํ•˜๊ณ  ์žˆ์œผ๋‹ˆ, Linux ์—์„œ ๊ทธ๊ฑธ ๋‹ค์šด๋ฐ›๊ณ  ์ง„ํ–‰ํ•ด๋„ ์ƒ๊ด€์—†๊ฒ ๋‹ค.

 

๋‹ค๋งŒ staging_dir ์€ ๊ต์ฐจ ์ปดํŒŒ์ผ๋ง์„ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ˆ, ํ™•์ธํ•˜๊ธฐ!

 

๋จผ์ € ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์ž.

$ cd /home/build/openwrt/package/mypackages/examples/helloworld/
$ vi helloworld.c

vi ์—๋””ํ„ฐ (์—†์œผ๋ฉด ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, vim ์„ค์น˜ ๊ถŒ์žฅ) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ helloworld.c ๋ผ๋Š” ์ด๋ฆ„์˜ ๊ฐ„๋‹จํ•œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ž.

๊ฒฝ๋กœ๋Š” ์–ด๋””๋“  ์ƒ๊ด€ ์—†์œผ๋‚˜, ๋‚˜์ค‘์— ์ด ๊ฒฝ๋กœ๋ฅผ ์†Œ์Šค ์ฝ”๋“œ ํด๋”๋กœ ์ง€์ •ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์–ตํ•ด์ฃผ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

(์ € ํด๋”๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Š” ๋ฐ‘์— ๋‚ด์šฉ ํ•˜๋‹ค๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜ ๋‚ด์šฉ ๐ŸŽ‰ ์ฐธ๊ณ )

#include <stdio.h>

int main(){
	printf("Hello, world!\n\n");
    return 0;
}

Hello, world ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฐ„๋‹จํ•œ C ์ฝ”๋“œ ์ด๋‹ค.

 

์ด ์•„์ด๋ฅผ ํ•œ๋ฒˆ ์ปดํŒŒ์ผํ•ด๋ณด์ž. ์ž˜ ์ž‘์„ฑํ–ˆ๋Š”์ง€ ํ™•์ธ์ฐจ!

$ gcc -o helloworld helloworld.c
$ ./helloworld

์ถœ๋ ฅ์ด ์ž˜ ๋˜๋ฉด ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๋‹ค.

 

์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

 

ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค ํด๋”๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. (๐ŸŽ‰)

$ mkdir -p /home/build/openwrt/package/mypackages/examples/helloworld
$ cd /home/build/openwrt/package/mypackages/examples/helloworld

(์ดํ•ด๋ฅผ ์œ„ํ•ด ๊ณ„์† ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ํ•˜๊ณ ๋Š” ์žˆ์ง€๋งŒ, ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๋ฏ€๋กœ ์ทจ์‚ฌ์„ ํƒ.. )

 

์—ฌ๊ธฐ์— Makefile ์„ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.

make ๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•œ ํŒŒ์ผ๋กœ ์ž‘์„ฑํ•ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ๋‚˜์ค‘์— ๊ธฐํšŒ๊ฐ€ ๋˜๋ฉด ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

์—ฌ๊ธฐ์„œ๋Š” OpenWrt ๊ณต์‹ ๋ฌธ์„œ Helloworld ์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” Makefile (https://openwrt.org/_export/code/docs/guide-developer/helloworld/chapter3?codeblock=2) ์„ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๊ด€ํ•˜๋‹ค.

๋‹จ, ์†Œ์Šค ์ฝ”๋“œ ํด๋”๋Š” ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค. : SOURCE_DIR

 

๊ฐ„๋‹จํ•˜๊ฒŒ ์กฐ๊ธˆ๋งŒ ์‚ดํŽด๋ณด๊ธฐ ์œ„ํ•ด ํ•ต์‹ฌ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” 4๊ฐ€์ง€ ๋ถ€๋ถ„์„ ๊ฐ€์ ธ์™”๋‹ค.

# [1]
PKG_NAME:=helloworld
PKG_VERSION:=1.0
PKG_RELEASE:=1

# [2]
SOURCE_DIR:=/home/build/openwrt/package/mypackages/examples/helloworld

# [3]
# Package definition; instructs on how and where our package will appear in the overall configuration menu ('make menuconfig')
define Package/helloworld
  SECTION:=examples
  CATEGORY:=Examples
  TITLE:=Hello, World!
endef

# [4]
# Package build instructions; invoke the target-specific compiler to first compile the source file, and then to link the file into the final executable
define Build/Compile
        $(TARGET_CC) $(TARGET_CFLAGS) -o $(PKG_BUILD_DIR)/helloworld.o -c $(PKG_BUILD_DIR)/helloworld.c
        $(TARGET_CC) $(TARGET_LDFLAGS) -o $(PKG_BUILD_DIR)/$1 $(PKG_BUILD_DIR)/helloworld.o
endef
  • [1] ํŒจํ‚ค์ง€ ์ด๋ฆ„/๋ฒ„์ „/๋ฆด๋ฆฌ์ฆˆ ์ •๋ณด๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณณ์ด๋‹ค. ์ถ”ํ›„ ์ƒ์„ฑํ•  ํŒจํ‚ค์ง€ ํŒŒ์ผ๋„ ์ด ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋œ๋‹ค.
  • [2] ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์œ„์น˜ํ•˜๋Š” ํด๋”์˜ ๊ฒฝ๋กœ์ด๋‹ค.
  • [3] ์ „์ฒด configuration ์—์„œ ์šฐ๋ฆฌ ํŒจํ‚ค์ง€๋ฅผ ์–ด๋””์— ์œ„์น˜ํ• ๊ฑฐ๋ƒ๋Š” ๊ฒƒ์ด๋‹ค
    ํƒ€์ดํ‹€ ์ •๋ณด์— ๋”ฐ๋ผ์„œ ๋ณด์—ฌ์ง€๊ณ , ์นดํ…Œ๊ณ ๋ฆฌ๋Š” make menuconfig ๋ฅผ ํ•˜๋ฉด ๋‚˜์˜ค๋Š” ์ฐฝ์—์„œ์˜ ์นดํ…Œ๊ณ ๋ฆฌ๋“ค์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋Š” ๋‚˜์ค‘์— make menuconfig ๋ฅผ ํ•ด๋ณด๋ฉด ๊ฐ์ด ๋ฐ”๋กœ ์˜ฌ ๊ฒƒ์ด๋‹ค. (๐Ÿšฉ)
  • [4] compile ์†์„ฑ์„ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ์œ„์—์„œ gcc -o helloworld helloword.c ๋ฅผ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ง€์ •ํ•˜๊ณ  ์—ฌ๋Ÿฌ ์˜ต์…˜์œผ๋กœ ์ตœ์ข… ์‹คํ–‰ ํŒŒ์ผ์„ ์ปดํŒŒ์ผ ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. $() ์„ ๋นผ๊ณ  ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๋” ๋ ์ˆ˜๋„..

 

์ด์ œ

OpenWrt build system ์€ feeds.conf ๋ผ๋Š” ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด์„œ firmware configuration stage ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์งˆ package feeds ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

์ด ํŒŒ์ผ์— ์šฐ๋ฆฌ์˜ ํŒจํ‚ค์ง€๋ฅผ ์ ์–ด์ฃผ๋ฉด ๋˜๋Š”๋ฐ, openwrt ๋ฃจํŠธ ํด๋”์— ์ด๋ฏธ ์žˆ์„ ์ˆ˜๋„,  ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค.

๋‚˜์˜ ๊ฒฝ์šฐ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” feess.conf.default ํŒŒ์ผ์ด ์กด์žฌํ•˜์—ฌ ๊ทธ ํŒŒ์ผ์— ํŒจํ‚ค์ง€ ์ •๋ณด๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜์˜€๋‹ค.

$ src-link mypackages /home/build/openwrt/package/mypackages

 

์ด๊ฑธ ์ €์žฅํ•ด์ฃผ๋ฉด ์ด์ œ feeds ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์„ค์น˜ํ•  ์‹œ๊ฐ„์ด๋‹ค.

๋‹ค์Œ์„ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋Œ€์ถฉ "์ด์ œ helloworld ๋ผ๋Š” ํŒจํ‚ค์ง€๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋“ฑ๋กํ•ด์คฌ๊ตฌ๋‚˜" ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

$ cd /home/build/openwrt
$ ./scripts/feeds update mypackages
$ ./scripts/feeds install -a -p mypackages

 

 

์ด์ œ ์šฐ๋ฆฌ์˜ ํŒจํ‚ค์ง€๊ฐ€ firmware configuration ์— ํฌํ•จ๋˜๋„๋ก, ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์น˜๊ณ  ์„ค์ •์„ ํ•ด๋ณด์ž.

$ make menuconfig

๊ทธ๋Ÿผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐฝ์œผ๋กœ ์ „ํ™˜๋œ๋‹ค.

 

๊ทธ ์ค‘ Examples ํด๋ฆญ (๐Ÿšฉ)

์•„๊นŒ Makefile ์— ์ž‘์„ฑํ•œ ๊ฒƒ์ฒ˜๋Ÿผ, Examples ์นดํ…Œ๊ณ ๋ฆฌ์— ๋“ค์–ด๊ฐ€๋ฉด helloworld ํŒจํ‚ค์ง€๊ฐ€ ๋ณด์ผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋œ๋‹ค.

 

 

์—ญ์‹œ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ helloworld ๊ฐ€ ๋ณด์ธ๋‹ค!

์šฐ์ธก ์„ค๋ช…๋„ Makefile ์— ์ž‘์„ฑํ•œ ๋Œ€๋กœ ํŒจํ‚ค์ง€๊ฐ€ ๋ณด์ด๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์„ ํƒ๋œ ์ƒํƒœ์—์„œ (ํŒŒ๋ž€์ƒ‰ ํ•˜์ด๋ผ์ด๋“œ) Y ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์„ ํƒ๋œ๋‹ค.

์ด๋Š” ์ด ํŒจํ‚ค์ง€๋ฅผ firmware configuration ์— ํฌํ•จํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

 

save ๋ˆ„๋ฅด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด .config ์ €์žฅ์ด ๋œจ๊ณ , ok ๋ˆ„๋ฅด๊ณ  exit ํ•˜๋ฉด ๋œ๋‹ค.

(๋ชจ๋“  ์กฐ์ž‘์€ ํ‚คํŒจ๋“œ๋กœ, ์ขŒ-์šฐ-์—”ํ„ฐ ๋ฅผ ํ•ด๋ณด๋ฉด ๊ฐ์ด ์žกํž ๊ฒƒ์ด๋‹ค.)

 

 

์ด์ œ ์šฐ๋ฆฌ์˜ ํŒจํ‚ค์ง€๋ฅผ ์ปดํŒŒ์ผํ•  ์ค€๋น„๊ฐ€ ๋๋‚ฌ๋‹ค! (_์ง„์งœ_์ง„์งœ_์ตœ์ข…)

 

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์ฃผ์ž.

$  make package/helloworld/compile

์—ฌ๊ธฐ์„œ ๋‹ค์Œ๊ณผ  ๊ฐ™์ด ์„ฑ๊ณตํ•˜๋ฉด (= ์‹คํŒจํ–ˆ๋‹ค๊ณ  ๋œจ์ง€ ์•Š์œผ๋ฉด) ํŒจํ‚ค์ง€ ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ๊ฒƒ์ด๋‹ค!

 

 

๋‹จ, ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—” V=s -j1 ์œผ๋กœ ์˜ต์…˜์„ ์ฃผ๊ณ  ์‚ดํŽด๋ณด์ž.

๋‚˜์˜ ๊ฒฝ์šฐ Makefile ์—์„œ ์†Œ์Šค ์ฝ”๋“œ ํด๋”๋ฅผ ์ž˜๋ชป ์ง€์ •ํ–ˆ์—ˆ๋‹ค;; (์•ŒํŒŒ๋ฒณ ํ•˜๋‚˜๋กœ ๋‹ฌ๋ผ์ง€๋Š” 0๊ณผ 1์˜ ใ……-ใ…”๊ณ„)

ํ•ด๋‹น ๊ฒฝ์šฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์•˜๋‹ค.

์˜ต์…˜์„ ์ฃผ๊ณ  ๋‹ค์‹œ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ ์˜ค๋ฅ˜๋ฅผ ์ž์„ธํžˆ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

๋นŒ๋“œํ•œ ํŒจํ‚ค์ง€ ํŒŒ์ผ์€ /bin ์ชฝ์œผ๋กœ ๊ฐ€๋ฉด ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

ipk ํŒŒ์ผ์ด ๋ณด์ด๋Š”๋ฐ, ๊ทธ๊ฒŒ ๋ฐ”๋กœ ํŒจํ‚ค์ง€ ํŒŒ์ผ์ด๋‹ค.

์ด๋กœ์จ helloworld ํŒจํ‚ค์ง€ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ  ๋นŒ๋“œ๊นŒ์ง€ ์™„๋ฃŒํ–ˆ๋‹ค!

 


Part 2. OpenWrt ์— helloworld ํŒจํ‚ค์ง€ ์„ค์น˜

 

์ด์ œ ์ด ํŒŒ์ผ์„ OpenWrt ํ…Œ์ŠคํŠธ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์— ๋ณด๋‚ด์„œ ์„ค์น˜ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.

(๊ด€๋ จ ๋‚ด์šฉ์€

2021.07.14 - [PROGRAMMING/๊ธฐํƒ€] - Docker for windows 10 : ๋„์ปค ๊ฐœ๋žต, windows 10 ์— ๋„์ปค ์„ค์น˜ํ•˜๊ธฐ ๋ฐฉ๋ฒ•

์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃจ์—ˆ๋‹ค.)

 

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด 2๊ฐœ์˜ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค€๋น„ํ•˜์ž.

์™ผ์ชฝ์€ OpenWrt ์ปจํ…Œ์ด๋„ˆ (์ดํ•˜ A) ๊ณ , ์˜ค๋ฅธ์ชฝ์€ ์—ฌํƒœ ์ž‘์—…ํ•˜๋˜ OpenWrt SDK ๋„์ปค ์ปจํ…Œ์ด๋„ˆ (์ดํ•˜ B) ๋‹ค.

(๋‘˜ ๋‹ค ๋„์ปค๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์œผ๋กœ ๊ตฌ์ถ•ํ•˜์—ฌ๋„ ๋ฌด๊ด€!)

 

B ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•ด์ฃผ์ž.

$ scp helloworld_1.0-1_x86_64.ipk root@172.17.0.4:/

(ip ์ฃผ์†Œ์™€ ํŒŒ์ผ๋ช…์€ ์ž์‹ ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝ!)

 

์ž˜ ์ „์†ก๋œ ๊ฒƒ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ด์ œ opkg ๋กœ ์ „์†ก๋ฐ›์€ helloworld ipk ํŒŒ์ผ์„ ์„ค์น˜ํ•ด์ฃผ์ž.

๊ทธ๋ฆฌ๊ณ  helloworld ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ "Hello, world!" ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

# opkg install helloworld_1.0-1_x86_64.ipk
# helloworld

 


 

์ด๋ ‡๊ฒŒ helloworld ํŒจํ‚ค์ง€๋ฅผ ์ž‘์„ฑํ•˜๊ณ  OpenWrt ์— ์„ค์น˜๊นŒ์ง€ ๋งˆ์ณค๋‹ค.

 

* /home/build/openwrt/package/mypackages/examples/helloworld/
*~/openwrt/bin/packages/x86_64/base

๋Œ“๊ธ€์ˆ˜0