본문 바로가기

Linux/systemd

(13)
systemd-detect-virt로 가상화 환경 확인하기 systemd는 systemd-detect-virt 라는 프로그램을 포함하고 있습니다. 이를통해 현재 가상화 환경에서 실행되는지, 어떤 가상화 기술을 사용하는지 확인할 수 있습니다. 사용방법은 단순히 쉘에서 systemd-detect-virt를 실행하면 됩니다.먼저 어떠한 가상화도 사용하지 않았다면 none이라는 문자열이 출력됩니다.라즈베리파이에서 systemd-nspawn을 통해 실행되는 컨테이너는 systemd-nspawn을 출력합니다.추가적으로 Vultr의 인스턴스는 kvm을 사용하는 것으로 나옵니다. 이외에도 WSL, vmware, qemu, docker 등 다양한 가상화 기술도 감지할 수 있습니다. 추가적인 옵션이나 감지가능한 기술 목록을 보려면 아래의 man 페이지를 참고하기 바랍니다. htt..
systemd 유닛 설정 수정하기 최근 대부분의 배포판들이 systemd를 init으로 사용하고, 패키지 안에 systemd service 유닛 파일을 포함하고 있어서 사용자는 그냥 systemctl 명령으로 프로그램을 실행, 중지를 하면 됩니다. 그런데 몇몇 패키지 간에 우선순위나 환경변수, 리소스 컨트롤이 필요한 경우가 발생할 수 있습니다. systemd는 최대한 동시에 실행하려하기 때문에 우선순위를 제대로 정하지 않는다면 실행이 성공할 수도 있고 실패할 수도 있는 마치 슈뢰딩거의 고양이같은 상황이 발생할 수 있습니다. 저의 경우는 postfix와 bind9이 동일한 서버에 있고 postfix가 bind9이 완전히 실행되기도 전에 제 서버의 도메인을 리졸브 시도를 하여 실행 실패한 적이 있었습니다. 우연히 bind9이 빨리 실행되어 ..
systemd-resolved로 LLMNR 사용하기 로컬 네트워크 내에서 일일히 IP를 적어서 연결하는 것은 귀찮은 일입니다. 거기다 IPv6 Link-local 주소를 사용한다면 더더욱 기억하기 어렵습니다. 그렇다고 네트워크에 DNS 서버를 설치하는 것도 배보다 배꼽이 큰 것 같습니다. 이럴 때 LLMNR이 좋은 해결책이 될 수 있습니다. LLMNR을 통해 동일한 네트워크 내에서 호스트네임으로 그 이름을 가진 호스트의 IP를 알아낼 수 있습니다. DNS 서버와 다른 점은 멀티캐스트를 사용한 기술이기 때문에 서버가 필요없고, 단지 호스트가 LLMNR 서비스를 실행해두고 있으면 됩니다. 거기다 Microsoft에서 만들었기 때문에 Windows에도 적용되어 있으므로 리눅스와 함께 사용할 수 있습니다. systemd-resolved는 기본적으로 LLMNR이 ..
[Linux] coredumpctl로 크래시 디버깅하기 리눅스는 프로그램에서 에러가 나서 크래시되면 coredump 파일을 남기게 할 수 있습니다. 옛날에만 해도 ulimit에 coredump를 남기지 않도록 기본설정이 되어있어서 에러를 확인하고 싶어도 정보가 없었던 적도 있었습니다. 하지만 init에 systemd가 채용되면서 단순히 파일만 남기는게 아니라 systemd가 해당 에러의 내용과 coredump 파일, 시간 등의 기록을 남기는 역할도 맡게 되었습니다. systemd는 이 기록들을 조회하고 관리하기위해 coredumpctl 이란 명령을 제공합니다. 그냥 해당 명령을 실행하면 지금까지 있었던 기록들을 보여줍니다. 참고로 이 기록은 journalctl과 연동됩니다. 사용자가 시스템 전반의 journal에 접근할 권한이 없다면 자신의 coredump ..
systemd-networkd로 SIT 터널링 설정하기 이전 글로 터널브로커로 IPv6 터널링을 하는 방법을 설명했습니다. tunnelbroker.net으로 공인 IPv6 할당받기 한국에서는 아직 개인 인터넷에 IPv6를 할당하는 ISP가 없습니다. 하지만 NAS나 서버를 집에서 운영하거나 실험적인 목적으로 IPv6를 할당받고 싶은 사람도 있습니다. 그런 분들을 위해 IPv4를 통해 IPv6 패킷을.. stackframe.tistory.com 저 글에서는 명령으로만 터널링을 설정한 관계로 리부팅하면 초기화된다는 단점이 있었습니다. 이번 글에서는 systemd-networkd를 통해 리부팅을 하여도 인터페이스가 유지되도록 설정하는 방법을 설명하겠습니다. 먼저 준비되어야 할 것은 systemd-networkd로 컴퓨터의 네트워크가 관리되고 있어야 한다는 점입니다..
systemd-boot를 부트로더로 사용하기 저도 리눅스 입문을 우분투로 했기 때문에 처음 부트로더로 사용한 것은 GRUB2였습니다. 초기에는 딱히 만질줄도 모르고 수정할 일도 없었기에 설치된 그대로 사용하였지만 리눅스에 익숙해지고 커널 파라미터를 넣거나 커스텀 커널을 사용하려니 너무 설정하기 복잡했습니다. 그러다가 아치리눅스로 넘어오고 systemd-boot를 알게 되었습니다. systemd-boot는 굉장히 심플하며 최소한의 기능만 들어있습니다. 그래서 GRUB2과 비교한다면 빈약하고 제약사항이 많다고도 할 수 있습니다. 그럼에도 불구하고 제가 사용하는 이유는 설정의 편리함 때문입니다. GRUB2은 /etc/default/grub, /etc/grub.d/ 등의 설정을 만져주고 업데이트를 실행해야만 비로소 적용됩니다. 그 설정파일도 쉘코드로 되어..
systemd로 시스템 자원 제한하기 다수의 사람들이 공동으로 사용하는 시스템이나 여러 프로세스들이 돌아가는 서버라면 특정 사용자나 프로세스가 자원을 독점하여 다른 작업에 지장이 생기는 문제에 대해 상당히 민감할겁니다. 하지만 현재 인터넷에 올라와있는 해결방법 중 하나인 cpulimit은 자동 실행 설정하기도 불편하고 단지 특정 프로세스에 대해 CPU 만 제한할 수 있다는 겁니다. 하지만 우리의 멋진 PID 1인 systemd는 다릅니다. CPU와 memory 뿐만 아니라 프로세스 수, IO 마저 제한이 가능합니다. 거기다 systemd는 계층적으로 서비스들을 관리하고 있으므로 특정 사용자나 컨테이너, 서비스 하위의 모든 프로세스에 대해 제한이 가능합니다. 다만 이 기능을 사용하기 위해서는 두가지 필요 요건이 있습니다.먼저 systemd v..
systemd 사용자 유닛 만들기 systemd에서는 사용자만의 유닛을 만들고 로그인 시 자동으로 실행하도록 설정할 수 있습니다. 이것으로 개별 사용자의 입맛대로 시작 프로그램을 등록할 수 있고, .timer나 resource control 등의 systemd 기능들을 사용할 수 있습니다. 먼저 사용자의 systemd 유닛 파일이 존재하는 디렉토리는 계정의 홈 디렉토리 아래의 .config/systemd/user/ 입니다. 사용자가 어떤 유닛을 만들어서 사용하고 싶다면 이 디렉토리에 저장되어 있어야 합니다. 예시로 chromium을 관리하는 서비스를 만들려면 아래와 같이 하면 됩니다. [Unit] Description=Chromium service [Service] ExecStart=/usr/bin/chromium 이 내용을 ~/.con..