젠투에서 MongoDB 빌드 오류

꽤 오래 전 부터 젠투 리눅스에서 MongoDB가 빌드안되어 emerge 명령에서 --exclude dev-db/mongodb 옵션을 주어 무시해왔었다.

직접 패치라도 해볼 생각으로 ChatGPT에게 해당 오류를 복사하여 오류를 복사하여 보고 된 내용이 있는가? 했더니 GCC 최근 버전에서 변경된 사양으로 해당 오류가 발생한다고 알려주었다. 당시 오류 메시지는 남겨놓지 않았으므로 오류 메시지는 아쉽게도 생략. (나중에 GCC 15로 다시 빌드를 시도해서 오류를 발생시켜야겠다.)

결과적으로 GCC 15라면 아래처럼 GCC 14를 머지하여 MongoDB를 빌드해야한다.

emerge sys-devel/gcc:14

이후 MongoDB를 빌드할 때 GCC 14를 사용하도록 빌드 환경변수를 지정해야한다. /etc/portage/env/dev-db 폴더더를 생성 후 해당 폴더에 편집기로 mongodb 파일로 아래와같이 환경변수 값을 설정한다.

CC=gcc-14
CXX=g++-14

이 후 다시 emerge 명령으로 mongodb를 업데이트하면 오류없이 빌드된다. ldd 명령으로 확인하면 GCC 15의 stdc++를 문제없이 참조하지만 mongodb가 GCC 15에서 빌드 되기 전까지는 GCC 14로 빌드해야하므로 컴파일러는 지우지 말고 유지해야겠다.

Linux 6.18.x 버전에서 docker가 구동 안될 때

오늘 Gentoo Linux의 커널을 업데이트 후 docker가 구동 안되는 문제가 발생했다. 메시지는 아래와같이 발생.

Mar 20 18:46:44 tun.iruis.net dockerd[11723]: failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to register "bridge" driver: failed to create NAT chain DOCKER: iptables failed: iptables --wait -t nat -N DOCKER: modprobe: FATAL: Module ip_tables not found in directory /lib/modules/6.18.18-gentoo
Mar 20 18:46:44 tun.iruis.net dockerd[11723]: iptables v1.8.11 (legacy): can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Mar 20 18:46:44 tun.iruis.net dockerd[11723]: Perhaps iptables or your kernel needs to be upgraded.
Mar 20 18:46:44 tun.iruis.net dockerd[11723]:  (exit status 3)
Mar 20 18:46:44 tun.iruis.net dockerd[11723]: time="2026-03-20T18:46:44.297442507+09:00" level=info msg="stopping event stream following graceful shutdown" error="context canceled" module=libcontainerd namespace=plugins.moby

뜬금없이 ip_tables 모듈을 사용할 수 없다는 메시지가 떠서 커널 소스를 확인해보니 net/netfilter/Makefile 파일에 아래와같은 코드가 있다.

obj-$(CONFIG_IP_NF_IPTABLES_LEGACY) += ip_tables.o

즉, 기존의 ip_tables가 legacy로 분류된 것. 해당 항목을 선택하기 위해서는 아래 항목을 선택하면 된다.

-> Networking support
  -> Networking options
    -> Network packet filtering framework (Netfilter)
      -> Core Netfilter Configuration
        -> Netfilter Xtables support (required for ip_tables)
          -> [*] Netfilter legacy tables support
      -> IP: Netfilter Configuration
        -> <M> Legacy IP tables support

NETFILTER_XTABLES_LEGACY를 먼저 선택 후 표시되는 Legacy IP tables support가 선택되었는지 확인하여 자동으로 선택 안되었다면 모듈을 선택하면 된다.

 # make -j12
  SYNC    include/config/auto.conf
  DESCEND objtool
  CALL    scripts/checksyscalls.sh
  INSTALL libsubcmd_headers
  CC [M]  net/ipv4/netfilter/ip_tables.o
  CC [M]  net/ipv4/netfilter/iptable_filter.o
  CC [M]  net/ipv4/netfilter/iptable_mangle.o
  CC [M]  net/ipv6/netfilter/ip6_tables.o
  UPD     kernel/config_data
  GZIP    kernel/config_data.gz
  CC [M]  net/ipv6/netfilter/ip6table_filter.o
  CC [M]  kernel/configs.o
  CC [M]  net/ipv6/netfilter/ip6table_mangle.o
  CC [M]  net/netfilter/x_tables.o
  MODPOST Module.symvers
