2GB가 넘는 ZIP 파일을 풀수 있는 방법을 알려 주시기 바랍니다.

thrhym의 이미지

윈도우즈에서는 이 파일이 잘 풀립니다.

하지만 리눅스에 올려서 풀려면 풀리지 않습니다.
다 풀리면 약 2.3 Gb 정도 되는데 딱 2GB까지만 풀리고 에러가 나면서 명령이 종료됩니다.

어떻게 하면 정상적으로 풀수 있는지 알려주시기 바랍니다.

참고로 제시스템 환경은
-.RedHat 7.2 Kernel 2.4.7-10
-.ext3 Filesystem
-.32Bit
환경입니다.

se7enkey의 이미지

혹시... 윈도 파티션을 마운트하셔서 한글이름이 포함된 파일들을
압축하셨는지요..?
얼마전에 비슷한 문제가 올라온걸 본적이 있습니다.
많은 분들이 답글이 있습니다.

'unzip'으로 한번 검색을 해보심이.....

thrhym의 이미지

압축 파일에 한글은 들어가 있지 않습니다.

님이 말씀하신데로 UNZIP으로 한번 검색해보도록 하겠습니다.

mycluster의 이미지

이거 아주 자주 나오는 이야기인데...
2GB가 넘는 파일을 핸들링하지 못하는 이유는 32bit 머신의 메모리제한에 걸려서 그렇습니다.
통상적인 리눅스용 소스코드들이 파일을 핸들링할때 메모리에 할당을 하고 그대로 파일을 읽어들여서 처리하도록 되어 있는데. 그 소스들이 잡을 수 있는 메모리가 2GB한계에 걸려서 그렇습니다.

이걸 하기 위해서는, kernel에서 mmap 패치등을 가하는 방법을 쓰거나, 아니면 unzip 등의 소스에서 메모리 할당부분을 고쳐서 순차적으로 읽고 풀고 하는 형태로 고쳐야하는데(제가 할 수 있다는 것은 아닙니다) 대부분의 소스들이 메모리가 2GB를 넘을것이라는 것을 상상하기 힘든 옛날(그래봐야 얼마전이지만)에 만들어져서 그런것이지요.

똑같은 문제가 ftp, rcp 등에서도 생깁니다. 이것들이 전부 메모리 제한에 걸려서 그런것이지요. 윈도의 경우는 아마 한번에 메모리에 할당하지 않고 조금씩 할당하고 다시 쓰고 하는 방식을 취하는 경우가 많으니 되는 것처럼 보이는 겁니다.

mmap patch 라는 것으로 검색을 해보시는것이 좋을 겁니다. 최대 3GB 까지는 메모리 사용량을 늘일 수 있읍니다.

빨리 64비트 시대로 가야할 것이지요 ....

--------------------------------
윈도위의 리눅스 윈도위의 윈도우 리눅스위의 익스플로러

방준영의 이미지

32비트 메모리 제한과는 관련이 없고, ext2fs의 구조상 32비트 아키텍쳐에서는 파일 크기가 31비트(=2GB)로 제한되어 있습니다. 파일 정보를 기록하는 아이노드표에 i_size 필드가 32비트거든요. 단, open(2)할 때 O_LARGEFILE 옵션을 주면 2GB보다 큰 파일도 접근할 수 있도록 하고 있습니다만, 해당 프로그램을 고쳐서 다시 컴파일해야 한다는 문제가 있습니다. 더 자세한 내용은 "Understanding the Linux Kernel" 2판 581페이지를 참조하시기 바랍니다.

mycluster의 이미지

2GB이상을 억세스하는데는 문제가 없을겁니다. 복사하거나 mv하는데는 문제가 없는데... IO문제는 아니라고 봅니다.

--------------------------------
윈도위의 리눅스 윈도위의 윈도우 리눅스위의 익스플로러

ux의 이미지

2.4.22에서 VFS상 offset은 long long으로 선언 되어 있기 때문에 2G 이상의 파일을 다룰 수 있지만, ext2와 같은 파일 시스템에서는 long 형 이기 때문에 음수 부분을 제외한 2^31 만큼만을 하나의 파일에서 사용할 수 있습니다.

그래서 Linux 커널문제는 아니고 파일 시스템의 구현에 따라서 달라지게 됩니다.

실제로 test한 바로는 ext3의 경우 glibc의 open64 콜을 이용하면 2G이상의 파일을 다를 수 있습니다. 근데 O_LARGEFILE flag로는 안되더라고요 -_-;;;
이유는 아직도 모르고 있습니다. -_-;;
@혹시 위의 이유를 아시는 분은 좀 알려주세요....^^;;;;

