2010년 9월 12일 일요일

USB Memory Stick Booting

USB 메모리로 부팅하여 Debian 설치하기 (간단하게)

  • USB 메모리로 부팅하여 Debian을 설치하려면 다음과 같이 합니다.

    http://ftp.nl.debian.org/debian/dists/lenny/main/installer-i386/current/images/hd-media/
    위의 hd-media 디렉토리에서 boot.img.gz을 내려 받은 후, 다음과 같이 합니다.

    # zcat boot.img.gz > /dev/sdc
    이제 USB 메모리를 mount한 후에, 데비안 네트워크 설치 ISO, 혹은 비지니스카드 ISO를 USB 메모리에 추가로 복사하면 됩니다.
    이제 이 USB 메모리로 부팅할 수 있습니다.

    이렇게 하면 다른 부팅 설정 없이 USB 메모리로 부팅할 수 있으나, 만들어진 부팅 USB 메모리는 USB 메모리 전체를 사용하지 않은 상태입니다.

USB 메모리로 부팅하여 Debian 설치하기 (직접 만들기)

  • 간단하게 boot.img.gz을 USB 메모리에 쓰면 부팅이 가능하나, USB 메모리를 모두 사용하지 않게 됩니다. 직접 파티션을 만들어 작업을 해야 합니다.

    아래의 USB-Zip 또는 USB-HDD로 부팅하게 만든후 debian 설치 파일을 복사합니다.

  • USB 메모리를 집드라이브 USB-Zip으로 만들기

    USB 메모리로 부팅할 때, 일부 오래된 컴퓨터에서 USB-HDD로는 부팅하지 못하고 USB-Zip만 부팅이 가능한 경우가 있습니다.

    집드라이브는 64개의 헤드, 32개의 섹터로 구성되어 있고 파티션 번호가 4입니다.
    따라서, USB 메모리를 집드라이브로 인식하려면 64개의 헤드, 32개의 섹터로 구성되어야 하며, 메모리 크기에 맞게 실린더를 정해야 합니다.

    데비안에서 패키지 syslinux를 설치하면 mkdiskimage를 사용할 수 있습니다. 사용방법은 다음과 같습니다.

    # mkdiskimage -4 /dev/sdc 0 64 32
    /dev/sdc는 mount되지 않은 USB 메모리로 파티션이 아닌 USB 메모리 전체를 의미합니다. 하드디스크와 혼동하지 않게 미리 # fdisk -l 로 이름을 확인합니다.
    -4는 파티션 4번으로 설정하게 합니다. (이 파티션으로 부팅 설정 됩니다.)
    0은 메모리에 맞게 실린더를 정하는데 프로그램이 자동으로 정해줍니다.
    64는 64개의 헤드를, 32는 32개의 섹터를 의미합니다.

    이렇게 만들어진 USB메모리에 부트 로더를 설치합니다. mount되지 않은 상태에서 sylinux를 실행합니다.
    # syslinux /dev/sdc4
    USB 메모리 루트에 ldlinux.sys가 생깁니다.

  • USB 메모리를 하드 디스크 USB-HDD로 만들기

    # fdisk /dev/sdc
    여기에서 FAT16 또는 FAT32로 파티션을 만들고 Boot를 설정하여 부팅할 수 있게 합니다.

    mkdosfs은 패키지 dosfstools 에 있습니다. 도스용으로 포맷합니다.
    # mkdosfs /dev/sdc1


    syslinux로 부트로더를 설치합니다. (패키지 syslinux와 mtools가 설치 되어 있지 않으면 설치합니다.)
    # syslinux /dev/sdc1
    USB 메모리 루트에 ldlinux.sys가 생깁니다.

  • 데비안 설치 파일 복사하기

    위에서 USB 메모리를 USB-Zip 또는 USB-HDD로 부팅가능하게 만든 후 debian 설치 파일을 USB 메모리에 옮깁니다.

    먼저 USB 메모리를 mount합니다.

    http://ftp.nl.debian.org/debian/dists/lenny/main/installer-i386/current/images/hd-media/
    위에서 boot.img.gz을 내려 받은 후 압축을 풉니다.
    $ wget http://ftp.nl.debian.org/debian/dists/lenny/main/installer-i386/current/images/hd-media/boot.img.gz
    $ gunzip boot.img.gz
    # mount -o loop boot.img /media/tmp
    기존 USB 메모리의 ldlinux.sys를 이름 변경한 후 파일을 복사합니다.
    # mv /media/disk/ldlinux.sys /media/disk/ldlinux.old
    # cp -r /media/tmp/* /media/disk


    이제 USB 메모리를 mount한 후에, 데비안 네트워크 설치 ISO, 혹은 비지니스카드 ISO를 USB 메모리에 추가로 복사하면 됩니다.
    이제 이 USB 메모리로 부팅할 수 있습니다.

    참고)
    http://ftp.nl.debian.org/debian/dists/lenny/main/installer-i386/current/images/hd-media/ 에서 boot.img.gz을 풀어서 옮기지 않고 vmlinuz 와 initrd.gz만 USB 메모리에 옮기고, syslinux.cfg를 USB 메모리에 다음의 내용을 입력후 저장할 수 있습니다.
    default vmlinuz
    append initrd=initrd.gz
    이어 데비안 네트워크 설치 ISO, 혹은 비지니스카드 ISO를 USB 메모리에 추가로 복사하면 USB 메모리로 Debian을 설치할 수 있으나 설치 초기 화면을 볼 수 없어
    Gnome Desktop으로만 설치되며, 복구용으로 활용할 수 없습니다.

    이렇게 설치만 할 수 있게 USB 메모리를 만들려면
    http://ftp.nl.debian.org/debian/dists/lenny/main/installer-i386/current/images/netboot/debian-installer/i386/
    위의 neboot 디렉토리의 initrd.gz 과 linux를 USB 메모리에 옮긴 후 syslinux.cfg를
    다음과 같이 합니다.
    default linux
    append initrd=initrd.gz
    이렇게 하면 굳이 데비안 네트워크 설치 ISO, 혹은 비지니스카드 ISO를 복사할 필요가 없습니다.
