1/27/2020

systemd 로만 관리될 경우 정리

1. systemd 로 부팅


1.1 systemctl 사용법

systemd 에서는 기본 control은 systemctl 이지만 이외에도 사용되어지는 command들이 존재하며 이부분은 이전 내용참조

  • systemctl 와 이외 사용되어지는 명령어 사용법 
  1. systemctl  사용법 
  2. networkctl 사용법 
  3. timedatectl 사용법 

systemctl 및 이외 명령 관련내용 참조  (반드시 참고)
  https://ahyuo79.blogspot.com/2017/03/systemctl.html

systemctl Manual 
  https://www.freedesktop.org/software/systemd/man/systemctl.html#


2. systemd의 Unit 구성 및 종류


  • Unit의 종류 (11개의 종류이지만 필요한것만 사용)
  1. *.service units : 주로 daemon 과 일반 process로 구성
  2. *.socket units:  IPC or Socket 기반의 활동 (encapsulate동작)
  3. *.target units:  Unit들을 group 화 하고 boot 동기화를 할때 유용
  4. *.device units:  Kernel device를 사용할 경우 udev sys
  5. *.mount units:  filesystem 안에 mount point
  6. *.automount units:  filesystem의 automount
  7. *.timer units: 다른 unit의 timer기반의 trigger로 사용
  8. *.swap units:  mount unit 과 유사하며 memory sway 과 OS의 file (encapsulate동작)
  9. *.path units: path 기반으로 변경될 때 동작되는 구조
  10. *.slice units: group unit으로 scope와 service를 계층으로 관리가 가능
  11. *.scope units:  service unit과 거의 유사하지만 외부 process 관리목적

상위 이외에도 systemd.exec 및 systemd.kill 존재하는데, 중복이 되는 것을 알수 있으며,  각 실행파일이 있으므로, 
모든 Section의 Directives의 Index에서 세부파악하자 

모든 Section의 Directives(Option) Index (중요)

  • Unit의 역할이 이미 정해진 것들 반드시 확인
Unit의 종류와 다양한 기능이 존재하지만, 이미 역할이 거의 정해진 것이 많으므로 각각의 특징을 알아보며 세부역할을 알자 

systemd 기반의 Init 관련된 부분 (SysVinit 과 차이)
  https://www.freedesktop.org/software/systemd/man/init.html#

사용용도가 특별한용도로 정해진것 아래에서 확인필요 (반드시 확인)
  https://www.freedesktop.org/software/systemd/man/systemd.special.html#


2.1 Unit의 기본구성 및 문법 

Unit의 기본 문법구성은 SectionDirective(Option)으로 설정이 가능하며 관련 Manual을 찾아서 각 기능을 보자

systemd 의 기본문법 및 구조소개 
  https://www.freedesktop.org/software/systemd/man/systemd.syntax.html#

  • 기본으로 Service 부분 Simple 예
아래의 경우 3개의 Section [Unit] 와 [Service] 와 [Install]로 구성되며 각각의 Manual 참조
$ cat *.service or *.target 
## 주석 
[Unit]  ## Section 이라고함 
Description=Wait for Network to be Configured   ## Section의 Directive or Options 이라고함 
Documentation=man:systemd-networkd-wait-online.service(8)
DefaultDependencies=no

[Service]  ## Section에 따라 Directive의 기능이 달라지므로 주의 
Type=oneshot


[Install]   ## 모든 Unit이 필요한것이 아니므로 주의 
WantedBy=multi-user.target

상위 Service의 기본 분석은 아래의 두개로 시작을 하면 될 것이다.

Unit Section 과 Unit의 Directives(Option) 기능확인
System Unit Search PATH부터 정확히 파악하고 각각의 설정을 파악 
  https://www.freedesktop.org/software/systemd/man/systemd.unit.html
  https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files

Service Section 과 Service의 Directives(Option)기능확인
  https://www.freedesktop.org/software/systemd/man/systemd.service.html#


  • 세부분석을 위한 참조사항 
상위에서 설명했듯이 세부분석시 중요 

모든 Section의 Directives(Option) Index
  https://www.freedesktop.org/software/systemd/man/systemd.directives.html

systemd의 사용되어지는 File index
  https://www.freedesktop.org/software/systemd/man/index.html

  • Target Unit 
systemd의 Unit Target 에 내부 Wants 와 Requires 
  https://www.freedesktop.org/software/systemd/man/systemd.target.html#


