[완료] /dev/null 로 copy 및 /dev/null 이란 어떤 장치 인가요?

kilhan의 이미지

안녕하세요

질문 있습니다^^

파일이 복사 되자 마자 지우고 싶습니다.

정확히는 ftp 업로드 하자 마자 파일을 지우고 싶은것입니다.

그런데 이때의 서버의 load 를 최소화 하려면 어떻게 해야 할까요?

제 생각으로는 ftp 파일을 업로드 할때

/dev/null 로 업로드 하면
(정확히는 /dev/null 로 링크된 파일로 업로드 하면)

disk에 write가 발생하지 않아 서버의 load가 낮을것 같은데

테스트 결과가 아래와 같습니다.

[경우1]
time cp 1.iso 2.iso

real 1m16.717s
user 0m0.340s
sys 0m4.190s

[경우2]
time cp 1.iso /dev/null
cp: overwrite `/dev/null'? y

real 0m31.682s
user 0m0.230s
sys 0m2.220s

제 예상과 비슷한 결과가 나왔는데요

real 시간이 걸리는 이유는 아마 disk에서 read 하는 시간으로 생각해서
real 에서 disk에 write 하는 시간만큼 줄었다고 생각합니다.

그럼 /dev/null 이란 어떤 장치 인가요?

메모리인가요?

어떤 장치이기 때문에 이런것이 가능한것일까요?

아님 제가 잘못 생각하거나 확인할것 일까요?

좋은 답변 기다리겠습니다.

hys545의 이미지

null로 이동하면 그냥 삭제하는거하고 같습니다.
그리고 이론적으로는 메모리에서 작업하지만 스왑등의 이유로 하드읽기 쓰기할수도 있습니다.

즐린

김정균의 이미지

흠.. cp 1.iso /dev/null 은 아닐 것 같은데요. 이 명령은 /dev/null 을 1.iso 로 바꿔치기 하라는 명령이죠.

제대로 비교를 하려면

cat 1.iso > a.dummy
cat 1.iso > /dev/null

과 같이 비교를 하셔야 합니다.

김정균의 이미지

흠.. /dev/null 은 character device 인데, 위의 명령으로 이미 regular file 로 변경이 되었을지 모르겠네요. 확인해 보시는 것이 좋을 듯 싶습니다.

kilhan의 이미지

이 명령어 실행에 대해서 저도 걱정을 해보았습니다.

time cp 1.iso /dev/null
cp: overwrite `/dev/null'? y

그런데 위와 같은 명령어를 수행한 후에

/dev/null 의 정보는 아래와 같더군요.

ls -alh /dev/null
crw-rw-rw- 1 root root 1, 3 9월 15 2003 /dev/null

제 생각으로는 /dev/null 을 일반파일로 복사하지는 못하는것 같습니다.
( 우선 테스트 서버에서 테스트후 이상이 없어서 다른 서버에서도 테스트 해보았습니다)

그런데 질문있습니다.
=>
null로 이동하면 그냥 삭제하는거하고 같습니다

이 과정에 대해서 write 가 일어난후에 삭제하는것이라면
Disk에 i/o 가 발생한다는 뜻으로 생각합니다.

그런데 제 생각에는 /dev/null 로 복사하면
disk에 write 가 발생하지 않는것 같습니다.
그러니 그냥 삭제하는거 하고 같습니다와는 조금 차이가 있지 않나요?

지적하신대로 swap 에서 작업을 하고 있지 않다면
모든 write 과정은 메모리에서 일어나는것이 맞겠죠?

말꼬리를 잡는것 같아 죄송한데
정확하게 해두어야 마음이 편할듯 해서요

하지만 답변에 감사드리는 마음은 변함이 없답니다^^;

아 또 궁금한점이 있습니다! ^^;

만약 /dev/null 이 메모리라면

600MB 파일을 복사하는데 메모리는 얼마나 사용할까요?

서버에 여유메모리가 없는데도 /dev/null 로 복사해도

정상적으로 처리되는것을 보면

한번에 /dev/null 로 복사되는것이 아니고

read에서 write 과정이 일어나자 마자 처리되는듯 합니다.

