2018년 12월 13일 목요일

NanoPi root file system 만들기

먼저, 제일 어려운 용어 부터 정리하고 넘어가 보자.

Root file system이란?

간단히 정의하자면 linux의 operating system이라고 설명할 수 있을 것 같다.
옛날 옛적의 MS-DOS (Disk Operating System)의 기능에서 유추하면 대략의 윤곽을 잡을 수 있다.
지금과 같은 화려한 Windows/MAC OS 같은 GUI 기반의 OS가 없던 시절에 쓰던 DOS에는 PC를 운영하기 위한 기능이 비교적 간단했다. 디스크를 읽거나 쓰고, 디스크의 내용을 조회하거나 시스템에 연결된 주변 장치를 조회하는 등의 작업을 지원하거나, operating system에서 지원하지 않는 기능들을 별도의 프로그램으로 작성하여 실행하는 것이 전부였다고 보면 될 것 같다. (물론 그 이면에 더 복잡한 시스템이 있겠지만 일반적인 사용자 관점에서 그렇다는 얘기다. - 누군가가 'MS-DOS가 뭐야?' 라고 묻는다면 귀찮은 대답을 피하고 싶어하는 엔지니어라면 의례 'command.com이야' 라고 얘기할걸? :))
dir, copy, del, move, type, echo 등과 run.exe와 같은 간단한 명령을 텍스트 기반의 입력 장치를 통해 수행하는 것이다. dir, copy 등과 같은 기본적인 디스크 작업 명령은 별도의 실행 파일을 가지고 있지 않고 command.com라는 텍스트 기반 프로그램의 하위 기능으로 구현이 되었는데, 아직 익숙하지는 않겠지만 linux의 busybox와 유사한 구성이라고 할 수 있겠다.
아무튼, 컴퓨터를 '사람'이 사용하기 위해서는 의사소통의 다리 역할을 하는 프로그램으로 구성된 operating system이 필요한데, 이것이 root file system인 것이다.

그렇다면 컴퓨터(embedded 기기)사용자는 root file system을 이해하고 사용해야 하는가?

결론부터 성급하게 말해보자면, '아니다'. 현대의 컴퓨터 시스템에서는 MS-DOS 시절처럼 컴퓨터에서 하는 작업이 단순하지 않다. 컴퓨터의 기능이 향상되면서, 수많은 복잡한 일들을 처리할 수 있게 operating system이 진화하였고, 반대로 사용자는 점점 복잡하거나 익숙하지 않은 것을 피할 수 있게 되었다. 더 이상 대부분의 사용자는 operating system을 통해 기기와 의사소통을 주고받지 않는다. 수많은 능력 있는 개발자들이 작성한 소프트웨어가 (사용자 대신) 소통의 다리 역할을 하고 있는 것이다.
아, 당신이 나처럼 소프트웨어 개발자일 것이라는 사실을 잊고 있었다.
'맞다' - 훌륭한 소프트웨어 개발자가 되려면 OS (또는 root file system)에 대해서 잘 알고 있어야 한다.


시작하기