2.2 Unit 의 기본분석 

Systemd의 Unit는 다양하므로 본인이 원하는 기능을 볼때 동작 여부와 종속성을 확인하여 정확하게 어떻게 동작하는지 파악하자.

systemctl 및 이외 명령 관련내용 참조  (반드시 참고)
  https://ahyuo79.blogspot.com/2017/03/systemctl.html

  • 각 Unit Linux 분석 (target)
현재 Target Unit의 동작여부를 ACTIVE에서 확인가능.

$ systemctl list-units --type target    // target을 분석 (화살표키로 움직임가능) 
UNIT                LOAD   ACTIVE SUB    DESCRIPTION
basic.target        loaded active active Basic System
getty.target        loaded active active Login Prompts
local-fs-pre.target loaded active active Local File Systems (Pre)
local-fs.target     loaded active active Local File Systems
machines.target     loaded active active Containers
multi-user.target   loaded active active Multi-User System
network.target      loaded active active Network
nss-lookup.target   loaded active active Host and Network Name Lookups
paths.target        loaded active active Paths
remote-fs.target    loaded active active Remote File Systems
slices.target       loaded active active Slices
sockets.target      loaded active active Sockets
swap.target         loaded active active Swap
sysinit.target      loaded active active System Initialization
time-sync.target    loaded active active System Time Synchronized
timers.target       loaded active active Timers
LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

  • 각 Unit 의 종류 및 동작상태 확인 
$ systemctl list-units --type target | grep target    // target을 분석 (나열식) 
상위와 동일 

$ systemctl list-units --type target --state active   // 보통 Service를 Target중심으로 하면 Active되었는지 확인 
or
$ systemctl list-units --type target --state active | grep target 

$ systemctl list-units --all --full | grep ".device"  // device을 세부분석 (나열식으로 전체를 볼수있음)  
  dev-disk-by\x2did-mmc\x2d00000_0x0cf64c62.device                                                                    loaded    active   plugged   /dev/disk/by-id/mmc-00000_0x0cf64c62
  dev-disk-by\x2did-mmc\x2d00000_0x0cf64c62\x2dpart1.device                                                           loaded    active   plugged   /dev/disk/by-id/mmc-00000_0x0cf64c62-part1
  dev-disk-by\x2did-mmc\x2dS0J57X_0x184f6793.device                                                                   loaded    active   plugged   /dev/disk/by-id/mmc-S0J57X_0x184f6793
  dev-disk-by\x2did-mmc\x2dS0J57X_0x184f6793\x2dpart1.device                                                          loaded    active   plugged   /dev/disk/by-id/mmc-S0J57X_0x184f6793-part1
  dev-disk-by\x2did-mmc\x2dS0J57X_0x184f6793\x2dpart2.device                                                          loaded    active   plugged   /dev/disk/by-id/mmc-S0J57X_0x184f6793-part2
  dev-disk-by\x2did-mmc\x2dS0J57X_0x184f6793\x2dpart3.device                                                          loaded    active   plugged   /dev/disk/by-id/mmc-S0J57X_0x184f6793-part3
  dev-disk-by\x2did-mmc\x2dS0J57X_0x184f6793\x2dpart4.device                                                          loaded    active   plugged   /dev/disk/by-id/mmc-S0J57X_0x184f6793-part4
  dev-disk-by\x2did-mmc\x2dS0J57X_0x184f6793\x2dpart5.device                                                          loaded    active   plugged   /dev/disk/by-id/mmc-S0J57X_0x184f6793-part5
  dev-disk-by\x2did-mmc\x2dS0J57X_0x184f6793\x2dpart6.device                                                          loaded    active   plugged   /dev/disk/by-id/mmc-S0J57X_0x184f6793-part6
  dev-disk-by\x2dlabel-boot.device                                                                                    loaded    active   plugged   /dev/disk/by-label/boot
.....


  • Target Unit의 종속성확인

$ systemctl status  // 현재 systemd의 실행상태확인 가능하며, 종속성 확인 (주의: 실행한 후 종료된 것은 제외됨) 
........

$ systemctl list-dependencies --all  // 전체 종속관계 확인  
.....

$ systemctl list-dependencies multi-user.target  // 전체구조파악 하며, 이 안에서 다시 세부 Target 분석  
.....

$ systemctl list-dependencies sockets.target // sockets.target 분석하며, 일반적인 Server Bind 분석  
.....