xfs의 경우는 O_LARGEFILE flag로 open 시스템 콜을 통해서 2G이상의 파일이 잘 만들어 집니다.

@UX... Vnn~

mycluster의 이미지

Understanding Linux Kernel 영문판 거기면 한글판으로 어딘가요? 갖고 있는 책이 그것뿐이라서...
일단 디스크에서 읽고 쓰기를 할경우 디스크의 내용을 메모리로 어떻게 읽어들이고 그것을 어떻게 write할것인가 하는 문제인데, 이경우 결국 메모리에 디스크의 내용을 어떻게 할당하는 것이 중요하다고 보여지고 그로 인하여 어플리케이션이 어떻게 버퍼링을 하고 write할것인가 하는데서 32비트의 한계점에 걸린다고 보는것이지요.

실제로 cat을 통해서 2GB이상의 파일을 만들거나 복사하는 경우, 또는 cp를 통해서 복사하는경우는 순차적으로 일정부분 메모리로 읽어서 write하게 되므로 2GB 이상되는 파일을 read-write하는데 별다른 문제가 없지만, 파일을 open하고 그 내용을 메모리로 올려서 다룬다음에 다시 write하는 application의 경우에는 버퍼링하는 메모리의 사이즈 등에 심각한 영향을 받게 되는 경우가 많지요.

unzip이 어떠한 방식으로 이를 처리하느냐에 따라서 다른데, 파일시스템은 ext2라고 할경우에도 64비트 리눅스에서는 별다른 문제없이 처리하는 것(이것도 사실 어느쪽에서 해결이 되기 때문인지 애매모호하지만...)을 볼때, inode 사이즈가 64비트가 된다고 해서 해결이 될 수 있을지는 고민을 좀 해봐야할 듯 하군요.

그리고, 질문하신 분이 ext3를 사용하는 것을 보면 그 파일을 통째로 생성하고 복사하는데는 ext3에서는 문제가 없지만 이걸 압축하거나 풀경우, 혹은 2GB가 넘는 파일을 ftp할경우에는 전송불능상태에 빠지게 되지요.

