2010-06-16 4 views
1

리눅스 용 C++의 initramfs에 대해 init에서 일하고 있습니다. 이 스크립트는 LUKS로 암호화 된 드라이브가있는 DM-Crypt의 잠금을 해제하고 사용 가능한 LVM 드라이브를 설정하는 데 사용됩니다.리눅스에서 system() 호출 문제

cryptsetupgpg의 기능을 다시 구현할 필요가 없으므로 시스템 호출을 사용하여 실행 파일을 호출하고 있습니다. 시스템 호출을 사용하여 gpg를 호출하면 시스템이 완전히 활성화 된 것입니다. (이미 initramfs를 기반으로하는 bash 스크립트를 가지고 있기 때문에 잘 작동합니다. grub을 사용하여 커맨드 라인을 편집하여 오래된 initramfs). 그러나 initramfs에서는 호출 된 것처럼 작동하지 않습니다. system("echo BLAH");과 같은 명령조차도 실패합니다.

그럼 누구 한테 입력이 있습니까?


편집 : 내 오류의 원인을 파악했습니다. 나는 에 관해서는 단서를 찾지 못했다. 그러나 오류를 발견했다.

는 핫 플러깅을 허용하기 위해, 나는 그러나 나는 (내가 덜 자신을 썼다 함수에) 매개 변수 주위에 전환 결국하지 그래서 /sbin/mdev/proc/sys/kernel/hotplug를 작성했다 ... /proc/sys/kernel/hotplug/sbin/mdev를 작성했습니다.

나는 그것이 문제의 원인이 될 수있는 단서가 없다.

답변

6

Amardeep 부팅되면 로그에서

strace -o myprog.log myprog 

봐는 POSIX에 system(), 권리

type 시스템은 /bin/sh을 통해 명령을 실행합니다.

본인이 Bourne 쉘을 통해 말하는 이러한 프로그램을 실제로 호출 할 필요가 있는지 의심 스럽습니다. 가장 좋은 이유는 기본 환경 변수 세트가 필요할 경우이지만 부팅 과정 초기에 /etc/profile을 사용할 수 없을 가능성이 높기 때문에 여기서 어떻게 될지는 알 수 없습니다. 당신이 호출 과정에서 표준 출력 읽거나 표준 입력에 데이터를 전송해야하는 경우

int system_alternative(const char* pgm, char *const argv[]) 
{ 
    pid_t pid = fork(); 
    if (pid > 0) { 
     // We're the parent, so wait for child to finish 
     int status; 
     waitpid(pid, &status, 0); 
     return status; 
    } 
    else if (pid == 0) { 
     // We're the child, so run the specified program. Our exit status will 
     // be that of the child program unless the execv() syscall fails. 
     return execv(pgm, argv); 
    } 
    else { 
     // Something horrible happened, like system out of memory 
     return -1; 
    } 
} 

, 당신은 pipe() 또는 dup2()를 통해 일부 표준 핸들 리디렉션을 수행해야합니다 :

대신, 표준 fork()/exec() 패턴을 사용 거기에.

좋은 유닉스 프로그래밍 북에서 이런 종류의 모든 것을 배울 수 있습니다. 나는 W. Richard Stevens의 UNIX 환경에서의 고급 프로그래밍을 권장합니다.Rago가 공동 저술 한 두 번째 에디션은 Stevens가 Linux 및 OS X와 ​​같은 첫 번째 에디션을 작성한 이후 등장한 플랫폼을 다루기위한 자료를 추가하지만 원래 버전 이후에는 기본 사항이 변경되지 않았습니다.

+0

도움 주셔서 대단히 감사합니다. 실제로 다른 질문이있을 때'system()'대신'exec()'함수 패밀리를 사용하는 것이 왜 맨 페이지에서 말하는 지 물어 보지 않은 질문에 실제로 응답했습니다. 괜찮으 시다면 파이프 출력에 유용한 링크가 있습니까? (어느 쪽이든, 내가 제안한 책을 주문 했으므로 궁극적으로 좋은 자료를 얻을 수 있습니다.) – Thomas

+1

스티븐스 (Stevens)는 초판 14.2 절에서 그것을 다루고 있습니다. 두 번째 판에서는 15.2 절로 이동했습니다. –

+0

감사합니다. 나는 그것을 반드시 찾을 것이다. – Thomas

6

system() 함수는 쉘에서 명령을 실행한다고 생각합니다. 쉘 실행 파일이 마운트되어 있으며 시작 프로세스 초기에 사용할 수 있습니까? fork() 및 execve()를 사용하여 살펴볼 수 있습니다.

편집 : 암호화 도구도 탑재 된 볼륨에 있는지 확인하십시오.

1

initramfs에 무엇이 있습니까?

int main() { 
    return system("echo hello world"); 

} 

를 그리고이 같은 초기화 스크립트에서 그것을 strace를 : 당신은 다음을 할 수있는 시스템이