$ systemctl list-dependencies network-online.target // network-online.target 종속부분확인 
network-online.target
● └─systemd-networkd-wait-online.service


  • 상위 Target 종속성을 확인 후 관련 서비스 확인 
$ cat /lib/systemd/system/systemd-networkd-wait-online.service // network-online.target에 관련된 service분석 
#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Wait for Network to be Configured
Documentation=man:systemd-networkd-wait-online.service(8)
DefaultDependencies=no
Conflicts=shutdown.target
Requires=systemd-networkd.service
After=systemd-networkd.service
Before=network-online.target shutdown.target

[Service]
Type=oneshot
ExecStart=/lib/systemd/systemd-networkd-wait-online
RemainAfterExit=yes

[Install]
WantedBy=network-online.target


$ readelf -a /lib/systemd/systemd-networkd-wait-online // 말그대로 network가 online이 될때까지 기다리는 실행파일  

  • systemd-analyze 분석 (중요)
systemd-analyze를 이용하여 booting 속도 및 각 Unit 연관성을 세부적으로 분석가능하므로 반드시 알아야함

systemd-analyze 부분 아래 참조 
  https://ahyuo79.blogspot.com/2017/04/systemd-analyze.html
  https://jlk.fjfi.cvut.cz/arch/manpages/man/systemd-analyze.1

  • network.target 및 관련내용 
  https://unix.stackexchange.com/questions/209832/debian-systemd-network-online-target-not-working
  https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
  https://www.freedesktop.org/software/systemd/man/systemd-networkd-wait-online.service.html


2.3 기본 Service Unit 문법 


$ vi *.service
[Unit]
Description=Mx Encrypted Folder
Requires=local-fs.target
After=local-fs.target

## Requires 와 After 설정 중요하며, 종속(dependency)이 아니라면 Requreis 제거 
## After 의 local-fs.target Local File System Mount 된 시점
## After 의 network.target (network.target 진입 후 )
## After 의 network-online.target (network 가 연결될 경우)

[Service]
Type=oneshot
ExecStart=/usr/bin/mxmountencrypted
RemainAfterExit=true
ExecStop=/usr/bin/mxunmountencrypted

## ExecStart 이 서비스가 시작시 
## ExecStop 이 서비스를 systemctl stop으로 중지가능 
## RemainAfterExit yes or no로 Exit되어도 유지하는지 설정 (아래 Directives Index 참조)
## StandardOutput=journal  (systemd-journal log로 사용)


[Install]
WantedBy=multi-user.target

## WantedBy or RequiredBy= [Install] Section에서 주로 사용된다 
## 더불어 각각 *.wants 와 .requres directory에 심볼링크를 생성한다 
## 이 대표적인 예가 systemctl enable/disable 설정이 될 것 같다. 


기본 Service Example 
  https://stackoverflow.com/questions/47293195/running-systemd-unit-directly-after-local-fs-target-and-before-basic-target
  https://www.freedesktop.org/software/systemd/man/systemd.service.html

각 Section 과 Directive 한글설명 
  https://fmd1225.tistory.com/93


  • 내가 만든 service 기본서비스
Network가 물리적으로 online되면, 즉 After 와 Wants를 확인

$ vi *.service  //systemd 가 network를 물리적으로 online 된 경우 실행 
## Unit Section 
[Unit]
Description=Setup and Start my Service
After=network-online.target
Wants=network-online.target

## After network-online.target 후 동작가능 (HW Network가 동작가능)
## Wants 충분조건이라고 함 Requires가 필요조건

[Service]
Type=simple
ExecStart=/usr/bin/setup.sh
Restart=on-failure

## ExecStart 상위 조건을 만족하면 실행 
## Restart=on-failure 비정상 종료면 다시 실행
or 
## Restart=always , 상위는 비정상 종료일 경우만 실행이지만, 이는 항상 무조건 실행
## RestartSec=1     매번 Restart시 1s Delay 
 

[Install]
WantedBy=multi-user.target

 https://wiki.archlinux.org/index.php/systemd
 https://wiki.archlinux.org/index.php/systemd#Targets
 https://www.freedesktop.org/wiki/Software/systemd/
 https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/


2.4 NTP Client 설정 

systemd의 NTP Client 설정은 아래와 같이 기본으로 timesyncd에서 담당한다.

  • NTP Client 관련기본설정 
systemd의 NTP Service

$ cat /etc/systemd/timesyncd.conf
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See timesyncd.conf(5) for details.