시간나면 한번 테스트를 해보십시오.
1. cat을 사용하여 2GB 이상의 파일 생성(이건 잘됩니다.)
2. 이걸 cp를 사용해서 다른 이름으로 복사 (이것도 잘 됩니다.)
3. ftp를 사용해서 2GB이상 파일을 전송(이건 잘 안될겁니다)
4. rcp를 이용해서 2GB이상되는 파일을 복사(이것도 잘 안될겁니다)
5. nfs로 마운트 한다음에 cp를 사용해서 복사(이건 잘될겁니다.

저는 메모리쪽에 한표....

--------------------------------
윈도위의 리눅스 윈도위의 윈도우 리눅스위의 익스플로러

방준영의 이미지

메모리와 관련이 없는 이유는 같은 일이 다른 파일시스템에선 잘 되기 때문입니다.

kyong의 이미지

thrhym wrote:
윈도우즈에서는 이 파일이 잘 풀립니다.

하지만 리눅스에 올려서 풀려면 풀리지 않습니다.
다 풀리면 약 2.3 Gb 정도 되는데 딱 2GB까지만 풀리고 에러가 나면서 명령이 종료됩니다.

어떻게 하면 정상적으로 풀수 있는지 알려주시기 바랍니다.

참고로 제시스템 환경은
-.RedHat 7.2 Kernel 2.4.7-10
-.ext3 Filesystem
-.32Bit
환경입니다.


아마 윈도우 파일 시스템이 vfat라면 4GB정도가 최대가 아닐까 생각되는데요.
아뭏든 리눅스에서 kernel 이나 file system 보다는 64bit offset 을 쓰도록 업
데이트 되지 않은 application의 문제라고 생각됩니다.
안전한 방법은 2G이상 파일을 만들지 않는 것입니다.
최근 winzip 같은 프로그램으로 잘라서 만들수 있고요,
리눅스에서는 split 같은 명령어가 있지요.
jforce의 이미지

http://www.pkware.com/download/download.php?PLATFORM=UNIX

혹시 모르니까 리눅스용 받아서 해보세요.

thrhym의 이미지

여러분들이 도와주신덕에 드뎌 2GB 넘는 ZIP 파일을 여는데 성공했습니다.
지금까지 도와주신 여러분께 감사드리며, 정확하게 어떻게 해결했는지 알려드리려고 합니다. 저 외의 다른분은 저 보다 훨씬 빠른 시간내에 해결하기를 바라겠습니다.

우선 위에 글을 쓰신 모든 분들의 이야기가 맞습니다. 하지만 위의 의견들을 서로 조합하여 사용을 했어야 합니다. UNZIP 소스를 다시 받아 컴파일 시에 _D_LARGEFILE_SOURCE을 주고 프로그램에서 fopen을 fopen64로 모두 바꾸고 난 후에 컴파일을 했더니 정상적으로 2GB 넘는 파일의 압축이 정상적으로 풀렸습니다. 다시 정확히 말하면

1.위 글에 보면 UNzip 소스를 구할 수 있는 URL에서 소스를 구하고

2.Makefile내에서 CFLAGS에 "_D_LARGEFILE_SOURCE -D_FILE_OFFSET=64"을 추가 하였는데 이때 주의하여야 할 사항은 CFLAGS의 여러 차례 있어 모두 바꿔주셔야 한다는 것입니다.

3.프로그램 소스에서 fopen을 fopen64로 변경

4.컴파일,,,,,,,, 약간의 경고 메시지가 출력되긴 했으나 실행은 정상적으로 이루어 졌습니다.

참고로, 시스템 환경은 그 사이 변경 되지 않고 그대로이며, 두 세개의 페키지에 대해서는 업그레이드를 한 상태입니다.

감사합니다.

정태영의 이미지

thrhym wrote:
2.Makefile내에서 CFLAGS에 "_D_LARGEFILE_SOURCE -D_FILE_OFFSET=64"을 추가 하였는데 이때 주의하여야 할 사항은 CFLAGS의 여러 차례 있어 모두 바꿔주셔야 한다는 것입니다.

autoconf를 사용하도록 되어있는 경우라면
CFLAGS="-O3 -pipe -march=pentium3 -D_LARGEFILE....." ./configure ......

로 하는게 더 편합니다 :D

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

zingle의 이미지

흠..
redhat 7.3 (2.4.18-10smp)에서
tar로 총 10기가가 되는 데이터 파일들을 묶고
gzip한 다음에
다른 파티션으로 mv한 다음에
ftp로 전송해서 백업했다가
시스템 밀고 깔고
다시 ftp 불러와서
gunzip + tar xvf 해준적이 있습니다.

위에 분들 말씀대로면 불가능해야하는건데...
ftp로 전송할때에는 hash를 켜두면 중간에 멈추는 현상이 있어서
hash를 꺼두고 하면 문제 없이 되었습니다.
혹시 전송이 멈춘건지 아닌지 알수가 없어서 좀 불안하긴 했습니다만..

정태영의 이미지

zingle wrote:
흠..
redhat 7.3 (2.4.18-10smp)에서
tar로 총 10기가가 되는 데이터 파일들을 묶고
gzip한 다음에
다른 파티션으로 mv한 다음에
ftp로 전송해서 백업했다가
시스템 밀고 깔고
다시 ftp 불러와서
gunzip + tar xvf 해준적이 있습니다.

위에 분들 말씀대로면 불가능해야하는건데...
ftp로 전송할때에는 hash를 켜두면 중간에 멈추는 현상이 있어서
hash를 꺼두고 하면 문제 없이 되었습니다.
혹시 전송이 멈춘건지 아닌지 알수가 없어서 좀 불안하긴 했습니다만..

아뇨.. 요 근래의 배포판들에선 신경안써도 되는 것들 중 하나입니다..
2.4대 초기커널(혹은 그 이하버젼들)과 glibc 버젼 그리고.. 관련해서 패키징과 연관이 있는 부분이니까요..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

김충길의 이미지

2번 항목에서 저 플래그를 사용했다면 fopen은 macro에 의해 fopen64로 호출되게 되어 있을 겁니다.

위에 어느분 처럼 configure 전에 CFLAGS를 정의해서 하시는게 좋을듯 하네요.

thrhym wrote:
여러분들이 도와주신덕에 드뎌 2GB 넘는 ZIP 파일을 여는데 성공했습니다.

2.Makefile내에서 CFLAGS에 "_D_LARGEFILE_SOURCE -D_FILE_OFFSET=64"을 추가 하였는데 이때 주의하여야 할 사항은 CFLAGS의 여러 차례 있어 모두 바꿔주셔야 한다는 것입니다.

3.프로그램 소스에서 fopen을 fopen64로 변경

screen + vim + ctags 좋아요~

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.