Kernel 및 U-boot 빌드와 준비물은 크게 다르지 않다.
  1. 크로스컴파일을 위한 도구가 이미 설치되어 있다고 가정해보자. (링크 참고)
  2. 빌드루트 또한 오픈소스 개발자들이 착실하게 유지보수를 수행하며 공유하고 있다. 아래 링크에서 다운로드를 받아보자
    • https://buildroot.org/downloads/buildroot-2018.11.tar.gz
  3. 사실, buildroot를 기본부터 이해하려면 막막하지만, 이것도 mainline 의 영향인지 NanoPi 보드의 경우 configuration을 이미 가지고 있다. 단지 아래 명령을 실행하는 것만으로 u-boot, kernel, root-file-system 까지 한 번에 내려받고 컴파일까지 모두 완료된다. 심지어는 SD-card에 직접 쓸 수 있는 image file 까지 만들어 준다. (주>빌드 할 것이 매우 많기 때문에 시간이 오-래 걸린다)
    • make nanopi_neo_defconfig
    • make
  4. Boot log 를 확인해보면 official image와는 사뭇 다른 결과물이 얻어졌음을 알 수 있다.
  5. 
    In:    serial
    Out:   serial
    Err:   serial
    Net:   No ethernet found.
    starting USB...
    USB0:   USB EHCI 1.00                                           
    USB1:   USB OHCI 1.0                                            
    scanning bus 0 for devices... 1 USB Device(s) found             
    Hit any key to stop autoboot:  0                                
    switch to partitions #0, OK                                     
    mmc0 is current device
    Scanning mmc 0:1...
    Found U-Boot script /boot.scr
    reading /boot.scr
    299 bytes read in 19 ms (14.6 KiB/s)
    ## Executing script at 43100000
    reading zImage
    3588880 bytes read in 188 ms (18.2 MiB/s)
    reading sun8i-h3-nanopi-neo.dtb
    13833 bytes read in 26 ms (519.5 KiB/s)
    ## Flattened Device Tree blob at 43000000
       Booting using the fdt blob at 0x43000000
       Using Device Tree in place at 43000000, end 43006608
    
    Starting kernel ...
    
    [    0.000000] Booting Linux on physical CPU 0x0
    [    0.000000] Linux version 4.10.1 (iddev@iddev-ubuntu) (gcc version 7.3.0 (Buildroot 2018.11)8
    [    0.000000] CPU: ARMv7 Processor [410fc075] revision 5 (ARMv7), cr=10c5387d
    [    0.000000] CPU: div instructions available: patching division code
    [    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
    [    0.000000] OF: fdt:Machine model: FriendlyARM NanoPi NEO
    [    0.000000] Memory policy: Data cache writealloc
    [    0.000000] psci: probing for conduit method from DT.
    [    0.000000] psci: Using PSCI v0.1 Function IDs from DT
    [    0.000000] percpu: Embedded 14 pages/cpu @cffb5000 s24652 r8192 d24500 u57344
    [    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 65024
    [    0.000000] Kernel command line: console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwat
    [    0.000000] PID hash table entries: 1024 (order: 0, 4096 bytes)
    [    0.000000] Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
    [    0.000000] Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
    [    0.000000] Memory: 250784K/262144K available (5120K kernel code, 308K rwdata, 1352K rodata,)
    [    0.000000] Virtual kernel memory layout:
    [    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    [    0.000000]     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
    [    0.000000]     vmalloc : 0xd0800000 - 0xff800000   ( 752 MB)
    [    0.000000]     lowmem  : 0xc0000000 - 0xd0000000   ( 256 MB)
    [    0.000000]     pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
    [    0.000000]     modules : 0xbf000000 - 0xbfe00000   (  14 MB)
    [    0.000000]       .text : 0xc0008000 - 0xc0600000   (6112 kB)
    [    0.000000]       .init : 0xc0800000 - 0xc0900000   (1024 kB)
    [    0.000000]       .data : 0xc0900000 - 0xc094d340   ( 309 kB)
    [    0.000000]        .bss : 0xc094f000 - 0xc0991934   ( 267 kB)
    [    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
    [    0.000000] Hierarchical RCU implementation.
    [    0.000000]  Build-time adjustment of leaf fanout to 32.
    [    0.000000]  RCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=4.
    [    0.000000] RCU: Adjusting geometry for rcu_fanout_leaf=32, nr_cpu_ids=4
    [    0.000000] NR_IRQS:16 nr_irqs:16 16
    [    0.000000] arm_arch_timer: Architected cp15 timer(s) running at 24.00MHz (phys).
    [    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, ms
    [    0.000006] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
    [    0.000017] Switching to timer-based delay loop, resolution 41ns
    [    0.000154] clocksource: timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 796358s
    [    0.000375] Console: colour dummy device 80x30
    [    0.000406] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00)
    [    0.000419] pid_max: default: 32768 minimum: 301
    [    0.000522] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
    [    0.000531] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
    [    0.001147] CPU: Testing write buffer coherency: ok
    [    0.001470] /cpus/cpu@0 missing clock-frequency property
    [    0.001483] /cpus/cpu@1 missing clock-frequency property
    [    0.001494] /cpus/cpu@2 missing clock-frequency property
    [    0.001504] /cpus/cpu@3 missing clock-frequency property
    [    0.001515] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
    [    0.001776] Setting up static identity map for 0x40100000 - 0x40100058
    [    0.002411] smp: Bringing up secondary CPUs ...
    [    0.013075] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
    [    0.023747] CPU2: thread -1, cpu 2, socket 0, mpidr 80000002
    [    0.034406] CPU3: thread -1, cpu 3, socket 0, mpidr 80000003
    [    0.034465] smp: Brought up 1 node, 4 CPUs
    [    0.034484] SMP: Total of 4 processors activated (192.00 BogoMIPS).
    [    0.034490] CPU: All CPU(s) started in HYP mode.
    [    0.034494] CPU: Virtualization extensions available.
    [    0.035177] devtmpfs: initialized
    [    0.038800] VFP support v0.3: implementor 41 architecture 2 part 30 variant 7 rev 5
    [    0.039021] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 1911s
    [    0.039040] futex hash table entries: 1024 (order: 4, 65536 bytes)
    [    0.039283] pinctrl core: initialized pinctrl subsystem
    [    0.040158] NET: Registered protocol family 16
    [    0.040501] DMA: preallocated 256 KiB pool for atomic coherent allocations
    [    0.041529] hw-breakpoint: found 5 (+1 reserved) breakpoint and 4 watchpoint registers.
    [    0.041539] hw-breakpoint: maximum watchpoint size is 8 bytes.
    [    0.052278] SCSI subsystem initialized
    [    0.052715] usbcore: registered new interface driver usbfs
    [    0.052773] usbcore: registered new interface driver hub
    [    0.052827] usbcore: registered new device driver usb
    [    0.053034] pps_core: LinuxPPS API ver. 1 registered
    [    0.053041] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti 
    [    0.053060] PTP clock support registered
    [    0.053267] Advanced Linux Sound Architecture Driver Initialized.
    [    0.054110] clocksource: Switched to clocksource arch_sys_counter
    [    0.062284] NET: Registered protocol family 2
    [    0.062780] TCP established hash table entries: 2048 (order: 1, 8192 bytes)
    [    0.062812] TCP bind hash table entries: 2048 (order: 2, 16384 bytes)
    [    0.062847] TCP: Hash tables configured (established 2048 bind 2048)
    [    0.062913] UDP hash table entries: 256 (order: 1, 8192 bytes)
    [    0.062956] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)
    [    0.063134] NET: Registered protocol family 1
    [    0.063507] RPC: Registered named UNIX socket transport module.
    [    0.063519] RPC: Registered udp transport module.
    [    0.063524] RPC: Registered tcp transport module.
    [    0.063529] RPC: Registered tcp NFSv4.1 backchannel transport module.
    [    0.065359] workingset: timestamp_bits=30 max_order=16 bucket_order=0
    [    0.073491] NFS: Registering the id_resolver key type
    [    0.073543] Key type id_resolver registered
    [    0.073549] Key type id_legacy registered
    [    0.074632] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 249)
    [    0.074644] io scheduler noop registered
    [    0.074651] io scheduler deadline registered
    [    0.074799] io scheduler cfq registered (default)
    [    0.079676] sun8i-h3-pinctrl 1c20800.pinctrl: initialized sunXi PIO driver
    [    0.081399] sun8i-h3-r-pinctrl 1f02c00.pinctrl: initialized sunXi PIO driver
    [    0.135079] Serial: 8250/16550 driver, 8 ports, IRQ sharing disabled
    [    0.137773] console [ttyS0] disabled
    [    0.157952] 1c28000.serial: ttyS0 at MMIO 0x1c28000 (irq = 30, base_baud = 1500000) is a U6_A
    [    0.762813] console [ttyS0] enabled
    [    0.766828] [drm] Initialized
    [    0.770954] libphy: Fixed MDIO Bus: probed
    [    0.775085] CAN device driver interface
    [    0.779179] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
    [    0.785715] ehci-platform: EHCI generic platform driver
    [    0.791131] ehci-platform 1c1d000.usb: EHCI Host Controller
    [    0.796745] ehci-platform 1c1d000.usb: new USB bus registered, assigned bus number 1
    [    0.804650] ehci-platform 1c1d000.usb: irq 24, io mem 0x01c1d000
    [    0.834135] ehci-platform 1c1d000.usb: USB 2.0 started, EHCI 1.00
    [    0.840984] hub 1-0:1.0: USB hub found
    [    0.844786] hub 1-0:1.0: 1 port detected
    [    0.849086] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
    [    0.855314] ohci-platform: OHCI generic platform driver
    [    0.860700] ohci-platform 1c1d400.usb: Generic Platform OHCI controller
    [    0.867343] ohci-platform 1c1d400.usb: new USB bus registered, assigned bus number 2
    [    0.875175] ohci-platform 1c1d400.usb: irq 25, io mem 0x01c1d400
    [    0.948781] hub 2-0:1.0: USB hub found
    [    0.952558] hub 2-0:1.0: 1 port detected
    [    0.957657] sun6i-rtc 1f00000.rtc: rtc core: registered rtc-sun6i as rtc0
    [    0.964458] sun6i-rtc 1f00000.rtc: RTC enabled
    [    0.969006] i2c /dev entries driver
    [    0.972694] IR NEC protocol handler initialized
    [    0.977233] IR RC5(x/sz) protocol handler initialized
    [    0.982276] IR RC6 protocol handler initialized
    [    0.986807] IR JVC protocol handler initialized
    [    0.991329] IR Sony protocol handler initialized
    [    0.995946] IR SANYO protocol handler initialized
    [    1.000642] IR Sharp protocol handler initialized
    [    1.005351] IR MCE Keyboard/mouse protocol handler initialized
    [    1.011173] IR XMP protocol handler initialized
    [    1.016203] sunxi-wdt 1c20ca0.watchdog: Watchdog enabled (timeout=16 sec, nowayout=0)
    [    1.024358] cpu cpu0: failed to get clock: -2
    [    1.028723] cpufreq-dt: probe of cpufreq-dt failed with error -2
    [    1.035585] sunxi-mmc 1c0f000.mmc: Got CD GPIO
    [    1.094130] sunxi-mmc 1c0f000.mmc: base:0xd0875000 irq:23
    [    1.100635] usbcore: registered new interface driver usbhid
    [    1.106234] usbhid: USB HID core driver
    [    1.110989] NET: Registered protocol family 17
    [    1.115492] can: controller area network core (rev 20120528 abi 9)
    [    1.121895] NET: Registered protocol family 29
    [    1.126352] can: raw protocol (rev 20120528)
    [    1.130619] can: broadcast manager protocol (rev 20161123 t)
    [    1.136289] can: netlink gateway (rev 20130117) max_hops=1
    [    1.141991] Key type dns_resolver registered
    [    1.146372] Registering SWP/SWPB emulation handler
    [    1.156056] sun6i-rtc 1f00000.rtc: setting system clock to 1970-01-01 00:00:06 UTC (6)
    [    1.164275] vcc3v0: disabling
    [    1.167245] vcc5v0: disabling
    [    1.170208] ALSA device list:
    [    1.173168]   No soundcards found.
    [    1.177201] Waiting for root device /dev/mmcblk0p2...
    [    1.204562] mmc0: host does not support reading read-only switch, assuming write-enable
    [    1.217527] mmc0: new high speed SDHC card at address aaaa
    [    1.223637] mmcblk0: mmc0:aaaa SU04G 3.69 GiB 
    [    1.231415]  mmcblk0: p1 p2
    [    1.264987] EXT4-fs (mmcblk0p2): couldn't mount as ext3 due to feature incompatibilities
    [    1.273704] EXT4-fs (mmcblk0p2): couldn't mount as ext2 due to feature incompatibilities
    [    1.282873] EXT4-fs (mmcblk0p2): INFO: recovery required on readonly filesystem
    [    1.290191] EXT4-fs (mmcblk0p2): write access will be enabled during recovery
    [    1.319718] random: fast init done
    [    1.338110] EXT4-fs (mmcblk0p2): recovery complete
    [    1.346671] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
    [    1.354829] VFS: Mounted root (ext4 filesystem) readonly on device 179:2.
    [    1.364537] devtmpfs: mounted
    [    1.368610] Freeing unused kernel memory: 1024K
    [    1.446305] EXT4-fs (mmcblk0p2): re-mounted. Opts: data=ordered
    Starting logging: OK
    Initializing random number generator... done.
    Starting network: OK
    
    Welcome to Buildroot for the NanoPi NEO
    nanopi-neo login:
    
이쯤 되면 역사와 의미 부터 구구절절 풀어냈던 '썰'이 무색해진다. (약간 치트키를 쓴 듯한 느낌?)
하지만, 이것 만으로는 뭔가 '했다'고 할수는 없으니 몇 가지를 추가적으로 시도해보자.

댓글 없음:

댓글 쓰기

[Scrap] Zero to Hero: Guide to Object Detection using Deep Learning: Faster R-CNN,YOLO,SSD

Zero to Hero: Guide to Object Detection using Deep Learning: Faster R-CNN,YOLO,SSD https://cv-tricks.com/object-detection/faster-r-cnn-yo...