[Time]
#NTP=
#FallbackNTP=time1.google.com time2.google.com time3.google.com time4.google.com
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

상위 timedatectl 명령어 참조 

$ timedatectl show-timesync --all //명령어로 확인 

// 이곳에 설정하면 NTP와 DNS를 같이 설정가능
// 이 설정이 상위 NTP에도 적용가능 
// 이 설정이 /etc/resolv.conf에 적용가능 

systemd의 NTP (timesyncd)
  https://stackframe.tistory.com/16
  https://www.freedesktop.org/software/systemd/man/timesyncd.conf.html
  https://wiki.archlinux.org/index.php/systemd-timesyncd

timedatectl (상위 링크참조)
  https://ahyuo79.blogspot.com/2017/03/systemctl.html

timedatectl (manual and example)
  http://man7.org/linux/man-pages/man1/timedatectl.1.html
  http://man7.org/linux/man-pages/man1/systemd-firstboot.1.html
  https://www.tecmint.com/set-time-timezone-and-synchronize-time-using-timedatectl-command/


2.5 SSH Server 설정 및 동작

  • SSH Server 설정변경 

$ cat /etc/ssh/sshd_config              //sftp 지원을 위해 수정 
# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

# 이곳에서 Port는 설정하지 말자 
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

# Logging
#SyslogFacility AUTH
#LogLevel INFO

# Authentication:

#LoginGraceTime 2m
PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

#PubkeyAuthentication yes

# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile      .ssh/authorized_keys

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
PermitEmptyPasswords yes

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no

# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
#UsePAM no

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
#X11Forwarding no
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#PermitUserEnvironment no
Compression no
ClientAliveInterval 15
ClientAliveCountMax 4
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

# no default banner path
#Banner none

# Jeonghun
# changed options for SFTP 
# override default of no subsystems
#Subsystem      sftp    /usr/libexec/sftp-server
Subsystem       sftp    internal-sftp

# Example of overriding settings on a per-user basis
#Match User anoncvs
#       X11Forwarding no
#       AllowTcpForwarding no
#       PermitTTY no
#       ForceCommand cvs server

  • SSH Server Port 설정 변경 및 확인 

//sshd.service는 별도로 없으며, sshd.socket만 존재하므로 관련부분 검색 
$ find /lib -name sshd.socket
/lib/systemd/system/sshd.socket

$ find /etc -name sshd.socket                               //sshd.service는 별도로 없으며, sshd.socket만 존재 
/etc/systemd/system/sockets.target.wants/sshd.socket

$ find /etc -name sshd*                                     //상위로도 못찾을 경우 
$ find /lib -name sshd*      


// systemd 는 /lib -> /etc 찾아실행되므로 최종은 etc 이며, 보통 이럴 경우 link임 
$ cat /etc/systemd/system/sockets.target.wants/sshd.socket   // sshd.socket에서 직접 port 변경 
[Unit]
Conflicts=sshd.service

[Socket]
ExecStartPre=/bin/mkdir -p /var/run/sshd
#ListenStream=22
ListenStream=3333
Accept=yes

## 아래의 WantedBy 부분참조하면, 
## systemctl enable/disable 할 경우 sockets.target.wants directory에 심볼 link 생성/삭제됨 
## /lib/systemd/system/sshd.socket 기반으로 link 생성/삭제 
[Install]
WantedBy=sockets.target 

  • SSH Server Port 적용 및 상태확인 

$ systemctl status sshd.socket        // sshd.socket 동작상태 확인 
or
$ systemctl status sshd               // sshd.service 동작상태 확인 (현재 없음) 


$ systemctl daemon-reload
$ systemctl restart sshd.socket.      //sshd.socket  만 있을 경우 sshd 재시작 
or 
$ systemctl restart sshd              //sshd.service 가 있을 경우 


  • SSH or SFTP 동작안될 경우 재확인 

$ netstat -a | grep 3333    // 우선적으로 SSH or SFTP 변경된 Port 동작 검색  
tcp        0      0 :::3333                 :::*                    LISTEN

$ systemctl status sshd.socket // sshd.socket 상태확인  

// 방화벽으로 인한부분 확인
$ iptables -S               // Iptables 설정확인  
-P INPUT DROP               // Iptables INPUT이 DROP이므로 별도 추가 하거나 Policy 변경  
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 123 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 123 -j ACCEPT

