C

Linux에서 슈퍼유저만 실행 가능한 C 함수 예제: mount()를 활용한 예제

지오준 2025. 6. 17.
반응형

물론입니다! 아래는 Linux 환경에서 슈퍼유저(root)만 실행 가능한 C언어 함수 예제를 중심으로 작성된 블로그 형식의 글입니다. 실제 소스코드와 함께 개념 설명도 포함되어 있어 학습 및 블로그 포스팅 용도로 적합합니다.


🔐 Linux에서 슈퍼유저만 실행 가능한 C 함수 예제: mount()를 활용한 예제

Linux 시스템에서 C 언어를 사용할 때 특정 함수들은 슈퍼유저(root 권한) 없이는 사용할 수 없습니다. 대표적인 예로 mount() 함수는 파일 시스템을 마운트하는 데 사용되며, 보안상 일반 사용자에게는 허용되지 않습니다.

이 글에서는 mount() 시스템 콜을 사용하여 간단한 디바이스를 마운트하는 예제를 소개하고, 왜 슈퍼유저 권한이 필요한지를 설명합니다.


🧠 왜 mount()는 슈퍼유저만 사용할 수 있을까?

mount()는 파일 시스템을 커널에 연결하는 매우 중요한 시스템 호출입니다. 이 함수로 인해:

  • 다른 파일 시스템을 시스템 트리에 연결하거나,
  • 중요한 데이터에 접근하거나 변경하거나,
  • 시스템의 보안과 무결성에 영향을 줄 수 있습니다.

따라서 이러한 중요한 작업은 일반 사용자로부터 제한되고, root 권한을 가진 슈퍼유저만이 호출할 수 있습니다.


📌 예제: mount() 함수 사용

1. 헤더 파일

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/mount.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>

2. 주요 코드

int main() {
    const char *source = "tmpfs";        // 가상 파일시스템
    const char *target = "/mnt/tmpfs";   // 마운트할 위치
    const char *filesystemtype = "tmpfs";
    unsigned long mountflags = 0;        // 옵션 없음
    const void *data = "size=10M";       // 옵션: 최대 10MB

    // 디렉토리가 존재하지 않으면 생성
    if (access(target, F_OK) != 0) {
        if (mkdir(target, 0755) != 0) {
            perror("mkdir failed");
            return EXIT_FAILURE;
        }
    }

    // 마운트 시도
    if (mount(source, target, filesystemtype, mountflags, data) != 0) {
        perror("mount failed (Are you root?)");
        return EXIT_FAILURE;
    }

    printf("Successfully mounted tmpfs at %s\n", target);

    // 마운트 해제 (cleanup)
    if (umount(target) != 0) {
        perror("umount failed");
        return EXIT_FAILURE;
    }

    printf("Successfully unmounted %s\n", target);
    return EXIT_SUCCESS;
}

🔧 컴파일 및 실행 방법

gcc -o mount_test mount_test.c
sudo ./mount_test

sudo 없이 실행하면 mount failed (Are you root?) 오류가 발생합니다.


✅ 출력 예시 (성공 시)

Successfully mounted tmpfs at /mnt/tmpfs
Successfully unmounted /mnt/tmpfs

🛡️ 일반 사용자로 실행 시

mount failed (Are you root?): Operation not permitted

이는 리눅스 커널이 일반 사용자에게 mount() 호출 권한을 허용하지 않기 때문입니다.


🧪 기타 root 전용 함수 예시

  • reboot() — 시스템 재시작
  • sethostname() — 시스템 호스트네임 변경
  • setuid(0) — 사용자 ID를 root로 변경
  • ioctl() — 디바이스 제어 (일부 작업만 root 가능)
  • mknod() — 특수 파일 생성

📝 마무리

mount()를 비롯한 많은 시스템 함수들은 보안상의 이유로 root 권한을 필요로 합니다. 시스템 수준의 프로그래밍을 할 때는 반드시 권한 문제를 고려해야 하며, root 전용 함수를 테스트할 때는 신중하게 시스템 영향을 파악하고 진행해야 합니다.

이 예제는 리눅스 시스템 프로그래밍을 배우는 초보자에게도 적합하며, **"왜 특정 함수는 root만 사용할 수 있는가?"**를 이해하는 데 좋은 출발점이 됩니다.


반응형

댓글