반응형

1. TTYD 설치

ttyd 는 웹 기반 터미널 애뮬레이터라고 한다.

WebSocket 프로토콜을 사용해서 브라우저와 Linux 터미널 간의 실시간 연결을 제공한다고 한다.

 

사용하는 이유는 docker 로 container 를 만들어서 사용할 경우에 직접 컨테이너 안을 들어가기가 어렵다.

(openshift 나 기타 툴을 사용하면 모를까..)

 

그래서 컨테이너 안에서 잘 작동하고 있는지 터미널을 붙혀보기위해 오늘은 ttyd 를 사용하는 방법을 알아보려한다.

나는 Rocky Linux 9.x 에서 작업한다.

설치하는 방법은 아래 페이지에서 가져왔다. (CentOS)

https://snapcraft.io/install/ttyd/centos

나의 경우 Rocky  Linux 9.x 이기 때문에 yum 명령어 대신 dnf 명령어로 수행한다.

sudo dnf install epel-release

sudo dnf install snapd

systemctl enable --now snapd.socket

sudo ln -s /var/lib/snapd/snap /snap

sudo snap install ttyd --classic

 

마지막 명령어에서 에러가 났다.

[root@hostname ~]$ sudo snap install ttyd --classic
error: too early for operation, device not yet seeded or device model not acknowledged

 

snap 명령어가 승인되지 않았다라고 나온다.

systemctl enable 명령부분에서 start 는 안되는 것 같다. (그냥 서버 재기동 시에 시작되게만 되는 듯)

상태를 확인해보았다.

[root@hostname ~]$ systemctl status snapd
○ snapd.service - Snap Daemon
     Loaded: loaded (/usr/lib/systemd/system/snapd.service; disabled; preset: disabled)
     Active: inactive (dead) since Tue 2025-04-08 17:29:38 KST; 1min 56s ago
   Duration: 8.004s
TriggeredBy: ● snapd.socket
    Process: 1121447 ExecStart=/usr/libexec/snapd/snapd (code=exited, status=42)
   Main PID: 1121447 (code=exited, status=42)
      Error: 2 (No such file or directory)
        CPU: 96ms

 

해결은 그냥 snap.socket 을 실행시켜주었다.

[root@hostname ~]$ systemctl start snapd
[root@hostname ~]$ systemctl status snapd
● snapd.service - Snap Daemon
     Loaded: loaded (/usr/lib/systemd/system/snapd.service; disabled; preset: disabled)
     Active: active (running) since Tue 2025-04-08 17:31:43 KST; 1s ago
TriggeredBy: ● snapd.socket
   Main PID: 1121496 (snapd)
      Tasks: 9 (limit: 48912)
     Memory: 16.9M
        CPU: 83ms
     CGroup: /system.slice/snapd.service
             └─1121496 /usr/libexec/snapd/snapd

Active 에 active 로 상태 설정을 잘 확인하길 바란다.

이후에 다시 원래 명령어를 실행했다.

sudo snap install ttyd --classic

알아서 잘 다운받는 것 같다.

snap 이라는 명령어가 어떤 store 에서 다운받아 오는 것 같은데, 다음에 알아봐야겠다.

[root@hostname ~]# snap install ttyd --classic
2025-04-08T17:38:07+09:00 INFO Waiting for automatic snapd restart...
Warning: /var/lib/snapd/snap/bin was not found in your $PATH. If you've not restarted your session
         since you installed snapd, try doing that. Please see https://forum.snapcraft.io/t/9469
         for more details.

ttyd 1.7.4 from tsl0922 installed

installed 라고 해서 warning 은 무시하였다.

( 대충 해석하면 snap 이 설치는 되었는데 OS가 안내려갔다 올라와서 snap 에 대한 PATH 를 못찾았다는 내용 같다...

=> 알아서 뭐 잘 설치 했겠지 ㅎㅎ )

 

2. TTYD 를 이용하여 웹에서 접속해보기

우선 설치가 되었는 지 확인해보자

[root@hostname ~]$ ttyd -v
-bash: ttyd: command not found

나 같은 경우 없다고 나온다.

아마 아까 설치할 때 warning 나왔던 PATH 가 이 문제였나보다.

대충 위치를 가늠해보니 설치할 때 link 를 걸어줬던 /snap 으로 들어가 보았더니 거기 안에 설치가 되어있었다.

[root@hostname bin]$ cd /snap/bin
[root@hostname bin]$ ls -al
total 0
drwxr-xr-x. 2 root root 18  4월  8 17:39 .
drwxr-xr-x. 6 root root 70  4월  8 17:39 ..
lrwxrwxrwx. 1 root root 13  4월  8 17:39 ttyd -> /usr/bin/snap
[root@hostname bin]$ ./ttyd -v
ttyd version 1.7.4-68521f5

아무튼간 설치가 잘 되었다!!

 

기본적으로 ttyd 는 7681 포트로 웹서버를 시작한다고 한다.