$ iptables -A INPUT  -p tcp --dport 3333  -j ACCEPT // Iptables INPUT 새로변경된 Port 추가        
$ iptables -A OUTPUT -p tcp --dport 3333  -j ACCEPT 


  • SSH or SFTP TEST 진행 
$ ssh -p 3333 root@192.168.1.60
$ sftp -P 3333 root@192.168.1.60    //만약 server의 key 정보가 다르다면 ssh-keygen 한 후 재연결 (ssh-keygen -f "/home/jhlee/.ssh/known_hosts" -R 192.168.1.60) 
sftp> pwd                           // remote path 확인
sftp> help                          // 기본 명령어 확인 
sftp> get test                      // remote path의 test file 가져옴 
$ sftp -P 3333 root@192.168.1.60:test1     // sftp로 바로 get test1 


2.6 SysV 기반의 Network 설정 (Systemd 같이사용)

SysV Script 기반으로는 /etc/network/interfaces 에 Network Interface를 추가하여, service로 각각의 관리를 진행을 했다.
이 부분은 systemd 와 SysV Script를 혼합해서 사용할 경우 알아두도록 하자 

  • 일반적인 /etc/network/interface 예제 (SysV Script)
SysV Script 기반으로 구성되며, Main은 ifup/ifdown이 전체 Control 하고 각각의 Shell Script 같이 분석해야함 

$ cat /etc/network/interfaces  //systemd로만 구성할 경우 사용안함 
source-directory /etc/network/interfaces.d

# The loopback network interface
auto lo
iface lo inet loopback

## DHCPC Client 예제
auto eth0
iface eth0 inet dhcp
## Static IP 예제
auto eth1
iface eth1 inet static
	address 192.168.1.11 
	netmask 255.255.255.0
	gateway 192.168.1.1
## USB hotplug
allow-hotplug usb0
iface usb0 inet static
	address 192.168.3.7
	netmask 255.255.255.0
    
$ ls /etc/network/     //각 Shell Script 과 Interface 확인 
if-down.d  if-post-down.d  if-pre-up.d  if-up.d  interfaces  interfaces.d

$ ls /etc/network/if-up.d/  //각각의 Shell script 혹은 Symbol Link  내부에서 $IFACE로 Interface 구분 
000resolvconf  avahi-daemon  ethtool  wpasupplicant

$ service --status-all    //network 관련서비스 name 확인 (SysV Script 사용할 경우 service이용) 
...
$ sudo service networking restart //network 관련서비스 재실행 
or
$ systemctl restart networking.service

  • ifup/ifdown  (상위 설정 및 Shell Script 연결)
$ cat /lib/systemd/system/networking.service //ifup ifdown 이 /etc/network/interfaces 사용
.......
[Install]
WantedBy=multi-user.target
WantedBy=network-online.target

[Service]
Type=oneshot
EnvironmentFile=-/etc/default/networking
ExecStart=/sbin/ifup -a --read-environment
ExecStop=/sbin/ifdown -a --read-environment --exclude=lo
RemainAfterExit=true
TimeoutStartSec=5min

/etc/network/interfaces 관련 좋은예제

/sbin/ifup and ifdown 관련사항


2.7 Systemd 의 Network 설정

처음에 NTP 및 DNS / DHCP 관련부분 설정을 다른 곳에서 설정하려고 했으나 아래와 같이 한곳에서 설정하면 다 적용이 되는 부분을 찾았다.

  • systemd 로만 network 설정할 경우 
systemd의 network interface 설정은 기존과 다른게 systemd-networkd에서 담당한다

만약 systemd로만 구성할 경우 /etc/network/interface의 설정은 불필요한 것으로 보이는데,여기서 설정하지 못하는 것은 
추가로 상위와 같이 보완용 ifup/ifdown 기반으로 넣을 수도 있을 것 같다. 

systemd로만 network를 구성할 경우  /etc/systemd/network/xxx.network 로 network interface를 추가하고 설정하는 구조이다

일반 MII기반의 ethernet은 ethx.network  , USB-CDC 기반의 network는 usbx.network
이외의 network의 이름일 경우 상위와 동일하게 각 interface name으로 설정.
** 주의 우선순위가 될 것이며, /etc 가 가장 높으므로, 이 위주로 설정진행  
** 주의 wvdial의 ppp의 경우 이곳에서 설정하지 않음 
  • eth0 Interface기반 Network DHCP 설정
$ cat /etc/systemd/network/eth0.network  
[Match]
Name=eth0

