ubuntu 18.04
1 ntp server
NTP : 네트웍크 타임 프로토콜.
네트워크에 있는 모든 시스템 시간 및 클럭을 동기화 하는데 사용하는 프로토콜이다.
설치
$ sudo apt-get install ntp
버전 확인
$ sntp --version
추가
sudo vi /etc/ntp.conf
server time.google.com iburst
restrict time.google.com mask 255.255.255.255 nomodify notrap nopeer noquery
server 1.kr.pool.ntp.org iburst
restrict 1.kr.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery
server 1.asia.pool.ntp.org iburst
restrict 1.asia.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery
server 2.asia.pool.ntp.org iburst
restrict 2.asia.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery
server 3.asia.pool.ntp.org iburst
restrict 3.asia.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery
서비스 재시작
sudo service ntp restart
서비스 상태 확인
sudo service ntp status
방화벽 설정.
sudo ufw allow from any to any port 123 proto udp
2 ntp client
sudo apt-get install ntpdate
ntp host 기반 추가.
sudo vi /etc/hosts
172.16.1.1 ntpdate NTP-server-host
업데이트
sudo ntpdate NTP-server-host
클라이언트 시스템 시간 공기화 비활성화.
sudo timedatectl set-ntp off
ntp 클라이언트 설치
sudo apt-get install ntp
vi /etc/ntp.conf
server NTP-server-host prefer iburst
sudo service ntp restart
시간 동기화 큐 보기
ntpq -p
재미는건
서버와 클라이언트를 한 시스템에 설정 하면 내부 네트워크 주소를 두 개 생성한다.
그리고 주소 두 개를 전부 사용할 수 있다.
즉 이말은 한 시스템에 dhcp 아이피를 여러개 받을 수 있다는 이야기가 된다.
ntp 서버 주소 하나에 dhcp ip를 임대 받아 서비스를 할 수 있다는 이야기가 된다.
나중 테스트 해 본다.
cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
127.0.1.1 gfairline.fairline.lan gfairline
172.16.1.1 NTP-server-host ---> 호스트 이름 생성 후 업데이트
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
설정 내용 서버 -> /etc/ntf.conf
server NTP-server-host prefer iburst ---> 호스트 기반 설정.
server time.google.com iburst
restrict time.google.com mask 255.255.255.255 nomodify notrap nopeer noquery
server 1.kr.pool.ntp.org iburst
restrict 1.kr.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery
server 1.asia.pool.ntp.org iburst
restrict 1.asia.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery
server 2.asia.pool.ntp.org iburst
restrict 2.asia.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery
server 3.asia.pool.ntp.org iburst
restrict 3.asia.pool.ntp.org mask 255.255.255.255 nomodify notrap nopeer noquery
2019/12/09
NFS 설정 및 속도 튜닝.
NFS
1.1 개요
NFS는 Sun Microsystems를 제외하고 분산파일 시스템 프로토콜이다.
- 동기화(Synchronous): 데이터 안정성 +, 성능 -
- 비동기화(Asynchronous): 데이터 안정성 -, 성능 +
- NFS Client mount 시 -o rw,async 비동기화 사용
1.1.1 데몬 설정
기본 데몬은 8개 설정.
cd /etc
vi ./init.d/nfs-kernel-server
28:RPCNFSDCOUNT=8
103: --exec $PREFIX/sbin/rpc.nfsd -- $RPCNFSDCOUNT
cd /etc
vi ./default/nfs-kernel-server
2:RPCNFSDCOUNT=8
1.2. nfs 설치.
apt-get install nfs-kernel-server
1.1.2 블록 크기 설정
- NFS Client mount시 RPC 최대 읽기버퍼(rsize), 최대 쓰기버퍼(wsize) 설정 가능
- Default 설정은 NFS Version 과 Kernel Version에 의해 정해짐
-- Linux Kernel 4.6 기준, fs/nfsd/nfsd.h에 define
-- NFSSVC_MAXBLKSIZE (1*1024*1024u) = 1048576 = 1M
- RPC 통신시 Packet Payload 크기
- rsize, wsize를 줄리면 요청이 늘어남
-- - 1MB 데이터를 전송 할 경우
--- 32KB Block Size: 32 번의 요청
--- 64KB Block Size: 16 번의 요청
1.1.3 Timeout, Re-transmission
- timeo: 클라이언트가 패킷을 재 전송해야 한다는 결론데 도달하기 전까지 클라이언트가 대기애햐 하는 시간
- retrans: timeo 만큼 기다린 후 재시도 횟수
-- retrans 값이 3(count)라면 "서버를 사용할 수 없다"라는 결론을 내기 위해 timeo 만큼 기다리고 재시도 3회 반복
-- 3번 반복 후에도 응답이 없으면 에러 메세지 발생하고 retrans 값 재설정(3) 계속 시도
-- rsize, wsize, MTU 조정 등은 서버로 부터 응답이 지연되거나 서버로부터 응답이 없는 경우 클라이언트가 서버에 시도하는 재시도 횟수에 영향을 줌.
- timeo은 1/10 second 단위로 설정
-- time0 값이 5(초) 라면 5/10 초를 기다린 다는 의미
- 클라이언트가 서버로부터 응답이 지연되면(retrans가 너무 자주 발생하는 경우) timeo 값을 늘릴 수 있음
-- timeo 값을 늘리면 성능이 약간 향상 됨을 볼 수 있음
모니터링
nfsstat -r
Server rpc stats:
calls badcalls badfmt badauth badclnt
212 14 2 12 0
1.1.4 FS-Cache
- kernel source/documentation/filesystems/caching/fscache.txt
- -o fsc 옵션 사용하여 NFS Client Mount
- Network 를 통해 받은 데이터를 로컬 디스크에 저장 하여 활용
- Read시 장정이 있을 수 있음
-- 로컬 디스크에 저장된 데이터를 읽기 때문에 네트워크 트래픽 감속
-- 무조건 Read 성능이 향상 된다고 볼 수는 없음.
1.1.5 Filesystem mount options
- noatime: Inode access times are not updated on the filesystem
-- Application에서 Access time이 필요 없을때 사용.
- nodiratime: The directory inode is not updated on the filesystem when it is accessed.
- relatime: Inode access times are relative to the modify or change time for the file, so the access time is updated only if the previous atime was earier than the modify or change time.
noacl: ACL(Access Control List) 비활성
-- 전동적인 nFS는 Write-through 캐시를 가짐
-- 두개 이상의 client가 같은 파일에 대해 Write 요청시 어떤 데이터가 남아 있는지 알 수 없음.
-- close-to-open cache coherence semantics는 이를 해결
-- 두 개 이상의 client가 같은 파일에 대해 수정하는 것을 방지
-- Open 요청 시 해당 파일 다른 Client가 Open 하지 않았는지 먼저 쿼리
-- nocto를 사용하는 경우는 Read Only 시 사용.
- lookupcache
-- kernel 2.6.28 이후 지원
-- mount point 대상으로 dentry cache를 관리 방법 명시
-- Linux NFS Client는 NFS LOOKUP request에 대한 cache 유지.
-- lookupcache=all 혹은 따로 지정 되지 않으면
-- lookupcache=pos or positive
-- lookupcache=none
--- 바로 바로 파일 변경 상태 확인 가능
--- Server 성능에 영향을 줌.
- NFS Module Parameters
- prcmode Module Parameters
1.2.1 디렉토리 생성
1.2.1.1 모든 권한 부여
sudo mkdir -p /mnt/sharedfolder
sudo chown nobody:nogroup /mnt/sharedfolder
sudo chmod 777 /mnt/sharedfolder
1.3 공유 디렉토리 설정
1.3.1 예제
단일 클라이언트 설정.
/mnt/sharedfolder clientIP(rw,sync,no_subtree_check)
여러 클라이언트 설정.
/mnt/sharedfolder client1IP(rw,sync,no_subtree_check)
/mnt/sharedfolder client2IP(rw,sync,no_subtree_check)
클라이언트 세브넷 설정.
/mnt/sharedfolder subnetIP/24(rw,sync,no_subtree_check)
1.3.2 실 적용.
vi /etc/exports
접근할 윈도우 IP 주소 설정
/home/linuxlee/Shinobi/videos 172.16.1.17(rw,sync,no_subtree_check)
네트워크 대역 접근 주소 설정
/home/linuxlee/Shinobi/videos 172.16.1.0/255.255.255.0(rw,sync,no_subtree_check)
2. 디렉토리 공유 정보 활성화.
sudo exportfs -a
3. 데몬 구동
방법1.
sudo service nfs-kernel-server restart
방법2.
sudo systemctl restart nfs-kernel-server
4. 방화벽 설정
sudo ufw allow from [clientIP or clientSubnetIP] to any port nfs
udo ufw allow from 192.168.100/24 to any port nfs
4.1 방화벽 상택 확인
sudo ufw status
nfs 상태 확인.
exportfs -u
2. 윈도우 설정.
PC: Windows 10 에서의 설정
2.1 NFS 클라이언트 설정
제어판 -> 프로그램 -> Windows 기능 켜기/끄기
NFS 서비스
- NFS 용 서비스(활성화)
-- NFS용 클라이언트(활성화)
-- 관리도구(활성화)
2.2 네트워크 드라이버 연결
내 pc 오른쪽 마우스 클릭 -> 네트워크 드라이브 연결
드라이브: 설정
폴더위치: \\172.16.1.167\home\linuxlee\Shinobi\videos
CLI 확인
cmd 도스 창 열기
mount
3. NFS 성능 튜닝
- system memory
- input, output Socket Queue
-- 대용량 파일 전송 시 서버에서 많은 메모리 필요
-- 네트워크 전송에 Linux는 기본적으로 파일 전송용으로 많은 메모리 할당 하지 않음
--- 여러 Application이 구동되는 환경이기 때문
-- 네트워크를 통한 대용량 입/출력이 있다면 높은 메모리 할당 가능
- Socket Queue
-- 서버에 16개의 프로세스, 각 프로세스에서 클라이언트 용총 대기 가정
-- 각 프로세스틑 동일한 소켓 입/출력 Queue 사용
--- 다른 application도 같은 Queue 사용
--- 따라서 Socket Queue가 크면 모든 프로세스에서 효율적으로 처리 가능
-- 조정 가능 한 값
--- Socket Input Queue: 요청을 처리해야 하는 대기열
--- socket Output Queue: 요청을 하는 대기열
3.1 방법.
// input queue: nfs 재시작 필요
# echo 219136 > /proc/sys/net/core/rmem_default
# echo 219136 > /proc/sys/net/core/rmem_max
// output queue: nfs 재시작 필요
# echo 219136 > /proc/sys/net/core/wmem_default
# echo 219136 > /proc/sys/net/core/wmem_max
// reboot 후에도 적용하려면
#echo 'net.core.wmem_max=219136' >> /etc/sysctl.conf
#echo 'net.core.rmem_max=219136' >> /etc/sysctl.conf
3.2 MTU 조정
MTU 확인.
netstat -i
- NFS 설정인 Block size(rsize, wsize) 만큼 MTU 설정 되어야 함
- rsize, wsize가 8K, MTU가 1500 B인 경우 fragmente 발생
- rsize, wsize가 8K, MTU가 1500 B인 경우 fragmente 발생
- Server, Client 모두 변경 되어야 함
3.3 확인.
cat /proc/mounts
192.168.0.103:/data /mnt nfs rw,vers=3,rsize=32768,wsize=32768,hard,proto=tcp,timeo=600,retrans=2,sec=sys,addr=192.168.0.103 0 0
rsize=32768및 wsize=32768 RPC 패킷이 소요되는 데이터 조각의 크기를 지정,조정하면 성능 향상 또는 정하 ㅚㄷㄹ 수 있다.
rsize, wsize 네트워크 용량뿐 아니라 클라이언트와 서버의 처리 성능 능력을 유지하여 수행해야 한다.
마운트시 rsize 크기를 줄이면 wsize 전송해야하는 데이터의 양과 관계없이 동일하게 된다.
rpc 패킷의 크기를 줄이면 동일한 양의 데이터를 전달하기 위해, 전송해야 할 총 네트워크 IP 패킷 수가 증가한다.
예를 들어, 전송할 데이터가 1MB인 경우, 이를 동일한 청크 32KB로 나누면 32개의 청크를 보내야 한다(32 * 32 = 1024),
동일한 1MB의 데이터를 64KB 보낸다면 16청크를 보내야 함(64 * 64 = 1024),
네트워크를 통해 전송 된 모든 패킷은 TCP/IP 동작으로 인해 약간의 오버 헤드가 발생하므로 32*32KB 패킷보다 16*64KB 패킷을 전송하는 것이 더 효율적이다.
따라서 이 매개 변수 수정에 대한 결정은 항상 네트워크 기능에 딸라 달라진다.
NFS 서버 및 클라이언트에 1 기가비트 포트가 있고 이 서버를 연결하는 네트워크 스위치가 해당 포트에서 1 기가 비트도 가능하면
이 매개 변소를 더 높은 값으로 저정하는 것이 좋다.
rsize, wsize 값 조정
mount 192.168.0.104:/data /mnt -o rsize=65536,wsize=65536
또는
mount 192.168.0.104:/data /mnt -o rsize=524288,wsize=524288
4096
8192
16384
35768
65536
524288
매개 변수 값을 테스트 해 최상의 값을 /etc/fstab 지정해 사용할 수 있다.
3.3.1 MTU 값
NIC의 MTU 값은 rsize 및 wsize 값이 8kb 이고 1500 바이트 mtu 크기를 사용하는 경우 최대 크기가 1500 바이트이므로 전송하는 동안 데이터가 조각화된다고 가정해야 한다.
mtu 크기가 9000 바이트로 수정하면 조각화없이 전체 8kb를 한 프레임으로 전송할 수 있다.
그러나 이렇게하면 서버와 클라이언트 사이의 모든 장치를 9000 mtu로 구성해야 한다.
여기에는 네트워크 스위치, 방화벽도 포함된다.
이렇게 하지 않으면 잘린 패킷과 장치 간 통신 손실이 발생할 수 있다.
카메라 mtu 값 변경.
보안장비 mtu 값 변경.
넷기어 스위치 mtu 값 변경.
시스코 장비 mtu 값 변경.
참고: mtu 크기를 변경하면 핸재 실행중인 응용 프로그램에 영향을 줄 수 있음.
일부 ISP는 지정된 MTU 크기보다 큰 프레임을 허용하지 않음.
보안장비 외부망은 DHCP 자동으로 활당 시키고,
뒤 로컬망 MTU 변경.
3.3.2 timeo및 retransNFS의 옵션
위에 설명 되어 지만 조금더 깊게 들어가 본다.
위 두 옵션은 서버가 응답이 지연되거나 서버에서 응답이 없는 경우 클라이언트가 서버로 재 시도하는 횟수에 영향을 준다.
timeoNFS의 옵션은 클라이언트가 패킷을 재전송해야한다는 결론을 내리기 전에 대기해야하는 시간을 결정
기본값은 0.7입니다 (초당 10 분의 1로 계산된다.
따라서 5 timeo 값을 지정하면 클라이언트가 5/10 초 동안 기다렸다가 패킷을 다시 보내야한다고 결정하게 된다.
두 번째 옵션 인 retrans는 클라이언트가 제한 시간을 초과 한 경우 (제공 한 timeo 초를 기다린 후) 클라이언트가 시도한 총 시도 횟수를 결정한다.
재전송 값을 3으로 지정하면 클라이언트는 서버를 사용할 수 없다는 결론을 내리기 전에 RPC 패킷을 3 번 (그리고 시간 초 동안 대기 할 때마다) 재전송한다.
mount 명령의 옵션으로 timeo 및 retrans 값을 수정가능
mount 192.168.0.102:/data /mnt -o timeo=5,retrans=4
3.3.3 마운트 동기 및 비동기
클라이언트 요청시 버서에서 데이터를 쓰는 방법을 결정한다.
둘 다 장점과 단점이 있다.
NFS 마운트의 동기화 및 비동화가 무엇인지 이해를 해야 한다.
nFS 크라이언트에서 수행하는 작업은 RPC 동등한 적업으로 변환된다.
RPC 프로토콜을 사용하여 서버로 보낼 수 있다.
서버가 쓰기에 대한 RPC 작업을 reieves NFS에 비동기 옵션을 사용하는 경우,
첫음 진입은 VFS(가상 파일 시스템) 작업에서 기본 디스크 시스템에 데이터를 기록한다.
VFS 핸들러가 기본 디스크에 대한 쓰기 작업을 마친과 동시에 쓰기 작업이 완료되었다는 확인을 받기 전에 서버는 추가 RPC쓰기 작업을 수락 할 준비가 된다.
이 경우 NFS 서버는 쓰기 작업을 완료하는 데 필요한 시간을 줄여 쓰기 성능을 향상시킨다.
그러나 기본 디스크 시스템이 작업을 완료하기 전에 NFS 서버가 더 많은 쓰기 작업을 수락하기 때문에 이 방법으로 데이터가 손실되거나 손상 될 수 있다.
동기화 옵션을 사용하면 그 반대가 된다.
이 경우는 서버는 쓰기 작업이 성공적으로 완료된 후에만 응답한다(데이터에 완전히 기록된 후_
중요한 데이터를 다르는 경우 비동기 옵션을 사용하지 않는 것이 좋지만 데이터가 그렇게 중요하지 않은 경우 async를 선택하는 것이 좋다.
mount 192.168.0.101:/data /mnt -o rw,async
4. 최종적 시스템 선택
4.1 NFS 서버 설정
vi /etc/exports
/home/linuxlee/Shinobi/videos 172.16.1.0/255.255.255.0(rw,async,no_subtree_check)
4.2 커널 파라메터 설정.
echo 524288 > /proc/sys/net/core/wmem_default
echo 524288 > /proc/sys/net/core/wmem_max
// reboot 후에도 적용하려면
echo 'net.core.wmem_max=524288' >> /etc/sysctl.conf
echo 'net.core.rmem_max=524288' >> /etc/sysctl.conf
4.3 MTU 조정
이더넷 MTU는 1500 바이트이므로 이더넷 프레임에 포함 할 수있는 가장 큰 IP 패킷 (또는 다른 페이로드)은 1500 바이트이다.
이더넷 헤더에 26 바이트를 추가하면 최대 프레임 (MTU와 동일하지 않음)이 1526 바이트가 됨.
넷기어 장비는 이더넷 헤더를 기본으로 잡는다. 그래서 1526으로 되어있음.
"MTU"라는 용어는 계층 3에서 패킷의 최대 크기만을 정의하기위한 것마은 아니다.
계층 2 MTU를 참조한다.
IP 패킷 (계층 3)의 길이는 IP 헤더에서 16 비트 총 길이 필드의 최대 값으로 제한된다.
IPv4의 경우 최대 페이로드 크기는 65515이다.(= 2^16 - 1 - 20 bytes header).
결국 dhclinet로 적용되는 외부 아이피는, 그 값을 dhcpd에서 주기 때문에. 수동으로 설정해줘야 한다.
처음 정보를 변경할 때는 수동으로 명령을 입력해줘야 한다.
dhcp 상위망 연동 때문에.
ip link show eth0
ip link set eth0 mtu 9000
ip link show eth0
만약 보안장비에서 dhcpd 설정시
템블릿 파일을 수정해 값을 변경할 수가 있다.
subnet.mas 파일 수정
option interface-mtu 9000; 추가.
subnet 192.168.0.0 netmask 255.255.255.0 {
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
option interface-mtu 9000; ---> 이 값으로 변경.
}
5. 리눅스 마운트 방법.
5.1 클라이언트 설치.
sudo apt-get install nfs-common
4.2 마운트 디렉토리 생성.
sudo mkdir -p /mnt/sharedfolder_client
5.3 마운트
sudo mount serverIP:/exportFolder_server /mnt/mountfolder_client
sudo mount 192.168.100.5:/mnt/sharedfolder /mnt/sharedfolder_client
sudo mount.nfs4 서버주소.com:/서버/마운트/위치 /클라이언트/마운트/위치
sudo mount.nfs4 ranko.local:/mnt/NAS-HGST-1TB /mnt/NFS/ranko@NAS-HGST-1TB/
속도 테스트
dd if=/dev/zero of=/mnt/NFS/ranko@NAS-HGST-1TB/TMP/output bs=1M count=1000
6. 윈도우즈 MTU 설정
윈도우 7 MTU 값에 변경시 네트워크 데이터 문제 발생.
변경시 많은 예외 처리가 있어야 함.
cmd
기존 설정 확인.
netsh interface ipv4 show interfaces
10 25 1500 disconnected 로컬 영역 연결* 2
수정
10 ID 값이 디바이스 선택.
netsh interface ipv4 set subinterface "10" mtu=9000 store=persistent
적용 설정 확인
netsh interface ipv4 show interfaces
1.1 개요
NFS는 Sun Microsystems를 제외하고 분산파일 시스템 프로토콜이다.
- 동기화(Synchronous): 데이터 안정성 +, 성능 -
- 비동기화(Asynchronous): 데이터 안정성 -, 성능 +
- NFS Client mount 시 -o rw,async 비동기화 사용
1.1.1 데몬 설정
기본 데몬은 8개 설정.
cd /etc
vi ./init.d/nfs-kernel-server
28:RPCNFSDCOUNT=8
103: --exec $PREFIX/sbin/rpc.nfsd -- $RPCNFSDCOUNT
cd /etc
vi ./default/nfs-kernel-server
2:RPCNFSDCOUNT=8
1.2. nfs 설치.
apt-get install nfs-kernel-server
1.1.2 블록 크기 설정
- NFS Client mount시 RPC 최대 읽기버퍼(rsize), 최대 쓰기버퍼(wsize) 설정 가능
- Default 설정은 NFS Version 과 Kernel Version에 의해 정해짐
-- Linux Kernel 4.6 기준, fs/nfsd/nfsd.h에 define
-- NFSSVC_MAXBLKSIZE (1*1024*1024u) = 1048576 = 1M
- RPC 통신시 Packet Payload 크기
- rsize, wsize를 줄리면 요청이 늘어남
-- - 1MB 데이터를 전송 할 경우
--- 32KB Block Size: 32 번의 요청
--- 64KB Block Size: 16 번의 요청
1.1.3 Timeout, Re-transmission
- timeo: 클라이언트가 패킷을 재 전송해야 한다는 결론데 도달하기 전까지 클라이언트가 대기애햐 하는 시간
- retrans: timeo 만큼 기다린 후 재시도 횟수
-- retrans 값이 3(count)라면 "서버를 사용할 수 없다"라는 결론을 내기 위해 timeo 만큼 기다리고 재시도 3회 반복
-- 3번 반복 후에도 응답이 없으면 에러 메세지 발생하고 retrans 값 재설정(3) 계속 시도
-- rsize, wsize, MTU 조정 등은 서버로 부터 응답이 지연되거나 서버로부터 응답이 없는 경우 클라이언트가 서버에 시도하는 재시도 횟수에 영향을 줌.
- timeo은 1/10 second 단위로 설정
-- time0 값이 5(초) 라면 5/10 초를 기다린 다는 의미
- 클라이언트가 서버로부터 응답이 지연되면(retrans가 너무 자주 발생하는 경우) timeo 값을 늘릴 수 있음
-- timeo 값을 늘리면 성능이 약간 향상 됨을 볼 수 있음
모니터링
nfsstat -r
Server rpc stats:
calls badcalls badfmt badauth badclnt
212 14 2 12 0
1.1.4 FS-Cache
- kernel source/documentation/filesystems/caching/fscache.txt
- -o fsc 옵션 사용하여 NFS Client Mount
- Network 를 통해 받은 데이터를 로컬 디스크에 저장 하여 활용
- Read시 장정이 있을 수 있음
-- 로컬 디스크에 저장된 데이터를 읽기 때문에 네트워크 트래픽 감속
-- 무조건 Read 성능이 향상 된다고 볼 수는 없음.
1.1.5 Filesystem mount options
- noatime: Inode access times are not updated on the filesystem
-- Application에서 Access time이 필요 없을때 사용.
- nodiratime: The directory inode is not updated on the filesystem when it is accessed.
- relatime: Inode access times are relative to the modify or change time for the file, so the access time is updated only if the previous atime was earier than the modify or change time.
noacl: ACL(Access Control List) 비활성
-- 전동적인 nFS는 Write-through 캐시를 가짐
-- 두개 이상의 client가 같은 파일에 대해 Write 요청시 어떤 데이터가 남아 있는지 알 수 없음.
-- close-to-open cache coherence semantics는 이를 해결
-- 두 개 이상의 client가 같은 파일에 대해 수정하는 것을 방지
-- Open 요청 시 해당 파일 다른 Client가 Open 하지 않았는지 먼저 쿼리
-- nocto를 사용하는 경우는 Read Only 시 사용.
- lookupcache
-- kernel 2.6.28 이후 지원
-- mount point 대상으로 dentry cache를 관리 방법 명시
-- Linux NFS Client는 NFS LOOKUP request에 대한 cache 유지.
-- lookupcache=all 혹은 따로 지정 되지 않으면
-- lookupcache=pos or positive
-- lookupcache=none
--- 바로 바로 파일 변경 상태 확인 가능
--- Server 성능에 영향을 줌.
- NFS Module Parameters
- prcmode Module Parameters
1.2.1 디렉토리 생성
1.2.1.1 모든 권한 부여
sudo mkdir -p /mnt/sharedfolder
sudo chown nobody:nogroup /mnt/sharedfolder
sudo chmod 777 /mnt/sharedfolder
1.3 공유 디렉토리 설정
1.3.1 예제
단일 클라이언트 설정.
/mnt/sharedfolder clientIP(rw,sync,no_subtree_check)
여러 클라이언트 설정.
/mnt/sharedfolder client1IP(rw,sync,no_subtree_check)
/mnt/sharedfolder client2IP(rw,sync,no_subtree_check)
클라이언트 세브넷 설정.
/mnt/sharedfolder subnetIP/24(rw,sync,no_subtree_check)
1.3.2 실 적용.
vi /etc/exports
접근할 윈도우 IP 주소 설정
/home/linuxlee/Shinobi/videos 172.16.1.17(rw,sync,no_subtree_check)
네트워크 대역 접근 주소 설정
/home/linuxlee/Shinobi/videos 172.16.1.0/255.255.255.0(rw,sync,no_subtree_check)
2. 디렉토리 공유 정보 활성화.
sudo exportfs -a
3. 데몬 구동
방법1.
sudo service nfs-kernel-server restart
방법2.
sudo systemctl restart nfs-kernel-server
4. 방화벽 설정
sudo ufw allow from [clientIP or clientSubnetIP] to any port nfs
udo ufw allow from 192.168.100/24 to any port nfs
4.1 방화벽 상택 확인
sudo ufw status
nfs 상태 확인.
exportfs -u
2. 윈도우 설정.
PC: Windows 10 에서의 설정
2.1 NFS 클라이언트 설정
제어판 -> 프로그램 -> Windows 기능 켜기/끄기
NFS 서비스
- NFS 용 서비스(활성화)
-- NFS용 클라이언트(활성화)
-- 관리도구(활성화)
2.2 네트워크 드라이버 연결
내 pc 오른쪽 마우스 클릭 -> 네트워크 드라이브 연결
드라이브: 설정
폴더위치: \\172.16.1.167\home\linuxlee\Shinobi\videos
CLI 확인
cmd 도스 창 열기
mount
3. NFS 성능 튜닝
- system memory
- input, output Socket Queue
-- 대용량 파일 전송 시 서버에서 많은 메모리 필요
-- 네트워크 전송에 Linux는 기본적으로 파일 전송용으로 많은 메모리 할당 하지 않음
--- 여러 Application이 구동되는 환경이기 때문
-- 네트워크를 통한 대용량 입/출력이 있다면 높은 메모리 할당 가능
- Socket Queue
-- 서버에 16개의 프로세스, 각 프로세스에서 클라이언트 용총 대기 가정
-- 각 프로세스틑 동일한 소켓 입/출력 Queue 사용
--- 다른 application도 같은 Queue 사용
--- 따라서 Socket Queue가 크면 모든 프로세스에서 효율적으로 처리 가능
-- 조정 가능 한 값
--- Socket Input Queue: 요청을 처리해야 하는 대기열
--- socket Output Queue: 요청을 하는 대기열
3.1 방법.
// input queue: nfs 재시작 필요
# echo 219136 > /proc/sys/net/core/rmem_default
# echo 219136 > /proc/sys/net/core/rmem_max
// output queue: nfs 재시작 필요
# echo 219136 > /proc/sys/net/core/wmem_default
# echo 219136 > /proc/sys/net/core/wmem_max
// reboot 후에도 적용하려면
#echo 'net.core.wmem_max=219136' >> /etc/sysctl.conf
#echo 'net.core.rmem_max=219136' >> /etc/sysctl.conf
3.2 MTU 조정
MTU 확인.
netstat -i
- NFS 설정인 Block size(rsize, wsize) 만큼 MTU 설정 되어야 함
- rsize, wsize가 8K, MTU가 1500 B인 경우 fragmente 발생
- rsize, wsize가 8K, MTU가 1500 B인 경우 fragmente 발생
- Server, Client 모두 변경 되어야 함
3.3 확인.
cat /proc/mounts
192.168.0.103:/data /mnt nfs rw,vers=3,rsize=32768,wsize=32768,hard,proto=tcp,timeo=600,retrans=2,sec=sys,addr=192.168.0.103 0 0
rsize=32768및 wsize=32768 RPC 패킷이 소요되는 데이터 조각의 크기를 지정,조정하면 성능 향상 또는 정하 ㅚㄷㄹ 수 있다.
rsize, wsize 네트워크 용량뿐 아니라 클라이언트와 서버의 처리 성능 능력을 유지하여 수행해야 한다.
마운트시 rsize 크기를 줄이면 wsize 전송해야하는 데이터의 양과 관계없이 동일하게 된다.
rpc 패킷의 크기를 줄이면 동일한 양의 데이터를 전달하기 위해, 전송해야 할 총 네트워크 IP 패킷 수가 증가한다.
예를 들어, 전송할 데이터가 1MB인 경우, 이를 동일한 청크 32KB로 나누면 32개의 청크를 보내야 한다(32 * 32 = 1024),
동일한 1MB의 데이터를 64KB 보낸다면 16청크를 보내야 함(64 * 64 = 1024),
네트워크를 통해 전송 된 모든 패킷은 TCP/IP 동작으로 인해 약간의 오버 헤드가 발생하므로 32*32KB 패킷보다 16*64KB 패킷을 전송하는 것이 더 효율적이다.
따라서 이 매개 변수 수정에 대한 결정은 항상 네트워크 기능에 딸라 달라진다.
NFS 서버 및 클라이언트에 1 기가비트 포트가 있고 이 서버를 연결하는 네트워크 스위치가 해당 포트에서 1 기가 비트도 가능하면
이 매개 변소를 더 높은 값으로 저정하는 것이 좋다.
rsize, wsize 값 조정
mount 192.168.0.104:/data /mnt -o rsize=65536,wsize=65536
또는
mount 192.168.0.104:/data /mnt -o rsize=524288,wsize=524288
4096
8192
16384
35768
65536
524288
매개 변수 값을 테스트 해 최상의 값을 /etc/fstab 지정해 사용할 수 있다.
3.3.1 MTU 값
NIC의 MTU 값은 rsize 및 wsize 값이 8kb 이고 1500 바이트 mtu 크기를 사용하는 경우 최대 크기가 1500 바이트이므로 전송하는 동안 데이터가 조각화된다고 가정해야 한다.
mtu 크기가 9000 바이트로 수정하면 조각화없이 전체 8kb를 한 프레임으로 전송할 수 있다.
그러나 이렇게하면 서버와 클라이언트 사이의 모든 장치를 9000 mtu로 구성해야 한다.
여기에는 네트워크 스위치, 방화벽도 포함된다.
이렇게 하지 않으면 잘린 패킷과 장치 간 통신 손실이 발생할 수 있다.
카메라 mtu 값 변경.
보안장비 mtu 값 변경.
넷기어 스위치 mtu 값 변경.
시스코 장비 mtu 값 변경.
참고: mtu 크기를 변경하면 핸재 실행중인 응용 프로그램에 영향을 줄 수 있음.
일부 ISP는 지정된 MTU 크기보다 큰 프레임을 허용하지 않음.
보안장비 외부망은 DHCP 자동으로 활당 시키고,
뒤 로컬망 MTU 변경.
3.3.2 timeo및 retransNFS의 옵션
위에 설명 되어 지만 조금더 깊게 들어가 본다.
위 두 옵션은 서버가 응답이 지연되거나 서버에서 응답이 없는 경우 클라이언트가 서버로 재 시도하는 횟수에 영향을 준다.
timeoNFS의 옵션은 클라이언트가 패킷을 재전송해야한다는 결론을 내리기 전에 대기해야하는 시간을 결정
기본값은 0.7입니다 (초당 10 분의 1로 계산된다.
따라서 5 timeo 값을 지정하면 클라이언트가 5/10 초 동안 기다렸다가 패킷을 다시 보내야한다고 결정하게 된다.
두 번째 옵션 인 retrans는 클라이언트가 제한 시간을 초과 한 경우 (제공 한 timeo 초를 기다린 후) 클라이언트가 시도한 총 시도 횟수를 결정한다.
재전송 값을 3으로 지정하면 클라이언트는 서버를 사용할 수 없다는 결론을 내리기 전에 RPC 패킷을 3 번 (그리고 시간 초 동안 대기 할 때마다) 재전송한다.
mount 명령의 옵션으로 timeo 및 retrans 값을 수정가능
mount 192.168.0.102:/data /mnt -o timeo=5,retrans=4
3.3.3 마운트 동기 및 비동기
클라이언트 요청시 버서에서 데이터를 쓰는 방법을 결정한다.
둘 다 장점과 단점이 있다.
NFS 마운트의 동기화 및 비동화가 무엇인지 이해를 해야 한다.
nFS 크라이언트에서 수행하는 작업은 RPC 동등한 적업으로 변환된다.
RPC 프로토콜을 사용하여 서버로 보낼 수 있다.
서버가 쓰기에 대한 RPC 작업을 reieves NFS에 비동기 옵션을 사용하는 경우,
첫음 진입은 VFS(가상 파일 시스템) 작업에서 기본 디스크 시스템에 데이터를 기록한다.
VFS 핸들러가 기본 디스크에 대한 쓰기 작업을 마친과 동시에 쓰기 작업이 완료되었다는 확인을 받기 전에 서버는 추가 RPC쓰기 작업을 수락 할 준비가 된다.
이 경우 NFS 서버는 쓰기 작업을 완료하는 데 필요한 시간을 줄여 쓰기 성능을 향상시킨다.
그러나 기본 디스크 시스템이 작업을 완료하기 전에 NFS 서버가 더 많은 쓰기 작업을 수락하기 때문에 이 방법으로 데이터가 손실되거나 손상 될 수 있다.
동기화 옵션을 사용하면 그 반대가 된다.
이 경우는 서버는 쓰기 작업이 성공적으로 완료된 후에만 응답한다(데이터에 완전히 기록된 후_
중요한 데이터를 다르는 경우 비동기 옵션을 사용하지 않는 것이 좋지만 데이터가 그렇게 중요하지 않은 경우 async를 선택하는 것이 좋다.
mount 192.168.0.101:/data /mnt -o rw,async
4. 최종적 시스템 선택
4.1 NFS 서버 설정
vi /etc/exports
/home/linuxlee/Shinobi/videos 172.16.1.0/255.255.255.0(rw,async,no_subtree_check)
4.2 커널 파라메터 설정.
echo 524288 > /proc/sys/net/core/wmem_default
echo 524288 > /proc/sys/net/core/wmem_max
// reboot 후에도 적용하려면
echo 'net.core.wmem_max=524288' >> /etc/sysctl.conf
echo 'net.core.rmem_max=524288' >> /etc/sysctl.conf
4.3 MTU 조정
이더넷 MTU는 1500 바이트이므로 이더넷 프레임에 포함 할 수있는 가장 큰 IP 패킷 (또는 다른 페이로드)은 1500 바이트이다.
이더넷 헤더에 26 바이트를 추가하면 최대 프레임 (MTU와 동일하지 않음)이 1526 바이트가 됨.
넷기어 장비는 이더넷 헤더를 기본으로 잡는다. 그래서 1526으로 되어있음.
"MTU"라는 용어는 계층 3에서 패킷의 최대 크기만을 정의하기위한 것마은 아니다.
계층 2 MTU를 참조한다.
IP 패킷 (계층 3)의 길이는 IP 헤더에서 16 비트 총 길이 필드의 최대 값으로 제한된다.
IPv4의 경우 최대 페이로드 크기는 65515이다.(= 2^16 - 1 - 20 bytes header).
결국 dhclinet로 적용되는 외부 아이피는, 그 값을 dhcpd에서 주기 때문에. 수동으로 설정해줘야 한다.
처음 정보를 변경할 때는 수동으로 명령을 입력해줘야 한다.
dhcp 상위망 연동 때문에.
ip link show eth0
ip link set eth0 mtu 9000
ip link show eth0
만약 보안장비에서 dhcpd 설정시
템블릿 파일을 수정해 값을 변경할 수가 있다.
subnet.mas 파일 수정
option interface-mtu 9000; 추가.
subnet 192.168.0.0 netmask 255.255.255.0 {
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
option interface-mtu 9000; ---> 이 값으로 변경.
}
5. 리눅스 마운트 방법.
5.1 클라이언트 설치.
sudo apt-get install nfs-common
4.2 마운트 디렉토리 생성.
sudo mkdir -p /mnt/sharedfolder_client
5.3 마운트
sudo mount serverIP:/exportFolder_server /mnt/mountfolder_client
sudo mount 192.168.100.5:/mnt/sharedfolder /mnt/sharedfolder_client
sudo mount.nfs4 서버주소.com:/서버/마운트/위치 /클라이언트/마운트/위치
sudo mount.nfs4 ranko.local:/mnt/NAS-HGST-1TB /mnt/NFS/ranko@NAS-HGST-1TB/
속도 테스트
dd if=/dev/zero of=/mnt/NFS/ranko@NAS-HGST-1TB/TMP/output bs=1M count=1000
6. 윈도우즈 MTU 설정
윈도우 7 MTU 값에 변경시 네트워크 데이터 문제 발생.
변경시 많은 예외 처리가 있어야 함.
cmd
기존 설정 확인.
netsh interface ipv4 show interfaces
10 25 1500 disconnected 로컬 영역 연결* 2
수정
10 ID 값이 디바이스 선택.
netsh interface ipv4 set subinterface "10" mtu=9000 store=persistent
적용 설정 확인
netsh interface ipv4 show interfaces
삼바 속도 향상.
1. 전부 설정 할 필요는 없음.
1.1 사항에 맞게 다음 내용에서 선택해 사용.
[global]
# FORCE THE DISK SYSTEM TO ALLOCATE REAL STORAGE BLOCKS WHEN
# A FILE IS CREATED OR EXTENDED TO BE A GIVEN SIZE.
# THIS IS ONLY A GOOD OPTION FOR FILE SYSTEMS THAT SUPPORT
# UNWRITTEN EXTENTS LIKE XFS, EXT4, BTRFS, OCS2.
# IF YOU USE A FILE SYSTEM THAT DOES NOT SUPPORT UNWRITTEN
# EXTENTS, SET "strict allocate = no".
# NOTE: MAY WASTE DRIVE SPACE EVEN ON SUPPORTED FILE SYSTEMS
# SEE: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=798532
strict allocate = Yes
# THIS IS TO COUNTERACT SPACE WASTAGE THAT CAN BE
# CAUSED BY THE PREVIOUS OPTION
# SEE: https://lists.samba.org/archive/samba-technical/2014-July/101304.html
allocation roundup size = 4096
# ALLOW READS OF 65535 BYTES IN ONE PACKET.
# THIS TYPICALLY PROVIDES A MAJOR PERFORMANCE BENEFIT.
read raw = Yes
# SERVER SIGNING SLOWS THINGS DOWN WHEN ENABLED.
# THIS WAS DISABLED BY DEFAULT PRIOR TO SAMBA 4.
# Thanks to Joe in the comments section!
server signing = No
# SUPPORT RAW WRITE SMBs WHEN TRANSFERRING DATA FROM CLIENTS.
write raw = Yes
# WHEN "strict locking = no", THE SERVER PERFORMS FILE LOCK
# CHECKS ONLY WHEN THE CLIENT EXPLICITLY ASKS FOR THEM.
# WELL-BEHAVED CLIENTS ALWAYS ASK FOR LOCK CHECKS WHEN IT IS
# IMPORTANT, SO IN THE VAST MAJORITY OF CASES,
# "strict locking = auto" OR "strict locking = no" IS ACCEPTABLE.
strict locking = No
# TCP_NODELAY:
# SEND AS MANY PACKETS AS NECESSARY TO KEEP DELAY LOW
# IPTOS_LOWDELAY:
# [Linux IPv4 Tweak] MINIMIZE DELAYS FOR INTERACTIVE TRAFFIC
# SO_RCVBUF:
# ENLARGE SYSTEM SOCKET RECEIVE BUFFER
# SO_SNDBUF:
# ENLARGE SYSTEM SOCKET SEND BUFFER
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=131072 SO_SNDBUF=131072
# SMBWriteX CALLS GREATER THAN "min receivefile size" WILL BE
# PASSED DIRECTLY TO KERNEL recvfile/splice SYSTEM CALL.
# TO ENABLE POSIX LARGE WRITE SUPPORT (SMB/CIFS WRITES UP TO 16MB),
# THIS OPTION MUST BE NONZERO.
# THIS OPTION WILL HAVE NO EFFECT IF SET ON A SMB SIGNED CONNECTION.
# MAX VALUE = 128k
min receivefile size = 16384
# USE THE MORE EFFICIENT sendfile() SYSTEM CALL FOR EXCLUSIVELY
# OPLOCKED FILES.
# NOTE: ONLY FOR CLIENTS HIGHER THAN WINDOWS 98/Me
use sendfile = Yes
# READ FROM FILE ASYNCHRONOUSLY WHEN SIZE OF REQUEST IS BIGGER
# THAN THIS VALUE.
# NOTE: SAMBA MUST BE BUILT WITH ASYNCHRONOUS I/O SUPPORT
aio read size = 16384
# WRITE TO FILE ASYNCHRONOUSLY WHEN SIZE OF REQUEST IS BIGGER
# THAN THIS VALUE
# NOTE: SAMBA MUST BE BUILT WITH ASYNCHRONOUS I/O SUPPORT
aio write size = 16384
2. 삼바 속도 옵션 값 정리.
#Read Raw = no
#Write Raw = no
#socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=4096 SO_RCVBUF=4096
#socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=8192 SO_RCVBUF=8192
#socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=16384 SO_RCVBUF=16384
#socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=32768 SO_RCVBUF=35768
#socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=65536 SO_RCVBUF=65536
#socket options = TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=524288 SO_SNDBUF=524288
#socket options = TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=524288 SO_SNDBUF=524288
2.1 속도.
윈도우 7 파일전송 20MB/s
최대 네트워크 사용률 90% 좋음.
95% 이상일 경우 웹서핑/다운로드/스트리밍 영향을 미친다.
80% 이면 유투브 1080p 영상을 보면서 데이터를 전솔할 때 버벅 거린다.(비디오 손실은 없음)
ifconfig
enp5s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ---> mtu 값 변경.
수동 설정 방법.
ip link set eth0 mtu 9000
ip link show eth0
버퍼 사이즈 조정
524288 -> 100MB+ ~90%
262144 -> 55MB ~50%
65536 -> ~40MB ~40%
8192 -> ~20MB ~20%
2.2 참고
우분투 17.10 네트워크 메니저 변경 됨.
/etc/network/interfaces 설정해도 동작 하지 않음.
우분투에서 ifupdown 패키지를 더이상 사용하 않음.
17.10 서버 부터 netplan을 사용하여 systemd-networkd를 제어한다고 명시 함.
설치 타이베 따른 설정 파일 위치가 다름.
Server ISO : /etc/netplan/01-netcfg.yaml
Cloud Image : /etc/netplan/50-cloud-init.yaml
Desktop ISO : /etc/netplan/01-network-manager-all.yaml
설치
apt install netplan
apt install netplan.io
디바이스 이름 확인
ip a
설정 방법.
ethernets:
enp3s0:
dhcp4: true
enp4s0:
addresses:
- 192.168.0.10/24
gateway4: 192.168.0.1
mtu: 1480
nameservers:
addresses:
- 8.8.8.8
- 9.9.9.9
net1:
addresses:
- fe80::a00:10a/120
gateway6: fe80::a00:101
match:
macaddress: 52:54:00:12:34:06
net2:
dhcp4: true
dhcp6: true
match:
macaddress: 52:54:00:12:34:07
mtu: 9000
Bonding 설정
다수의 네트워크 인터페이스를 단일 링크로 만든다(가용성, 로드 벨런싱, 최대 처리량)
https://help.ubuntu.com/community/UbuntuBonding?_ga=2.47296547.5475972.1546175131-1696157538.1544368933#Descriptions_of_bonding_modes
mode 1 설정: active-backup 셋팅
bonds:
bond0:
dhcp4: yes
interfaces:
- enp3s0
- enp4s0
parameters:
mode: active-backup
primary: enp3s0
Bridges 설정
DHCP를 활용한 간단한 예제
bridges:
br0:
dhcp4: yes
interfaces:
- enp3s0
Vlan 설정
기본적으로 vlan을 설정하기 위해서 key로 이름을 지정하고 vlan에서 사용하는 ID와 링크 정보를 추가한다.
vlans:
vdev:
id: 101
link: net1
addresses:
- 10.0.1.10/24
vprod:
id: 102
link: net2
addresses:
- 10.0.2.10/24
vtest:
id: 103
link: net3
addresses:
- 10.0.3.10/24
vmgmt:
id: 104
link: net4
addresses:
- 10.0.4.10/24
netplan generate : /etc/netplan에 renderer에 대한 구성들을 생성한다.
netplan apply : renderer에 대한 구성들을 적용하고, 필요에따라 재시작한다.
netplan ifupdown-migrate : /etc/network/interfaces 의 내용을 마이그레이션 한다.
설정한 인터페이스 끄고키기
$ ip link set $dev up
$ ip link set $dev down
고정 아이피 설정 /etc/netplan/a.yaml
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
addresses:
- 10.10.10.2/24
dhcp4: no
Netplan을 사용하고 싶지 않을 경우
Ubuntu 서버 설치 이미지로 부팅시 grub (e 버튼을 클릭해서 수정하거나, F6을 눌러 bootspash로 들어가서)에서
preseeding 설정으로 netcfg/do_not_use_netplan=true 명령을 추가
mtu 자동 설정
more /run/systemd/network/10-netplan-enp5s0.network
[Match]
Name=enp5s0 ---> Mac 주소를 확인 해야 함.
[Network]
DHCP=ipv4
LinkLocalAddressing=ipv6
[DHCP]
RouteMetric=100
UseMTU=true
mtu 수정
맥 정보 확인.
ip a
04:92:26:b7:ba:XX
정보 수정
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
addresses: [9.3.3.XX/24]
gateway4: 9.3.3.X
nameservers:
addresses: [9.3.1.YY, 8.8.8.8]
eth4:
addresses: [10.1.1.8/24]
mtu: 9000
eth2:
addresses: [192.168.1.8/24]
mtu: 9000
설정 적용.
netplan apply
외부망이 dhclient 자동을 받기 때문에 mtu 값도 자동 설정이 된다.
/etc/dhcp/dhclient.conf mtu 설정 방법을 연구 해야 한다.
예전 방식으로 사용하려면 패키지를 설치.
apt-get install ifupdown
vi /etc/network/interfaces
auto lo enp5s0 enp6s0
iface lo inet loopback
iface enp5s0 inet dhcp
post-up /sbin/ifconfig enp5s0 mtu 9000 ---> 이걸로 변경 해 버린.
dns-nameserver 172.16.1.1 8.8.8.8
iface enp6s0 inet static
address 172.16.2.1
netmask 255.255.255.0
broadcast 172.16.2.255
dns-nameserver 172.16.1.1 8.8.8.8
dhcpd mtu 설정
이더넷 MTU는 1500 바이트이므로 이더넷 프레임에 포함 할 수있는 가장 큰 IP 패킷 (또는 다른 페이로드)은 1500 바이트이다.
이더넷 헤더에 26 바이트를 추가하면 최대 프레임 (MTU와 동일하지 않음)이 1526 바이트가 됨.
넷기어 장비는 이더넷 헤더를 기본으로 잡는다. 그래서 1526으로 되어있음.
"MTU"라는 용어는 계층 3에서 패킷의 최대 크기만을 정의하기위한 것마은 아니다.
계층 2 MTU를 참조한다.
IP 패킷 (계층 3)의 길이는 IP 헤더에서 16 비트 총 길이 필드의 최대 값으로 제한된다.
IPv4의 경우 최대 페이로드 크기는 65515이다.(= 2^16 - 1 - 20 bytes header).
결국 dhclinet로 적용되는 외부 아이피는, 그 값을 dhcpd에서 주기 때문에. 수동으로 설정해줘야 한다.
처음 정보를 변경할 때는 수동으로 명령을 입력해줘야 한다.
dhcp 상위망 연동 때문에.
ip link show eth0
ip link set eth0 mtu 9000
ip link show eth0
만약 보안장비에서 dhcpd 설정시
템블릿 파일을 수정해 값을 변경할 수가 있다.
subnet.mas 파일 수정
option interface-mtu 9000; 추가.
subnet 192.168.0.0 netmask 255.255.255.0 {
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
option interface-mtu 9000; ---> 이 값으로 변경.
}
3. 속도 측정.
dd if=/dev/zero of=/마운트/위치/TMP/output bs=크기(k,M,G) count=측정횟수
dd if=/dev/zero of=/home/linuxlee/Shinobi/videos/lNOkBz1PzM/tbulnOHIq8/2019-12-07T12-30-09.mp4 bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 6.06899 s, 173 MB/s ---> 173MB/s 초당 173 메가...
1.1 사항에 맞게 다음 내용에서 선택해 사용.
[global]
# FORCE THE DISK SYSTEM TO ALLOCATE REAL STORAGE BLOCKS WHEN
# A FILE IS CREATED OR EXTENDED TO BE A GIVEN SIZE.
# THIS IS ONLY A GOOD OPTION FOR FILE SYSTEMS THAT SUPPORT
# UNWRITTEN EXTENTS LIKE XFS, EXT4, BTRFS, OCS2.
# IF YOU USE A FILE SYSTEM THAT DOES NOT SUPPORT UNWRITTEN
# EXTENTS, SET "strict allocate = no".
# NOTE: MAY WASTE DRIVE SPACE EVEN ON SUPPORTED FILE SYSTEMS
# SEE: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=798532
strict allocate = Yes
# THIS IS TO COUNTERACT SPACE WASTAGE THAT CAN BE
# CAUSED BY THE PREVIOUS OPTION
# SEE: https://lists.samba.org/archive/samba-technical/2014-July/101304.html
allocation roundup size = 4096
# ALLOW READS OF 65535 BYTES IN ONE PACKET.
# THIS TYPICALLY PROVIDES A MAJOR PERFORMANCE BENEFIT.
read raw = Yes
# SERVER SIGNING SLOWS THINGS DOWN WHEN ENABLED.
# THIS WAS DISABLED BY DEFAULT PRIOR TO SAMBA 4.
# Thanks to Joe in the comments section!
server signing = No
# SUPPORT RAW WRITE SMBs WHEN TRANSFERRING DATA FROM CLIENTS.
write raw = Yes
# WHEN "strict locking = no", THE SERVER PERFORMS FILE LOCK
# CHECKS ONLY WHEN THE CLIENT EXPLICITLY ASKS FOR THEM.
# WELL-BEHAVED CLIENTS ALWAYS ASK FOR LOCK CHECKS WHEN IT IS
# IMPORTANT, SO IN THE VAST MAJORITY OF CASES,
# "strict locking = auto" OR "strict locking = no" IS ACCEPTABLE.
strict locking = No
# TCP_NODELAY:
# SEND AS MANY PACKETS AS NECESSARY TO KEEP DELAY LOW
# IPTOS_LOWDELAY:
# [Linux IPv4 Tweak] MINIMIZE DELAYS FOR INTERACTIVE TRAFFIC
# SO_RCVBUF:
# ENLARGE SYSTEM SOCKET RECEIVE BUFFER
# SO_SNDBUF:
# ENLARGE SYSTEM SOCKET SEND BUFFER
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF=131072 SO_SNDBUF=131072
# SMBWriteX CALLS GREATER THAN "min receivefile size" WILL BE
# PASSED DIRECTLY TO KERNEL recvfile/splice SYSTEM CALL.
# TO ENABLE POSIX LARGE WRITE SUPPORT (SMB/CIFS WRITES UP TO 16MB),
# THIS OPTION MUST BE NONZERO.
# THIS OPTION WILL HAVE NO EFFECT IF SET ON A SMB SIGNED CONNECTION.
# MAX VALUE = 128k
min receivefile size = 16384
# USE THE MORE EFFICIENT sendfile() SYSTEM CALL FOR EXCLUSIVELY
# OPLOCKED FILES.
# NOTE: ONLY FOR CLIENTS HIGHER THAN WINDOWS 98/Me
use sendfile = Yes
# READ FROM FILE ASYNCHRONOUSLY WHEN SIZE OF REQUEST IS BIGGER
# THAN THIS VALUE.
# NOTE: SAMBA MUST BE BUILT WITH ASYNCHRONOUS I/O SUPPORT
aio read size = 16384
# WRITE TO FILE ASYNCHRONOUSLY WHEN SIZE OF REQUEST IS BIGGER
# THAN THIS VALUE
# NOTE: SAMBA MUST BE BUILT WITH ASYNCHRONOUS I/O SUPPORT
aio write size = 16384
2. 삼바 속도 옵션 값 정리.
#Read Raw = no
#Write Raw = no
#socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=4096 SO_RCVBUF=4096
#socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=8192 SO_RCVBUF=8192
#socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=16384 SO_RCVBUF=16384
#socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=32768 SO_RCVBUF=35768
#socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=65536 SO_RCVBUF=65536
#socket options = TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=524288 SO_SNDBUF=524288
#socket options = TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=524288 SO_SNDBUF=524288
2.1 속도.
윈도우 7 파일전송 20MB/s
최대 네트워크 사용률 90% 좋음.
95% 이상일 경우 웹서핑/다운로드/스트리밍 영향을 미친다.
80% 이면 유투브 1080p 영상을 보면서 데이터를 전솔할 때 버벅 거린다.(비디오 손실은 없음)
ifconfig
enp5s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ---> mtu 값 변경.
수동 설정 방법.
ip link set eth0 mtu 9000
ip link show eth0
버퍼 사이즈 조정
524288 -> 100MB+ ~90%
262144 -> 55MB ~50%
65536 -> ~40MB ~40%
8192 -> ~20MB ~20%
2.2 참고
우분투 17.10 네트워크 메니저 변경 됨.
/etc/network/interfaces 설정해도 동작 하지 않음.
우분투에서 ifupdown 패키지를 더이상 사용하 않음.
17.10 서버 부터 netplan을 사용하여 systemd-networkd를 제어한다고 명시 함.
설치 타이베 따른 설정 파일 위치가 다름.
Server ISO : /etc/netplan/01-netcfg.yaml
Cloud Image : /etc/netplan/50-cloud-init.yaml
Desktop ISO : /etc/netplan/01-network-manager-all.yaml
설치
apt install netplan
apt install netplan.io
디바이스 이름 확인
ip a
설정 방법.
ethernets:
enp3s0:
dhcp4: true
enp4s0:
addresses:
- 192.168.0.10/24
gateway4: 192.168.0.1
mtu: 1480
nameservers:
addresses:
- 8.8.8.8
- 9.9.9.9
net1:
addresses:
- fe80::a00:10a/120
gateway6: fe80::a00:101
match:
macaddress: 52:54:00:12:34:06
net2:
dhcp4: true
dhcp6: true
match:
macaddress: 52:54:00:12:34:07
mtu: 9000
Bonding 설정
다수의 네트워크 인터페이스를 단일 링크로 만든다(가용성, 로드 벨런싱, 최대 처리량)
https://help.ubuntu.com/community/UbuntuBonding?_ga=2.47296547.5475972.1546175131-1696157538.1544368933#Descriptions_of_bonding_modes
mode 1 설정: active-backup 셋팅
bonds:
bond0:
dhcp4: yes
interfaces:
- enp3s0
- enp4s0
parameters:
mode: active-backup
primary: enp3s0
Bridges 설정
DHCP를 활용한 간단한 예제
bridges:
br0:
dhcp4: yes
interfaces:
- enp3s0
Vlan 설정
기본적으로 vlan을 설정하기 위해서 key로 이름을 지정하고 vlan에서 사용하는 ID와 링크 정보를 추가한다.
vlans:
vdev:
id: 101
link: net1
addresses:
- 10.0.1.10/24
vprod:
id: 102
link: net2
addresses:
- 10.0.2.10/24
vtest:
id: 103
link: net3
addresses:
- 10.0.3.10/24
vmgmt:
id: 104
link: net4
addresses:
- 10.0.4.10/24
netplan generate : /etc/netplan에 renderer에 대한 구성들을 생성한다.
netplan apply : renderer에 대한 구성들을 적용하고, 필요에따라 재시작한다.
netplan ifupdown-migrate : /etc/network/interfaces 의 내용을 마이그레이션 한다.
설정한 인터페이스 끄고키기
$ ip link set $dev up
$ ip link set $dev down
고정 아이피 설정 /etc/netplan/a.yaml
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
addresses:
- 10.10.10.2/24
dhcp4: no
Netplan을 사용하고 싶지 않을 경우
Ubuntu 서버 설치 이미지로 부팅시 grub (e 버튼을 클릭해서 수정하거나, F6을 눌러 bootspash로 들어가서)에서
preseeding 설정으로 netcfg/do_not_use_netplan=true 명령을 추가
mtu 자동 설정
more /run/systemd/network/10-netplan-enp5s0.network
[Match]
Name=enp5s0 ---> Mac 주소를 확인 해야 함.
[Network]
DHCP=ipv4
LinkLocalAddressing=ipv6
[DHCP]
RouteMetric=100
UseMTU=true
mtu 수정
맥 정보 확인.
ip a
04:92:26:b7:ba:XX
정보 수정
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
addresses: [9.3.3.XX/24]
gateway4: 9.3.3.X
nameservers:
addresses: [9.3.1.YY, 8.8.8.8]
eth4:
addresses: [10.1.1.8/24]
mtu: 9000
eth2:
addresses: [192.168.1.8/24]
mtu: 9000
설정 적용.
netplan apply
외부망이 dhclient 자동을 받기 때문에 mtu 값도 자동 설정이 된다.
/etc/dhcp/dhclient.conf mtu 설정 방법을 연구 해야 한다.
예전 방식으로 사용하려면 패키지를 설치.
apt-get install ifupdown
vi /etc/network/interfaces
auto lo enp5s0 enp6s0
iface lo inet loopback
iface enp5s0 inet dhcp
post-up /sbin/ifconfig enp5s0 mtu 9000 ---> 이걸로 변경 해 버린.
dns-nameserver 172.16.1.1 8.8.8.8
iface enp6s0 inet static
address 172.16.2.1
netmask 255.255.255.0
broadcast 172.16.2.255
dns-nameserver 172.16.1.1 8.8.8.8
dhcpd mtu 설정
이더넷 MTU는 1500 바이트이므로 이더넷 프레임에 포함 할 수있는 가장 큰 IP 패킷 (또는 다른 페이로드)은 1500 바이트이다.
이더넷 헤더에 26 바이트를 추가하면 최대 프레임 (MTU와 동일하지 않음)이 1526 바이트가 됨.
넷기어 장비는 이더넷 헤더를 기본으로 잡는다. 그래서 1526으로 되어있음.
"MTU"라는 용어는 계층 3에서 패킷의 최대 크기만을 정의하기위한 것마은 아니다.
계층 2 MTU를 참조한다.
IP 패킷 (계층 3)의 길이는 IP 헤더에서 16 비트 총 길이 필드의 최대 값으로 제한된다.
IPv4의 경우 최대 페이로드 크기는 65515이다.(= 2^16 - 1 - 20 bytes header).
결국 dhclinet로 적용되는 외부 아이피는, 그 값을 dhcpd에서 주기 때문에. 수동으로 설정해줘야 한다.
처음 정보를 변경할 때는 수동으로 명령을 입력해줘야 한다.
dhcp 상위망 연동 때문에.
ip link show eth0
ip link set eth0 mtu 9000
ip link show eth0
만약 보안장비에서 dhcpd 설정시
템블릿 파일을 수정해 값을 변경할 수가 있다.
subnet.mas 파일 수정
option interface-mtu 9000; 추가.
subnet 192.168.0.0 netmask 255.255.255.0 {
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
option interface-mtu 9000; ---> 이 값으로 변경.
}
3. 속도 측정.
dd if=/dev/zero of=/마운트/위치/TMP/output bs=크기(k,M,G) count=측정횟수
dd if=/dev/zero of=/home/linuxlee/Shinobi/videos/lNOkBz1PzM/tbulnOHIq8/2019-12-07T12-30-09.mp4 bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 6.06899 s, 173 MB/s ---> 173MB/s 초당 173 메가...
ssd hard disk tuning
우분투 18.04
1. 낮은 시간 대기 안정적 커널 다운로드.
1.1 커널 다운로드
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.17.1/linux-headers-4.17.1-041701_4.17.1-041701.201806111730_all.deb
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.17.1/linux-headers-4.17.1-041701-lowlatency_4.17.1-041701.201806111730_amd64.deb
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.17.1/linux-image-unsigned-4.17.1-041701-lowlatency_4.17.1-041701.201806111730_amd64.deb
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.17.1/linux-modules-4.17.1-041701-lowlatency_4.17.1-041701.201806111730_amd64.deb
1.1.1 커널소스 다운로드 및 컴파일 예제.
커널 4.7.5 이상의 우분투에서 메인 라인 커널로 부팅
CONFIG_UEVENT_HELPER설정 하지 않으면 일부 머신은 "루트를 찾을 수 없음" 커널 패닉.
우분투 커널 4.6.x 이하의 경우에서만 발생.
4.7.5에서는 그러지 않음.
소스 다운로드
git clone --branch v4.7.5 --depth 1 git://git.launchpad.net/~ubuntu-kernel-test/ubuntu/+source/linux/+git/mainline-crack
-p1( http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.7.5/ )를 사용 하여 메인 라인의 모든 패치를 적용
이미 설치된 기본 커널 /boo /what에서 .config로 구성을 복사
ONFIG_UEVENT_HELPER = y 및 CONFIG_UEVENT_HELPER_PATH = ""를 사용하도록 편집
커널 컴파일.
fakeroot make-kpkg --initrd --revision=4.7.5.pjf kernel_image kernel_headers -j8
*.deb files are created in directory above this one.
1.1.2 실 장비 컴파일.
git clone --branch v4.17.1 --depth 1 git://git.launchpad.net/~ubuntu-kernel-test/ubuntu/+source/linux/+git/mainline-crack
패치 파일 확인.
https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.17.1/
-p 옵션으로 패치 적용.
fakeroot make-kpkg --initrd --revision=4.7.5.pjf kernel_image kernel_headers -j8
1.2 커널 설치
dpkg -i *.deb
1.3 시스템 재부팅
reboot
2) cron TRIM 설정
2.1 하드디스크 지원 확인.
DISC-MAX 열이 0B가 아닌 경우 lsblk -D를 시도 하고 TRIM/discard를 사용 가능함.
lsblk -D
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda 0 0B 0B 0
└─sda1 0 0B 0B 0 ---> TRIM 사용할 수 없음.
nvme0n1 0 512B 2T 0 ---> 사용할 수 있음.
├─nvme0n1p1 0 512B 2T 0
├─nvme0n1p2 0 512B 2T 0
├─nvme0n1p3 0 512B 2T 0
├─nvme0n1p4 0 512B 2T 0
└─nvme0n1p5 0 512B 2T 0
nvme1n1 0 512B 2T 0
├─nvme1n1p1 0 512B 2T 0
└─nvme1n1p2 0 512B 2T 0
2.2 TRIM 활성화.
vi /etc/cron.weekly/fstrim
#!/bin/sh
/sbin/fstrim --all || true
2.2.1 실행권한 부여
sudo chmod +x /etc/cron.weekly/fstrim
3. grub 설정
3.1 배경 지식
CFO(Completey Fair Queuing) 스케줄.
레드햇 엔트프라이즈 Linux 4의 기본 알고리즘.
확장 가능한 프로세스 별 I/O 대기열 유지하고 사용 가능한 I/O 대역폭을 모든 I/O에 균등하게 분배 하려고 한다.
I/O 요청에 대한 I/O 대기 시간을 최소화한다.
스케줄러는 거의 실시간 동작을 제공하고 라운드 로분 정책을 사용하여 I/O 요청간에 공정성을 유지시켜 프로세스 고갈을 피한다.
스케줄러는 5개의 I/O 대기 열을 사용하여 요청을 적즉적으로 다시 정럴하여 I/O 성능을 향상 시키니다.
NOOP 스케줄러는 간단한 FIFO 대기열이며 I/O당 최소량의 CPU/명령을 사용하여 I/O를 완료 하기 위한 기본 병합 및 정렬 기능을 수행한다.
I/O 성능이 블록 장치(메모리 디스크) 또는 지능형 HBA 또는 외부에 연결된 컨트롤러에서 최적화되었거나 최적화 된 것으로 가정한다.
실 환경에서는 베어 메탈에 운영 체제가 설치되어 있으므로 워크로드에 가장 적합한 알고리즘을 선택해야 한다.
가상 세계에는 OS와 디스크 사이에 하이퍼 바이저가 있으며 하이버 바이저에는 자체 디스크 큐가 있다.
이러한 현실 때문에 일어나는 일들을 나열해 본다.
1. VM에 디스크 I/O 발생
2. 케스트 OS는 CPU 시간을 사용하여 활성화 된 디스크 알고리즘 기반으로 I/O를 이장적인 순서로 정력한다.
3. 게스트 OS는 기본 가상 하드웨어에 새로운 수서로 요청한다
4. 하이퍼 바이저는 해당 요청을 가져와 자체 알고리즘 기반으로 다시 정렬한다.
5. 하이퍼 바이저는 자체 순서에 따라 실제 하드웨어에 요청한다.
하이퍼 바이저가 자체 디스크 큐에 대해 저체 정렬을 수행마므로 게스트 OS에서 동일한 작업을 시도하는 지점은 거의 없다.
최소한 게스트 OS는 약간의 대기 시간을 발생시키고 일부 CPU 주기를 낭비한다.
최악의 경우 하이퍼 바이저 및 백엔드 스토리지가 어려운 사항에 처한게 된다.(I/O 블랜더)
NOOP 스케줄러 전환하면 게스트 OS는 I/O를 통과하기 전에 가능한 한 저게 I/O를 숭행 하므로 가상 환경에 적합하다.
elevator = noop 지원 및 위치 확인.
cat /sys/block/sda/queue/scheduler
noop deadline [cfq]
[cfq]는 활성 스케줄러이다.
NOOP로 전환하려면 부트러도에 기본 커널 매개 변수를 추가해야한다.
elevator = noop
3.2 SSD 디스크 대기열 비활성화.
3.2.1 부트로더 수정
vi /etc/default/grub
GRUB_CMDLINE_LINUX="elevator=noop"
3.2.2 적용
sudo update-grub
재부팅 후 스케줄러 변경을 확인한다.
cat /sys/block/sda/queue/scheduler
[noop] deadline cfq
noop가 선택 됨.
4 하드디스크 마운트 정보 수정 /etc/fstab
4.1 sata POSIX 표준 함수
- 메뉴얼 페치지 확인.
man -s 2 stat
int stat(const char *path, struct stat *buf);
4.1.1 struct stat 구조
메타 데이타 확인 사항 키워드
st_atime, st_mtime, st_ctime
st_atime: 파일에 접근한 최종 시간, mknod, execve, pipe, read 함수를 실행할 때 변경 됨.
st_mtime: 파일이 변경된 시간, mknode, truncate, utime, write 함수 실행 경우 변경
st_ctime: 상태 변경 시간으로 소유자나, 소유그룹, 링크, mode 등 innode 관련 정보 변경 시간.
File IO가 많이 발생하는 웹 서비스의 경우 I/O 처리는 Contents를 읽어서 클라이언트에게 보내주기 위해 File에 대해 수행하는 read 연산이다.
POXIX 표준.
read 연산도 파일이나 디렉토리의 메타 데이터중 st_atime(access time)을 변경하게 되며 이는 IO 성능에 나쁜 영향을 주게된다.
이를 매번 기록하지 않는다면 File IO의 성능은 많이 향상된다.
이런 기능을 noatime(no access time)이라고 하며 mount나 chattr의 명령으로 파일 시스템 전체, 또는 개별 파일마다 접근 시간 기록 여분를 설정 할 수 있다.
4.1.2 fstab notime 설정
vi /etc/fstab
/dev/mapper/vg_linux-lv_home /var ext4 defaults,noatime 1 2
4.1.3 chattr 파일/디렉토리마다 지정
fie의 attributes를 설정하는 chattr 명령어를 사용하여 atime 옵션으로 마운트된 file system에서 특정 파일/디렉토리만 notime을 적용할 수 있다.
chattr에 +A를 설정하면 atime을 기록하지 않는다.
정상 ㅅ러정 여부 확인은 lsattr의 결과값중 A 필드가 설정되었는지 확인해 보면된다.
# lsattr -d /var/www/html/
-------------e- /var/www/html/
# chattr +A /var/www/html
# lsattr -d /var/www/html/
-------A-----e- /var/www/html/
4.1.3.1 테스트
파일 상태를 확인할 수 있는 stat의 명령어는 포맷을 지정할 수 있는 -c 옵션이 있다.
지정할 수 있는 포맷중 %x는 access time, %y는 modification time, %z는 change time이다.
파일의 atime을 확인한 후 read()를 수행하는 명령어(cat,vi등)을 수행한 후에 atime을 확인하여 변경되지 않았으면 정성 적용된 것이다.
4.2 파일 수정.
/ 디렉토리에 대한 디스크 매개 변수에 약간의 쓰기 권한을 적용.
UUID=XXXXXX / ext4 errors=remount-ro 0 1
에 아래와 같이 변경.
UUID=XXXXXX / ext4 noatime,nodelalloc,barrier=0,i_version,commit=30,inode_readahead_blks=64,errors=remount-ro 0 1
temfs 수정
tmpfs /tmp tmpfs noatime,nodiratime,nodev,nosuid,mode=1777,size=1G,defaults 0 0
tmpfs /var/tmp tmpfs noatime,nodiratime,nodev,nosuid,mode=1777,size=1G,defaults 0 0
"size=1G"에 대해 이 매개 변수를 사용하여,
tmpfs 파일 시스템을 제한 한다.
제한하지 않으면 사용 가능한 램의 절반을 "사용"한다.
그러나 램에대해 "예약" 하지 않는다.
df -h 명령을 사용해 현재 시스템에서 1GB가 잘 작동해 설정 했음.
df -h
tmpfs 1.0G 0 1.0G 0% /var/tmp
/dev/sda1 916G 1.3G 869G 1% /home
tmpfs 3.2G 0 3.2G 0% /run/user/0
tmpfs 3.2G 0 3.2G 0% /run/user/1000
5. sysctl
vi /etc/sysctl.conf
vm.swappiness=1
vm.vfs_cache_pressure=50
vm.dirty_writeback_centisecs=1500
5.1 재 부팅
reboot
6. /etc/xdg/autostart
이 디렉토리 파일은 /etc/X11의 Xsession 스크립트에 의해 실행됨.
파일을 살펴보면 일부는 특정 그래픽 인터페이스에서만 실행된다는 것을 알 수 있다.
KDE에 맞게 조정되어 있어 몇 가지를 삭제한다.
파일 백업.
cp -a /etc/xdg/autostart /etc/xdg/autostart_orgi
*at-spi-dbus-bus.desktop
*gnome-keyring-secrets.desktop
*snap-userd-autostart.desktop
*gnome-keyring-ssh.desktop
*baloo_file.desktop
*spice-vdagent.desktop
*blueman.desktop
*gnome-welcome-tour.desktop
*update-notifier.desktop
*gnome-initial-setup-copy-worker.desktop
*kdeconnectd.desktop
*user-dirs-update-gtk.desktop
*gnome-initial-setup-first-login.desktop
*orca-autostart.desktop
*xdg-user-dirs.desktop
*gnome-keyring-pkcs11.desktop
*org.gnome.DejaDup.Monitor.desktop
7) TLP(노트북 참고)
화면 밝기 조정
apt install tlp
충전 임계 값 설정.
/etc/default/tlp
# Battery charge thresholds (ThinkPad only, tp-smapi or acpi-call kernel module
# required). Charging starts when the remaining capacity falls below the
# START_CHARGE_THRESH value and stops when exceeding the STOP_CHARGE_THRESH value.
# Main / Internal battery (values in %)
#START_CHARGE_THRESH_BAT0=75
#STOP_CHARGE_THRESH_BAT0=80
# Ultrabay / Slice / Replaceable battery (values in %)
#START_CHARGE_THRESH_BAT1=75
#STOP_CHARGE_THRESH_BAT1=80
8) Preload
apt install preload
/etd/default/preload 구성 파일이 있다
아 파일 옵션에 디스크 사용을 줄이는 옵션이 있음.
디스크 활동 줄이기 옵션 활성화.
OPTIONS="-l /dev/null"
9) 불필요한 시스템 서비스 비활성화.
systemctl disable mpd.socket
systemctl disable snapd
systemctl disable avahi-daemon
systemctl disable apparmor
systemctl disable ModemManager
systemctl mask ModemManager
systemctl disable NetworkManager-wait-online
systemctl mask NetworkManager-wait-online
systemctl disable nmbd --> 서비스 하므로 활성화
systemctl disable smbd --> 서비스 하므로 활성화
systemctl disable ssh ---> 개발환경이기 때문에 활성화.
systemctl disable lm-sensors
systemctl mask lm-sensors
systemctl mask apparmor
systemctl mask bluetooth
systemctl mask speech-dispatcher
systemctl mask pppd-dns
systemctl mask accounts-daemon
systemctl mask apport
분석
systemd-analyze time
systemd-analyze blame
1. 낮은 시간 대기 안정적 커널 다운로드.
1.1 커널 다운로드
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.17.1/linux-headers-4.17.1-041701_4.17.1-041701.201806111730_all.deb
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.17.1/linux-headers-4.17.1-041701-lowlatency_4.17.1-041701.201806111730_amd64.deb
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.17.1/linux-image-unsigned-4.17.1-041701-lowlatency_4.17.1-041701.201806111730_amd64.deb
http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.17.1/linux-modules-4.17.1-041701-lowlatency_4.17.1-041701.201806111730_amd64.deb
1.1.1 커널소스 다운로드 및 컴파일 예제.
커널 4.7.5 이상의 우분투에서 메인 라인 커널로 부팅
CONFIG_UEVENT_HELPER설정 하지 않으면 일부 머신은 "루트를 찾을 수 없음" 커널 패닉.
우분투 커널 4.6.x 이하의 경우에서만 발생.
4.7.5에서는 그러지 않음.
소스 다운로드
git clone --branch v4.7.5 --depth 1 git://git.launchpad.net/~ubuntu-kernel-test/ubuntu/+source/linux/+git/mainline-crack
-p1( http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.7.5/ )를 사용 하여 메인 라인의 모든 패치를 적용
이미 설치된 기본 커널 /boo /what에서 .config로 구성을 복사
ONFIG_UEVENT_HELPER = y 및 CONFIG_UEVENT_HELPER_PATH = ""를 사용하도록 편집
커널 컴파일.
fakeroot make-kpkg --initrd --revision=4.7.5.pjf kernel_image kernel_headers -j8
*.deb files are created in directory above this one.
1.1.2 실 장비 컴파일.
git clone --branch v4.17.1 --depth 1 git://git.launchpad.net/~ubuntu-kernel-test/ubuntu/+source/linux/+git/mainline-crack
패치 파일 확인.
https://kernel.ubuntu.com/~kernel-ppa/mainline/v4.17.1/
-p 옵션으로 패치 적용.
fakeroot make-kpkg --initrd --revision=4.7.5.pjf kernel_image kernel_headers -j8
1.2 커널 설치
dpkg -i *.deb
1.3 시스템 재부팅
reboot
2) cron TRIM 설정
2.1 하드디스크 지원 확인.
DISC-MAX 열이 0B가 아닌 경우 lsblk -D를 시도 하고 TRIM/discard를 사용 가능함.
lsblk -D
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda 0 0B 0B 0
└─sda1 0 0B 0B 0 ---> TRIM 사용할 수 없음.
nvme0n1 0 512B 2T 0 ---> 사용할 수 있음.
├─nvme0n1p1 0 512B 2T 0
├─nvme0n1p2 0 512B 2T 0
├─nvme0n1p3 0 512B 2T 0
├─nvme0n1p4 0 512B 2T 0
└─nvme0n1p5 0 512B 2T 0
nvme1n1 0 512B 2T 0
├─nvme1n1p1 0 512B 2T 0
└─nvme1n1p2 0 512B 2T 0
2.2 TRIM 활성화.
vi /etc/cron.weekly/fstrim
#!/bin/sh
/sbin/fstrim --all || true
2.2.1 실행권한 부여
sudo chmod +x /etc/cron.weekly/fstrim
3. grub 설정
3.1 배경 지식
CFO(Completey Fair Queuing) 스케줄.
레드햇 엔트프라이즈 Linux 4의 기본 알고리즘.
확장 가능한 프로세스 별 I/O 대기열 유지하고 사용 가능한 I/O 대역폭을 모든 I/O에 균등하게 분배 하려고 한다.
I/O 요청에 대한 I/O 대기 시간을 최소화한다.
스케줄러는 거의 실시간 동작을 제공하고 라운드 로분 정책을 사용하여 I/O 요청간에 공정성을 유지시켜 프로세스 고갈을 피한다.
스케줄러는 5개의 I/O 대기 열을 사용하여 요청을 적즉적으로 다시 정럴하여 I/O 성능을 향상 시키니다.
NOOP 스케줄러는 간단한 FIFO 대기열이며 I/O당 최소량의 CPU/명령을 사용하여 I/O를 완료 하기 위한 기본 병합 및 정렬 기능을 수행한다.
I/O 성능이 블록 장치(메모리 디스크) 또는 지능형 HBA 또는 외부에 연결된 컨트롤러에서 최적화되었거나 최적화 된 것으로 가정한다.
실 환경에서는 베어 메탈에 운영 체제가 설치되어 있으므로 워크로드에 가장 적합한 알고리즘을 선택해야 한다.
가상 세계에는 OS와 디스크 사이에 하이퍼 바이저가 있으며 하이버 바이저에는 자체 디스크 큐가 있다.
이러한 현실 때문에 일어나는 일들을 나열해 본다.
1. VM에 디스크 I/O 발생
2. 케스트 OS는 CPU 시간을 사용하여 활성화 된 디스크 알고리즘 기반으로 I/O를 이장적인 순서로 정력한다.
3. 게스트 OS는 기본 가상 하드웨어에 새로운 수서로 요청한다
4. 하이퍼 바이저는 해당 요청을 가져와 자체 알고리즘 기반으로 다시 정렬한다.
5. 하이퍼 바이저는 자체 순서에 따라 실제 하드웨어에 요청한다.
하이퍼 바이저가 자체 디스크 큐에 대해 저체 정렬을 수행마므로 게스트 OS에서 동일한 작업을 시도하는 지점은 거의 없다.
최소한 게스트 OS는 약간의 대기 시간을 발생시키고 일부 CPU 주기를 낭비한다.
최악의 경우 하이퍼 바이저 및 백엔드 스토리지가 어려운 사항에 처한게 된다.(I/O 블랜더)
NOOP 스케줄러 전환하면 게스트 OS는 I/O를 통과하기 전에 가능한 한 저게 I/O를 숭행 하므로 가상 환경에 적합하다.
elevator = noop 지원 및 위치 확인.
cat /sys/block/sda/queue/scheduler
noop deadline [cfq]
[cfq]는 활성 스케줄러이다.
NOOP로 전환하려면 부트러도에 기본 커널 매개 변수를 추가해야한다.
elevator = noop
3.2 SSD 디스크 대기열 비활성화.
3.2.1 부트로더 수정
vi /etc/default/grub
GRUB_CMDLINE_LINUX="elevator=noop"
3.2.2 적용
sudo update-grub
재부팅 후 스케줄러 변경을 확인한다.
cat /sys/block/sda/queue/scheduler
[noop] deadline cfq
noop가 선택 됨.
4 하드디스크 마운트 정보 수정 /etc/fstab
4.1 sata POSIX 표준 함수
- 메뉴얼 페치지 확인.
man -s 2 stat
int stat(const char *path, struct stat *buf);
4.1.1 struct stat 구조
메타 데이타 확인 사항 키워드
st_atime, st_mtime, st_ctime
st_atime: 파일에 접근한 최종 시간, mknod, execve, pipe, read 함수를 실행할 때 변경 됨.
st_mtime: 파일이 변경된 시간, mknode, truncate, utime, write 함수 실행 경우 변경
st_ctime: 상태 변경 시간으로 소유자나, 소유그룹, 링크, mode 등 innode 관련 정보 변경 시간.
File IO가 많이 발생하는 웹 서비스의 경우 I/O 처리는 Contents를 읽어서 클라이언트에게 보내주기 위해 File에 대해 수행하는 read 연산이다.
POXIX 표준.
read 연산도 파일이나 디렉토리의 메타 데이터중 st_atime(access time)을 변경하게 되며 이는 IO 성능에 나쁜 영향을 주게된다.
이를 매번 기록하지 않는다면 File IO의 성능은 많이 향상된다.
이런 기능을 noatime(no access time)이라고 하며 mount나 chattr의 명령으로 파일 시스템 전체, 또는 개별 파일마다 접근 시간 기록 여분를 설정 할 수 있다.
4.1.2 fstab notime 설정
vi /etc/fstab
/dev/mapper/vg_linux-lv_home /var ext4 defaults,noatime 1 2
4.1.3 chattr 파일/디렉토리마다 지정
fie의 attributes를 설정하는 chattr 명령어를 사용하여 atime 옵션으로 마운트된 file system에서 특정 파일/디렉토리만 notime을 적용할 수 있다.
chattr에 +A를 설정하면 atime을 기록하지 않는다.
정상 ㅅ러정 여부 확인은 lsattr의 결과값중 A 필드가 설정되었는지 확인해 보면된다.
# lsattr -d /var/www/html/
-------------e- /var/www/html/
# chattr +A /var/www/html
# lsattr -d /var/www/html/
-------A-----e- /var/www/html/
4.1.3.1 테스트
파일 상태를 확인할 수 있는 stat의 명령어는 포맷을 지정할 수 있는 -c 옵션이 있다.
지정할 수 있는 포맷중 %x는 access time, %y는 modification time, %z는 change time이다.
파일의 atime을 확인한 후 read()를 수행하는 명령어(cat,vi등)을 수행한 후에 atime을 확인하여 변경되지 않았으면 정성 적용된 것이다.
4.2 파일 수정.
/ 디렉토리에 대한 디스크 매개 변수에 약간의 쓰기 권한을 적용.
UUID=XXXXXX / ext4 errors=remount-ro 0 1
에 아래와 같이 변경.
UUID=XXXXXX / ext4 noatime,nodelalloc,barrier=0,i_version,commit=30,inode_readahead_blks=64,errors=remount-ro 0 1
temfs 수정
tmpfs /tmp tmpfs noatime,nodiratime,nodev,nosuid,mode=1777,size=1G,defaults 0 0
tmpfs /var/tmp tmpfs noatime,nodiratime,nodev,nosuid,mode=1777,size=1G,defaults 0 0
"size=1G"에 대해 이 매개 변수를 사용하여,
tmpfs 파일 시스템을 제한 한다.
제한하지 않으면 사용 가능한 램의 절반을 "사용"한다.
그러나 램에대해 "예약" 하지 않는다.
df -h 명령을 사용해 현재 시스템에서 1GB가 잘 작동해 설정 했음.
df -h
tmpfs 1.0G 0 1.0G 0% /var/tmp
/dev/sda1 916G 1.3G 869G 1% /home
tmpfs 3.2G 0 3.2G 0% /run/user/0
tmpfs 3.2G 0 3.2G 0% /run/user/1000
5. sysctl
vi /etc/sysctl.conf
vm.swappiness=1
vm.vfs_cache_pressure=50
vm.dirty_writeback_centisecs=1500
5.1 재 부팅
reboot
6. /etc/xdg/autostart
이 디렉토리 파일은 /etc/X11의 Xsession 스크립트에 의해 실행됨.
파일을 살펴보면 일부는 특정 그래픽 인터페이스에서만 실행된다는 것을 알 수 있다.
KDE에 맞게 조정되어 있어 몇 가지를 삭제한다.
파일 백업.
cp -a /etc/xdg/autostart /etc/xdg/autostart_orgi
*at-spi-dbus-bus.desktop
*gnome-keyring-secrets.desktop
*snap-userd-autostart.desktop
*gnome-keyring-ssh.desktop
*baloo_file.desktop
*spice-vdagent.desktop
*blueman.desktop
*gnome-welcome-tour.desktop
*update-notifier.desktop
*gnome-initial-setup-copy-worker.desktop
*kdeconnectd.desktop
*user-dirs-update-gtk.desktop
*gnome-initial-setup-first-login.desktop
*orca-autostart.desktop
*xdg-user-dirs.desktop
*gnome-keyring-pkcs11.desktop
*org.gnome.DejaDup.Monitor.desktop
7) TLP(노트북 참고)
화면 밝기 조정
apt install tlp
충전 임계 값 설정.
/etc/default/tlp
# Battery charge thresholds (ThinkPad only, tp-smapi or acpi-call kernel module
# required). Charging starts when the remaining capacity falls below the
# START_CHARGE_THRESH value and stops when exceeding the STOP_CHARGE_THRESH value.
# Main / Internal battery (values in %)
#START_CHARGE_THRESH_BAT0=75
#STOP_CHARGE_THRESH_BAT0=80
# Ultrabay / Slice / Replaceable battery (values in %)
#START_CHARGE_THRESH_BAT1=75
#STOP_CHARGE_THRESH_BAT1=80
8) Preload
apt install preload
/etd/default/preload 구성 파일이 있다
아 파일 옵션에 디스크 사용을 줄이는 옵션이 있음.
디스크 활동 줄이기 옵션 활성화.
OPTIONS="-l /dev/null"
9) 불필요한 시스템 서비스 비활성화.
systemctl disable mpd.socket
systemctl disable snapd
systemctl disable avahi-daemon
systemctl disable apparmor
systemctl disable ModemManager
systemctl mask ModemManager
systemctl disable NetworkManager-wait-online
systemctl mask NetworkManager-wait-online
systemctl disable nmbd --> 서비스 하므로 활성화
systemctl disable smbd --> 서비스 하므로 활성화
systemctl disable ssh ---> 개발환경이기 때문에 활성화.
systemctl disable lm-sensors
systemctl mask lm-sensors
systemctl mask apparmor
systemctl mask bluetooth
systemctl mask speech-dispatcher
systemctl mask pppd-dns
systemctl mask accounts-daemon
systemctl mask apport
분석
systemd-analyze time
systemd-analyze blame
보안장비 6.0 기반 웹 서버 활성화.
보안장비 6.0 웹서비스
/etc/apache2/sites-available
/etc/apache2/sites-available/kerberosis.nemo.lan.conf
<VirtualHost *:80>
#ServerAdmin admin@nemo.lan
ServerName kerberosis.nemo.lan:80
DocumentRoot /srv/www/kerberosis.nemo.lan
ErrorLog /var/log/apache2/kerberosis.nemo.lan-error.log
CustomLog /var/log/apache2/kerberosis.nemo.lan-access.log lanbined
</VirtualHost>
<Directory /srv/www/kerberosis.nemo.lan>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
6.0 보안 서버 접근
touch /etc/apache2/sites-available/kerberosis.nemo.lan.conf
vi /etc/apache2/sites-available/kerberosis.nemo.lan.conf
<VirtualHost *:80>
#ServerAdmin admin@nemo.lan
ServerName kerberosis.nemo.lan:80
DocumentRoot /srv/www/kerberosis.nemo.lan
ErrorLog /var/log/apache2/kerberosis.nemo.lan-error.log
CustomLog /var/log/apache2/kerberosis.nemo.lan-access.log lanbined
</VirtualHost>
<Directory /srv/www/kerberosis.nemo.lan>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
mkdir -p /sr/www/kerberosis.nemo.lan
사이트 활성화.
sudo a2ensite
웹 서버 다시 로드.
sudo service apache2 reload
보안장비 웹 관리자 이동
DNS 생성.
보안설정 80 http 활성화.
/etc/apache2/sites-available
/etc/apache2/sites-available/kerberosis.nemo.lan.conf
<VirtualHost *:80>
#ServerAdmin admin@nemo.lan
ServerName kerberosis.nemo.lan:80
DocumentRoot /srv/www/kerberosis.nemo.lan
ErrorLog /var/log/apache2/kerberosis.nemo.lan-error.log
CustomLog /var/log/apache2/kerberosis.nemo.lan-access.log lanbined
</VirtualHost>
<Directory /srv/www/kerberosis.nemo.lan>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
6.0 보안 서버 접근
touch /etc/apache2/sites-available/kerberosis.nemo.lan.conf
vi /etc/apache2/sites-available/kerberosis.nemo.lan.conf
<VirtualHost *:80>
#ServerAdmin admin@nemo.lan
ServerName kerberosis.nemo.lan:80
DocumentRoot /srv/www/kerberosis.nemo.lan
ErrorLog /var/log/apache2/kerberosis.nemo.lan-error.log
CustomLog /var/log/apache2/kerberosis.nemo.lan-access.log lanbined
</VirtualHost>
<Directory /srv/www/kerberosis.nemo.lan>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
mkdir -p /sr/www/kerberosis.nemo.lan
사이트 활성화.
sudo a2ensite
웹 서버 다시 로드.
sudo service apache2 reload
보안장비 웹 관리자 이동
DNS 생성.
보안설정 80 http 활성화.
보안장비 6.0
가상 머신 관리자.
================
KVM 스위치(입력, 출력, 디바이스를 공유하는 스위치)와 혼동하면 안된다.
단어 용약 정리.
1. 하이퍼바어저
hypervisor는 호스트 컴퓨터에서 다수의 운영 체제(operating system)를 동시에 실행하기 위한 논리적 플랫폼(platform)을 말한다.
하나의 컴퓨터 시스템에서 여러 개의 운영 체계(OS)를 가동할 수 있게 하는 가상화 엔진.
하이퍼바이저 방식에는 물리 컴퓨터의 하드웨어상에서 하이퍼바이저를 직접 동작시키는 네이티브(native) 또는 베어메탈(bare-metal) 방식이 있고,
호스트 OS 위에 하이퍼바이저를 설치하고 그 위에서 게스트 OS를 동작시키는 호스트형이 있다.
2. 라이센스
GPL 코드를 일부라도 사용하게 되면 그 프로그램은 GPL이 된다.
유료 판매는 가능하나, 코드를 공개해야 한다.
GPL 코드를 사용한 SW는 내부적인(개인, 기관, 단체 등)목적으로 사용시 소스코드 공개할 필요능 없다.
외부에 공개 할 때는 전체 소스를 공개해야 함.(유료, 무료)
프로그램의 특정 부분이 GPL 코드로 부터 패생된 것이 아닌 독립적인 저작물일 경우에는 독립 저작물 모듈의 개별적인 배포에는 GPL 적용되지 않는다.
(즉, 코드를 공개할 필요가 없다)
코드를 공개 할 때는 GPL을 따라서 전체코드 공개.
GPL과 관련디지 아니한 부분만 독립적으로 판매, 배포하는 경우는 관계 없다.
GPL 코드를 일부라도 사용한 프로그램 전체를 배포할 때에는 GPL을 적용(전체코드 공개)해야 한다.
GNU LGPL(Lesser General Public License)
LGPL 코드를 정적(static) 또는 동적(dynamic) 라이브러리로 사용한 프로그램을 개발하여 판매/배포할 경우에 프로그램의 소스코드를 공개하지 않아도 된다
LGPL 코드를 사용했음을 명시만 하면됨.
LGPL 코드를 단순히 이용하는 것이 아니라 이를 수정한 또는 이로부터 파생된 라이브러리를 개발하여 배포하는 경우에는 전체 코드를 공개
BSD (Berkeley Software Distribution) License
소스코드 공개의 의무가 없으며 상용(상업적) 소프트웨어에서도 무제한 사용 가능한 라이센스
OpenCV는 BSD 라이센스.
MIT License
MIT license는 copyright와 license에 대한 정보만 표기하면 자유롭게 사용할 수 있는 라이센스인데, 상업적인사용, 배포, 수정 및 개인적인 사용이 모두 가능.
3. 커널 가성 머신
Kernel-base Virtual Machine, KVM은 리눅스 커널 하이퍼바이저로 변환하기 위한 가상화 인프라스트럭처의(기반 구조)의 하나이다.
2007년 2월 5일에 출시된 커널 버전 2.6.20의 리눅스 커널 메인라인에 병합되었다.
KVM은 하드웨어 가상화 확장을 갖춘 프로세서가 필요하다.
KVM은 적재 가능한 커널 모듈의 형태로 FreeBSD, 알루모스에도 포팅되었음.
3.1 라이선스
KVM의 일부는 다양한 GNU 라이선스로 구성되어 있다:[5]
KVM 커널 모듈: GPL v2
KVM 사용자 모듈: LGPL v2
QEMU 가상 CPU 코어 라이브러리 (libqemu.a) 및 QEMU PC 시스템 에뮬레이터: LGPL
리눅스 사용자 모드 QEMU 에뮬레이터: GPL
BIOS 파일 (bios.bin, vgabios.bin, vgabios-cirrus.bin): LGPL v2 이상
3.2 Feautres(특징)
- Over-committing : 시스템에서 사용 가능한 리소스보다 더 많은 가상화 된 CPU 또는 메모리를 할당하는 것을 의미
- Thin provisioning : 유연한 스토리지를 할당하고 모든 게스트 가상 머신에 사용 가능한 공간을 최적화
- Disk I/O throttling : 가상 시스템에서 호스트 시스템으로 전송되는 디스크 I / O 요청에 대한 제한을 설정하는 기능을 제공
- Automatic NUMA balancing : NUMA 하드웨어 시스템에서 실행되는 응용 프로그램의 성능을 향상
- Virtual CPU hot add capability : 실행중인 가상 머신에서 필요에 따라 처리 능력을 향상 시킨다.
interl 하드웨어 가상화 확장 체크
grep -e 'vmx' /proc/cpuinfo
amd 하드웨어 가상화 확장 체크
grep -e 'svm' /proc/cpuinfo
메세지가 없으면 BIOS 가상화 체크 확인.
kvm 모듈 사용 체크(기본적 로드 됨)
4. 보안장비 가상 머신.
사용자 추가 해 줘야 함. (AD)
그래야 schema object present가 동작한다.
4.1 가상 머신 생성
4.1.1 가상 머신 생성 테이블
4.2 설정
4.2.1 운영체제 선택
4.2.2 32bit, 64bit
4.3.3 RAM
- 기본값 512MB
4.2 가상머신 네트워크 설정
4.3 가상머신 하드웨어 설정
- cd/dvd
- hard Disk
4.4 가상 머신 디렉토리 경로
/var/lib/fairline/machines/test
4.5 vpn 인증서
보안장비 관리자 웹 인터페이스
클라이언트 인증 속성 파일 VPN/Servers/Configuration 위치.
비 활성화 하면 보안장비에서 생성 한 인증서를 가진 모든 클라이언트는 연결할 수 있다.
활성화 하면 CN 에서 선택한 인증서 내용으로 연결 할 수 있다.
이 필드를 비활성화로 설정하면 보안장비에서 발급한 인증서를 사용해 OpenVPN 클라이언트와 연결된다.
재현 하기.
보안장비 로그인 및 VPN 모듈 활성화.
VPN 로깅 사용 가능한지 확인.
인증기관 -> 일반 이동 -> 새 인증서 발생.
SomeExamplePrefix
또다른 인증서 발생.
SomeExamplePrefixForSomeClient
VPN -> Server 이동
보안장비 하위 네트워크를 알리는 단일 서버 구성.
서버의 구성에서 일반 이름으로 클라이언트 권한 부여 후 SomeExamplePrefixForSomeClient 인증서 선택.
(다른 필드에 값들은 필요에 따라 설정한다)
SomeExamplePrefixForSomeClient를 클라이언트의 인증서로 사용하여 클라이언트 번들 다운로드 한다.
(다른 필드에 값들은 필요에 따라 설정한다)
클라이언트 OpenVPN을 설치하고 다운로드 한 클라이언트 번들을 사용해 보안장비 관리하는 네트워크 말고 다른 네트워크 망에서 연결한다.
연결할 수 없음.
보안장비 보고서 (VPN 로그)를 확인.
인증서 공통 이름이 인증되지 않음.
(참고: 현 테스트 국가 코드 C=US로 원격 인증서를 식별, 보안장비에서 잘못된 속성을 보고 할 수 있음.)
VPN -> 서버 -> 구성으로 이동
일반 이름 인증서로 클라이언트 권한 부여 사용 안함 변경.
클라이언트에서 VPN 연결 하면 성공된다.
보안장비의 인증서 값 SomeExamplePrefixForSomeClient 성공적 연결 확인.
예상.
CN(공통 이름) 필드가 인증서에서 지정된 클라이언트 권한 부여의 CN 필드로 시작하는 클라이언트 인증서를 사용하는 VPN 연결,
(이 인증서는 CN의 보안장비 관리 인증 기관에 의해 발행되고 최소되지 않음) 수락해야 한다.
다른 모든 클라이언트 인증서는 거부해야 한다.
4.6 vpn CRL 30일 만료.
openssl crl -text -noout -in /var/lib/fairline/CA/crl/latest.pem
두 개의 필드가 구체적으로 표시된다.
마지막 업데이트 Last Update : xxx
다음 업데이트 Next Update : xxx + 1 개월
CRL 기본 시간 변경.
/var/lib/fairline/conf/openssl.cnf
default_crl_days= 3650
4.7 FBox::Module::LDAP::_sendSchemaUpdate - Error sending schema update
sudo find /usr/share -iname schema*.ldif -exec ls -l {} \;
4.8 ldap 초기화.
- fairline-mail schemas
sudo -s # this will prompt your for password to get superuser access
/usr/share/fairline-mail/mail-ldap update
perl -MFBox -MFBox::Global -e'FBox::init(); $mod = FBox::Global->modInstance('mail'); $mod->reprovisionLDAP(); 1'
fs webadmin restart
exit # exit superuser account
- fairline-mailfilter:
sudo -s # this will prompt your for password to get superuser access
perl -MFBox -MFBox::Global -e'FBox::init(); $mod = FBox::Global->modInstance('mailfilter'); $mod->reprovisionLDAP(); 1'
fs webadmin restart
exit # exit superuser account
Can't locate object method "_ldapSetup" via package "FBox::MailFilter" at /usr/share/perl5/FBox/MailFilter.pm line 209.
4.9 스키마 오류
유효하지 않은 필터를 사용한 검색 또는 스키마 수정 요청 일 수 있으며 주어진 스키마에 잘못된 구문이 있습니다.
20191206 --- 여기서 가상화 안정화 부분 연구 대기 상태.
- 필요한 모듈만 화상화 해 놓은 상태임.
- 생성된 가상화 파일 삭제.
- 현재 가상 머신 모듈과 LDAP 통신 문제 발생(이 부분 나중 해결 하기로 나겨 둠)
- 지금 해야 할 부분을 하기 위해(NVR 작업)
5. 가상 머신 유지 관리.
VNC 프로토콜 사용
- 터미널 접근 팝업창 생성.
보안장비 GUI
시작 멈춤
가상 머신 시작, 중지, 일시 정지 제어 가능
6. vmware tools
6.1 open vm tools 설치
sudo apt-get install open-vm-tools
가상 머신 브릿지 네트워크 만들기.
network -> Network Interface
eth0 -> 브리지 설정 후 -> br1 설정
br1 DHCP
Virual Machines -> dm-experiments(가상머신 이름) -> Network Settings
체크 : Enabled
Type: Bridged
Bridged to : Nome
MAC Address: 00:!F:0A:F4:19:88
해결 방법.
https://wiki.libvirt.org/page/Networking#Debian.2FUbuntu_Bridging
manage.sh 인터페이스 세션 편집
<interface type='bridge'>
<source bridge='br1'/>
<mac address='00:1F:0A:F4:19:88'/>
</interface>
cd /var/lib/fairline/machines/dm-experiments
vi /var/lib/fairline/machines/dm-experiments/domain.xml
#change interface section
./manage.sh edit
웹 UI를 변경하면 다시 설정
젠트라 설치 및 vm 자료
https://sourceforge.net/projects/zentyal/files/Old%20versions/
계정 및 패스워드 : zentyal/zentyal
zip 압축 해제 후, .vdi .vmdk 이미지 파일로 가상머신을 만들어야 한다.
가상 머신 관리자.
================
KVM 스위치(입력, 출력, 디바이스를 공유하는 스위치)와 혼동하면 안된다.
단어 용약 정리.
1. 하이퍼바어저
hypervisor는 호스트 컴퓨터에서 다수의 운영 체제(operating system)를 동시에 실행하기 위한 논리적 플랫폼(platform)을 말한다.
하나의 컴퓨터 시스템에서 여러 개의 운영 체계(OS)를 가동할 수 있게 하는 가상화 엔진.
하이퍼바이저 방식에는 물리 컴퓨터의 하드웨어상에서 하이퍼바이저를 직접 동작시키는 네이티브(native) 또는 베어메탈(bare-metal) 방식이 있고,
호스트 OS 위에 하이퍼바이저를 설치하고 그 위에서 게스트 OS를 동작시키는 호스트형이 있다.
2. 라이센스
GPL 코드를 일부라도 사용하게 되면 그 프로그램은 GPL이 된다.
유료 판매는 가능하나, 코드를 공개해야 한다.
GPL 코드를 사용한 SW는 내부적인(개인, 기관, 단체 등)목적으로 사용시 소스코드 공개할 필요능 없다.
외부에 공개 할 때는 전체 소스를 공개해야 함.(유료, 무료)
프로그램의 특정 부분이 GPL 코드로 부터 패생된 것이 아닌 독립적인 저작물일 경우에는 독립 저작물 모듈의 개별적인 배포에는 GPL 적용되지 않는다.
(즉, 코드를 공개할 필요가 없다)
코드를 공개 할 때는 GPL을 따라서 전체코드 공개.
GPL과 관련디지 아니한 부분만 독립적으로 판매, 배포하는 경우는 관계 없다.
GPL 코드를 일부라도 사용한 프로그램 전체를 배포할 때에는 GPL을 적용(전체코드 공개)해야 한다.
GNU LGPL(Lesser General Public License)
LGPL 코드를 정적(static) 또는 동적(dynamic) 라이브러리로 사용한 프로그램을 개발하여 판매/배포할 경우에 프로그램의 소스코드를 공개하지 않아도 된다
LGPL 코드를 사용했음을 명시만 하면됨.
LGPL 코드를 단순히 이용하는 것이 아니라 이를 수정한 또는 이로부터 파생된 라이브러리를 개발하여 배포하는 경우에는 전체 코드를 공개
BSD (Berkeley Software Distribution) License
소스코드 공개의 의무가 없으며 상용(상업적) 소프트웨어에서도 무제한 사용 가능한 라이센스
OpenCV는 BSD 라이센스.
MIT License
MIT license는 copyright와 license에 대한 정보만 표기하면 자유롭게 사용할 수 있는 라이센스인데, 상업적인사용, 배포, 수정 및 개인적인 사용이 모두 가능.
3. 커널 가성 머신
Kernel-base Virtual Machine, KVM은 리눅스 커널 하이퍼바이저로 변환하기 위한 가상화 인프라스트럭처의(기반 구조)의 하나이다.
2007년 2월 5일에 출시된 커널 버전 2.6.20의 리눅스 커널 메인라인에 병합되었다.
KVM은 하드웨어 가상화 확장을 갖춘 프로세서가 필요하다.
KVM은 적재 가능한 커널 모듈의 형태로 FreeBSD, 알루모스에도 포팅되었음.
3.1 라이선스
KVM의 일부는 다양한 GNU 라이선스로 구성되어 있다:[5]
KVM 커널 모듈: GPL v2
KVM 사용자 모듈: LGPL v2
QEMU 가상 CPU 코어 라이브러리 (libqemu.a) 및 QEMU PC 시스템 에뮬레이터: LGPL
리눅스 사용자 모드 QEMU 에뮬레이터: GPL
BIOS 파일 (bios.bin, vgabios.bin, vgabios-cirrus.bin): LGPL v2 이상
3.2 Feautres(특징)
- Over-committing : 시스템에서 사용 가능한 리소스보다 더 많은 가상화 된 CPU 또는 메모리를 할당하는 것을 의미
- Thin provisioning : 유연한 스토리지를 할당하고 모든 게스트 가상 머신에 사용 가능한 공간을 최적화
- Disk I/O throttling : 가상 시스템에서 호스트 시스템으로 전송되는 디스크 I / O 요청에 대한 제한을 설정하는 기능을 제공
- Automatic NUMA balancing : NUMA 하드웨어 시스템에서 실행되는 응용 프로그램의 성능을 향상
- Virtual CPU hot add capability : 실행중인 가상 머신에서 필요에 따라 처리 능력을 향상 시킨다.
interl 하드웨어 가상화 확장 체크
grep -e 'vmx' /proc/cpuinfo
amd 하드웨어 가상화 확장 체크
grep -e 'svm' /proc/cpuinfo
메세지가 없으면 BIOS 가상화 체크 확인.
kvm 모듈 사용 체크(기본적 로드 됨)
4. 보안장비 가상 머신.
사용자 추가 해 줘야 함. (AD)
그래야 schema object present가 동작한다.
4.1 가상 머신 생성
4.1.1 가상 머신 생성 테이블
4.2 설정
4.2.1 운영체제 선택
4.2.2 32bit, 64bit
4.3.3 RAM
- 기본값 512MB
4.2 가상머신 네트워크 설정
4.3 가상머신 하드웨어 설정
- cd/dvd
- hard Disk
4.4 가상 머신 디렉토리 경로
/var/lib/fairline/machines/test
4.5 vpn 인증서
보안장비 관리자 웹 인터페이스
클라이언트 인증 속성 파일 VPN/Servers/Configuration 위치.
비 활성화 하면 보안장비에서 생성 한 인증서를 가진 모든 클라이언트는 연결할 수 있다.
활성화 하면 CN 에서 선택한 인증서 내용으로 연결 할 수 있다.
이 필드를 비활성화로 설정하면 보안장비에서 발급한 인증서를 사용해 OpenVPN 클라이언트와 연결된다.
재현 하기.
보안장비 로그인 및 VPN 모듈 활성화.
VPN 로깅 사용 가능한지 확인.
인증기관 -> 일반 이동 -> 새 인증서 발생.
SomeExamplePrefix
또다른 인증서 발생.
SomeExamplePrefixForSomeClient
VPN -> Server 이동
보안장비 하위 네트워크를 알리는 단일 서버 구성.
서버의 구성에서 일반 이름으로 클라이언트 권한 부여 후 SomeExamplePrefixForSomeClient 인증서 선택.
(다른 필드에 값들은 필요에 따라 설정한다)
SomeExamplePrefixForSomeClient를 클라이언트의 인증서로 사용하여 클라이언트 번들 다운로드 한다.
(다른 필드에 값들은 필요에 따라 설정한다)
클라이언트 OpenVPN을 설치하고 다운로드 한 클라이언트 번들을 사용해 보안장비 관리하는 네트워크 말고 다른 네트워크 망에서 연결한다.
연결할 수 없음.
보안장비 보고서 (VPN 로그)를 확인.
인증서 공통 이름이 인증되지 않음.
(참고: 현 테스트 국가 코드 C=US로 원격 인증서를 식별, 보안장비에서 잘못된 속성을 보고 할 수 있음.)
VPN -> 서버 -> 구성으로 이동
일반 이름 인증서로 클라이언트 권한 부여 사용 안함 변경.
클라이언트에서 VPN 연결 하면 성공된다.
보안장비의 인증서 값 SomeExamplePrefixForSomeClient 성공적 연결 확인.
예상.
CN(공통 이름) 필드가 인증서에서 지정된 클라이언트 권한 부여의 CN 필드로 시작하는 클라이언트 인증서를 사용하는 VPN 연결,
(이 인증서는 CN의 보안장비 관리 인증 기관에 의해 발행되고 최소되지 않음) 수락해야 한다.
다른 모든 클라이언트 인증서는 거부해야 한다.
4.6 vpn CRL 30일 만료.
openssl crl -text -noout -in /var/lib/fairline/CA/crl/latest.pem
두 개의 필드가 구체적으로 표시된다.
마지막 업데이트 Last Update : xxx
다음 업데이트 Next Update : xxx + 1 개월
CRL 기본 시간 변경.
/var/lib/fairline/conf/openssl.cnf
default_crl_days= 3650
4.7 FBox::Module::LDAP::_sendSchemaUpdate - Error sending schema update
sudo find /usr/share -iname schema*.ldif -exec ls -l {} \;
4.8 ldap 초기화.
- fairline-mail schemas
sudo -s # this will prompt your for password to get superuser access
/usr/share/fairline-mail/mail-ldap update
perl -MFBox -MFBox::Global -e'FBox::init(); $mod = FBox::Global->modInstance('mail'); $mod->reprovisionLDAP(); 1'
fs webadmin restart
exit # exit superuser account
- fairline-mailfilter:
sudo -s # this will prompt your for password to get superuser access
perl -MFBox -MFBox::Global -e'FBox::init(); $mod = FBox::Global->modInstance('mailfilter'); $mod->reprovisionLDAP(); 1'
fs webadmin restart
exit # exit superuser account
Can't locate object method "_ldapSetup" via package "FBox::MailFilter" at /usr/share/perl5/FBox/MailFilter.pm line 209.
4.9 스키마 오류
유효하지 않은 필터를 사용한 검색 또는 스키마 수정 요청 일 수 있으며 주어진 스키마에 잘못된 구문이 있습니다.
20191206 --- 여기서 가상화 안정화 부분 연구 대기 상태.
- 필요한 모듈만 화상화 해 놓은 상태임.
- 생성된 가상화 파일 삭제.
- 현재 가상 머신 모듈과 LDAP 통신 문제 발생(이 부분 나중 해결 하기로 나겨 둠)
- 지금 해야 할 부분을 하기 위해(NVR 작업)
5. 가상 머신 유지 관리.
VNC 프로토콜 사용
- 터미널 접근 팝업창 생성.
보안장비 GUI
시작 멈춤
가상 머신 시작, 중지, 일시 정지 제어 가능
6. vmware tools
6.1 open vm tools 설치
sudo apt-get install open-vm-tools
가상 머신 브릿지 네트워크 만들기.
network -> Network Interface
eth0 -> 브리지 설정 후 -> br1 설정
br1 DHCP
Virual Machines -> dm-experiments(가상머신 이름) -> Network Settings
체크 : Enabled
Type: Bridged
Bridged to : Nome
MAC Address: 00:!F:0A:F4:19:88
해결 방법.
https://wiki.libvirt.org/page/Networking#Debian.2FUbuntu_Bridging
manage.sh 인터페이스 세션 편집
<interface type='bridge'>
<source bridge='br1'/>
<mac address='00:1F:0A:F4:19:88'/>
</interface>
cd /var/lib/fairline/machines/dm-experiments
vi /var/lib/fairline/machines/dm-experiments/domain.xml
#change interface section
./manage.sh edit
웹 UI를 변경하면 다시 설정
젠트라 설치 및 vm 자료
https://sourceforge.net/projects/zentyal/files/Old%20versions/
계정 및 패스워드 : zentyal/zentyal
zip 압축 해제 후, .vdi .vmdk 이미지 파일로 가상머신을 만들어야 한다.
MariaDB password 설정
MySQL 또는 MariaDB 데이터베이스 서버를 처음 설정하는 경우 기본 보안 설정을 구현하기 위해 mysql_secure_installation 실행하게 된다.
보안 관련 설정에서 가장 중요한 것은 root 데이터 베이스 비밀번호이다.
root 비밀 번호를 분실 했을 경우 복구 하는 방법에 대해 설명한다.
서비스 정지
------------- SystemD -------------
# systemctl stop mariadb
------------- SysVinit -------------
# /etc/init.d/mysqld 중지
--skip-grant-tables 옵션을 사용해 서비스 시작
------------- SystemD -------------
# systemctl set-environment MYSQLD_OPTS = "-skip-grant-tables"
# systemctl start mariadb
# systemctl 상태 mariadb
------------- SysVinit -------------
# mysqld_safe --skip-grant-tables &
데이터 베이스 접근
mysql -u root
패스워드 변경
use mysql;
UPDATE user SET password=PASSWORD('YourNewPasswordHere') WHERE User='root' AND Host = 'localhost';
FLUSH PRIVILEGES;
데이터 베이스 재구동.
------------- SystemD -------------
# systemctl stop mariadb
# systemctl unset-environment MYSQLD_OPTS
# systemctl start mariadb
------------- SysVinit -------------
# /etc/init.d/mysql stop
# /etc/init.d/mysql start
MariaDB 10.4 인증 변경 사항 검토
================================
비밀번호 저장소 변경.
전체 사용자 계정, 비밀번호 및 클로벌 권한 mysql.global_priv 테이블에 저장 된다.
mysql.user 테이블 ?
여전히 존재하며, 그 전과 동일한 테이블 구조를 가지고 있다.
mysql.user 테이블을 사용하는 곳이 있다면 이전 처럼 계속 동작한다.
현재 mariadb 설정 할 수 있는 사용자는 mysql.global_priv 테이블로 이동한 상태이다.
보안 관련 설정에서 가장 중요한 것은 root 데이터 베이스 비밀번호이다.
root 비밀 번호를 분실 했을 경우 복구 하는 방법에 대해 설명한다.
서비스 정지
------------- SystemD -------------
# systemctl stop mariadb
------------- SysVinit -------------
# /etc/init.d/mysqld 중지
--skip-grant-tables 옵션을 사용해 서비스 시작
------------- SystemD -------------
# systemctl set-environment MYSQLD_OPTS = "-skip-grant-tables"
# systemctl start mariadb
# systemctl 상태 mariadb
------------- SysVinit -------------
# mysqld_safe --skip-grant-tables &
데이터 베이스 접근
mysql -u root
패스워드 변경
use mysql;
UPDATE user SET password=PASSWORD('YourNewPasswordHere') WHERE User='root' AND Host = 'localhost';
FLUSH PRIVILEGES;
데이터 베이스 재구동.
------------- SystemD -------------
# systemctl stop mariadb
# systemctl unset-environment MYSQLD_OPTS
# systemctl start mariadb
------------- SysVinit -------------
# /etc/init.d/mysql stop
# /etc/init.d/mysql start
MariaDB 10.4 인증 변경 사항 검토
================================
비밀번호 저장소 변경.
전체 사용자 계정, 비밀번호 및 클로벌 권한 mysql.global_priv 테이블에 저장 된다.
mysql.user 테이블 ?
여전히 존재하며, 그 전과 동일한 테이블 구조를 가지고 있다.
mysql.user 테이블을 사용하는 곳이 있다면 이전 처럼 계속 동작한다.
현재 mariadb 설정 할 수 있는 사용자는 mysql.global_priv 테이블로 이동한 상태이다.
PM2 Process Manager
PM2 는 Process Manager 약자이다.
공식 홈 페이지: https://pm2.keymetrics.io/
소스 프로젝트 : https://github.com/Unitech/pm2
node 프로세스를 관리한다.
node js
구글에서 개발한 자바스크립트 엔진으로 빌드된 서버 사이드 개발용 소프트웨어 플랫폼.
자바 스크립트 웹 브라우저 클라이언트 동작.
Node.js 런타임 환경에서는 모든 종류의 서버 사이드 도구들을 제공하여 자바스크립트로 개발.
클라이언트(Fron-end), 서버(back-end)를 모두 개발 할 수 있음.
웹 개발시 추가 언어 학습이 필요 없음.
node.js 패키지
npm(Node Packaged Manager) 세게에서 가장 큰 오픈 소스.
node.js를 설치시 npm 같이 설치 됨.
서버 개발.
데몬 형태의 응용프로그램 개발.
- 로그 처리
- 프로세스 비 인가 종료(restart)
유사 프로그램
- qmail에 svscan(프로세스가 죽으면 살리는 역활)
프로그램 설치 -g는 글로벌 환경(명령어 디렉토리에 상관없이 명령어 처리)
npm install pm2 -g
프로그램 등록
pm2 start server.js
목록 확인
pm2 list
프로그램 종료.
pm2 list
pm2 stop id넘버.
pm2 stop 0 ---> list id 값이 0을 종료.
등록된 서비스 삭제.
pm2 delete 0 ---> list id 값 확인
서비스 등록시 ID 이름 지정
pm2 start server.js --name "TEST"
그외 start 명령어.
# app.js에 -a 23이라는 인수를 전달
$ pm2 start app.js -- -a 23
# 프로세스 이름을 지정
$ pm2 start app.js -- name servername
# --node-args를 통해 node v8에 옵션값을 전달
$ pm2 start app.js --node-args="--debug=7001"
# cpu를 최대치로 할당(클러스터 전용)
$ pm2 start app.js -i max
# 로그의 시간데이터 포맷을 지정
$ pm2 start app.js --log-date-format "YYYY-MM-DD HH:mm Z"
# 아웃풋 로그와 에러로그의 위치를 지정
$ pm2 start app.js -e err.log -o out.log
# 명령어를 pm2를 실행하는 유저가 아닌 harry로 설정
# 유저그룹은 --run-as-group
$ pm2 --run-as-user harry start app.js
등록 확인.
pm2 list
App name 항목에 보면 TEST 확인.
서비스 상세정보 확인
pm2 show TEST
server.js 파일이 수정 할 경우,
pm2에 TEST 이름을 갖는 대상에 대해 재시작 해줘야 함.(restart)
pm2 인자 수정하는 경우, delete 후 등록
로그 정보
out log path -> 기본 경로 위치.
로그 위치 정보 변경
pm2 delete TEST && pm2 start server.js --name "TEST" -o ./api.log
-o 옵션 처리: stdout 을 처리 함.
-o 옵션 처리: stderr 을 처리 하지 못함.
로그 하드 코딩 시절.
void systemLog(char *log)
{
fopen(api.log)
fwrite(log)
fclose(api.log)
}
open/write에 대한 atomic 보장을 위해 함수 내부에 lock 필요한 언어도 있음.
stderr 처리 -e 옵션
pm2 delete TEST && pm2 start server.js --name "TEST" -o ./api.log -e ./api.log --merge-logs
-e stderr 옵션: 노드 모율 예외 발생(크래 메세지) api.log 파일에서 확인 가능.
pm2 logs #모든 로그 출력
pm2 ilogs #자세한 로그 출력
pm2 flush #모든 로그 비우기
pm2 reloadLogs #로그 다시불러오기
트래픽 제어
서비스가 활성화 되면서 트패픽이 급증할 경우, node.js 처리할 수 가 없음.
트래픽을 받아 async(비동기)로 처리한다고 해도 내부 로직이 복잡해지면, CPU 자원을 감당하지 못한다.
이때 필요한 것이 클러스터이다.
pm2의 클러스터는 분산 컴퓨터 용어와 비슷한 역할을 한다.
server.js 하나의 노드 파일을 지정한 개수만큼 pm2에 등록하고 Load Balancing(LB)를 통해 부하 분산 시킨다.
pm2의 LB은 round robin(RR)방식으로 동작하여 모든것은 옵션 하나로 처리가 충분하다.
-i 옵션을 통해 3개 클러스터 등록
pm2 delete TEST && pm2 start server.js --name "TEST" -i 3 -o ./test.log
패킷 발생.
curl localhost:6985
로그 클러스터 확인.
test.log 클러스터 번호 활당.
test-0.log
test-1.log
test-2.log 로 나눠줘 기록된다.
로그 라운드 로빈(RR) 로드 발란싱(LB)
tail -f test-*
운영중 클러스터 개수 조정.
scale in/out 가능하다.
3개의 클러스터가 돌고 있는 TEST에게 클러스터 5로 변경했다.
scale in/out 설정
pm2 scale TEST 5
중단 명령
pm2 stop all
그외 프로세스 관리
pm2 stop all # 모든 프로세스 멈추기
pm2 restart all # 모든 프로세스 재시작
pm2 reload all # 모든 프로세스의 다운타임을 0으로 설정후 다시로드
pm2 stop 0 # 프로세스 0번을 멈추기
pm2 restart 0 # 프로세스 0번을 재시작
pm2 delete 0 # 프로세스 0번을 삭제
pm2 delete all # 프로세스 전부 삭제
pm2 ping # pm2가 사용가능한지 핑확인
pm2 updatePM #pm2 업데이트
pm2 reset <process> # 리셋 후 메타데이터 리로드
모인터링
- 실시간 로그 확인
- q 단축키 종료.
pm2 monit
시작(start) 명령어
================
쉘 스크립트 작성
================
start.sh
#!/bin/bash
pm2 reload node_yun;
echo 'Reload pm2 demon...';
sleep 1;
sudo service nginx restart;
echo 'Restart nginx server...';
echo 'All Done!'
exit;
stop.sh
#!/bin/bash
pm2 stop node_yun;
echo 'Stop node_yun by pm2';
sleep 1;
sudo service nginx stop'
echo 'Stop nginx server...';
echo 'All Done!';
exit;
restart.sh
#!/bin/bash
pm2 delete node_yun;
pm2 start /home/ec2-user/node-yun/bin/www -i 0 --name node_yun;
echo 'start node_yun by pmw';
sleep 1;
sudo service nginx start;
echo 'Start nginx server...';
echo 'All Done!';
exit;
공식 홈 페이지: https://pm2.keymetrics.io/
소스 프로젝트 : https://github.com/Unitech/pm2
node 프로세스를 관리한다.
node js
구글에서 개발한 자바스크립트 엔진으로 빌드된 서버 사이드 개발용 소프트웨어 플랫폼.
자바 스크립트 웹 브라우저 클라이언트 동작.
Node.js 런타임 환경에서는 모든 종류의 서버 사이드 도구들을 제공하여 자바스크립트로 개발.
클라이언트(Fron-end), 서버(back-end)를 모두 개발 할 수 있음.
웹 개발시 추가 언어 학습이 필요 없음.
node.js 패키지
npm(Node Packaged Manager) 세게에서 가장 큰 오픈 소스.
node.js를 설치시 npm 같이 설치 됨.
서버 개발.
데몬 형태의 응용프로그램 개발.
- 로그 처리
- 프로세스 비 인가 종료(restart)
유사 프로그램
- qmail에 svscan(프로세스가 죽으면 살리는 역활)
프로그램 설치 -g는 글로벌 환경(명령어 디렉토리에 상관없이 명령어 처리)
npm install pm2 -g
프로그램 등록
pm2 start server.js
목록 확인
pm2 list
프로그램 종료.
pm2 list
pm2 stop id넘버.
pm2 stop 0 ---> list id 값이 0을 종료.
등록된 서비스 삭제.
pm2 delete 0 ---> list id 값 확인
서비스 등록시 ID 이름 지정
pm2 start server.js --name "TEST"
그외 start 명령어.
# app.js에 -a 23이라는 인수를 전달
$ pm2 start app.js -- -a 23
# 프로세스 이름을 지정
$ pm2 start app.js -- name servername
# --node-args를 통해 node v8에 옵션값을 전달
$ pm2 start app.js --node-args="--debug=7001"
# cpu를 최대치로 할당(클러스터 전용)
$ pm2 start app.js -i max
# 로그의 시간데이터 포맷을 지정
$ pm2 start app.js --log-date-format "YYYY-MM-DD HH:mm Z"
# 아웃풋 로그와 에러로그의 위치를 지정
$ pm2 start app.js -e err.log -o out.log
# 명령어를 pm2를 실행하는 유저가 아닌 harry로 설정
# 유저그룹은 --run-as-group
$ pm2 --run-as-user harry start app.js
등록 확인.
pm2 list
App name 항목에 보면 TEST 확인.
서비스 상세정보 확인
pm2 show TEST
server.js 파일이 수정 할 경우,
pm2에 TEST 이름을 갖는 대상에 대해 재시작 해줘야 함.(restart)
pm2 인자 수정하는 경우, delete 후 등록
로그 정보
out log path -> 기본 경로 위치.
로그 위치 정보 변경
pm2 delete TEST && pm2 start server.js --name "TEST" -o ./api.log
-o 옵션 처리: stdout 을 처리 함.
-o 옵션 처리: stderr 을 처리 하지 못함.
로그 하드 코딩 시절.
void systemLog(char *log)
{
fopen(api.log)
fwrite(log)
fclose(api.log)
}
open/write에 대한 atomic 보장을 위해 함수 내부에 lock 필요한 언어도 있음.
stderr 처리 -e 옵션
pm2 delete TEST && pm2 start server.js --name "TEST" -o ./api.log -e ./api.log --merge-logs
-e stderr 옵션: 노드 모율 예외 발생(크래 메세지) api.log 파일에서 확인 가능.
pm2 logs #모든 로그 출력
pm2 ilogs #자세한 로그 출력
pm2 flush #모든 로그 비우기
pm2 reloadLogs #로그 다시불러오기
트래픽 제어
서비스가 활성화 되면서 트패픽이 급증할 경우, node.js 처리할 수 가 없음.
트래픽을 받아 async(비동기)로 처리한다고 해도 내부 로직이 복잡해지면, CPU 자원을 감당하지 못한다.
이때 필요한 것이 클러스터이다.
pm2의 클러스터는 분산 컴퓨터 용어와 비슷한 역할을 한다.
server.js 하나의 노드 파일을 지정한 개수만큼 pm2에 등록하고 Load Balancing(LB)를 통해 부하 분산 시킨다.
pm2의 LB은 round robin(RR)방식으로 동작하여 모든것은 옵션 하나로 처리가 충분하다.
-i 옵션을 통해 3개 클러스터 등록
pm2 delete TEST && pm2 start server.js --name "TEST" -i 3 -o ./test.log
패킷 발생.
curl localhost:6985
로그 클러스터 확인.
test.log 클러스터 번호 활당.
test-0.log
test-1.log
test-2.log 로 나눠줘 기록된다.
로그 라운드 로빈(RR) 로드 발란싱(LB)
tail -f test-*
운영중 클러스터 개수 조정.
scale in/out 가능하다.
3개의 클러스터가 돌고 있는 TEST에게 클러스터 5로 변경했다.
scale in/out 설정
pm2 scale TEST 5
중단 명령
pm2 stop all
그외 프로세스 관리
pm2 stop all # 모든 프로세스 멈추기
pm2 restart all # 모든 프로세스 재시작
pm2 reload all # 모든 프로세스의 다운타임을 0으로 설정후 다시로드
pm2 stop 0 # 프로세스 0번을 멈추기
pm2 restart 0 # 프로세스 0번을 재시작
pm2 delete 0 # 프로세스 0번을 삭제
pm2 delete all # 프로세스 전부 삭제
pm2 ping # pm2가 사용가능한지 핑확인
pm2 updatePM #pm2 업데이트
pm2 reset <process> # 리셋 후 메타데이터 리로드
모인터링
- 실시간 로그 확인
- q 단축키 종료.
pm2 monit
시작(start) 명령어
================
쉘 스크립트 작성
================
start.sh
#!/bin/bash
pm2 reload node_yun;
echo 'Reload pm2 demon...';
sleep 1;
sudo service nginx restart;
echo 'Restart nginx server...';
echo 'All Done!'
exit;
stop.sh
#!/bin/bash
pm2 stop node_yun;
echo 'Stop node_yun by pm2';
sleep 1;
sudo service nginx stop'
echo 'Stop nginx server...';
echo 'All Done!';
exit;
restart.sh
#!/bin/bash
pm2 delete node_yun;
pm2 start /home/ec2-user/node-yun/bin/www -i 0 --name node_yun;
echo 'start node_yun by pmw';
sleep 1;
sudo service nginx start;
echo 'Start nginx server...';
echo 'All Done!';
exit;
kerberos_io
kerberos.io
보안장비 6.0
1.1 패키지 업데이트
sudo apt-get update && sudo apt-get upgrade
2 개발 도구(c++, cmake) 설치
sudo apt-get install git cmake subversion libav-tools dh-autoreconf libcurl4-openssl-dev yasm libx264-dev pkg-config libssl-dev
2.1 문제 발생.
However the following packages replace it:
ffmpeg:i386 ffmpeg
E: Package 'libav-tools' has no installation candidate
2.1.1 참고 1 -----
ffmpage 최신 버전 설치 방향 전화.
sudo add-apt-repository ppa:jonathonf/ffmpeg-4
sudo apt-get update
sudo apt-get install ffmpeg
ffmpeg -version
옵션
ffmpeg -version: 버전 표시
ffmpeg -formats: 사용 가능한 형식 보기
ffmpeg -codecs: 사용 가능한 코텍 보기
ffmpeg -decoders: 사용 가능한 디코더 보기
ffmpeg -encoders: 사용 가능한 인코더 보기
ffmpeg -bsfs: 사용 가능한 비트 스트림 필터 보기
ffmpeg -protocols: 사용 가능한 프로토콜 보기
ffmpeg -filters: 사용 가능한 필터 보기
ffmpeg -pix_fmts: 사용 가능한 픽셀 형식 보기
ffmpeg -layouts: 표준 채널 레이아웃 보기
ffmpeg -sample_fmts: 사용 가능한 오디오 보기.
파일 용량 줄이기
ffmpeg -i in.mov -c:v libx264 -c:a copy -crf 20 out.mov
mp4 파일 변환.
ffmpeg -i in.mov -vcodec copy -acodec aac -strict experimental -ab 128k out.mp4
참고 1 end -----
2.1.2 해결 방법1
sudo add-apt-repository ppa:jonathonf/ffmpeg-4
sudo apt update
sudo apt install ffmpeg libav-tools x264 x265
해결 방법2
sudo add-apt-repository ppa:jonathonf/ffmpeg-3
sudo apt update
sudo apt install ffmpeg libav-tools x264 x265
해결 방법3
sudo add-apt-repository ppa:djcj/hybrid
sudo apt-get update
sudo apt-get install ffmpeg
2.2 최신버전 선택
sudo add-apt-repository ppa:jonathonf/ffmpeg-4
sudo apt update
wget http://launchpadlibrarian.net/339874908/libav-tools_3.3.4-2_all.deb
sudo dpkg -i libav-tools_3.3.4-2_all.deb
sudo apt-get install git cmake subversion libav-tools dh-autoreconf libcurl4-openssl-dev yasm libx264-dev pkg-config libssl-dev
ip 카메라 사용 ffmpeg, x264 컴파일
git clone https://github.com/FFmpeg/FFmpeg ffmpeg
cd ffmpeg && sudo git checkout remotes/origin/release/2.8
sudo ./configure --enable-gpl --enable-libx264 --enable-shared --prefix=/usr/local
sudo make && sudo make install
kerberos.io 코드 다운로드
cd && git clone https://github.com/kerberos-io/machinery
컴파일
cd machinery && mkdir build && cd build
cmake .. && make && make check && sudo make install
libavcodec.so.56 error
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
cmake .. && make && make check && sudo make install
3. 실행파일 위치
which kerberosio
/usr/bin/kerberosio
3.1 부팅 자동 실행 등록
sudo systemctl enable kerberosio
4. 기본 구성 파일 위치
/etc/opt/kerberosio
기본 캡처: 라즈벨리 파이 카메라 모듈 설정 된다.
config.xml 파일 수정
USBCamera 또는 IPCamera로 변경 할 수 있음.
이미지 저장 위치
/etc/opt/kerberosio/capture
이미지 저장 위치 변경
io.xml 파일 편집.
5. 운영.
5.1 웹 설치
웹 서버(예: Nginx) PHP
NodeJS 와 NPM 설치.
5.2 의존성 설치.
sudo apt-get update && sudo apt-get upgrade
curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install git nginx php7.2-cli php7.2-gd libmcrypt-dev php-pear php7.2-curl php7.2-mbstring php7.2-xml php7.2-zip php7.2-fpm nodejs npm node-gyp nodejs-dev libssl1.0-dev
sudo ln -s /usr/bin/nodejs /usr/bin/node
6 환경설정
sudo apt-get install nginx
6.1 보안장비 환경 설정에서 추가 설정.
sudo rm -f /etc/nginx/sites-enabled/default ---> 보안장비의 경우 삭제 하면은 안됨. 추가 설정 해야함.
sudo vi /etc/nginx/sites-enabled/default
server
{
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/web/public;
server_name kerberos.rpi;
index index.php index.html index.htm;
location /
{
autoindex on;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$
{
fastcgi_pass unix:/var/run/php/php7.2-cli-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
7. 웹 사이트 구조
7.1 웹사이트 생성.
7.2 dns 설정
8. 웹 소스 다운로드
8.1 사이트 경로 이동.
sudo git clone https://github.com/kerberos-io/web && cd web
8.2 composer 사용해 php 패키지 설치.
curl -sS https://getcomposer.org/installer | sudo php
sudo mv composer.phar /usr/bin/composer
sudo composer install
8.3 스토리지 및 디렉토리 파일 쓰기 권한 주기.
sudo chmod -R 777 storage
sudo chmod -R 777 bootstrap/cache
sudo chmod 777 config/kerberos.php
9. npm bower 설치
sudo npm -g install bower
9.1 bower 사용해 프런트 엔드 종속성 설치.
cd public
sudo bower --allow-root install
9.2 재부팅
10. 파일 제거.
이미지, 비디오 파일은 자동으로 제거되지 않음.
디스크에 용량이 없어도, 계속 디스크에 계속 쓰게된다.
이 문제를 해결하려면 bash 스크립트 작성해 관리해 준다.
파티션 경로를 지정 해준다.
vi /home/users]/autoremoval.sh
partition=/dev/root
imagedir=/etc/opt/kerberosio/capture/
if [[ $(df -h | grep $partition | head -1 | awk -F' ' '{ print $5/1 }' | tr ['%'] ["0"]) -gt 90 ]];
then
echo "Cleaning disk"
find $imagedir -type f | sort | head -n 100 | xargs -r rm -rf;
fi;
chmod +x /home/[your user]/autoremoval.sh
크롬 에디터 설정 vi
crontab -e
5분 주기로 스크립트 실행
*/5 * * * * /bin/bash /home/[your user]/autoremoval.sh
====
ubunt 14.xx
apt-get update
apt-get install -y git build-essential unzip mercurial php5 php5-gd mcrypt php5-mcrypt php5-curl
php5enmod mcrypt
curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
apt-get install -y nodejs npm nodejs-legacy
npm install -g bower
git clone https://github.com/kerberos-io/kios
cd kios
git checkout develop
./build.sh all
./build.sh all mkrelease
보안장비 6.0
1.1 패키지 업데이트
sudo apt-get update && sudo apt-get upgrade
2 개발 도구(c++, cmake) 설치
sudo apt-get install git cmake subversion libav-tools dh-autoreconf libcurl4-openssl-dev yasm libx264-dev pkg-config libssl-dev
2.1 문제 발생.
However the following packages replace it:
ffmpeg:i386 ffmpeg
E: Package 'libav-tools' has no installation candidate
2.1.1 참고 1 -----
ffmpage 최신 버전 설치 방향 전화.
sudo add-apt-repository ppa:jonathonf/ffmpeg-4
sudo apt-get update
sudo apt-get install ffmpeg
ffmpeg -version
옵션
ffmpeg -version: 버전 표시
ffmpeg -formats: 사용 가능한 형식 보기
ffmpeg -codecs: 사용 가능한 코텍 보기
ffmpeg -decoders: 사용 가능한 디코더 보기
ffmpeg -encoders: 사용 가능한 인코더 보기
ffmpeg -bsfs: 사용 가능한 비트 스트림 필터 보기
ffmpeg -protocols: 사용 가능한 프로토콜 보기
ffmpeg -filters: 사용 가능한 필터 보기
ffmpeg -pix_fmts: 사용 가능한 픽셀 형식 보기
ffmpeg -layouts: 표준 채널 레이아웃 보기
ffmpeg -sample_fmts: 사용 가능한 오디오 보기.
파일 용량 줄이기
ffmpeg -i in.mov -c:v libx264 -c:a copy -crf 20 out.mov
mp4 파일 변환.
ffmpeg -i in.mov -vcodec copy -acodec aac -strict experimental -ab 128k out.mp4
참고 1 end -----
2.1.2 해결 방법1
sudo add-apt-repository ppa:jonathonf/ffmpeg-4
sudo apt update
sudo apt install ffmpeg libav-tools x264 x265
해결 방법2
sudo add-apt-repository ppa:jonathonf/ffmpeg-3
sudo apt update
sudo apt install ffmpeg libav-tools x264 x265
해결 방법3
sudo add-apt-repository ppa:djcj/hybrid
sudo apt-get update
sudo apt-get install ffmpeg
2.2 최신버전 선택
sudo add-apt-repository ppa:jonathonf/ffmpeg-4
sudo apt update
wget http://launchpadlibrarian.net/339874908/libav-tools_3.3.4-2_all.deb
sudo dpkg -i libav-tools_3.3.4-2_all.deb
sudo apt-get install git cmake subversion libav-tools dh-autoreconf libcurl4-openssl-dev yasm libx264-dev pkg-config libssl-dev
ip 카메라 사용 ffmpeg, x264 컴파일
git clone https://github.com/FFmpeg/FFmpeg ffmpeg
cd ffmpeg && sudo git checkout remotes/origin/release/2.8
sudo ./configure --enable-gpl --enable-libx264 --enable-shared --prefix=/usr/local
sudo make && sudo make install
kerberos.io 코드 다운로드
cd && git clone https://github.com/kerberos-io/machinery
컴파일
cd machinery && mkdir build && cd build
cmake .. && make && make check && sudo make install
libavcodec.so.56 error
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
cmake .. && make && make check && sudo make install
3. 실행파일 위치
which kerberosio
/usr/bin/kerberosio
3.1 부팅 자동 실행 등록
sudo systemctl enable kerberosio
4. 기본 구성 파일 위치
/etc/opt/kerberosio
기본 캡처: 라즈벨리 파이 카메라 모듈 설정 된다.
config.xml 파일 수정
USBCamera 또는 IPCamera로 변경 할 수 있음.
이미지 저장 위치
/etc/opt/kerberosio/capture
이미지 저장 위치 변경
io.xml 파일 편집.
5. 운영.
5.1 웹 설치
웹 서버(예: Nginx) PHP
NodeJS 와 NPM 설치.
5.2 의존성 설치.
sudo apt-get update && sudo apt-get upgrade
curl -sL https://deb.nodesource.com/setup | sudo bash -
sudo apt-get install git nginx php7.2-cli php7.2-gd libmcrypt-dev php-pear php7.2-curl php7.2-mbstring php7.2-xml php7.2-zip php7.2-fpm nodejs npm node-gyp nodejs-dev libssl1.0-dev
sudo ln -s /usr/bin/nodejs /usr/bin/node
6 환경설정
sudo apt-get install nginx
6.1 보안장비 환경 설정에서 추가 설정.
sudo rm -f /etc/nginx/sites-enabled/default ---> 보안장비의 경우 삭제 하면은 안됨. 추가 설정 해야함.
sudo vi /etc/nginx/sites-enabled/default
server
{
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/web/public;
server_name kerberos.rpi;
index index.php index.html index.htm;
location /
{
autoindex on;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$
{
fastcgi_pass unix:/var/run/php/php7.2-cli-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
7. 웹 사이트 구조
7.1 웹사이트 생성.
7.2 dns 설정
8. 웹 소스 다운로드
8.1 사이트 경로 이동.
sudo git clone https://github.com/kerberos-io/web && cd web
8.2 composer 사용해 php 패키지 설치.
curl -sS https://getcomposer.org/installer | sudo php
sudo mv composer.phar /usr/bin/composer
sudo composer install
8.3 스토리지 및 디렉토리 파일 쓰기 권한 주기.
sudo chmod -R 777 storage
sudo chmod -R 777 bootstrap/cache
sudo chmod 777 config/kerberos.php
9. npm bower 설치
sudo npm -g install bower
9.1 bower 사용해 프런트 엔드 종속성 설치.
cd public
sudo bower --allow-root install
9.2 재부팅
10. 파일 제거.
이미지, 비디오 파일은 자동으로 제거되지 않음.
디스크에 용량이 없어도, 계속 디스크에 계속 쓰게된다.
이 문제를 해결하려면 bash 스크립트 작성해 관리해 준다.
파티션 경로를 지정 해준다.
vi /home/users]/autoremoval.sh
partition=/dev/root
imagedir=/etc/opt/kerberosio/capture/
if [[ $(df -h | grep $partition | head -1 | awk -F' ' '{ print $5/1 }' | tr ['%'] ["0"]) -gt 90 ]];
then
echo "Cleaning disk"
find $imagedir -type f | sort | head -n 100 | xargs -r rm -rf;
fi;
chmod +x /home/[your user]/autoremoval.sh
크롬 에디터 설정 vi
crontab -e
5분 주기로 스크립트 실행
*/5 * * * * /bin/bash /home/[your user]/autoremoval.sh
====
ubunt 14.xx
apt-get update
apt-get install -y git build-essential unzip mercurial php5 php5-gd mcrypt php5-mcrypt php5-curl
php5enmod mcrypt
curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
apt-get install -y nodejs npm nodejs-legacy
npm install -g bower
git clone https://github.com/kerberos-io/kios
cd kios
git checkout develop
./build.sh all
./build.sh all mkrelease
시노비 shinobi
https://shinobi.video/why
ubuntu 12.04
=============
maridb mariadb-5.5.56 install 사용.
현재 보안 장비는 mysql 기반으로 동작한다.
한 시스템에 두개의 DB를 구성 할 수 있도록 시스템 개발을 해야 한다.
실 작업을 통해 알아낸 결과.
- 2개의 데이터 베이스가 필요 없음.
- mysql 과 mariadb는 운영체제 버전과, 기본 패키지가 맞으면 자동 업데이트 됨.
결국 하나의 mariadb로 시스템이 구성되어 동작하고 있음.
현재 보안장비도 패키징 동작 판단을 해야한다.
3.0 NO
3.2 Yes
3.2 Version 마린 DB 설치.
sudo apt-get install python-software-properties
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
ubuntu 12.04
sudo add-apt-repository 'deb http://mirror.klaus-uwe.me/mariadb/repo/5.5/ubuntu precise main'
sudo apt-get update
sudo apt-get install mariadb-server
sudo service mysql start
mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or g.
Your MariaDB connection id is 35
Server version: 5.5.36-MariaDB-1~saucy-log mariadb.org binary distribution
.
Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.
.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
.
MariaDB [(none)]>
일반 사용자에서 루트 권한 변경.
sudo su
apt install git -y
소소 다운로드
git clone https://gitlab.com/Shinobi-Systems/Shinobi.git Shinobi
cd Shinobi
설치 파일 실행 권한.
chmod +x INSTALL/ubuntu.sh
node 저장소 등록
sudo sh -c "echo deb https://deb.nodesource.com/node_6.x precise main \
> /etc/apt/sources.list.d/nodesource.list"
소스 파일 추가
sudo vi /etc/apt/sources.list.d/nodesource.list
deb https://deb.nodesource.com/node_6.x precise main
deb-src https://deb.nodesource.com/node_6.x precise main
키값 추가 설치 스크립트 다운로드
sudo apt-get -y install curl
curl --silent https://deb.nodesource.com/gpgkey/nodesource.gpg.key | sudo apt-key add -
curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh
컴파일러 추가
sudo apt-get install gcc g++ make
설치
sudo bash nodesource_setup.sh
nodejs 설치 ip 는 설치 안해도 된다. 하지만 예전 프로젝트 webrtc 구동을 위해 설치 했음.
sudo apt-get -y install nodejs && sudo npm -y install forever -g && sudo npm install ip -g
Node.js 플러그인 forever, ip 설치
$ sudo npm install forever -g
$ sudo npm install ip -g
--- sudo rm -rf /usr/bin/node
-. $ sudo ln -s /usr/bin/nodejs /usr/bin/node
설치
./INSTALL/ubuntu.sh
완료 메세지.
[PM2] Remove init script via:
$ pm2 unstartup upstart
[PM2] Saving current process list...
[PM2] Successfully saved in /root/.pm2/dump.pm2
뚢рррррррррр[39m
[39m App name [39m id [39m mode [39m pid [39m status [39m restart [39m uptime [39m cpu [39m mem [39m user [39m watching [39m
쒋쇄쇄쇄쇄쇄쇄쇄쇄쇄쇄[39m
[39m camera [39m 0 [39m fork [39m 25413 [39m online [39m 0 [39m 3s [39m 0% [39m 28.3 MB [39m root [39m disabled [39m
[39m cron [39m 1 [39m fork [39m 25456 [39m online [39m 0 [39m 2s [39m 0% [39m 24.8 MB [39m root [39m disabled [39m
붴닳닳닳닳닳닳닳닳닳닳[39m
Use `pm2 show <id|name>` to get more details about an app
=====================================
||===== Install Completed =====||
=====================================
|| Login with the Superuser and create a new user!!
||===================================
|| Open http://172.16.1.165
172.16.10.1
172.16.20.1
172.16.30.1
172.16.40.1
172.16.50.1
10.10.10.1
192.168.160.1:8080/super in your web browser.
||===================================
|| Default Superuser : admin@shinobi.video
|| Default Password : admin
=====================================
=====================================
종료 kill pm2
시작
pm2 start path/camera.js
pm2 start path/cron.js
pm2 list
/etc/init.d/pm2-root stop
/etc/init.d/pm2-root restart
접근
http://localhost:8080
http://your.shinobi.video/super
포팅은 성공 했으나 동작은 하지 않음.
의존성 및 DB 버전 문제.
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ccio | ---> shinobi 데이터베이스 생성됨.
| mysql |
| nemoos |
| performance_schema |
| pydio |
| roundcube |
| spamassassin |
+--------------------+
그대로 두고 18.04에서 동작 시킨후 12.04 포팅, 진행.
==============
ubuntu 18.04
==============
1. 우분투 저장소 설치
보안장 6.0 버전 업데이트
sudo apt update
설치
sudo apt install mariadb-server
20191205 보안장비 패키징 의존성 문제 발생.
The following packages have unmet dependencies:
mariadb-server : Depends: mariadb-server-10.1 (>= 1:10.1.43-0ubuntu0.18.04.1) but it is not going to be installed
기존 보안 패키징 전부 삭제 후 기본 운영체제 모드로 설치 진행
apt-get install aptitude
aptitude 에서 제안한 해결책은 기존 보안 패키징을 삭제.
재 설치 완료.
20191206
shinobi 설치 후 동작 확인, 보안장비 zen 오리지널 버전을 설치 시도.
문제 발생.
zen 패키징 삭제.
mariadb-server 설치.
의존성 문제 발생. mariadb-server : Depends: mariadb-server-10.1 (>= 1:10.1.43-0ubuntu0.18.04.1) but it is not going to be installed
운영체제 확인.
Ubuntu 18.04.3 LTS 다음 저장소 18.04.1...
메타패키지 설치 방법으로 진행(Mariadb 저장소에서 설치)
설치 완료.
mysql-common, mysql-server 삭제.
maridb 삭제.
우분투 저정소 지정 업데이트 재부팅.
sudo apt-get install mariadb-server
상태 확인.
sudo systemctl status mariadb
● mariadb.service - MariaDB 10.1.43 database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/mariadb.service.d
└─migrated-from-my.cnf-settings.conf
Active: active (running) since Thu 2019-12-05 17:51:51 KST; 37s ago
Docs: man:mysqld(8)
https://mariadb.com/kb/en/library/systemd/
Main PID: 2871 (mysqld)
Status: "Taking your SQL requests now..."
Tasks: 6 (limit: 4915)
CGroup: /system.slice/mariadb.service
└─2871 /usr/sbin/mysqld
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: Processing databases
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: information_schema
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: mysql
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: performance_schema
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: Phase 6/7: Checking and upgrading tables
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: Processing databases
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: information_schema
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: performance_schema
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: Phase 7/7: Running 'FLUSH PRIVILEGES'
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: OK
버전확인.
mysql -V
mysql Ver 15.1 Distrib 10.1.43-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
mariadb root 패스워드 설정.
mysql -u root
use mysql;
update user set password=password('totoro') where user='root';
flush pribvileges;
문제발생.
mysql 버전 15.01 mariadb 10.1.43 패스워드 변경시 문법오류 발생.
계정삭제
update mysql.user set authentication_string=null where user='root';
flush privileges;
mysql -u root -p
use mysql;
UPDATE user SET password=PASSWORD('totoro') WHERE User='root' AND Host = 'localhost';
FLUSH PRIVILEGES;
exit
------------- SystemD -------------
# systemctl stop mariadb
# systemctl unset-environment MYSQLD_OPTS
# systemctl start mariadb
------------- SysVinit -------------
# /etc/init.d/mysql stop
# /etc/init.d/mysql start
패스워드 작동 안함.
그냥 접근 해 버림.
cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
sudo mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 36
Server version: 10.1.43-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04
버전 차이가 있음.(무시해도 됨)
시스템 루트 권한을 획득하면 mariadb에서 불필요한 인증 처리를 하지 않도록 설계 한 것으로 보여진다.
비밀번호 저장소 변경.
전체 사용자 계정, 비밀번호 및 클로벌 권한 mysql.global_priv 테이블에 저장 된다.
mysql.user 테이블 ?
여전히 존재하며, 그 전과 동일한 테이블 구조를 가지고 있다.
mysql.user 테이블을 사용하는 곳이 있다면 이전 처럼 계속 동작한다.
현재 mariadb 설정 할 수 사용자는 mysql.global_priv 테이블로 이동한 상태이다.
1.1 Shinobi 설치
sudo su
apt install git -y
git clone https://gitlab.com/Shinobi-Systems/Shinobi.git Shinobi
cd Shinobi
chmod +x INSTALL/ubuntu.sh && INSTALL/ubuntu.sh
=============
Shinobi - Do you want to Install MariaDB? Choose No if you already have it.
현재 저장소 버전을 설치 한 상태이다.
(y)es or (N)o
n
=============
Shinobi - Database Installation
(y)es or (N)o
y 만약 이 부분을 no 해 버리면 마린 db 문제 발생.
=============
Shinobi - Start Shinobi and set to start on boot?
(y)es or (N)o
y
[PM2] Remove init script via:
$ pm2 unstartup systemd
[PM2] Saving current process list...
[PM2] Successfully saved in /root/.pm2/dump.pm2
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│ camera │ 0 │ fork │ 1319 │ online │ 0 │ 39m │ 0% │ 96.9 MB │ root │ disabled │
│ cron │ 1 │ fork │ 1324 │ online │ 0 │ 39m │ 0% │ 52.5 MB │ root │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
=====================================
||===== Install Completed =====||
=====================================
|| Login with the Superuser and create a new user!!
||===================================
|| Open http://10.10.10.122:8080/super in your web browser.
||===================================
|| Default Superuser : admin@shinobi.video
|| Default Password : admin
=====================================
Runtime Edition
PM2 is a Production Process Manager for Node.js applications
with a built-in Load Balancer.
Start and Daemonize any application:
$ pm2 start app.js
Load Balance 4 instances of api.js:
$ pm2 start api.js -i 4
Monitor in production:
$ pm2 monitor
Make pm2 auto-boot at server restart:
$ pm2 startup
To go further checkout:
http://pm2.io/
2. MariaDB 저장소 설치.
=======================
sudo apt-get remove mariadb-server
sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository "deb [arch=amd64,arm64,ppc64el] http://mariadb.mirror.liquidtelecom.com/repo/10.4/ubuntu $(lsb_release -cs) main"
sudo apt update
sudo apt install mariadb-server mariadb-client
20191205 보안장비 패키징 의존성 문제 발생.
The following packages have unmet dependencies:
mariadb-server : Depends: mariadb-server-10.1 (>= 1:10.1.43-0ubuntu0.18.04.1) but it is not going to be installed
기본 운영체제 설치 버전으로 다음 진행
sudo systemctl status mariadb
● mariadb.service - MariaDB 10.3.8 database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/mariadb.service.d
└─migrated-from-my.cnf-settings.conf
Active: active (running) since Sun 2018-07-29 19:36:30 UTC; 56s ago
Docs: man:mysqld(8)
https://mariadb.com/kb/en/library/systemd/
Main PID: 16417 (mysqld)
Status: "Taking your SQL requests now..."
Tasks: 31 (limit: 507)
CGroup: /system.slice/mariadb.service
└─16417 /usr/sbin/mysqld
mysql -V
mysql_secure_installation명령을 실행하여 MariaDB 설치의 보안을 향상
sudo mysql_secure_installation
mysql -u root -p
mysql_secure_installation스크립트를 실행할 때 이전에 설정 한 루트 암호를 입력하라는 메시지가 표시
apt install git -y
git clone https://gitlab.com/Shinobi-Systems/Shinobi.git Shinobi
cd Shinobi
chmod +x INSTALL/ubuntu.sh && INSTALL/ubuntu.sh
3. MariaDB 보안장비 6.0 install
===============================
sudo apt-get remove mariadb-server
sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository "deb [arch=amd64,arm64,ppc64el] http://mariadb.mirror.liquidtelecom.com/repo/10.4/ubuntu $(lsb_release -cs) main"
sudo apt update
apt list --upgradable
mysql-common/unknown,unknown,unknown 1:10.4.10+maria~bionic all [upgradable from: 5.8+1.0.4]
N: There is 1 additional version. Please use the '-a' switch to see it
sudo apt-get dist-upgrade
mysql-common ---> upgrade 함.
mysql-common 패키지는 http://mariadb.mirror.liquidtelecom.com/repo/10.4/ubuntu bionic main 이 사이트에 업데이 했음.
http://mariadb.mirror.liquidtelecom.com/repo/10.4/ubuntu bionic main
나중 6.0 문제 발생 시 이 부분을 생각해야 함.
mariadb-server : Depends: mariadb-server-10.4 (>= 1:10.4.10+maria~bionic) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
20191205
이상태에서 머물고 있음.
ubuntu 12.04
=============
maridb mariadb-5.5.56 install 사용.
현재 보안 장비는 mysql 기반으로 동작한다.
한 시스템에 두개의 DB를 구성 할 수 있도록 시스템 개발을 해야 한다.
실 작업을 통해 알아낸 결과.
- 2개의 데이터 베이스가 필요 없음.
- mysql 과 mariadb는 운영체제 버전과, 기본 패키지가 맞으면 자동 업데이트 됨.
결국 하나의 mariadb로 시스템이 구성되어 동작하고 있음.
현재 보안장비도 패키징 동작 판단을 해야한다.
3.0 NO
3.2 Yes
3.2 Version 마린 DB 설치.
sudo apt-get install python-software-properties
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
ubuntu 12.04
sudo add-apt-repository 'deb http://mirror.klaus-uwe.me/mariadb/repo/5.5/ubuntu precise main'
sudo apt-get update
sudo apt-get install mariadb-server
sudo service mysql start
mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or g.
Your MariaDB connection id is 35
Server version: 5.5.36-MariaDB-1~saucy-log mariadb.org binary distribution
.
Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.
.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
.
MariaDB [(none)]>
일반 사용자에서 루트 권한 변경.
sudo su
apt install git -y
소소 다운로드
git clone https://gitlab.com/Shinobi-Systems/Shinobi.git Shinobi
cd Shinobi
설치 파일 실행 권한.
chmod +x INSTALL/ubuntu.sh
node 저장소 등록
sudo sh -c "echo deb https://deb.nodesource.com/node_6.x precise main \
> /etc/apt/sources.list.d/nodesource.list"
소스 파일 추가
sudo vi /etc/apt/sources.list.d/nodesource.list
deb https://deb.nodesource.com/node_6.x precise main
deb-src https://deb.nodesource.com/node_6.x precise main
키값 추가 설치 스크립트 다운로드
sudo apt-get -y install curl
curl --silent https://deb.nodesource.com/gpgkey/nodesource.gpg.key | sudo apt-key add -
curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh
컴파일러 추가
sudo apt-get install gcc g++ make
설치
sudo bash nodesource_setup.sh
nodejs 설치 ip 는 설치 안해도 된다. 하지만 예전 프로젝트 webrtc 구동을 위해 설치 했음.
sudo apt-get -y install nodejs && sudo npm -y install forever -g && sudo npm install ip -g
Node.js 플러그인 forever, ip 설치
$ sudo npm install forever -g
$ sudo npm install ip -g
--- sudo rm -rf /usr/bin/node
-. $ sudo ln -s /usr/bin/nodejs /usr/bin/node
설치
./INSTALL/ubuntu.sh
완료 메세지.
[PM2] Remove init script via:
$ pm2 unstartup upstart
[PM2] Saving current process list...
[PM2] Successfully saved in /root/.pm2/dump.pm2
뚢рррррррррр[39m
[39m App name [39m id [39m mode [39m pid [39m status [39m restart [39m uptime [39m cpu [39m mem [39m user [39m watching [39m
쒋쇄쇄쇄쇄쇄쇄쇄쇄쇄쇄[39m
[39m camera [39m 0 [39m fork [39m 25413 [39m online [39m 0 [39m 3s [39m 0% [39m 28.3 MB [39m root [39m disabled [39m
[39m cron [39m 1 [39m fork [39m 25456 [39m online [39m 0 [39m 2s [39m 0% [39m 24.8 MB [39m root [39m disabled [39m
붴닳닳닳닳닳닳닳닳닳닳[39m
Use `pm2 show <id|name>` to get more details about an app
=====================================
||===== Install Completed =====||
=====================================
|| Login with the Superuser and create a new user!!
||===================================
|| Open http://172.16.1.165
172.16.10.1
172.16.20.1
172.16.30.1
172.16.40.1
172.16.50.1
10.10.10.1
192.168.160.1:8080/super in your web browser.
||===================================
|| Default Superuser : admin@shinobi.video
|| Default Password : admin
=====================================
=====================================
종료 kill pm2
시작
pm2 start path/camera.js
pm2 start path/cron.js
pm2 list
/etc/init.d/pm2-root stop
/etc/init.d/pm2-root restart
접근
http://localhost:8080
http://your.shinobi.video/super
포팅은 성공 했으나 동작은 하지 않음.
의존성 및 DB 버전 문제.
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ccio | ---> shinobi 데이터베이스 생성됨.
| mysql |
| nemoos |
| performance_schema |
| pydio |
| roundcube |
| spamassassin |
+--------------------+
그대로 두고 18.04에서 동작 시킨후 12.04 포팅, 진행.
==============
ubuntu 18.04
==============
1. 우분투 저장소 설치
보안장 6.0 버전 업데이트
sudo apt update
설치
sudo apt install mariadb-server
20191205 보안장비 패키징 의존성 문제 발생.
The following packages have unmet dependencies:
mariadb-server : Depends: mariadb-server-10.1 (>= 1:10.1.43-0ubuntu0.18.04.1) but it is not going to be installed
기존 보안 패키징 전부 삭제 후 기본 운영체제 모드로 설치 진행
apt-get install aptitude
aptitude 에서 제안한 해결책은 기존 보안 패키징을 삭제.
재 설치 완료.
20191206
shinobi 설치 후 동작 확인, 보안장비 zen 오리지널 버전을 설치 시도.
문제 발생.
zen 패키징 삭제.
mariadb-server 설치.
의존성 문제 발생. mariadb-server : Depends: mariadb-server-10.1 (>= 1:10.1.43-0ubuntu0.18.04.1) but it is not going to be installed
운영체제 확인.
Ubuntu 18.04.3 LTS 다음 저장소 18.04.1...
메타패키지 설치 방법으로 진행(Mariadb 저장소에서 설치)
설치 완료.
mysql-common, mysql-server 삭제.
maridb 삭제.
우분투 저정소 지정 업데이트 재부팅.
sudo apt-get install mariadb-server
상태 확인.
sudo systemctl status mariadb
● mariadb.service - MariaDB 10.1.43 database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/mariadb.service.d
└─migrated-from-my.cnf-settings.conf
Active: active (running) since Thu 2019-12-05 17:51:51 KST; 37s ago
Docs: man:mysqld(8)
https://mariadb.com/kb/en/library/systemd/
Main PID: 2871 (mysqld)
Status: "Taking your SQL requests now..."
Tasks: 6 (limit: 4915)
CGroup: /system.slice/mariadb.service
└─2871 /usr/sbin/mysqld
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: Processing databases
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: information_schema
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: mysql
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: performance_schema
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: Phase 6/7: Checking and upgrading tables
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: Processing databases
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: information_schema
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: performance_schema
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: Phase 7/7: Running 'FLUSH PRIVILEGES'
Dec 05 17:51:51 gfairline /etc/mysql/debian-start[2885]: OK
버전확인.
mysql -V
mysql Ver 15.1 Distrib 10.1.43-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
mariadb root 패스워드 설정.
mysql -u root
use mysql;
update user set password=password('totoro') where user='root';
flush pribvileges;
문제발생.
mysql 버전 15.01 mariadb 10.1.43 패스워드 변경시 문법오류 발생.
계정삭제
update mysql.user set authentication_string=null where user='root';
flush privileges;
mysql -u root -p
use mysql;
UPDATE user SET password=PASSWORD('totoro') WHERE User='root' AND Host = 'localhost';
FLUSH PRIVILEGES;
exit
------------- SystemD -------------
# systemctl stop mariadb
# systemctl unset-environment MYSQLD_OPTS
# systemctl start mariadb
------------- SysVinit -------------
# /etc/init.d/mysql stop
# /etc/init.d/mysql start
패스워드 작동 안함.
그냥 접근 해 버림.
cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"
sudo mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 36
Server version: 10.1.43-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04
버전 차이가 있음.(무시해도 됨)
시스템 루트 권한을 획득하면 mariadb에서 불필요한 인증 처리를 하지 않도록 설계 한 것으로 보여진다.
비밀번호 저장소 변경.
전체 사용자 계정, 비밀번호 및 클로벌 권한 mysql.global_priv 테이블에 저장 된다.
mysql.user 테이블 ?
여전히 존재하며, 그 전과 동일한 테이블 구조를 가지고 있다.
mysql.user 테이블을 사용하는 곳이 있다면 이전 처럼 계속 동작한다.
현재 mariadb 설정 할 수 사용자는 mysql.global_priv 테이블로 이동한 상태이다.
1.1 Shinobi 설치
sudo su
apt install git -y
git clone https://gitlab.com/Shinobi-Systems/Shinobi.git Shinobi
cd Shinobi
chmod +x INSTALL/ubuntu.sh && INSTALL/ubuntu.sh
=============
Shinobi - Do you want to Install MariaDB? Choose No if you already have it.
현재 저장소 버전을 설치 한 상태이다.
(y)es or (N)o
n
=============
Shinobi - Database Installation
(y)es or (N)o
y 만약 이 부분을 no 해 버리면 마린 db 문제 발생.
=============
Shinobi - Start Shinobi and set to start on boot?
(y)es or (N)o
y
[PM2] Remove init script via:
$ pm2 unstartup systemd
[PM2] Saving current process list...
[PM2] Successfully saved in /root/.pm2/dump.pm2
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│ camera │ 0 │ fork │ 1319 │ online │ 0 │ 39m │ 0% │ 96.9 MB │ root │ disabled │
│ cron │ 1 │ fork │ 1324 │ online │ 0 │ 39m │ 0% │ 52.5 MB │ root │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
=====================================
||===== Install Completed =====||
=====================================
|| Login with the Superuser and create a new user!!
||===================================
|| Open http://10.10.10.122:8080/super in your web browser.
||===================================
|| Default Superuser : admin@shinobi.video
|| Default Password : admin
=====================================
Runtime Edition
PM2 is a Production Process Manager for Node.js applications
with a built-in Load Balancer.
Start and Daemonize any application:
$ pm2 start app.js
Load Balance 4 instances of api.js:
$ pm2 start api.js -i 4
Monitor in production:
$ pm2 monitor
Make pm2 auto-boot at server restart:
$ pm2 startup
To go further checkout:
http://pm2.io/
2. MariaDB 저장소 설치.
=======================
sudo apt-get remove mariadb-server
sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository "deb [arch=amd64,arm64,ppc64el] http://mariadb.mirror.liquidtelecom.com/repo/10.4/ubuntu $(lsb_release -cs) main"
sudo apt update
sudo apt install mariadb-server mariadb-client
20191205 보안장비 패키징 의존성 문제 발생.
The following packages have unmet dependencies:
mariadb-server : Depends: mariadb-server-10.1 (>= 1:10.1.43-0ubuntu0.18.04.1) but it is not going to be installed
기본 운영체제 설치 버전으로 다음 진행
sudo systemctl status mariadb
● mariadb.service - MariaDB 10.3.8 database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/mariadb.service.d
└─migrated-from-my.cnf-settings.conf
Active: active (running) since Sun 2018-07-29 19:36:30 UTC; 56s ago
Docs: man:mysqld(8)
https://mariadb.com/kb/en/library/systemd/
Main PID: 16417 (mysqld)
Status: "Taking your SQL requests now..."
Tasks: 31 (limit: 507)
CGroup: /system.slice/mariadb.service
└─16417 /usr/sbin/mysqld
mysql -V
mysql_secure_installation명령을 실행하여 MariaDB 설치의 보안을 향상
sudo mysql_secure_installation
mysql -u root -p
mysql_secure_installation스크립트를 실행할 때 이전에 설정 한 루트 암호를 입력하라는 메시지가 표시
apt install git -y
git clone https://gitlab.com/Shinobi-Systems/Shinobi.git Shinobi
cd Shinobi
chmod +x INSTALL/ubuntu.sh && INSTALL/ubuntu.sh
3. MariaDB 보안장비 6.0 install
===============================
sudo apt-get remove mariadb-server
sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository "deb [arch=amd64,arm64,ppc64el] http://mariadb.mirror.liquidtelecom.com/repo/10.4/ubuntu $(lsb_release -cs) main"
sudo apt update
apt list --upgradable
mysql-common/unknown,unknown,unknown 1:10.4.10+maria~bionic all [upgradable from: 5.8+1.0.4]
N: There is 1 additional version. Please use the '-a' switch to see it
sudo apt-get dist-upgrade
mysql-common ---> upgrade 함.
mysql-common 패키지는 http://mariadb.mirror.liquidtelecom.com/repo/10.4/ubuntu bionic main 이 사이트에 업데이 했음.
http://mariadb.mirror.liquidtelecom.com/repo/10.4/ubuntu bionic main
나중 6.0 문제 발생 시 이 부분을 생각해야 함.
mariadb-server : Depends: mariadb-server-10.4 (>= 1:10.4.10+maria~bionic) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
20191205
이상태에서 머물고 있음.
2019/12/04
Mysql, Mariadb 동시 사용 및 mariadb 단일 사용방법 정리.
MySQL과 함께 MariaDB 설치
=======================================
mariadb-5.5.24-linux-x86_64.tar.gz 설치
=======================================
MariaDB와 Mysql DB 함께 설치 할 수 있음.
1. 시스템 정보 확인.
1.1 운영체제 정보
cat /etc/issue
Ubuntu 12.04.5 LTS \n \l
1.2 DB 정보
mysql --version
mysql Ver 14.14 Distrib 5.5.54, for debian-linux-gnu (x86_64) using readline 6.2
2. MariDB 설치
MariaDB 다운로드 : http://downloads.mariadb.org/mariadb/5.5.24/#bits=64&file_type=tar_gz
2.1 심볼릭 링크
cd /opt/
mkdir mariadb-data
ln -s mariadb-5.5.24-linux-x86_64 mariadb
ls -al
lrwxrwxrwx 1 root root 27 Dec 4 13:42 mariadb -> mariadb-5.5.24-linux-x86_64
drwxr-xr-x 13 root root 4096 Dec 4 13:42 mariadb-5.5.24-linux-x86_64
-rw-r--r-- 1 root root 213836788 Dec 4 13:41 mariadb-5.5.24-linux-x86_64.tar.gz
drwxr-xr-x 2 root root 4096 Dec 4 13:42 mariadb-data
drwxr-xr-x 9 root root 4096 Nov 28 12:01 samba4
2.2 사용자 생성 및 소유권 설정
groupadd --system mariadb
useradd -c "MariaDB Server" -d /opt/mariadb -g mariadb --system mariadb
chown -R mariadb:mariadb mariadb-5.5.24-linux-x86_64/
chown -R mariadb:mariadb mariadb-data/
3 my.cnf 설정
3.1 편집
pwd
/opt
cp mariadb/support-files/my-medium.cnf mariadb-data/my.cnf
chown mariadb:mariadb mariadb-data/my.cnf
vi ./mariadb-data/my.cnf
[client]
port = 3307
socket = /opt/mariadb-data/mariadb.sock
[mysqld]
datadir = /opt/mariadb-data
basedir = /opt/mariadb
port = 3307
socket = /opt/mariadb-data/mariadb.sock
user = mariadb
4. 데몬 구동
cp mariadb/support-files/mysql.server /etc/init.d/mariadb
chmod +x /etc/init.d/mariadb
4.1 데몬 시작 파일 편집
vi /etc/init.d/mariadb
- # Provides: mysql
+ # Provides: mariadb
- basedir=
+ basedir=/opt/mariadb
- datadir=
+ datadir=/opt/mariadb-data
- lock_file_path="$lockdir/mysql"
+ lock_file_path="$lockdir/mariadb"
4.1 하나의 구성 파일만 사용하도록 설정
/etc/init.d/mariadb 파일 수정.
# my.cnf 파일을 사용하여 mysqld에 다가 추가 인수를 제공해야한다.
# 만약 업그레이드가 일어나면 스크립트를 덮어 쓸 수 있다.
$bindir/mysqld_safe --defaults-file=/opt/mariadb-data/my.cnf --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
# mariadb start mysqladmin 명령어 사용.
wait_for_ready () {
[...]
if $bindir/mysqladmin --defaults-file=/opt/mariadb-data/my.cnf ping >/dev/null 2>&1; then
수정파일
=== modified file 'support-files/mysql.server.sh'
--- support-files/mysql.server.sh 2017-07-16 17:09:54 +0000
+++ support-files/mysql.server.sh 2018-02-17 10:10:30 +0000
@@ -147,68 +147,12 @@
datadir_set=1
;;
--pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
+ --socket=*) socket=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
--service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
esac
done
}
-wait_for_pid () {
- verb="$1" # created | removed
- pid="$2" # process ID of the program operating on the pid-file
- pid_file_path="$3" # path to the PID file.
-
- i=0
- avoid_race_condition="by checking again"
-
- while test $i -ne $service_startup_timeout ; do
-
- case "$verb" in
- 'created')
- # wait for a PID-file to pop into existence.
- test -s "$pid_file_path" && i='' && break
- ;;
- 'removed')
- # wait for this PID-file to disappear
- test ! -s "$pid_file_path" && i='' && break
- ;;
- *)
- echo "wait_for_pid () usage: wait_for_pid created|removed pid pid_file_path"
- exit 1
- ;;
- esac
-
- # if server isn't running, then pid-file will never be updated
- if test -n "$pid"; then
- if kill -0 "$pid" 2>/dev/null; then
- : # the server still runs
- else
- # The server may have exited between the last pid-file check and now.
- if test -n "$avoid_race_condition"; then
- avoid_race_condition=""
- continue # Check again.
- fi
-
- # there's nothing that will affect the file.
- log_failure_msg "The server quit without updating PID file ($pid_file_path)."
- return 1 # not waiting any more.
- fi
- fi
-
- echo $echo_n ".$echo_c"
- i=`expr $i + 1`
- sleep 1
-
- done
-
- if test -z "$i" ; then
- log_success_msg
- return 0
- else
- log_failure_msg
- return 1
- fi
-}
-
# Get arguments from the my.cnf file,
# the only group, which is read from now on is [mysqld]
if test -x ./bin/my_print_defaults
@@ -266,6 +210,69 @@
parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`
+# wait for the pid file to disappear
+wait_for_gone () {
+ pid="$1" # process ID of the program operating on the pid-file
+ pid_file_path="$2" # path to the PID file.
+
+ i=0
+ crash_protection="by checking again"
+
+ while test $i -ne $service_startup_timeout ; do
+
+ if kill -0 "$pid" 2>/dev/null; then
+ : # the server still runs
+ else
+ if test ! -s "$pid_file_path"; then
+ # no server process and no pid-file? great, we're done!
+ log_success_msg
+ return 0
+ fi
+
+ # pid-file exists, the server process doesn't.
+ # it must've crashed, and mysqld_safe will restart it
+ if test -n "$crash_protection"; then
+ crash_protection=""
+ sleep 5
+ continue # Check again.
+ fi
+
+ # Cannot help it
+ log_failure_msg "The server quit without updating PID file ($pid_file_path)."
+ return 1 # not waiting any more.
+ fi
+
+ echo $echo_n ".$echo_c"
+ i=`expr $i + 1`
+ sleep 1
+
+ done
+
+ log_failure_msg
+ return 1
+}
+
+wait_for_ready () {
+
+ test -n "$socket" && sockopt="--socket=$socket"
+
+ i=0
+ while test $i -ne $service_startup_timeout ; do
+
+ if $bindir/mysqladmin $sockopt ping >/dev/null 2>&1; then
+ log_success_msg
+ return 0
+ fi
+
+ echo $echo_n ".$echo_c"
+ i=`expr $i + 1`
+ sleep 1
+
+ done
+
+ log_failure_msg
+ return 1
+}
#
# Set pid file if not given
#
@@ -292,7 +299,7 @@
# Give extra arguments to mysqld with the my.cnf file. This script
# may be overwritten at next upgrade.
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
- wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
+ wait_for_ready; return_value=$?
# Make lock for RedHat / SuSE
if test -w "$lockdir"
@@ -319,7 +326,7 @@
echo $echo_n "Shutting down MySQL"
kill $mysqld_pid
# mysqld should remove the pid file when it exits, so wait for it.
- wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value=$?
+ wait_for_gone $mysqld_pid "$mysqld_pid_file_path"; return_value=$?
else
log_failure_msg "MySQL server process #$mysqld_pid is not running!"
rm "$mysqld_pid_file_path"
5. 테스트
설정 파일 지정.
cd /opt/mariadb
scripts/mysql_install_db --defaults-file=/opt/mariadb-data/my.cnf
데몬 시작.
/etc/init.d/mariadb start
cd /etc/init.d
시작 데몬 등록
chmod +x mariadb
update-rc.d mariadb defaults
6. 확인.
mysql -e "SELECT VERSION();"
+--------------------+
| VERSION() |
+--------------------+
| 5.5.24-MariaDB-log |
+--------------------+
mysql -e "SELECT VERSION();" --socket=/opt/mariadb-data/mariadb.sock
Enter password:
+-----------+
| VERSION() |
+-----------+
| 5.5.41 |
+-----------+
# mysql --socket=/opt/mariadb-data/mariadb.sock
mariadb 패스워드 설정
mysql -u root
mysql> use mysql;
mysql> update user set password=PASSWORD("new-password") where User='root';
mysql> flush privileges;
mysql> exit
익명 사용자 삭제
DELETE FROM mysql.user WHERE user='' AND host='myhost';
FLUSH PRIVILEGES;
테스트베이스를 삭제하고 접근
DELETE FROM mysql.db WHERE db LIKE 'tes%' AND user='';
FLUSH PRIVILEGES;
데이터베이스에 대한 원격 연결 비활성화
vi my.cnf
bind-address=127.0.0.1
/opt/mariadb-data 디렉토리에 MariaDB 데이터베이스를 업데이트 할 경우(mariadb.socket, my.cnf)
/opt 새 버전의 데이터베이스 압축푼다.
심볼릭 링크 mariadb를 지정된 디렉토리로 변경하십시오.
MariaDB 시작
소켓을 사용하여 업데이트 스크립트를 실행 -> --socket=/opt/mariadb-data/mariadb.sock
mysql 데이터 베이스 동기화 업그레이드.(myaql에 DB가 마리아DB로 업데이트 된다).
/usr/local/mariadb/bin/mysql_upgrade -uroot -p
===============================
Mariadb10.2.8 데이터베이스 설치
===============================
다운로드 : https://downloads.mariadb.org/interstitial/mariadb-10.2.8/bintar-linux-x86_64/mariadb-10.2.8-linux-x86_64.tar.gz?serv
cd /usr/local/mariadb
sudo groupadd --system mariadb
sudo useradd -g mariadb mariadb
sudo chown -R mariadb:mariadb /usr/local/mariadb
sudo chown -R mariadb:mariadb /usr/local/mariadb/data/
sudo cp /usr/local/mariadb/support-files/my-large.cnf /usr/local/mariadb/data/my.cnf
vi /usr/local/mariadb/data/my.cnf
[client]
#password = your_password
port = 3307
socket = /opt/mariadb-data/mariadb.sock
# Here follows entries for some specific programs
# The MariaDB server
[mysqld]
datadir = /opt/mariadb-data
basedir = /opt/mariadb
port = 3307
socket = /opt/mariadb-data/mariadb.sock
user = mariadb
sudo cp /usr/local/mariadb/support-files/mysql.server /etc/init.d/mariadb
sudo chmod +x /etc/init.d/mariadb
vi /etc/init.d/mariadb
- # Provides: mysql
+ # Provides: mariadb
- basedir=
+ basedir=/usr/local/mariadb
- datadir=
+ datadir=/usr/local/mariadb/data
- lock_file_path="$lockdir/mysql"
+ lock_file_path="$lockdir/mariadb"
$bindir/mysqld_safe --defaults-file=/usr/local/mariadb/data/my.cnf --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
wait_for_ready; return_value=$?
1. mysql, mariadb 바이너리 버전으로 설치 후 부팅시 시작 오류 발생.
메세지 내용.
/usr/local/mysql/share/errmsg.sys를 찾을 수 없음.
바이너리 설치 디렉토리 /usr/local/mysql이 아닌 경우 오류 발생.
추가
설치 파일 경로는 /usr/local/mysql 일 경우.
/etc/my.cnf 파일에 다음줄 추가.
language = /usr/local/mysql/share/english
/etc/mysql/my.cnf 권한 변경
chmod 644 /etc/mysql/my.cnf
/etc/mysql/debian-start 실행에서 문제가 발생.
다음 명령을 통해 debian-start 검색
locate debian-start
updatedb
locate debian-start
파일복사.
mariadb-10.2.8/debian/additions/debian-star /etc/mysql/
2. mariadb 버전 업그레이드
/usr/local/mariadb/bin/mysql_upgrade -uroot -p
========================================
Mariadb 우분투 저장소 단일 DB 사용 설치
========================================
sudo apt-get install python-software-properties
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
ubuntu 12.04
# sudo add-apt-repository 'deb http://mirror.klaus-uwe.me/mariadb/repo/5.5/ubuntu precise main'
Ubuntu 12.10
# sudo add-apt-repository 'deb http://mirror.klaus-uwe.me/mariadb/repo/5.5/ubuntu quantal main'
Ubuntu 13.10
# sudo add-apt-repository 'deb http://mirror.klaus-uwe.me/mariadb/repo/5.5/ubuntu saucy main'
sudo apt-get update
sudo apt-get install mariadb-server
sudo service mysql start
mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or g.
Your MariaDB connection id is 35
Server version: 5.5.36-MariaDB-1~saucy-log mariadb.org binary distribution
.
Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.
.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
.
MariaDB [(none)]>
설치시 이미 업그레이드 됨.
mysql_upgrade -uroot -p
=======================================
mariadb-5.5.24-linux-x86_64.tar.gz 설치
=======================================
MariaDB와 Mysql DB 함께 설치 할 수 있음.
1. 시스템 정보 확인.
1.1 운영체제 정보
cat /etc/issue
Ubuntu 12.04.5 LTS \n \l
1.2 DB 정보
mysql --version
mysql Ver 14.14 Distrib 5.5.54, for debian-linux-gnu (x86_64) using readline 6.2
2. MariDB 설치
MariaDB 다운로드 : http://downloads.mariadb.org/mariadb/5.5.24/#bits=64&file_type=tar_gz
2.1 심볼릭 링크
cd /opt/
mkdir mariadb-data
ln -s mariadb-5.5.24-linux-x86_64 mariadb
ls -al
lrwxrwxrwx 1 root root 27 Dec 4 13:42 mariadb -> mariadb-5.5.24-linux-x86_64
drwxr-xr-x 13 root root 4096 Dec 4 13:42 mariadb-5.5.24-linux-x86_64
-rw-r--r-- 1 root root 213836788 Dec 4 13:41 mariadb-5.5.24-linux-x86_64.tar.gz
drwxr-xr-x 2 root root 4096 Dec 4 13:42 mariadb-data
drwxr-xr-x 9 root root 4096 Nov 28 12:01 samba4
2.2 사용자 생성 및 소유권 설정
groupadd --system mariadb
useradd -c "MariaDB Server" -d /opt/mariadb -g mariadb --system mariadb
chown -R mariadb:mariadb mariadb-5.5.24-linux-x86_64/
chown -R mariadb:mariadb mariadb-data/
3 my.cnf 설정
3.1 편집
pwd
/opt
cp mariadb/support-files/my-medium.cnf mariadb-data/my.cnf
chown mariadb:mariadb mariadb-data/my.cnf
vi ./mariadb-data/my.cnf
[client]
port = 3307
socket = /opt/mariadb-data/mariadb.sock
[mysqld]
datadir = /opt/mariadb-data
basedir = /opt/mariadb
port = 3307
socket = /opt/mariadb-data/mariadb.sock
user = mariadb
4. 데몬 구동
cp mariadb/support-files/mysql.server /etc/init.d/mariadb
chmod +x /etc/init.d/mariadb
4.1 데몬 시작 파일 편집
vi /etc/init.d/mariadb
- # Provides: mysql
+ # Provides: mariadb
- basedir=
+ basedir=/opt/mariadb
- datadir=
+ datadir=/opt/mariadb-data
- lock_file_path="$lockdir/mysql"
+ lock_file_path="$lockdir/mariadb"
4.1 하나의 구성 파일만 사용하도록 설정
/etc/init.d/mariadb 파일 수정.
# my.cnf 파일을 사용하여 mysqld에 다가 추가 인수를 제공해야한다.
# 만약 업그레이드가 일어나면 스크립트를 덮어 쓸 수 있다.
$bindir/mysqld_safe --defaults-file=/opt/mariadb-data/my.cnf --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
# mariadb start mysqladmin 명령어 사용.
wait_for_ready () {
[...]
if $bindir/mysqladmin --defaults-file=/opt/mariadb-data/my.cnf ping >/dev/null 2>&1; then
수정파일
=== modified file 'support-files/mysql.server.sh'
--- support-files/mysql.server.sh 2017-07-16 17:09:54 +0000
+++ support-files/mysql.server.sh 2018-02-17 10:10:30 +0000
@@ -147,68 +147,12 @@
datadir_set=1
;;
--pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
+ --socket=*) socket=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
--service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
esac
done
}
-wait_for_pid () {
- verb="$1" # created | removed
- pid="$2" # process ID of the program operating on the pid-file
- pid_file_path="$3" # path to the PID file.
-
- i=0
- avoid_race_condition="by checking again"
-
- while test $i -ne $service_startup_timeout ; do
-
- case "$verb" in
- 'created')
- # wait for a PID-file to pop into existence.
- test -s "$pid_file_path" && i='' && break
- ;;
- 'removed')
- # wait for this PID-file to disappear
- test ! -s "$pid_file_path" && i='' && break
- ;;
- *)
- echo "wait_for_pid () usage: wait_for_pid created|removed pid pid_file_path"
- exit 1
- ;;
- esac
-
- # if server isn't running, then pid-file will never be updated
- if test -n "$pid"; then
- if kill -0 "$pid" 2>/dev/null; then
- : # the server still runs
- else
- # The server may have exited between the last pid-file check and now.
- if test -n "$avoid_race_condition"; then
- avoid_race_condition=""
- continue # Check again.
- fi
-
- # there's nothing that will affect the file.
- log_failure_msg "The server quit without updating PID file ($pid_file_path)."
- return 1 # not waiting any more.
- fi
- fi
-
- echo $echo_n ".$echo_c"
- i=`expr $i + 1`
- sleep 1
-
- done
-
- if test -z "$i" ; then
- log_success_msg
- return 0
- else
- log_failure_msg
- return 1
- fi
-}
-
# Get arguments from the my.cnf file,
# the only group, which is read from now on is [mysqld]
if test -x ./bin/my_print_defaults
@@ -266,6 +210,69 @@
parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`
+# wait for the pid file to disappear
+wait_for_gone () {
+ pid="$1" # process ID of the program operating on the pid-file
+ pid_file_path="$2" # path to the PID file.
+
+ i=0
+ crash_protection="by checking again"
+
+ while test $i -ne $service_startup_timeout ; do
+
+ if kill -0 "$pid" 2>/dev/null; then
+ : # the server still runs
+ else
+ if test ! -s "$pid_file_path"; then
+ # no server process and no pid-file? great, we're done!
+ log_success_msg
+ return 0
+ fi
+
+ # pid-file exists, the server process doesn't.
+ # it must've crashed, and mysqld_safe will restart it
+ if test -n "$crash_protection"; then
+ crash_protection=""
+ sleep 5
+ continue # Check again.
+ fi
+
+ # Cannot help it
+ log_failure_msg "The server quit without updating PID file ($pid_file_path)."
+ return 1 # not waiting any more.
+ fi
+
+ echo $echo_n ".$echo_c"
+ i=`expr $i + 1`
+ sleep 1
+
+ done
+
+ log_failure_msg
+ return 1
+}
+
+wait_for_ready () {
+
+ test -n "$socket" && sockopt="--socket=$socket"
+
+ i=0
+ while test $i -ne $service_startup_timeout ; do
+
+ if $bindir/mysqladmin $sockopt ping >/dev/null 2>&1; then
+ log_success_msg
+ return 0
+ fi
+
+ echo $echo_n ".$echo_c"
+ i=`expr $i + 1`
+ sleep 1
+
+ done
+
+ log_failure_msg
+ return 1
+}
#
# Set pid file if not given
#
@@ -292,7 +299,7 @@
# Give extra arguments to mysqld with the my.cnf file. This script
# may be overwritten at next upgrade.
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
- wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
+ wait_for_ready; return_value=$?
# Make lock for RedHat / SuSE
if test -w "$lockdir"
@@ -319,7 +326,7 @@
echo $echo_n "Shutting down MySQL"
kill $mysqld_pid
# mysqld should remove the pid file when it exits, so wait for it.
- wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value=$?
+ wait_for_gone $mysqld_pid "$mysqld_pid_file_path"; return_value=$?
else
log_failure_msg "MySQL server process #$mysqld_pid is not running!"
rm "$mysqld_pid_file_path"
5. 테스트
설정 파일 지정.
cd /opt/mariadb
scripts/mysql_install_db --defaults-file=/opt/mariadb-data/my.cnf
데몬 시작.
/etc/init.d/mariadb start
cd /etc/init.d
시작 데몬 등록
chmod +x mariadb
update-rc.d mariadb defaults
6. 확인.
mysql -e "SELECT VERSION();"
+--------------------+
| VERSION() |
+--------------------+
| 5.5.24-MariaDB-log |
+--------------------+
mysql -e "SELECT VERSION();" --socket=/opt/mariadb-data/mariadb.sock
Enter password:
+-----------+
| VERSION() |
+-----------+
| 5.5.41 |
+-----------+
# mysql --socket=/opt/mariadb-data/mariadb.sock
mariadb 패스워드 설정
mysql -u root
mysql> use mysql;
mysql> update user set password=PASSWORD("new-password") where User='root';
mysql> flush privileges;
mysql> exit
익명 사용자 삭제
DELETE FROM mysql.user WHERE user='' AND host='myhost';
FLUSH PRIVILEGES;
테스트베이스를 삭제하고 접근
DELETE FROM mysql.db WHERE db LIKE 'tes%' AND user='';
FLUSH PRIVILEGES;
데이터베이스에 대한 원격 연결 비활성화
vi my.cnf
bind-address=127.0.0.1
/opt/mariadb-data 디렉토리에 MariaDB 데이터베이스를 업데이트 할 경우(mariadb.socket, my.cnf)
/opt 새 버전의 데이터베이스 압축푼다.
심볼릭 링크 mariadb를 지정된 디렉토리로 변경하십시오.
MariaDB 시작
소켓을 사용하여 업데이트 스크립트를 실행 -> --socket=/opt/mariadb-data/mariadb.sock
mysql 데이터 베이스 동기화 업그레이드.(myaql에 DB가 마리아DB로 업데이트 된다).
/usr/local/mariadb/bin/mysql_upgrade -uroot -p
===============================
Mariadb10.2.8 데이터베이스 설치
===============================
다운로드 : https://downloads.mariadb.org/interstitial/mariadb-10.2.8/bintar-linux-x86_64/mariadb-10.2.8-linux-x86_64.tar.gz?serv
cd /usr/local/mariadb
sudo groupadd --system mariadb
sudo useradd -g mariadb mariadb
sudo chown -R mariadb:mariadb /usr/local/mariadb
sudo chown -R mariadb:mariadb /usr/local/mariadb/data/
sudo cp /usr/local/mariadb/support-files/my-large.cnf /usr/local/mariadb/data/my.cnf
vi /usr/local/mariadb/data/my.cnf
[client]
#password = your_password
port = 3307
socket = /opt/mariadb-data/mariadb.sock
# Here follows entries for some specific programs
# The MariaDB server
[mysqld]
datadir = /opt/mariadb-data
basedir = /opt/mariadb
port = 3307
socket = /opt/mariadb-data/mariadb.sock
user = mariadb
sudo cp /usr/local/mariadb/support-files/mysql.server /etc/init.d/mariadb
sudo chmod +x /etc/init.d/mariadb
vi /etc/init.d/mariadb
- # Provides: mysql
+ # Provides: mariadb
- basedir=
+ basedir=/usr/local/mariadb
- datadir=
+ datadir=/usr/local/mariadb/data
- lock_file_path="$lockdir/mysql"
+ lock_file_path="$lockdir/mariadb"
$bindir/mysqld_safe --defaults-file=/usr/local/mariadb/data/my.cnf --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null 2>&1 &
wait_for_ready; return_value=$?
1. mysql, mariadb 바이너리 버전으로 설치 후 부팅시 시작 오류 발생.
메세지 내용.
/usr/local/mysql/share/errmsg.sys를 찾을 수 없음.
바이너리 설치 디렉토리 /usr/local/mysql이 아닌 경우 오류 발생.
추가
설치 파일 경로는 /usr/local/mysql 일 경우.
/etc/my.cnf 파일에 다음줄 추가.
language = /usr/local/mysql/share/english
/etc/mysql/my.cnf 권한 변경
chmod 644 /etc/mysql/my.cnf
/etc/mysql/debian-start 실행에서 문제가 발생.
다음 명령을 통해 debian-start 검색
locate debian-start
updatedb
locate debian-start
파일복사.
mariadb-10.2.8/debian/additions/debian-star /etc/mysql/
2. mariadb 버전 업그레이드
/usr/local/mariadb/bin/mysql_upgrade -uroot -p
========================================
Mariadb 우분투 저장소 단일 DB 사용 설치
========================================
sudo apt-get install python-software-properties
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
ubuntu 12.04
# sudo add-apt-repository 'deb http://mirror.klaus-uwe.me/mariadb/repo/5.5/ubuntu precise main'
Ubuntu 12.10
# sudo add-apt-repository 'deb http://mirror.klaus-uwe.me/mariadb/repo/5.5/ubuntu quantal main'
Ubuntu 13.10
# sudo add-apt-repository 'deb http://mirror.klaus-uwe.me/mariadb/repo/5.5/ubuntu saucy main'
sudo apt-get update
sudo apt-get install mariadb-server
sudo service mysql start
mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or g.
Your MariaDB connection id is 35
Server version: 5.5.36-MariaDB-1~saucy-log mariadb.org binary distribution
.
Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.
.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
.
MariaDB [(none)]>
설치시 이미 업그레이드 됨.
mysql_upgrade -uroot -p
카메라 ONVIF 지원 확인
카메라 ONVIF 지원 확인
ONVIF 지원 여부를 검사.
ONVIF를 통해 RTSP 스트리밍 전송 확인.
1. 카메라 정보 확인.
1.1 카메라 업체 공급 문의.
- ONVIF 공식 테스트 툴 적합성 버번 확인.
- NUUO 제품의 경우 최소한 ONVIF 공식 테스트 도구 버전 12.06을 준수하며, S 프로파일을 지원해야 한다.
1.2 ONVIF 사이트 이동
https://www.onvif.org/
1.2.1 제품 검색
Conformant Products 클릭
Product Search(제품 검색)
Application Type:
Profile(s):
Manufacturer:
Product Name:
1.2.2 작합성 확인.
보고서 파업창 확인 목록
- 카메라 지원하는 프로파일 유형
- 지원되는 카메라 기능
- 카메라 프로파일 S를 지원하는지 확인.
1.2.3 DOC 클릭
카메라 ONVIF Device Test Tool 12.06 버전 이상을 통과했는지 확인.
2. ONVIF 미 지원 영부
- ONVIF 웹 페이지에서 카메라 브랜드를 검색하고 찾을 수 없다.
- ONVIF 웹 페이지에서 카메라 모델을 검색하고 찾을 수 없다.
- 카메라 모델은 프로파일 S를 지원하지 않는다.
- 카메라 모델은 테스트되지 않았으며 ONVIF Device Test Tool 버전 12.06 이상을 통과했다.
3. 카메라가 ONVIF 지원하지만, ONVIF 프로토콜을 통해 연결하지 못한 경우.
3.1 ONVIF 연결 설정 확인
- ONVIF 프로토콜 비활성화 확인.
3.2 NVR Device Pack 최신 버전 업그레이드
3.2.1 Device Pack 최신 버전 다운로드
- 제조사 다운로드 사이트 접근
- 카메라/NVR ONVIF 프로토콜 사용 확인.
- 카메라 제공 스트리밍 H.265 코덱 사용시 ONVIF/ONVIF17.06을 사용.
- 카메라 펌웨어 업그레이드 필요 할 수 있음.
ONVIF 지원 여부를 검사.
ONVIF를 통해 RTSP 스트리밍 전송 확인.
1. 카메라 정보 확인.
1.1 카메라 업체 공급 문의.
- ONVIF 공식 테스트 툴 적합성 버번 확인.
- NUUO 제품의 경우 최소한 ONVIF 공식 테스트 도구 버전 12.06을 준수하며, S 프로파일을 지원해야 한다.
1.2 ONVIF 사이트 이동
https://www.onvif.org/
1.2.1 제품 검색
Conformant Products 클릭
Product Search(제품 검색)
Application Type:
Profile(s):
Manufacturer:
Product Name:
1.2.2 작합성 확인.
보고서 파업창 확인 목록
- 카메라 지원하는 프로파일 유형
- 지원되는 카메라 기능
- 카메라 프로파일 S를 지원하는지 확인.
1.2.3 DOC 클릭
카메라 ONVIF Device Test Tool 12.06 버전 이상을 통과했는지 확인.
2. ONVIF 미 지원 영부
- ONVIF 웹 페이지에서 카메라 브랜드를 검색하고 찾을 수 없다.
- ONVIF 웹 페이지에서 카메라 모델을 검색하고 찾을 수 없다.
- 카메라 모델은 프로파일 S를 지원하지 않는다.
- 카메라 모델은 테스트되지 않았으며 ONVIF Device Test Tool 버전 12.06 이상을 통과했다.
3. 카메라가 ONVIF 지원하지만, ONVIF 프로토콜을 통해 연결하지 못한 경우.
3.1 ONVIF 연결 설정 확인
- ONVIF 프로토콜 비활성화 확인.
3.2 NVR Device Pack 최신 버전 업그레이드
3.2.1 Device Pack 최신 버전 다운로드
- 제조사 다운로드 사이트 접근
- 카메라/NVR ONVIF 프로토콜 사용 확인.
- 카메라 제공 스트리밍 H.265 코덱 사용시 ONVIF/ONVIF17.06을 사용.
- 카메라 펌웨어 업그레이드 필요 할 수 있음.
ONVIF Onvif Device Manager
리눅스 Onvif Device Manager 프로그램
1. xeoma
우분투 16.04 xeoma PPA 저장소 지원하지 않음.
소스 파일 존재 이 파일로 컴파일 해 진행해야함.
http://felenasoft.com/xeoma/downloads/xeoma_linux64.tgz
2. Lingodigit ONVIF Device Tool
라즈베리 파이 카메라 및 임베디드 리눅스 기술 : https://www.lingodigit.com/onvif.html
Lingodigit ONVIF Device Tool v19.05
- ONVIF Client Test Tool v18.12의 ONVIF Conformance Supported Profiles S를 통과했음.
- VLC 플레이어가 내장 된 Linux Qt GUI를 QTGstreamer로 변경.
- Ubuntu 사용자가 아닌 경우 수동 설치해야 함.
우분투 18.04 64 비트 (amd64) : onvif-device-tool_19.05-2019.05.30_amd64.deb(https://www.lingodigit.com/onvif/onvif-device-tool_19.05-2019.05.30_amd64.deb)
Linux (amd64) 수동 설치 : onvif_device_tool_Release.2019.05.30.zip(https://www.lingodigit.com/onvif/onvif_device_tool_Release.2019.05.30.zip)
3. Soruce Forege
https://sourceforge.net/projects/onvifdm/support
4. 스트림 URL 검색
네트워크 카메라의 RTSP URL 검색
https://github.com/xris-hu/gsoap-onvif
5. ONVIF 뷰어
onvif 공식 사이트 : https://www.onvif.org/
뷰어 사이트 : https://gitlab.com/caspermeijn/onvifviewer
Kirigami UI framework: https://github.com/KDE/kirigami
OnVIFViewer는 QT 기반의 Kirigami UI 프레임 워크를 바탕으로 개발 되어짐.
IP 카메라와 통신하기 CPP 라이브러리 개발.
이 라이브러리는 나중 사용을 위해 독릭 모듈로 변환 될 수 있따.
5.1 설치방법
ONVIFViewer는 Ubuntu, Mint, Fedora 및 기타 Linux 시스템 용 Flatpak 설치 프로그램과 함께 제공한다.
https://flatpak.org/setup/
접근 후 사용하는 운영체제를 선택한다.
Flatpak을 설정하고 설치 url 참조.
https://flathub.org/apps/details/net.meijn.onvifviewer
설치
flatpak install flathub net.meijn.onvifviewer
실행
flatpak run net.meijn.onvifviewer
참고 사이트
https://www.debugpoint.com/2018/08/onvifviewer-internet-camera-viewer-for-linux/
06. ONVIF 장치 (IP 카메라) 서비스 서버
프로젝트 사이트 : https://github.com/KoynovStas/onvif_srvd
최소한의 구현으로 한다.
IP 카메라 ONVIF용 서비스 작성을 위한 템플릿으로 사용해얀한다.
07. 윈도우즈 스트림 URL 검색.
https://sourceforge.net/projects/onvifdm/
RTSP 또는 MJPEG 스트림 경로 확인.
스트림 경로 찾기
1 단계 : 검색하려는 기기와 동일한 네트워크에 있는지 확인합니다
(고급 사용자는 원격으로 액세스 할 수있는 카메라의 스트림 주소를 찾을 수도 있습니다.
"추가"버튼을 사용하여 공개를 지정하십시오. 원격 장치의 주소 및 전달 된 ONVIF 포트)
2 단계 : ONVIF 장치 관리자 다운로드 및 설치 (Windows 만 해당)
3 단계 : "새로 고침"버튼을 클릭하여 네트워크를 스캔하십시오
4 단계 : 메뉴에서 "실시간 비디오"를 선택하십시오
5 단계 : 라이브 비디오 뷰어 창 아랫에 표시된 스트림 주소를 클립 보드에 복사합니다 (직접 연결하는 경우 로컬 IP 주소를 공개 IP 주소로 바꾸십시오)
참고 : 카메라가 비밀번호로 보호 된 경우 왼쪽 상단에 자격 증명을 입력하십시오.
1. xeoma
우분투 16.04 xeoma PPA 저장소 지원하지 않음.
소스 파일 존재 이 파일로 컴파일 해 진행해야함.
http://felenasoft.com/xeoma/downloads/xeoma_linux64.tgz
2. Lingodigit ONVIF Device Tool
라즈베리 파이 카메라 및 임베디드 리눅스 기술 : https://www.lingodigit.com/onvif.html
Lingodigit ONVIF Device Tool v19.05
- ONVIF Client Test Tool v18.12의 ONVIF Conformance Supported Profiles S를 통과했음.
- VLC 플레이어가 내장 된 Linux Qt GUI를 QTGstreamer로 변경.
- Ubuntu 사용자가 아닌 경우 수동 설치해야 함.
우분투 18.04 64 비트 (amd64) : onvif-device-tool_19.05-2019.05.30_amd64.deb(https://www.lingodigit.com/onvif/onvif-device-tool_19.05-2019.05.30_amd64.deb)
Linux (amd64) 수동 설치 : onvif_device_tool_Release.2019.05.30.zip(https://www.lingodigit.com/onvif/onvif_device_tool_Release.2019.05.30.zip)
3. Soruce Forege
https://sourceforge.net/projects/onvifdm/support
4. 스트림 URL 검색
네트워크 카메라의 RTSP URL 검색
https://github.com/xris-hu/gsoap-onvif
5. ONVIF 뷰어
onvif 공식 사이트 : https://www.onvif.org/
뷰어 사이트 : https://gitlab.com/caspermeijn/onvifviewer
Kirigami UI framework: https://github.com/KDE/kirigami
OnVIFViewer는 QT 기반의 Kirigami UI 프레임 워크를 바탕으로 개발 되어짐.
IP 카메라와 통신하기 CPP 라이브러리 개발.
이 라이브러리는 나중 사용을 위해 독릭 모듈로 변환 될 수 있따.
5.1 설치방법
ONVIFViewer는 Ubuntu, Mint, Fedora 및 기타 Linux 시스템 용 Flatpak 설치 프로그램과 함께 제공한다.
https://flatpak.org/setup/
접근 후 사용하는 운영체제를 선택한다.
Flatpak을 설정하고 설치 url 참조.
https://flathub.org/apps/details/net.meijn.onvifviewer
설치
flatpak install flathub net.meijn.onvifviewer
실행
flatpak run net.meijn.onvifviewer
참고 사이트
https://www.debugpoint.com/2018/08/onvifviewer-internet-camera-viewer-for-linux/
06. ONVIF 장치 (IP 카메라) 서비스 서버
프로젝트 사이트 : https://github.com/KoynovStas/onvif_srvd
최소한의 구현으로 한다.
IP 카메라 ONVIF용 서비스 작성을 위한 템플릿으로 사용해얀한다.
07. 윈도우즈 스트림 URL 검색.
https://sourceforge.net/projects/onvifdm/
RTSP 또는 MJPEG 스트림 경로 확인.
스트림 경로 찾기
1 단계 : 검색하려는 기기와 동일한 네트워크에 있는지 확인합니다
(고급 사용자는 원격으로 액세스 할 수있는 카메라의 스트림 주소를 찾을 수도 있습니다.
"추가"버튼을 사용하여 공개를 지정하십시오. 원격 장치의 주소 및 전달 된 ONVIF 포트)
2 단계 : ONVIF 장치 관리자 다운로드 및 설치 (Windows 만 해당)
3 단계 : "새로 고침"버튼을 클릭하여 네트워크를 스캔하십시오
4 단계 : 메뉴에서 "실시간 비디오"를 선택하십시오
5 단계 : 라이브 비디오 뷰어 창 아랫에 표시된 스트림 주소를 클립 보드에 복사합니다 (직접 연결하는 경우 로컬 IP 주소를 공개 IP 주소로 바꾸십시오)
참고 : 카메라가 비밀번호로 보호 된 경우 왼쪽 상단에 자격 증명을 입력하십시오.
XIAOVV 무선 WiFi 카메라 테스트
무선망 구축
1. 카메라 확인.
무선 라우터 정보 확인.
rtsp://카메라 IP:8899/live/ch00_1
접속 안됨.
즉,현재 구매한 XIAOVV 카메라는 ONVIF는, rtsp 지원하지 않음.
ip카메라는 각각의 카메라가 규정화된 pc와 비슷하여 동일 프로토콜을 사용하여야만이 한개의 nvr로 구성이 가능.
nvr이 지원하는 프로토콜 확인. 카메라에서 지원하는 프로토콜과 NVR에서 지원하는 프로토콜이 있어야 함.
onvif지원 해주는 카메라를 구매하면 된다.
ONVIF 지원 카메라의 경우 작업. ONVIF (Open Network Video Interface Forum)
ODM (Onvif Device Manager)라는 프로그램을 설치
IP CAMERA를 네트워크에 접목
[
아날로그카메라와 달리 디지털카메라의 경우 네트워크에 붙였다고 해서 바로 작동이 되지 않는다.
대략 부팅과 구동등의 과정으로 1~2분정도의 시간이 필요하다.
이후 ODM프로그램에서 serch를 통해서 해당 카메라의 주소를 확인함.
디지털카메라는 한개의 ip address를 갖고 운용한다.
NVR은 고정 IP 사용.
카메라도 같은 대역에 DDNS 구성.
만약 할 수 없다면 고정 IP 정보 입력.
네트워 카메라 기능중 Cloud 기능
cloud기능은 카메라 하나하나가 인터넷에서 고유의 시리얼을 통해 해당 어플등으로 디지털카메라에서 촬영된 영상을 손쉽게 볼 수 있게 해주는 기능.
NVR의 기능을 Cloud 서비스가 함.
Cloud 기능은 사용하지 않음.
카메라 설정이 있는 경우.
공유기 기능중 DMZ 설정이 있음.
dmz 설정에 nvr 주소를 입력한다.
결론.
XIAOVV 카메라는 onvif 을 지원한다고 하지만 결국 지원하지 않는다. 허위 공고이며, 클라우드 서비스만 지원하고 있다.
1. 카메라 확인.
무선 라우터 정보 확인.
rtsp://카메라 IP:8899/live/ch00_1
접속 안됨.
즉,현재 구매한 XIAOVV 카메라는 ONVIF는, rtsp 지원하지 않음.
ip카메라는 각각의 카메라가 규정화된 pc와 비슷하여 동일 프로토콜을 사용하여야만이 한개의 nvr로 구성이 가능.
nvr이 지원하는 프로토콜 확인. 카메라에서 지원하는 프로토콜과 NVR에서 지원하는 프로토콜이 있어야 함.
onvif지원 해주는 카메라를 구매하면 된다.
ONVIF 지원 카메라의 경우 작업. ONVIF (Open Network Video Interface Forum)
ODM (Onvif Device Manager)라는 프로그램을 설치
IP CAMERA를 네트워크에 접목
[
아날로그카메라와 달리 디지털카메라의 경우 네트워크에 붙였다고 해서 바로 작동이 되지 않는다.
대략 부팅과 구동등의 과정으로 1~2분정도의 시간이 필요하다.
이후 ODM프로그램에서 serch를 통해서 해당 카메라의 주소를 확인함.
디지털카메라는 한개의 ip address를 갖고 운용한다.
NVR은 고정 IP 사용.
카메라도 같은 대역에 DDNS 구성.
만약 할 수 없다면 고정 IP 정보 입력.
네트워 카메라 기능중 Cloud 기능
cloud기능은 카메라 하나하나가 인터넷에서 고유의 시리얼을 통해 해당 어플등으로 디지털카메라에서 촬영된 영상을 손쉽게 볼 수 있게 해주는 기능.
NVR의 기능을 Cloud 서비스가 함.
Cloud 기능은 사용하지 않음.
카메라 설정이 있는 경우.
공유기 기능중 DMZ 설정이 있음.
dmz 설정에 nvr 주소를 입력한다.
결론.
XIAOVV 카메라는 onvif 을 지원한다고 하지만 결국 지원하지 않는다. 허위 공고이며, 클라우드 서비스만 지원하고 있다.
2019/12/03
피드 구독하기:
글 (Atom)



