외부 USB 메모리에 파일 Read, Write 하는 방법이 궁금합니다.

안녕하세요.
외부 USB 메모리리를 자유롭게 읽고 쓰고 싶습니만 아는게 없어서 질문 드립니다 ^^;
많은 가르침 부탁드리겠습니다.
char ch;
FILE * fp=fopen("/media/Yeon_USB/sample/save_exm.txt", "wt");
if(fp==NULL) {
puts("fail !!");
return -1;}
printf("C - Please input Character : ");
scanf("%s", &ch);
fprintf(fp, "%c\n", ch);
fclose(fp);
return 0;
위 프로그램에서는 특정 usb의 경로로 접속해서 해당 파일에 데이터를 적고 있습니다.
질문 드립니다 ^^
1) 위 경로 "/media/Yeon_USB/sample/save_exm.txt" 말고 다른 절대 경로를 통해서 접속할 수 있나요?
dev/sdb1/sample/save_exm.txt -> 이런 경로로도 접속이 가능한가요?
다른 USB메모리가 연결되어도 절대경로를 통해 쓸 수 있을까요?
터미널 상에서 dev/sdb1 이런식으로 접근해서 파일 목록을 보려니깐 안되더라고요..
2) 우분투에서는 USB장치를 자동으로 인식하자나요..
터미널 상에서도 usb가 접속되면 이를 인식하고 파일 목록을 자동으로 보여주게 할 수 있을까요?
할 수 있다면 팁이라도 조금 가르쳐 주세요~
많은 가르침 부탁드리겠습니다~
??
mount, udev 개념부터 필요하신듯하네요.
우분투가 USB 드라이브를 자동으로 인식하는것은
커널이 장치를 인식하고 장치 관리 데몬 udev에 신호를 보내면
udev는 적당한 커널 드라이버들을 로드하고 장치 노드를 /dev/에 생성시키며,
필요하면 설정에 따라 파일시스템을 마운트하면,
Gnome같은 DM이 새로 마운트된 파일시스템을 탐색기로 띄워보여주거나 하는 작업을 합니다.
이것이 자동으로 USB 드라이브를 인식하는 과정이지요.
USB 드라이브를 연결했다고 /media/에 "당연히" 뜨는 것이 아니라 커널, 데몬, 유저스페이의 유기적
조합으로 그렇게 할 수 있는 것입니다. 유저가 볼때는 자동으로 되는 것처럼 보이는 것이 목표이긴 하지만요.
A1. /media/에 자동 마운트 된 것은 udev의 설정일 뿐입니다.
탐색기로 띄워주는 것은 DM의 행동이구요.
원한다면 다른 절대 경로에도 마운트 할 수 있지요.
탐색기를 띄우는 대신에 다른 작업을하려면 DM의 설정을 바꿔야 할테고요.
udev 설정과 fstab을 주물거려서 파일시스템의 UUID 등을 이용해
USB 드라이브 별로 고유한 디렉토리에 마운트 할 수도 있을 것이고요.
아니면 다른 USB 드라이브를 연결하더라도 동일한 디렉토리에 마운트 할 수도 있겠지만,
여러개 연결할 경우를 생각해서 후자와 같은 설정은 피하겠네요.
아무튼 자동 마운트와 그 마운트 포인트는 udev 등의 설정에 따릅니다.
그래서 조금 파고들면 자기 마음대로 마운트 포인트나 마운트 후 실행할 명령 등의 설정을 바꿀 수 있지요.
커널 수준에서 제공하는 마운트의 절대경로란 없다고 보시면 됩니다.(즉 배포판과 설정에 따라 다릅니다.)
심지어 /dev/에 제공하는 노드들의 이름도 커널 버전에 따라 바뀌어왔고요.(물론 관습적 이름이 있습니다만)
/dev/sdb1 이것은 장치(여기서는 SCSI 두번째 디스크 첫번째 주파티션)를 지칭하는 이름입니다.
커널에서 이러한 파티션을 인식하고 있음을 udev가 생성해서 관리자에게 보여주고 있을 뿐입니다.
이것을 접근하기 위해 마운트 해야하는지는 전적으로 설정에 달렸습니다.(요즘 거의 모든 배포판이
자동마운트를 구현하고 있지만, 마운트 포인트도 배포판 마다 다를 것입니다.)
마운트 하지 않고 /dev/sdb1를 직접 이용하여 파일시스템에 접근할 수도 있지만(dd 같은 프로그램)
이진수 연속의 블럭으로 보고 접근하므로 파일을 열고 닫는 기능조차 구현하기 어렵습니다.
(마운트 하는 것이 커널 드라이버가 파일 시스템을 사용할 수 있도록 만든 파일 시스템 드라이버를 이용해
읽고 쓰겠다는 행동입니다.)
A2. 터미널에 접속했을 때 이를 인식하고 자동으로 보여준다는 기능을 생각하실 수 있지만,
기본적으로 유닉스 시스템은 로그인의 개념이 있어서 로그인은 했는지, 했다면 어느 유저의
터미널에 뿌릴 것인지(유저가 다른 작업중이면 작업중인 화면을 말도 없이 지저분하게 만드는 짓일테죠)
등등을 고려해야하기 때문에(유닉스는 그렇게 유저에게 떠먹여 주는 설계이념이 아닙니다.)
관리자는 모든 것을 아는 존재라고 가정하는 것이 설계 이념이기에,
장치를 연결하면 /dev/에 노드를 띄울 수 있도록 udev 데몬에 알리고 커널로그(dmesg)에 남기는 것이
커널의 보편적 행동입니다.
물론 udev가 자동마운트 하면서 파일 시스템의 내용을 터미널에 뿌리도록 udev의 설정을 바꿀 수 있지만,
앞서 말한 문제들을 피하도록 만들어야 겠죠.
윈도우는 이러한 시스템 관련 내용을 찾기 어렵지만,
리눅스는 공개되어 있어서 책을 사서 보시던지 검색만 해도 많은 내용을 알 수 있습니다.
우선 리눅스/유닉스 시스템 기초부터 이해하시고 시스템 프로그래밍 책도 사서 통독하고 온라인 문서를
찾아 보시면 많은 것을 알 수 있을겁니다. 공개 소프트웨어의 강점입니다.
모든 비트의 흐름을 알게 되는 구루의 경지까지 이를 수 있겠지요 ;-)
추가로..
/etc/fstab은 mount 명령의 설정파일인데 관리자가 수동으로 마운트 할 때나 부팅시 자동 마운트할
파일시스템과 마운트 포인트의 숏컷, 마운트 옵션을 저장하는 파일입니다.
요즘 장치를 연결할 때 자동마운트는 udev 설정에서 지정하는 것으로 알고 있습니다.
autofs라는 데몬도 사용되었구요.
http://en.gentoo-wiki.com/wiki/Autofs
자세한 답변 감사드립니다.
자세한 답변 정말 감사드립니다 ^^
그냥 원하는 부분만 배워서 쉽게 가려고 했던 제가 잘못생각한것 같습니다.
관련 책 구입해서 차근차근 배워나가도록 하겠습니다.
....
자동마운트를 udev로 구현하는 것 보다 Gnome 같은 DM들이 구현(gnome-mount)하는 추세네요.
(그러나 엑스 윈도우를 띄우지 않으면 동작하지 않는다는 단점)
자동마운트 포인트는 점점 /media의 하위 디렉토리로 굳어가고 있는 것 같습니다.
http://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
그러나 마운트 설정은 배포판마다 또는 관리자에 따라 가변적이므로
이동식 디스크가 /media에 자동으로 마운트 될거라는 가정으로
프로그램에 하드코딩하는 것은 좋은 아이디어는 아니겠지요.
요즘 배포판들이 사용자 친화적으로 접근하기 위해 서비스들 자동으로 구성하게끔 DM에 얹어 제공하는데요.
어디까지가 kernel이고 어디서부터가 user space인지 구조를 알아야 효율적인 시스템 프로그래밍이 되겠지요.
...
https://help.ubuntu.com/community/Autofs
https://help.ubuntu.com/community/AutomaticallyMountPartitions
자동 마운트에 여러 구현이 있었군요.
댓글 달기