[Network]
DHCP=yes
NTP=1.kr.pool.ntp.org
DNS=8.8.8.8
DefaultRouteOnDevice=yes

  • eth0 Interface기반 Network Static IP설정
$ cat /etc/systemd/network/eth0.network  
[Match]
Name=eth0

[Network]
##Static IP로 직접설정  192.168.1.67/24  24는 NetMask의 bits수 Netmask 255.255.255.0 
Address=192.168.1.67/24
Gateway=192.168.1.1
NTP=1.kr.pool.ntp.org
DNS=8.8.8.8
DefaultRouteOnDevice=yes

DefaultRouteOnDevice를 해야지 route table에 default로 등록가능

/etc/systemd/network/eth0.network  설정사항
  https://www.freedesktop.org/software/systemd/man/systemd.network.html

/etc/systemd/network/99-default.link (현재 /dev/null 로 link됨)

  • Route Table 설정확인 및 분석
$ route  
or
$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
192.168.1.1     0.0.0.0         255.255.255.255 UH        0 0          0 eth0

$ ls /etc/network/
if-down.d       if-post-down.d  if-pre-up.d


  • DNS Server 설정확인
/var/run/resolv.conf
/etc/resolve.conf


  • RTC 관련사항
/dev/rtc 기능으로  i.MX SNVS
PMIC의 별도의 Battery Generator 와 i.MX의 RTC기능이며, 배터리로 RTC가 유지가 되어진다.

세부사항은 timedatectl 설정에서 확인가능
  https://www.digi.com/resources/documentation/digidocs/90001546/reference/bsp/cc6/r_real_time_clock.htm
  https://developer.toradex.com/knowledge-base/how-to-use-the-real-time-clock-in-linux

1/04/2020

Edge computing ( Google Coral / Intel / NVIDIA)

1. Edge Computing 의 개념

Edge Computing 이라는 말을 최근에 들은 것이 Coral 사의 TPU 때문인 것 같으며, 주로 Jetson 시리즈와 비교 때문에 이것을 찾아보게 되어진 것같다.

Edge Computing의 기본컨셉을 보면 IoT에서 자주사용되어지는 것으로 보이며, 아래를 봐도 Cloud에 부담을 줄이기 위해서
복잡한 AI의 계산 및 특정 계산을 이 곳에서 처리하는 방식을 말하는 것으로 보인다.
일종의 분산처리라고 생각이되며, 현재 개발 버전으로는 Coral 것이 가장 많이 사용되어지는 것으로 보이는 것 같다.

현재 보이는 것들은 거의 Machine Learning의 복잡한 Inference 기능을 대신 수행해주기 위해서 사용되어지는 Edge TPU가 될 것 같다.


이외에도 Jetson AGX Xavier에서 사용되어지고 있는  NVDLA(NVIDIA Deep Learning Accelerator)도 존재한다.
이를 FPGA or RISC-V에 연결하여 사용하려고도 하려는 것 같으며, 이미 Sifive or FPGA기반으로 연결하여 사용하는 것 같다.


Edge Computing
  https://en.wikipedia.org/wiki/Edge_computing


2.  Google Coral 의 Edge TPU 들 과 Intel의 Edge

화자가 많이 되는 것이 Raspberry Pi 와 Coral USB Accelerator 의 조합과 Jetson Nano시리즈와 비교가 많이 되고 있으며,  성능을 봐도 괜찮아 보인다
하지만, 무조건 좋은것은 아니며, Jetson 과 비교하여 Google Coral은 모델을 많이 지원을 못해주고 있는 것이 좀 문제인 것 같지만,
이 부분은 점차적으로 개선이 되어질 거라고 생각하고 크게 생각하지 않고 본다.

더불어 최근에는 Corla Deve Board까지 출시되었는데, NXP의 i.MX 기반에 Edge TPU를 부착한 기능이다. (PCIe 연결)

Google Coral Edge TPU 시작
  https://coral.ai/docs/accelerator/get-started/#

Google Coral의 전체 제품군
  https://coral.ai/products/


  • USB Accelerator ( USB Edge TPU)
USB 3.0으로 USB Type-C로 지원을 해주는 Edge TPU이며 현재  Raspberry Pi와 많이 연결하여 사용하고 있다.



  https://coral.ai/products/accelerator/
  https://coral.ai/docs/accelerator/datasheet/



  • i.MX 8M 기반으로 Edge TPU Dev Board 