Kernel: arch/x86/boot/bzImage is ready  (#2)
  LD [M]  kernel/configs.ko
  CC [M]  net/netfilter/x_tables.mod.o
  CC [M]  net/ipv4/netfilter/ip_tables.mod.o
  CC [M]  net/ipv4/netfilter/iptable_mangle.mod.o
  CC [M]  net/ipv4/netfilter/iptable_filter.mod.o
  CC [M]  net/ipv6/netfilter/ip6_tables.mod.o
  CC [M]  net/ipv6/netfilter/ip6table_filter.mod.o
  CC [M]  net/ipv6/netfilter/ip6table_mangle.mod.o
  LD [M]  net/netfilter/x_tables.ko
  LD [M]  net/ipv4/netfilter/ip_tables.ko
  LD [M]  net/ipv6/netfilter/ip6table_filter.ko
  LD [M]  net/ipv6/netfilter/ip6_tables.ko
  LD [M]  net/ipv6/netfilter/ip6table_mangle.ko
  LD [M]  net/ipv4/netfilter/iptable_mangle.ko
  LD [M]  net/ipv4/netfilter/iptable_filter.ko

위와같이 추가로 선택 된 모듈이 빌드되었다. 이것을 설치하고 재부팅하니 docker 실행 해결. 만약 nat 모듈 오류도 발생한다면 ip_tables 모듈이 legacy가 되어 해제된것이니 iptables NAT support를 선택하여 빌드하면되며, raw 모둘 오류가 발생한다면 raw table support (required for NOTRACK/TRACE)를 선택하여 빌드하면 된다.

-> Networking support
  -> Networking options
    -> Network packet filtering framework (Netfilter)
      -> IP: Netfilter Configuration
        -> IP tables support (required for filtering/masq/NAT)
          -> iptables NAT support
          -> raw table support (required for NOTRACK/TRACE)

macOS(맥OS)의 타임머신 백업이 안될경우 해결 법

AFP 지원이 종료 된 후 언젠가부터 네트워크 드라이브의 백업이 진행되지 않는 문제가 발생했다. 그간 신경 안쓰다가 백업 안한지 너무 오래되어 몇시간 헤딩하면서 해결 방법을 찾게되었다.

아래는 증상이 나타나는 화면

SMB로 전환 후 한동안 백업이 되었던거같은데… 어느날 백업 안된지 오래되었다는 알람이 발생하여 확인하니 저렇게 타임머신 백업이 계속 실패했었다. 구글링을 통하여 알게 된 log show --info --style compact --predicate '(subsystem == "com.apple.TimeMachine")' --last 5m 명령으로 타임머신 로그 메시지 조회를 해보았다.

ChatGPT에 로그 메시지를 넣어서 해결법을 요구하니 “의 백업” 문구의 한글 인코딩에 차이가 있다는 결과를 알려주었다. (맥에서 기본적으로 한글을 처리할 때 풀어쓰기를 사용하기때문에 발생하는 버그인지 서로 불일치가 일어난거같다. 분명 잘 되던 백업이 어느날 부터 안되는걸 보면 AFP 지원 종료 후 뭔가 잘못 건든게 있는 듯 하다.)

ChatGPT에서는 명령줄로 변경하는 방법을 제시하였지만…

백업이 끝나면 마운트 해제되므로 위 내용 그대로 할 수 없다. 핵심은 백업 미디어의 볼륨 이름을 바꾼다는 것이므로 아래와 같은 방법으로 변경했다. 참고로 새로운 백업을 생성 한 경우 백업 실패 메시지 까지 떠야 한다.

Continue reading macOS(맥OS)의 타임머신 백업이 안될경우 해결 법

Qt 6.7버전 부터 발생한 사소한 QNetworkRequest 문제

사소하면서 어쩌면 사소하지 않은 문제가 6.7버전부터 발생하였다.

6.6버전까지 HTTP 헤더는 아래와같은 형식의 네이밍을 가진다.

6.7버전 부터는 아래와같은 네이밍을 가진다.

문자열이 아닌 QByteArray여서 그런지 라인피드가 이스케이프되어 표시되는데 보기 편하지 않지만 자세히 보면 6.6버전까지는 단어 첫 글자가 대문자로 시작하지만 6.7버전 부터는 모든 글자가 소문자로 변했다. 보통의 웹서버는 문제가 없지만 간혹 문제가 되는 서버가 있다.

예를 들면 SHIP같은 가벼운 웹서버 같은 경우다.

프로젝트 주소: https://github.com/xgfone/ship

대소문자 무시하여 헤더를 얻지않기때문에 소문자로 되어 있으면 Content-Type 헤더를 얻어오지 못한다. 덕분에 Bad Request를 응답하게 된다. 따라서 이걸 사용한 장비가 있다면 직접 HTTP 프로토콜을 구현하거나 Qt 소스를 고쳐야한다.

이것도 Qt의 버그라고 해야할지 모호하기도 하지만 일반적으로 Content-Type로 헤더를 보내지 content-type로 보내는 경우는 지금까지 본적이 없다. 버그리포트 하기가 좀… 귀찮기도하고 그냥 지금은 Qt 6.6.3을 받아서 써야겠다.

GDI의 SelectObject 함수

요즘은 GDI를 사용할 일이 없겠지만 간혹 사용할 일이 생긴다. 최근 uxtheme를 파고들다보니 다시 접하게 되었는데 GDI 정보가 생각보다 일관성이 없다.

일단 내가 오래전에 봤던 내용 중 기억에 남아있고 하던 코딩 방식은 아래와같았다.

static void TestDC()
{
    HDC hdc = GetDC(NULL);
    HDC memDC = CreateCompatibleDC(hdc);
    HBITMAP memBitmap = CreateCompatibleBitmap(hdc, 100, 100);
    HBITMAP oldBitmap = (HBITMAP)SelectObject(memDC, memBitmap);

    // ...

    SelectObject(memDC, oldBitmap);

    DeleteObject(memBitmap);
    DeleteDC(memDC);
    ReleaseDC(NULL, hdc);
}

DC 객체를 생성하고 처음 SelectObject하면 반환되는 기본 객체는 DC를 지우기 전 다시 SelectObject로 기본 객체를 선택하여 DC를 지워야한다는 것이였다.

GDI 오브젝트 개수를 확인하는 코드를 구글링하니 GetGuiResources(GetCurrentProcess(), GR_GDIOBJECTS) 이러한 코드가 나왔다(참조 링크). 이걸 참조하여 아래와같이 수정하여 실행해보았다.

Continue reading GDI의 SelectObject 함수