참고) SYSLINUX의 syslinux.cfg
  • SYSLINUX는  MS-DOS/Windows FAT 파일시스템에서  리눅스로 부팅할 수 있게 하는  boot loader입니다. FAT 파일 시스템에 설치하면 boot sector를 교체하고 root directory에 ldlinux.sys를 설치합니다. SYSLINUX는 처음 리눅스를 설치하려 하거나, 복구용등으로 활용됩니다.
  • SYSLINUX로 처음 부팅하면 화면에 boot: 만 보입니다. 여기에서 직접 커널 파일명을 입력을 합니다. 화면에 boot: 만 보이면 당황하게 되므로, 다음 차례로 자동으로 진행하거나 또는 화면을 보고 선택할 수 있게 해야 합니다.
    이러한 설정은 syslinux.cfg에서 하게 됩니다.

    SYSLINUX가 부팅할 때 syslinux.cfg를 다음 차례대로 읽어 드립니다. 먼저 보이는 syslinux.cfg 설정대로 진행합니다.
    /boot/syslinux/syslinux.cfg
    /syslinux/syslinux.cfg
    /syslinux.cfg
    syslinux.cfg 파일 안에 여러 설정 항목이 있습니다.  특별하게  / 또는 \로 디렉토리를 지정하지 않으면 syslinux.cfg을 읽은 디렉토리에서 먼저 찾게 됩니다.

    syslinux.cfg 안에 default 항목이 있으면 boot: 화면에 default 항목이 자동으로 입력된것 처럼 다음 차례로 진행하게 됩니다. 따로 설정하지 않으면 default 항목이 기본적으로 linux로 설정되어 있습니다. default 항목을 menu.c32 (또는 vesamenu.C32)로 하여 메뉴 구성을 할 수 있습니다.
  • Debian(lenny)의 boot.img.gz의 syslinux.cfg은 다음과 같습니다.

    # D-I config version 1.0
    include menu.cfg
    default vesamenu.c32
    prompt 0
    timeout 0

    include : 설정을 다른 파일에 따로 기록하고 읽어 드립니다. 여기서는 menu.cfg을 읽습니다.
    default : 부팅하면서 화면에 boot: 보일 때 vesamenu.c32를 입력한 것으로 간주합니다.
    prompt : 부팅하면서 화면에 boot:을 감춥니다.
    timeout : 부팅하면서 곧바로 실행합니다.
    여기서는 부팅하면서 곧바로 감추어진 boot: 에 vesamenu.c32를 입력한 것이 됩니다. 따라서 이미 읽어드린 menu.cfg을 바탕으로 화면에 메뉴를 보여줍니다.

    내 입맛에 맞게 다음과 같이 메뉴를 추가하였습니다. 또한 필요한 파일 chain.c32를 USB 메모리에 복사하였습니다.

    $ cp /usr/lib/syslinux/chain.c32 /media/disk/

    syslinux.cfg에 다음과 같이 바꾸었습니다.

    # D-I config version 1.0
    include menu.cfg
    default vesamenu.c32
    prompt 0
    timeout 0
    LABEL myinstall
      MENU LABEL Gnome Install
      KERNEL /netboot/linux
      APPEND initrd=/netboot/initrd.gz
    LABEL hd00
      MENU LABEL 1st hard drive
      KERNEL chain.c32
      APPEND hd0
    LABEL hd12
      MENU LABEL 2nd Partition from 2nd Hard
      KERNEL chain.c32
      APPEND hd1 2

    LABEL : 부팅시 화면에 boot:이 보일 경우 직접 입력할 이름을 기록합니다.
    MENU LABLE : 메뉴 화면에서 보여줄 메뉴 이름입니다.
    KERNEL : 커널파일 이름을 기록합니다. chain.c32로 다른 부트로더로 변경할 수 있습니다.
    APPEND : 커널에 추가할 옵션을 기록합니다.
    hd0 : 첫번째 하드 디스크에서 부팅합니다. 즉 첫번 째 하드 디스크의 MBR로 부팅하는 것입니다.  hd0 0 과 같습니다.
    hd1 2 : 두번째 하드 디스크의 두번 째 파티션에서 부팅하는 것입니다.