i.MX 8M 과 Edge TPU는 PCIe 와 I2C/GPIO로 연결되어있다고 하며, 이 보드와 Jetson TX2와도 성능이 궁금하다
왜냐하면 i.MX8M의 경우 별도의 GPU도 존재하는데, 이부분과 같이 동작할지 의문이다. 



  https://coral.ai/products/dev-board/
  https://coral.ai/docs/dev-board/datasheet/

최근을 보면 거의 SOM(System On Module) 잘 제공해주고 있어서 HW적으로 편하게 작업이 가능할 것이다.  Jetson Nano 역시 SOM을 지원을 해주고 있다


  • Intel 사의 NCS2 (Neural compute Stick 2) 
Intel 사의 Edge Device 로 Intel의 OpenVINO도 지원가능하며 주로 개발로 Raspberry Pi에 연결하여 사용하는 것으로 보인다.

  https://software.intel.com/en-us/neural-compute-stick
  https://software.intel.com/en-us/articles/intel-movidius-neural-compute-stick
  https://www.youtube.com/watch?v=sRYs0dZLXkw&feature=youtu.be


2.1  Jetson Nano 와 Coral Edge TPU Dev Board 의 비교 


  • Jetson Nano 와 Croal Edge TPU Dev Board  비교 
우선 가격적으로 보면 Jetson Nano가 싸지만, Coral Dev Board는 eMMC 이지만, Jetson Nano는 SD Card 만 지원한다.
Jetson Nano의 경우 WIFI 와 Bluetooth를 지원하지 못한다.



  • Jetson Nano / Raspberry Pi3 / Raspberry Pi3+Intel NCS2 / Edge TPU Dev Board

상위 보드들을 성능을 비교하기 위해 각각의 모델 마다 성능을 알수 있는지표이다.
아쉬운게 있다면, 이곳에 Coral USB와 조합도 있었으며, 딱 좋을 것 같은데 없으며, 대체적으로 보면 Intel의 NCS2 or Edge TPU의 경우 미지원되는 Model Network 이 많이 존재한다.

아래의 Model를 보면 영상처리 기반에서 많이 사용되는 Model로 비교하므로 이를 염두해두 보도록하자.
SSD Mobilenet-v2의 경우 Kernel Size가 300x300 을 보면 상대적으로 TPU Dev Board가 높지만,
이상하게 Inception v4의 경우는 상대적으로 낮은 수치를 보이는데, Tensorflow가 아니라서 그런지 아래의 데이터를 가지고는 정확한 성능비교는 불가능해 보인다.


https://devblogs.nvidia.com/jetson-nano-ai-computing/






자료출처
  https://towardsdatascience.com/google-coral-edge-tpu-board-vs-nvidia-jetson-nano-dev-board-hardware-comparison-31660a8bda88




  • 각 보드 성능비교 사이트 
대체적으로 보면 각각의 모델마다 다른 성능을 보여주고 있는데, 이 부분은 정확도와 같이 봐야 성능비교가 될 것 같다.
왜냐하면, NVIDIA만 보더라도, Precision을 변경하여, 정확도는 좀 떨어지지만, 성능이 개선이되는 것을 보면 각각의 Model기준으로는 정확한 비교를 위해서는 정확도가 있어야 비교가 될 것 같다.




  https://github.com/jolibrain/dd_performances




  • NVIDIA Jetson Nano/TX2/AGX Xavier 비교 
NVIDIA의 TensorRT 에서 GoogleNet의  FP16 과 INT8 Mode의 성능비교이며, 역시 Xavier는 INT8의 성능이 대단하다




세부사항은 각 Model마다 각 Batch size와 Precision에 따라 비교하므로 아래참조
  https://www.phoronix.com/scan.php?page=article&item=nvidia-jetson-nano&num=3



  • MobileNetV2 기준비교 
내가 재미있게 본 것은 아래의 블로그이며, MobileNetV2 기준으로 성능 측정을 했으며 각각의 개별성능을 보여주고 Jetson Nano와 TPU와 조합 재미있다.

자료출처
  https://blog.raccoons.be/coral-tpu-jetson-nano-performance


주의해야할 것은 Jetson 과 비교를 해봐도 모든 모델이 지원이 되지 않지만 점점 늘어가는 추세이다.


  • Edge TPU Benchmark 
현재지원가능한 Network(Model) 들과 성능을 알수 있으며, Tensorflow lite 부분도 최근에 관심이 있는데, 이 부분 지원역시 재미있다.

  https://coral.ai/docs/edgetpu/benchmarks/

