쉘 스크립트와 바이너리 결합하기?

netisinfinite의 이미지

안녕하세요.
작성한 프로그램의 배포용 패키지를 개발하던 중 궁금한 게 생겨 질문 올립니다.
영어 실력이 달려서인지 한참 구글링을 해도 답이 안 나오네요...

하나는, 쉘 스크립트와 바이너리를 합치는 방법입니다.
예전에 j2se의 단일 파일로 된 레드햇 배포판(.bin)을 받았었는데
실행하면 라이센스를 출력하는 쉘 스크립트가 실행되고, 그후 사용자가 동의를 하면
설치용 패키지(.rpm)가 실행중인 파일로부터 분리 생성되더군요.
파일을 에디터로 열어 보았을 때 앞부분은 스크립트, 뒷부분은 바이너리였던 것으로 기억합니다.
그와 같은 것은 어떻게 작성하는 것인지 궁금합니다. 관련한 문서도 좋구요.

또 하나는, 조금 설명이 필요한데요.
제가 기존의 프로그램 설치 및 실행 과정, 즉
압축된 파일을 받아 풀고 실행하는 것이나, 인스톨러를 실행해 잡다한 파일들을 PC에 깔아놓는 것을 싫어해서
이번에 만든 프로그램은 jar 처럼 실행 가능한 아카이브 형태로 배포하려고 생각하고 있습니다.
말하자면 프로그램 전체를 하나의 파일로 압축해서 설치와 실행, 삭제시 그것만 관리하면 되도록 하고 싶은 거지요.

하지만 아시다시피 jar에는 문제가 있어서, 일단은 java 전용이고,
내부의 파일에 쓰기가 불가능하며, 여러 종류의 파일을 담아 사용하는 데는 조금 까다로운 것으로 알고 있습니다.
그래서 생각해 낸 것이 iso나 tar 파일을 이용해, 실행시엔 이것을 특정 디렉터리로 마운트하고
실행이 끝나면 다시 언마운트해 하나의 파일로 유지하는 방법인데요.
역시 문제는 현재 이들 파일을 마운트하는 것은 읽기 전용으로만 가능하다는 겁니다.
(제가 잘못 알고 있는 것인지? 그랬으면 좋겠군요.)

vfs 관련한 프로그래밍 도구들을 이용하는 방법이 있지만,
일단은 배포판의 기본 도구와 셸 스크립트만을 사용해 해결하는 방법이 있지 않을까 싶어 이렇게 조언을 구합니다.
이미 이런 형태를 지원하기 위한 배포판이나 패키지 매니저가 있을 것 같은 생각도 드는군요.

dalgarak의 이미지

1. Makeself 라는 것이 있습니다. 타르볼을 만들어, self-extracting이 되도록 도와주는 셸 스크립트와 합친것입니다.
기본적인 구조는 상단에서 MD5 스트링을 체크하여 파일의 이상 유무를 점검하고, tail을 써서 타르볼을 분리한 다음 처리하게 하는 구조입니다만... 여하간,
이를 사용하시면 됩니다.

다음의 페이지를 참조하시면 됩니다.
http://www.megastep.org/makeself/

2. 만약 Autotools(automake, autoconf)를 사용할 수 있는 환경이라면, Autotools를 사용하여 개발하세요.
(소위 configure - make - make install 순서로 진행되는..)
별 생각없이 만들어 놓아도, make distcheck 명령에서 통과되는 패키지면
최소한 make uninstall을 실행하여 이전에 make install로 설치된 파일을 삭제할 수 있습니다.

뭐, 임시의 디렉토리를 생성해서 mount로 바인딩하는 방법도 있습니다. (mount의 man 페이지 중, bind로 찾아보세요. 단방에 나옵니다.)
해당 디렉토리에 쓰기 권한이 있으면 잘 됩니다.
loopback device로 마운트 했을때 readonly라는 것은, 해당 파일 시스템이 iso9660이라서 그런것일겁니다 :-)

----
It's Friday I want to play,
on Saturday don't want to stay, at home
thinking of you
so let me party all night long.

from m-flo, Come again lyrics

http://luna.onionmixer.net

netisinfinite의 이미지

답변 감사드립니다. 궁금증이 해소되었네요.

다만 제가 질문드린 것 중 두번째 것은 단순히 설치 삭제 과정의 단순화나 자동화.. 이런걸 넘어서
아예 프로그램 전체를 파일 하나로 합치면서도 실행 속도에는 지장이 없는 방법을 찾고 싶은 것이라...
(전에 잠깐 맥을 해본 기억으로는 비슷한 게 있었던 것 같은... 확실하진 않음)
이미 있는 솔루션이 있으면 그걸 사용하거나
혹 iso나 tar 아카이브를 rw로 마운트 할 수 있으면 쉽겠다 하는 생각이 들었던 거지요.
임시 디렉터리를 만들어 압축을 풀고 프로그램 종료시 재압축 하는 것도 하나의 방법이지만
풀고 묶는데 소요되는 시간과 자원을 생각하면 별로 좋은 생각은 아닌 것 같고...
파일 시스템 이미지의 경우는 용량이 고정이라 좀 망설여지고...
어쨌든 좀 더 찾아봐야 할 것 같습니다.

dalgarak의 이미지

뭔가 쓰기가 들어가야 한다면.. 그 쓰는 부분을 각 사용자의 홈디렉토리에 .PROGRAM_NAME 으로 디렉토리를 생성해서 관리하는 방식도 나쁘지 않을까 싶습니다. 그럼 iso9660을 loopback 마운팅해서 사용할 수도 있겠지요. :-)

----
It's Friday I want to play,
on Saturday don't want to stay, at home
thinking of you
so let me party all night long.

from m-flo, Come again lyrics

http://luna.onionmixer.net

댓글 달기

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