참고) install-mbr

  • MBR 오류로 부팅이 안되면 다음과 같이 합니다.
    # install-mbr /dev/sdb
    install-mbr은 패키지 mbr에 있습니다.
  • install-mbr로 윈도우 부팅시 MBR 오류로 부팅이 안되면 다음과 같이 활용합니다. # install-mbr -r /dev/sda
    MBR 지우는 명령입니다.

    initrd.gz 에 firmware 를 추가하여 새로 만들기

    lenny가 설치된 구형 Toshiba 노트북에 squeeze를 설치하려하니 랜카드(인텔)이 인식이 안되어 실패하였습니다.
    설치시 grub을 이용하여 initrd.gz과 linux파일을 사용하였는데, 설치중 랜카드가 인식이 안되어 Alt+F3하니 화면에 d101m_ucode.bin라는 firmware가 없다고 합니다.
    찾아보니 전에는 커널에 포함된 여러 firmware가 이제 squeeze에서 firmware-linux-nonfree 패키지로 옮겨진 상태입니다.
    물론 CD로 부팅하여 설치를 시도해도 같은 상태입니다.

    d101m_ucode.bin를 floppy 디스크에 복사하여 시도해도 안되고,
    설치중 곧바로 Alt+F3하여 floppy에  있는 d101m_ucode.bin를 ram disk에  /lib/firmware/e100 디렉토리를 만들고 여기에 복사해 넣어도 안됩니다.

    lenny에서 squeeze로 upgrade하는 것보다, 다른 파티션에 새로 설치하려고 알아보니,
    firmware를 initrd.gz에 넣어 initrd.gz을 새로 만들어 설치하는 방법이 있었습니다.

    먼저 필요한 파일 firmware-linux-nonfree_0.26_all.deb 저장후 압축을 풉니다.
    $ wget http://ftp.kr.debian.org/debian/pool/non-free/f/firmware-nonfree/firmware-linux-nonfree_0.26_all.deb
    $ mkdir tmp-firmware
    $ cd tmp-firmware
    $ mv ../ firmware-linux-nonfree_0.26_all.deb ./

    $ ar -x  firmware-linux-nonfree_0.26_all.deb

    $ tar zxvf data.tar.gz
    이제 lib/e100 디렉토리에 firmware가 있습니다.

    이제 initrd.gz파일을 디렉토리에 저장합니다.
    $ cd ~
    $ wget http://people.debian.org/~joeyh/d-i/images/daily/netboot/debian-installer/i386/initrd.gz

    이제 initrd.gz 압축을 풀고 firmware를 포함해서 다시 만듭니다.
    $ gunzip initrd.gz
    $ mkdir tmp
    $ cd tmp
    $ cpio -i < ../initrd
    $ mkdir lib/firmware
    $ cp -r ~/tmp-firmware/lib/firmware/e100/ lib/firmware/
    $ find . | cpio -o -H newc > ../initrd

    $ cd ..
    $ gzip initrd

    새로 만든 initrd.gz으로 부팅합니다.

    Toshiba Satellite sound card 설정 (YMF-754)

    YMF-754 firmware가 없어서 http://www.alsa-project.org/main/index.php/Main_Page에서 tar alsa-firmware-1.0.20.tar.bz2를 다운받음.

    먼저 make gcc 설치한후

    $ tar xvf alsa-firmware-1.0.24.1.tar.bz2 
    $ cd alsa-firmware-xxx
    $ ./configure -> cd ymfpci -> make

    # make install
    (또는 *.fw를 /lib/firmware/yamaha에 직접 파일 옮김)


    참고)
    $ /sbin/modinfo snd-emu10k1
    filename:       /lib/modules/2.6.38-2-686/kernel/sound/pci/emu10k1/snd-emu10k1.ko
    license:        GPL
    description:    EMU10K1
    author:         Jaroslav Kysela
    firmware:       emu/emu1010_notebook.fw
    firmware:       emu/emu0404.fw
    firmware:       emu/micro_dock.fw
    firmware:       emu/emu1010b.fw
    firmware:       emu/audio_dock.fw
    firmware:       emu/hana.fw

    참고)
    Debian의 firmware /lib/udev/firmware-agent에 정해져 있으며
    1) /lib/firmware/$(uname -r) - Firmware provided by a package, specific for a kernel.
    2) /lib/firmware/ - Firmware provided by a package, valid for all kernels.
    3) /usr/local/lib/firmware - Location for manually installed firmware.
    4) /usr/lib/hotplug/firmware - Firmware provided by a package, valid for all kernels