개인적으로 Jetson Nano를 구입할 생각을 했으나, 지금 좀 더 지켜보고 각각의 기능을 좀 더 지켜보기로 했다.



3. Jetson AGX Xavier의 NVDLA(Deep Learning Accelerator)

상위 설명한 Edge 기능이 Jetson NVDLA 역시 동일한 것 같으며, 이를 어떻게 다른 CPU에 연결하는지가 궁금하다.
NVDLA 인 경우 ARM 이외에도 RISC-V와 연결되어 사용되어 질 것 같은데, 어떻게 될지  사용이 될지가 궁금하다.

참고로 제목에도 설명했듯이 DLA는 현재 Jetson AGX Xavier에서 제공되어지고 있으며, 마지막으로 Jetson Xavier에서 DLA 기능을 Deep Learning 사용시 연결해서 사용한다고 했지만,
내 기억으로는 그 때  초반이라 그런지 DLA의 성능을 전부 사용하지 못한 것 같다.

요즘 관심사가 Open Core인 RISC-V도 관심이 많으며, 관련부분도 계속 보려고 한다.

NVDLA의 구성의 경우 상위 Coral사의 차이를 보면 Interface가 차이가 날 것이며,

3.1 NVDLA 구성과 Interface 

Interface는 아래와 같이 3가지로 기본으로 구성이 되며  기본적으로 생각하면, 구성은 간단하다. 
CPU에서 Control해서 이를  Interrupt로 확인을 받고 Data는 공유메모리 방식으로 가지는 것이다. 

  • CSB (Configuration Space Bus) Interface
32bit 동기적인 BUS로 low bandwith를 가진 BUS라고 한다.
CPU가 NVLDA를 Configuration 즉, Control을 할 때 사용되어지는 Bus 인 것이며, 연결은 CPU or FPGA 와  Memory Mapped IO 방식으로 연결될 것 같다.


  • IRQ (Interrupt ) Interface
1 bit Level Trigger 방식의 Interrupt라고 하는데, 사용을 유추하면, CPU에서 Control 하면,  ACK로써 Complete or Error 체크로 보면 될 것 같다.
CPU에서는 이를 기반으로 ISR로 다시 CSB의 Register를 읽어 확인을 하면 될 것 이다.



  • DBB ( Data BackBone) Interface
동기적인인 High Bandwith Memory Bus 로 유사한것이 AMBA의 AXI라고 하는데, 목적은 Shared Memory 인 것 같다.
TI를 예를 들면, Davinci or OMAP에서  ARM 과 DSP 사의 Shared Memory Interface를 통한 빠른 Data 통신이 될 것이다.


세부구성 사항은 아래의 출처에서 보면 될 것 같다.



3.2  NVDLA와 CPU 연결방법 


  • Small NVDLA 와 Large NVLDA 차이 
성능향상을 위해 확장 SRAMIF도 존재하는데, 이를 사용여부가 될 것 이며, 그리고, 중간에 NVDLA를 Control을 하기위해서 Micom 사용여부가 될 것이다. 
Small or Large를 Headless 와 Headded라고 부르는 것 같으며, 둘다 Edge로써 IoT로 ARM이면, Cortex-M에 적합할 것이며,  RISC-V는 PicoRV32가 적합하다고 한다.
핵심기술은 공유메모리를 위한 MMU에 연결하는 것이 될 것이다.


Linux SW 입장에서 보면 UserMode 와 Kernel Mode로 구분이 되고 구현이된다.
세부사항은 아래의 링크에서 확인가능하다.



NVDLA 관련내용
  http://nvdla.org/
  http://nvdla.org/primer.html
  https://devblogs.nvidia.com/nvdla/


3.3 RISC-V or FPGA 와 NVDLA 연결 
OpenCore의 Sifve의 RISC-V와 NVDLA의 기능형태


SiFive의 Risc-V 와 NVLDA 관련내용
  https://content.riscv.org/wp-content/uploads/2018/12/Nvidias-Deep-Learning-Accelerator-Meets-SiFives-Freedom-Platform-Frans-Sijstermans-and-Yunsup-Lee.pdf

FPGA 와 NVDLA 연결내용
  http://nvdla.org/_images/nvdla-vp-fpga.svg
  http://nvdla.org/vp_fpga.html


관련내용
  https://github.com/nvdla/hw
  https://github.com/nvdla/sw
  https://github.com/sifive/block-nvdla-sifive