-p 옵션으로 포트를 변경할 수 있다.

[root@hostname bin]$ ./ttyd -p 8080 bash
[2025/04/08 17:46:21:5072] N: ttyd 1.7.4-68521f5 (libwebsockets 3.2.0)
[2025/04/08 17:46:21:5072] N: tty configuration:
[2025/04/08 17:46:21:5072] N:   start command: bash
[2025/04/08 17:46:21:5072] N:   close signal: SIGHUP (1)
[2025/04/08 17:46:21:5072] N:   terminal type: xterm-256color
[2025/04/08 17:46:21:5072] N: The --writable option is not set, will start in readonly mode[2025/04/08 17:46:21:5073] N:  Using foreign event loop...

실행하면 알아서 서버가 띄워져있고 client 를 listen 하고 있다.

이제 브라우저를 열어서 접속한다.

{서버IP}:8080 으로 접속하면 된다.

이렇게 접속이 된다.

그리고 서버는 잘 연결되었다고 client 의 정보를 보여준다.

 

이렇게 ttyd 설치해서 사용하면 될 것 같다.

 

반응형
반응형
bb.c:(.text+0x0): multiple definition of `test'
/tmp/ccoyicve.o:aa.c:(.text+0x0): first defined here

 

 

첫번째 줄 해석 그대로 중복된 정의라는 얘기이다.

 

아래와 같이 해당 함수가 중복으로 선언이 되었다는 것을 알 수 있다. 

 

두번째 줄의 경우 첫번째로 선언되어 있는 곳을 알려준다. 

 

따라서 중복되는 함수를 유의 깊게 보면 된다.

 

위의 경우 test 라는 함수가 중복이 되었고, bb.c 파일과 aa.c 파일에 중복 선언이 되어있는 test 함수를 체크한다.

 

반응형
반응형

sqlite 설치 환경

linux version : Rocky Linux release 8.7 (Green Obsidian)

kernel version : 4.18.0-425.10.1.el8_7.x86_64

 

sqlite 를 처음 설치하고, 테스트하려고 테스트 명령어를 날려봤다.

sqlite3 test.db

sqlite3 test.db 라는 명령어를 처음 수행하였으나, error 가 발생하였다. 

$ sqlite3 test
sqlite3: /lib64/libm.so.6: version `GLIBC_2.29' not found (required by sqlite3)
sqlite3: /lib64/libc.so.6: version `GLIBC_2.33' not found (required by sqlite3)
sqlite3: /lib64/libc.so.6: version `GLIBC_2.34' not found (required by sqlite3)

 

일단 내가 해석해보자면, sqlite3 를 사용할때 필요한 library 들 中 libm.so.6 과 libc.so.6 라이브러리에 GLIBC_2.29, 2.33, 2.34 버전을 찾을 수 없다는 에러 메시지인거 같다.

 

우선 ldd 명령어로 라이브러리 의존성을 확인했다.

./sqlite3: /lib64/libc.so.6: version `GLIBC_2.34' not found (required by ./sqlite3)
	linux-vdso.so.1 (0x00007ffc239c9000)
	libm.so.6 => /lib64/libm.so.6 (0x00007f0c4cc00000)
	libz.so.1 => /lib64/libz.so.1 (0x00007f0c4c9e8000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f0c4c622000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f0c4cf82000)

libm.so.6, libc.so.6 이 버젓이 있다.

결국 라이브러리를 업데이트를 해줘야할것같다.

 

google에 "version glibc_2.29' not found centos" 로 검색해보았다.

참고 : https://www.deok.me/entry/CentOS-6x-%EC%97%90%EC%84%9C-version-GLIBC214-not-found-%EC%97%90%EB%9F%AC%EA%B0%80-%EB%B0%9C%EC%83%9D%ED%95%A0%EB%95%8C

 

CentOS 6.x 에서 version 'GLIBC_2.14' not found 에러가 발생할때

CentOS 6.x 에서 version 'GLIBC_2.14' not found 와 같이 에러가 날 경우 처리 방법 입니다. 제 경우 docker-compose 를 사용하려는데 아래와 같이 에러가 나네요. $ docker-compose -v docker-compose: /lib64/libc.so.6: version `

www.deok.me

 

결국 위의 블로그를 참고해 없는 버전에 대해 glibc 를 직접 받아주었다.

나는 2.29, 2.33, 2.34 버전이 없다고 했으니 받아보았다.

linux 서버이니까 다운받아서 filezilla는 번거로우니 wget 으로 설치해보겠다.

wget https://ftp.gnu.org/gnu/glibc/glibc-2.29.tar.gz
wget https://ftp.gnu.org/gnu/glibc/glibc-2.33.tar.gz
wget https://ftp.gnu.org/gnu/glibc/glibc-2.34.tar.gz

 

압축 푼 뒤 설치하였다.

 $ tar zxvf glibc-2.29.tar.gz
 $ cd glibc-2.29
 $ mkdir build; cd build;
 $ ../configure --prefix=/opt/glibc-2.29
 $ make -j4
 $ sudo make install
 $ export LD_LIBRARY_PATH=/opt/glibc-2.29/lib