만약 이런 상태라면

동시에 수G 파일을 /dev/null 로 복사해도
메모리 부족이 발생하지 않겠죠?

위에 글에서 지적하신 복사 결과를 한번 올려봅니다.

time cat 1.iso > /dev/null

real 0m28.430s
user 0m0.230s
sys 0m1.940s

time cat 1.iso > 2.iso

real 1m18.469s
user 0m0.220s
sys 0m3.840s

다들 좋은 하루 되세요

Hyun의 이미지

커널소스를 보는게 가장 정확하죠...
drivers/char/mem.c 를 보면...

static int memory_open(struct inode * inode, struct file * filp)
{
        switch (iminor(inode)) {
...
...
                case 3:
                        filp->f_op = &null_fops;
                        break;
...
...
}

처럼 major 1 에 대한 open함수가 있구요, 여기서 minor가 3일 때 null_fops를 연결시켜주는데 null_fops를 보면...
static const struct file_operations null_fops = {
        .llseek         = null_lseek,
        .read           = read_null,
        .write          = write_null,
        .splice_write   = splice_write_null,
};
 
static ssize_t read_null(struct file * file, char __user * buf,
                         size_t count, loff_t *ppos)
{
        return 0;
}
 
static ssize_t write_null(struct file * file, const char __user * buf,
                          size_t count, loff_t *ppos)
{
        return count;
}

요렇게 되어있습니다. 즉, /dev/null로 부터 read/write system call이 들어왔을땐 아무것도 안한다는 뜻이죠... /dev/null을 건드리면서는 드라이버에서 사용자 메모리인 buf를 건드리지 않기때문에 스왑등의 작업도 일어나지 않죠...

Quote:

만약 /dev/null 이 메모리라면 600MB 파일을 복사하는데 메모리는 얼마나 사용할까요?

...

동시에 수G 파일을 /dev/null 로 복사해도 메모리 부족이 발생하지 않겠죠?


그러므로... 개념없이 큰 파일이라도 /dev/null로 집어넣으면... 커널은 아무작업을 하지 않죠...

다만 파일을 읽어서 /dev/null로 넣어주는 쪽에서 큰 파일을 다루게 되므로 파일시스템의 캐시메모리를 왕창 쓰겠네요...
파일시스템의 캐시가 없으면 시스템이 좀 느려지긴 하겠으나... 메모리 부족이 되진 않습니다. 메모리가 부족하면 먼저 캐시의 내용을 버려버릴테니깐요...

bushi의 이미지

이 경우에, 시간과 부하는 별 관계가 없는 것 같습니다.
관계가 있다면... 오히려 서로 상대되는 관계가 되지 않나 싶은데요.

1. CPU 를 좀 많이 쳐먹더라도 빠른 시간 안에 끝내고 싶다.
2. 시간이 오래 걸려도 좋으니 CPU 부하를 일정수준이하로 계속 유지하고 싶다.

목표를 명확히 하고 방법을 찾아보세요.
cat 은 테스트에 적합하지 않으니 dd 로 테스트해보세요. blocksize 를 조절하면서 부하와 시간을 검사해보시면 되겠습니다.

덧.
그나저나... 지우고 싶으시다면서 왜 /dev/null 이 필요한지 모르겠습니다.

사랑천사의 이미지

이미 아실 거 같지만.. /dev/null은 블랙홀 이라고 생각 하시면 됩니다. 결국 어던 분 말씀처럼 아무 일도 안 일어 납니다. 근대 /dev/null을 수 백 개 이상 마구 열다 보면... 그 것도 계속 해서 말이죠. too many open files ... ... ... 이와 흡사한 메세지가 나타납니다. 흠흠... 아마도 너무 많음 파일 디스크립터가 만들어 져서 그런 것 같습니다 음.
----
Lee Yeosong(이여송 사도요한)
E-Mail: yeosong@gmail.com
MSN: ysnglee2000@hotmail.com
----
웃음... 행복... 평화... (진정한...) 희망... 사랑... 이 세상 모든것이 그렇다면 얼마나 좋을까...(꿈 속의 바램일 뿐인가...)

사람천사

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.