LD_LIBRARY_PATH 는 재로그인하면 셋팅이 안될꺼기 때문에

.bash_profile 에 아래와 같이 저장하였다.

export LD_LIBRARY_PATH=/opt/glibc-2.29/lib:$LD_LIBRARY_PATH

 

저장 후에 다시 sqlite3 testdb 를 날려보았다.

결과는?? 똑같았다.... 무엇이 문제인가 생각해보니 /lib64 에 있던 libm.so.6이 링크였고, libm.so-2.28을 물고있어서 링크를 교체해 주었다.

# libm.so.6 이 있는 위치로 이동
cd /lib64
# 기존 링크 삭제
sudo rm libm.so.6
# 삭제후 재 2-29 버전의 libm 으로 교체
sudo ln -s /opt/glibc-2.29/lib/libm-29.so libm.so.6

 

libc.so.6 같은경우는 조심해야한다... 링크 삭제시에 기본 명령어들을 사용할수없다.

 

이후 sqlite 재실행 해보았다.

$ sqlite3 testdb
sqlite3: /lib64/libc.so.6: version `GLIBC_2.33' not found (required by sqlite3)
sqlite3: /lib64/libc.so.6: version `GLIBC_2.34' not found (required by sqlite3)

드디어 2.29 버전은 사라졌다!!

2.33 과 2.34를 이제 나머지 셋팅을 해주어야하는데 libc.so.6은 다른 방법이 있는 것 같다...

 

반응형
반응형

컴파일 시 warning

아래와 같은 warning 이 발생하였다.

warning: ‘%s’ directive writing up to 255 bytes into a region of size between 192 and 255 [-Wformat-overflow=]

해당 warning은 버퍼오버 플로우를 방지하라는 warning 이다.

이유는 담을 변수의 사이즈가 더 작거나 같거나 할때 나타는 warning 이다.

예시로는 아래와 같은 상황이다.

ex) 
char buf[5];
long a = 10000000;
sprintf( buf, "%d", a )

결국엔 buf의 사이즈보다 더 큰 상황이 올 것이고, 버퍼오버플로우가 날 것이다.

이 부분을 방지하는 것이다.

 

참고 : https://stackoverflow.com/questions/51697753/how-to-suppress-sprintf-warning-directive-writing-between-1-and-11-bytes-into

반응형
반응형

스트림 (stream)

직역하면 흐르다 인데, 원래는 물이 흐르는 시냇물을 의미한다.

컴퓨터에서는 데이터의 흐름으로 말한다. 즉, 데이터가 바이트이기에 바이트의 흐름이다.

흐르기 위해서는 통로가 필요하기때문에 통로라고도 부른다.

컴퓨터에서 스트림
: 데이터의 이동 통로 혹은 바이트의 흐름

linux 에서 스트림은 network 를 연결할 때, device 를 연결할 때 process 끼리 소통할 때 사용된다. 

 

linux 는 파일로 모든 것이 이루어져 있기 때문에 파일에 관한 시스템 콜인 open, close, read, write 가 stream 을 다루는 함수가 된다. open 함수는 fd 값을 반환시키는데, fd가 바로 스트림이 된다. (fd 가 파일을 연결시켜주는 통로가 되기 때문에) 

int open(const char* path, int flags, mode_t mode)

 return 값이 int 형인 fd 가 된다. 즉 스트림을 만들어주는 함수가 이 open 함수가 되는 것이다. 

그렇게 fd (stream) 을 받았으면 그 스트림에 데이터를 흘려 보낸다. 어떻게? write 함수로 

ssize_t write(int fd, const *buf, size_t bufsize)

이게 write (스트림, 보낼 데이터, 보낼 데이터의 크기) 가 되는 것이다.

받는 쪽에서는 read 로 읽는다.

ssize_t read (int fd, void *buf, size_t bufsize)

read (스트림, 읽을 데이터, 읽을 데이터의 크기) 가 된다.

 

close의 경우 스트림을 닫는 역할을 한다. 

int close(int fd)
반응형
반응형

ssd mount  도중나온 error 메세지

mount: /datfs: unknown filesystem type 'ntfs'.

 

ntfs 의 파일시스템 타입이 없다...

당연히 nfs 를 설치를 안하여 나오는 현상이였으나 순간 당황하였다...

 

nfs 를 설치를 하자!!

아래와 같이 설치하면 된다.

# 확인 명령어
rpm -qa | grep nfs

# 결과값이 없을 경우 설치
# 아래 명령어로 설치할수있는 패키지 확인
yum search nfs 

# 그 중에 nfs-utils.x86_64 설치 (nfs-util을 설치하면 된다. 그 뒤는 각자 설정에 따라)
yum install -y nfs-utils.x86_64

이후 mount 시 정상작동 된다!! 

반응형

+ Recent posts