1. 程式人生 > >根檔案製作(一):根檔案系統樹 和 Initramfs檔案系統的製作

根檔案製作(一):根檔案系統樹 和 Initramfs檔案系統的製作

 根檔案系統樹製作

首先要明白的是“什麼是檔案系統”,檔案系統是對一個儲存裝置上的資料和元資料進行組織的機制。

這種機制有利於使用者和作業系統的互動。

根檔案系統之所以在前面加一個”根“,說明它是載入其它檔案系統的”根“,既然是根的話,那麼如果沒有這個根,其它的檔案系統也就沒有辦法進行載入的。它包含系統引導和使其他檔案系統得以掛載(mount)所必要的檔案。根檔案系統包括Linux啟動時所必須的目錄和關鍵性的檔案,例如Linux啟動時都需要有init目錄下的相關檔案,在 Linux掛載分割槽時Linux一定會找/etc/fstab這個掛載檔案等,根檔案系統中還包括了許多的應用程式bin目錄等,任何包括這些Linux 系統啟動所必須的檔案都可以成為根檔案系統。

 Linux 中將一個檔案系統與一個儲存裝置關聯起來的過程稱為掛載(mount)。使用 mount 命令將一個檔案系統附著到當前檔案系統層次結構中(根)。在執行掛裝時,要提供檔案系統型別、檔案系統和一個掛裝點。根檔案系統被掛載到根目錄下“/”上後,在根目錄下就有根檔案系統的各個目錄,檔案:/bin /sbin /mnt等,再將其他分割槽掛接到/mnt目錄上,/mnt目錄下就有這個分割槽的各個目錄,檔案。

 Linux根檔案系統中一般有下面的幾個目錄:

1. /bin目錄

該目錄下的命令可以被root與一般賬號所使用,由於這些命令在掛接其它檔案系統之前就可以使用,所以/bin目錄必須和根檔案系統在同一個分割槽中。

/bin目錄下常用的命令有:cat、chgrp、chmod、cp、ls、sh、kill、mount、umount、mkdir、[、test等。其中“[”命令就是test命令,我們在利用Busybox製作根檔案系統時,在生成的bin目錄下,可以看到一些可執行的檔案,也就是可用的一些命令。

.2. /sbin 目錄

該目錄下存放系統命令,即只有系統管理員(俗稱最高許可權的root)能夠使用的命令,系統命令還可以存放在/usr/sbin,/usr/local/sbin目錄下,/sbin目錄中存放的是基本的系統命令,它們用於啟動系統和修復系統等,與/bin目錄相似,在掛接其他檔案系統之前就可以使用/sbin,所以/sbin目錄必須和根檔案系統在同一個分割槽中。

/sbin目錄下常用的命令有:shutdown、reboot、fdisk、fsck、init等,本地使用者自己安裝的系統命令放在/usr/local/sbin目錄下。

3. /dev目錄

該目錄下存放的是裝置與裝置介面的檔案,裝置檔案是Linux中特有的檔案型別,在Linux系統下,以檔案的方式訪問各種裝置,即通過讀寫某個裝置檔案操作某個具體硬體。比如通過"dev/ttySAC0"檔案可以操作串列埠0,通過"/dev/mtdblock1"可以訪問MTD裝置的第2個分割槽。比較重要的檔案有/dev/null, /dev/zero, /dev/tty, /dev/lp*等。

.4. /etc目錄

該目錄下存放著系統主要的配置檔案,例如人員的賬號密碼檔案、各種服務的其實檔案等。一般來說,此目錄的各檔案屬性是可以讓一般使用者查閱的,但是隻有root有許可權修改。對於PC上的Linux系統,/etc目錄下的檔案和目錄非常多,這些目錄檔案是可選的,它們依賴於系統中所擁有的應用程式,依賴於這些程式是否需要配置檔案。在嵌入式系統中,這些內容可以大為精減。

.5. /lib目錄

該目錄下存放共享庫和可載入(驅動程式),共享庫用於啟動系統。執行根檔案系統中的可執行程式,比如:/bin /sbin 目錄下的程式。

.6. home目錄

系統預設的使用者資料夾,它是可選的,對於每個普通使用者,在/home目錄下都有一個以使用者名稱命名的子目錄,裡面存放使用者相關的配置檔案。

.7. /root目錄

系統管理員(root)的主資料夾,即是根使用者的目錄,與此對應,普通使用者的目錄是/home下的某個子目錄。

.8. /usr目錄

/usr目錄的內容可以存在另一個分割槽中,在系統啟動後再掛接到根檔案系統中的/usr目錄下。裡面存放的是共享、只讀的程式和資料,這表明/usr目錄下的內容可以在多個主機間共享,這些主要也符合FHS標準的。/usr中的檔案應該是隻讀的,其他主機相關的,可變的檔案應該儲存在其他目錄下,比如/var。/usr目錄在嵌入式中可以精減。

.9. /var目錄

與/usr目錄相反,/var目錄中存放可變的資料,比如spool目錄(mail,news),log檔案,臨時檔案。

10. /proc目錄

這是一個空目錄,常作為proc檔案系統的掛接點,proc檔案系統是個虛擬的檔案系統,它沒有實際的儲存裝置,裡面的目錄,檔案都是由核心

臨時生成的,用來表示系統的執行狀態,也可以操作其中的檔案控制系統。

.11. /mnt目錄

用於臨時掛載某個檔案系統的掛接點,通常是空目錄,也可以在裡面建立一引起空的子目錄,比如/mnt/cdram /mnt/hda1 。用來臨時掛載光碟、移動儲存裝置等。

12. /tmp目錄

用於存放臨時檔案,通常是空目錄,一些需要生成臨時檔案的程式用到的/tmp目錄下,所以/tmp目錄必須存在並可以訪問。

那我們利用Busybox製作根檔案系統就是建立這上面的這些目錄,和這些目錄下面的各種檔案。

對於嵌入式Linux系統的根檔案系統來說,一般可能沒有上面所列出的那麼複雜,比如嵌入式系統通常都不是針對多使用者的,所以/home這個目錄在一般嵌入式Linux中可能就很少用到,而/boot這個目錄則取決於你所使用的BootLoader是否能夠重新獲得核心映象從你的根檔案系統在核心啟動之前。一般說來,只有/bin,/dev,/etc,/lib,/proc,/var,/usr這些需要的,而其他都是可選的。

根檔案系統一直以來都是所有類Unix作業系統的一個重要組成部分,也可以認為是嵌入式Linux系統區別於其他一些傳統嵌入式作業系統的重要特徵,它給 Linux帶來了許多強大和靈活的功能,同時也帶來了一些複雜性。我們需要清楚的瞭解根檔案系統的基本結構,以及細心的選擇所需要的系統庫、核心模組和應用程式等,並配置好各種初始化指令碼檔案,以及選擇合適的檔案系統型別並把它放到實際的儲存裝置的合適位置。

對於嵌入式檔案系統的製作和移植而言,它的根檔案系統結構基本一樣。因此,對同一個根檔案系統,通過相應的工具和方法就能容易生成對應檔案系統。下面介紹如何製作一個簡潔的根檔案系統。



製作根檔案系統

製作根檔案系統經常會用到根使用者許可權,所以需要倍加小心



tree命令可以以樹形結構顯示檔案目錄結構,它非常適合於我們給別人介紹我們的檔案目錄的組成框架,同時該命令使用適當的引數也可以將命令結果輸出到文字檔案中。安裝tree命令:


 


 


Dev目錄下建立裝置檔案

 

Var 目錄下建立符號連結檔案

 

 拷貝交叉編譯器中的動態庫到相應的目錄下

檢視一下自己交叉編譯器的路徑及*.so*檔案

[[email protected] fl2440]$ ls

3rdparty  bootloader  driver  kernel  program  rootfs

[[email protected] fl2440]$ cd kernel/

[[email protected] kernel]$ ls

linux-3.0  linux-3.0.tar.bz2

[[email protected] kernel]$ cd linux-3.0

[[email protected] linux-3.0]$ ls

arch           fs       linuxrom-s3c2440.bin  README          usr

block          include  MAINTAINERS           REPORTING-BUGS  virt

COPYING        init     Makefile              samples         vmlinux

CREDITS        ipc      mm                    scripts         vmlinux.o

crypto         Kbuild   modules.builtin       security

Documentation  Kconfig  modules.order         sound

drivers        kernel   Module.symvers        System.map

firmware       lib      net                   tools

[[email protected] linux-3.0]$ cd /opt/buildroot-2012.08/arm920t/

[[email protected] arm920t]$ ls

usr

[[email protected] arm920t]$ find -iname "*.so*"

./usr/lib/libmpc.so.2.0.0

./usr/lib/libgmp.so.10.0.5

./usr/lib/libltdl.so.7

./usr/lib/libltdl.so.7.2.2

./usr/lib/libmpfr.so.4.1.1

./usr/lib/libmpc.so.2

./usr/lib/libmpfr.so.4

./usr/lib/libmpfr.so

./usr/lib/libmpc.so

./usr/lib/libgmp.so.10

./usr/lib/libltdl.so

./usr/lib/libgmp.so

./usr/arm-unknown-linux-uclibcgnueabi/lib/libmudflap.so.0

./usr/arm-unknown-linux-uclibcgnueabi/lib/libstdc++.so.6.0.14-gdb.py

./usr/arm-unknown-linux-uclibcgnueabi/lib/libstdc++.so

./usr/arm-unknown-linux-uclibcgnueabi/lib/libstdc++.so.6.0.14

省略N行..........................

./usr/arm-unknown-linux-uclibcgnueabi/sysroot/lib/libdl.so.0

./usr/arm-unknown-linux-uclibcgnueabi/sysroot/lib/libpthread.so.0

./usr/arm-unknown-linux-uclibcgnueabi/sysroot/lib/libgcc_s.so.1

./usr/arm-unknown-linux-uclibcgnueabi/sysroot/lib/libuClibc-0.9.33.2.so

[[email protected] arm920t]$ cd

[[email protected] ~]$ cat /etc/fstab

#

# /etc/fstab

# Created by anaconda on Thu Jul 14 00:24:28 2016

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

UUID=6f9a4081-5b62-41a8-91a2-4e0193a38eb2 /                       ext4    defaults        1 1

UUID=ca1f139e-1401-4e65-bd1f-9e298287daaf swap                    swap    defaults        0 0

tmpfs                   /dev/shm                tmpfs   defaults        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

拷貝交叉編譯器中的動態庫到相應的目錄下

[[email protected] rootfs]$ cd rootfs/

[[email protected] rootfs]$ ls

apps  bin  data  dev  etc  info  lib  mnt  proc  root  sbin  sys  tmp  usr  var

[[email protected] rootfs]$ ls lib/

modules

[[email protected] rootfs]$ cp -af /opt/buildroot-2012.08/arm920t/usr/lib/lib*.so* lib/

[[email protected] rootfs]$ ls lib/

libgmp.so         libltdl.so        libmpc.so        libmpfr.so        modules

libgmp.so.10      libltdl.so.7      libmpc.so.2      libmpfr.so.4

libgmp.so.10.0.5  libltdl.so.7.2.2  libmpc.so.2.0.0  libmpfr.so.4.1.1

[[email protected] rootfs]$ cd lib/

[[email protected] lib]$ ll

總用量 1024

lrwxrwxrwx. 1 luxibao luxibao     16 7月  14 23:02 libgmp.so -> libgmp.so.10.0.5

lrwxrwxrwx. 1 luxibao luxibao     16 7月  14 23:02 libgmp.so.10 -> libgmp.so.10.0.5

-rwxr-xr-x. 1 luxibao luxibao 488709 7月  14 23:02 libgmp.so.10.0.5

lrwxrwxrwx. 1 luxibao luxibao     16 7月  14 23:03 libltdl.so -> libltdl.so.7.2.2

lrwxrwxrwx. 1 luxibao luxibao     16 7月  14 23:03 libltdl.so.7 -> libltdl.so.7.2.2

-rwxr-xr-x. 1 luxibao luxibao  46306 7月  14 23:03 libltdl.so.7.2.2

lrwxrwxrwx. 1 luxibao luxibao     15 7月  14 23:04 libmpc.so -> libmpc.so.2.0.0

lrwxrwxrwx. 1 luxibao luxibao     15 7月  14 23:04 libmpc.so.2 -> libmpc.so.2.0.0

-rwxr-xr-x. 1 luxibao luxibao  95963 7月  14 23:04 libmpc.so.2.0.0

lrwxrwxrwx. 1 luxibao luxibao     16 7月  14 23:02 libmpfr.so -> libmpfr.so.4.1.1

lrwxrwxrwx. 1 luxibao luxibao     16 7月  14 23:02 libmpfr.so.4 -> libmpfr.so.4.1.1

-rwxr-xr-x. 1 luxibao luxibao 404434 7月  14 23:02 libmpfr.so.4.1.1

drwxrwxr-x. 3 luxibao luxibao   4096 7月  18 07:47 modules

Etc 目錄下建立一些檔案

建立inittab檔案

[[email protected] rootfs]$ cd etc/

[[email protected] etc]$ ls

dropbear  init.d

[[email protected] etc]$ vim inittab

# /etc/inittab                                                                       

#

# Copyright (C) 2011 fulinux <[email protected]>

#

# Note: BusyBox init doesn't support runlevels.  The runlevels field is

# completely ignored by BusyBox init. If you want runlevels, use sysvinit.

#

# Format for each entry: <id>:<runlevels>:<action>:<process>

#

# id        == tty to run on, or empty for /dev/console.

#              If specified, then /dev/$id device must exist

# runlevels == ignored, busybox doesn't support it

# action    == one of sysinit, respawn, askfirst, wait, and once

# process   == program to run

# Startup the system

# mount all the file systems specified in /etc/fstab

::sysinit:/bin/mount -a

#Use mdev as hotplug to auto mount USB storage or SD card

::sysinit:/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug

#Use mdev to auto generate the device node in /dev path

::sysinit:/sbin/mdev -s

#make shm, pts support

::sysinit:/bin/mkdir -p /dev/pts

::sysinit:/bin/mkdir -p /dev/shm

::sysinit:/bin/mount -t devpts devpts /dev/pts

#Mount our apps/info partition

null::wait:/bin/mount -o sync,noatime,ro -t jffs2 /dev/mtdblock6 /apps

null::wait:/bin/mount -o sync,noatime,ro -t jffs2 /dev/mtdblock7 /info

#Set hostname

null::sysinit:/bin/hostname -F /etc/hostname

#Enable console logon

null::respawn:/sbin/getty -L ttyS0 115200 vt100

# now run any rc scripts

null::wait:/etc/init.d/rcS

# system daemon

null::respawn:/sbin/syslogd -n

null::respawn:/sbin/klogd -n

# Stuff to do before rebooting

null::shutdown:/bin/umount /apps

null::shutdown:/bin/umount /info

null::shutdown:/bin/killall klogd

null::shutdown:/bin/killall syslogd

null::shutdown:/bin/umount -a -r

#null::shutdown:/sbin/swapoff -a

"inittab" [] 54L, 1768C已寫入  

建立/etc/init.d/rcS指令碼

[[email protected] etc]$ vim init.d/rcS

#!/bin/sh

# Copyright (C) 2011 fulinux <[email protected]>

# Start all init scripts in /etc/init.d

# executing them in numerical order.

#

for i in /etc/init.d/S??* ; do

            $i

Done

"init.d/rcS" [] 10L, 218C已寫入

配置網絡卡的啟動指令碼

[[email protected] etc]$ vim  init.d/S01_network

#!/bin/sh

ifconfig eth0 192.168.1.111 netmask 255.255.255.0 up

"init.d/S01_network" [] 3L, 64C已寫入

建立支援/apps/etc目錄下的啟動指令碼

[[email protected] etc]$ vim init.d/S99_rcsApp

#!/bin/sh

# Copyright (C) 2011 fulinux <[email protected]>

#

# Start all init scripts in /apps/etc/init.d

# executing them in numerical order.

#

if (test -d /apps/etc/init.d)

    then

    for i in /apps/etc/init.d/S??* ; do

    $i

    done

Fi

"init.d/S99_rcsApp" [] 13L, 244C已寫入

修改init.d目錄下的檔案許可權

[[email protected] etc]$ chmod 777 init.d/*

[[email protected] etc]$ ll init.d/

總用量 12

-rwxrwxrwx. 1 luxibao luxibao 218 7月  18 09:49 rcS

-rwxrwxrwx. 1 luxibao luxibao  64 7月  18 09:50 S01_network

-rwxrwxrwx. 1 luxibao luxibao 244 7月  18 09:53 S99_rcsApp

建立fstab檔案

[[email protected] etc]$ vim fstab

# /etc/fstab: static file system information.

# Copyright (C) 2011 fulinux <[email protected]>

#

#<File system> <mount pt>     <type>   <options>         <dump> <pass>

#devpts          /dev/pts       devpts   defaults          0      0

#/dev/root       /              ext2     rw,noauto         0      1

proc            /proc          proc     defaults          0      0

tmpfs           /tmp          tmpfs    defaults          0      0

tmpfs           /dev          tmpfs    defaults          0      0

sysfs           /sys           sysfs    defaults          0      0

"fstab" [] 10L, 570C已寫入

建立hostname,hosts,TZ檔案

[[email protected] etc]$ echo "root" > hostname

[[email protected] etc]$ echo "127.0.0.1      localhost" >> hosts

[[email protected] etc]$ echo "MST7MDT" >> TZ

[[email protected] etc]$ echo "Copyright (C) 2011 fulinux<[email protected]>" >> issue    #系統登入時的提示資訊

建立profile檔案

[[email protected] etc]$ vim profile

# /etc/profile: system-wide .profile file for the Bourne shells.

export PATH=\

/bin:\

/sbin:\

/usr/bin:\

/usr/sbin:\

/usr/local/bin:\

/apps/bin:\

/apps/tools:\

/apps/tslib/bin\

# If running interactively, then:

if [ "$PS1" ]; then

   if [ "$BASH" ]; then

        export PS1="[\[email protected]\h \W]\\$ "

        alias ll='/bin/ls --color=tty -laFh'

        alias ls='/bin/ls --color=tty -F'

        export

LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;

    32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.de

b=0

    1;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.png=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;

35

    :*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:

*.d

    l=01;35:*.xcf=01;35:*.xwd=01;35:';

        else

          if [ "`id -u`" -eq 0 ]; then

            export PS1='>: '

          else

            export PS1='>: '

          fi

         fi

      # System Setting

          set -o vi

          alias  ll='ls -l'

          export USER=`id -un

          export LOGNAME=$USER

          export HOSTNAME=`/bin/hostname`

          export HISTSIZE=1000

          export HISTFILESIZE=1000

          export PAGER='/bin/more '

          export EDITOR='/bin/vi'

          export INPUTRC=/etc/inputrc

          export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile

          export VAR1=

          export VAR2=

          export VAR3=

          export VAR4=

          export VAR5=

          export LD_LIBRARY_PATH=/lib:/usr/lib/

# QT Extendded 4.4.3 Setting

    export QTDIR=/apps/qt-extended-4.4.3

    export QWS_MOUSE_PROTO='TSLIB:/dev/event0'

    export QWS_DISPLAY='LinuxFB:/dev/fb0'

    export QWS_DISPLAY='LinuxFB:mmWidth240:mmHeight320:0'

    export QWS_SIZE='240x320'

    export QT_PLUGIN_PATH=$QTDIR/plugins/

    export QT_QWS_FONTDIR=$QTDIR/lib/fonts

    export PATH=$QTDIR/bin:$PATH

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib

# Touch Scree tslib Setting

    export TSLIB_ROOT=/apps/tslib

    export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf

    export TSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercal

    export TSLIB_TSDEVICE=/dev/event0

    export TSLIB_CONSOLEDEVICE=none

    export TSLIB_FBDEVICE=/dev/fb0

fi;

"profile" [] 71L, 2372C已寫入  

建立指定一些協議所使用的埠號檔案protocols

[[email protected] etc]$ vim protocols

# /etc/protocols:

# # $Id: protocols,v 1.1.1.1 2001/09/12 19:03:24 andersee Exp $

# #

# # Internet (IP) protocols

# #

# #       from: @(#)protocols     5.1 (Berkeley) 4/17/89

# #

# #       Updated for NetBSD based on RFC 1340, Assigned Numbers (July 1992).

#

# ip      0       IP              # internet protocol, pseudo protocol number

# icmp    1       ICMP            # internet control message protocol

# igmp    2       IGMP            # Internet Group Management

# ggp     3       GGP             # gateway-gateway protocol

# ipencap 4       IP-ENCAP        # IP encapsulated in IP (officially ``IP'')

# st      5       ST              # ST datagram mode

# tcp     6       TCP             # transmission control protocol

# egp     8       EGP             # exterior gateway protocol

# pup     12      PUP             # PARC universal packet protocol

# udp     17      UDP             # user datagram protocol

# hmp     20      HMP             # host monitoring protocol

# xns-idp 22      XNS-IDP         # Xerox NS IDP

# rdp     27      RDP             # "reliable datagram" protocol

# iso-tp4 29      ISO-TP4         # ISO Transport Protocol class 4

# xtp     36      XTP             # Xpress Tranfer Protocol

# ddp     37      DDP             # Datagram Delivery Protocol

# idpr-cmtp       39      IDPR-CMTP       # IDPR Control Message Transport

# rspf    73      RSPF            #Radio Shortest Path First.

# vmtp    81      VMTP            # Versatile Message Transport

# ospf    89      OSPFIGP         # Open Shortest Path First IGP

# ipip    94      IPIP            # Yet Another IP encapsulation

# encap   98      ENCAP           # Yet Another IP encapsulation

~

~

~

~

"protocols" [] 31L, 1676C已寫入

建立mdev.conf檔案

mdev會在/etc目錄下找mdev的配置檔案: mdev.conf. 如果該檔案不存在,那麼在執行mdev –s這個命令時,

會提示找不到mdev.conf,這時我們可以建一個空的mdev.conf檔案解決這個問題。下面建立使用mdev自動掛載u盤和SD卡的配置/etc/mdev.conf

[[email protected] etc]$ vim mdev.conf

sd[a-z][0-9]      0:0 0777        @(mount /dev/$MDEV /mnt/usb)

sd[a-z]           0:0 0777        $(umount /mnt/usb)

ub[a-z][0-9]      0:0 0777        @(mount /dev/$MDEV /mnt/usb)

ub[a-z]           0:0 0777        $(umount /mnt/usb)

mmcblk[0-9]p[0-9] 0:0 0777        @(mount /dev/$MDEV /mnt/sdc)

mmcblk[0-9]       0:0 0777        $(umount /mnt/sdc)

"mdev.conf" [] 6L, 348C已寫入

建立使用者組group檔案

[[email protected] etc]$ vim group

root:x:0:root

"group" [] 1L, 14C已寫入

它的格式如下:

groupname:password:gid:members

第一個欄位為使用者組名稱

第二個欄位為使用者組密碼,當為x時密碼是對映到/etc/gshadow中的,是非逆的

第三個欄位為GID,及組號,為正整數或0,0被付於了root使用者組;系統通常會預留一些較靠前的GID給系統虛擬使用者之用,每個系統預留的GID都不同,Fedora預留了500個,所以我們新增新使用者組時是從500開始的。GID的範圍由/etc/login.defs中的GID_MIN和GID_MAX決定

第四個欄位為使用者列表,每個使用者間用逗號分隔

這裡的password代表組口令,很少用到。它可使原先不在這個群組中的使用者可以通過newgrp命令暫時繼承該組的許可權,使用 newgrp命令時會新開一個shell。口令的加密方式和passwd檔案中的口令一樣,所以如果需設定組口令,要用passwd程式虛設一個使用者,再把該使用者password節中的加密口令拷貝到/etc/group檔案中。members列代表組成員,我們可把需加入該組的使用者以逗號分隔新增到這裡即可。同一組的成員可繼承該組所擁有的許可權。

建立使用者passwd檔案

[[email protected] etc]$ vim passwd

root:x:0:0:root:/:/bin/sh

"passwd" [] 1L, 26C已寫入

它的格式如下:

username:password:uid:gid:gecos:homedir:shell

第一個欄位為登入名

第二個欄位為口令,一般被對映到shadow檔案中

第三個欄位為UID

第四個欄位為GID

第五個欄位為使用者名稱全稱,gecos是通用電子計算機作業系統的縮寫,是Bell實驗室中的一臺大型主機。

第六個欄位為使用者根目錄

第七個欄位為使用者所用SHELL的型別

Unix系統最初是用明文儲存密碼的,後來由於安全的考慮,採用crypt()演算法加密密碼並存放在/etc/passwd檔案。現在,由於計算機處理能力的提高,使密碼破解變得越來越容易。/etc/passwd檔案是所有合法使用者都可訪問的,大家都可互相看到密碼的加密字串,這給系統帶來很大的安全威脅。現代的Unix系統使用影子密碼系統,它把密碼從/etc/pa sswd檔案中分離出來,真正的密碼儲存在/etc/shadow檔案中,shadow檔案只能由超級使用者訪問。這樣入侵者就不能獲得加密密碼串,用於破解。使用shadow密碼檔案後,/etc/passwd檔案中所有帳戶的password域的內容為"x",如果password域的內容為"*",則該帳號被停用。使用passwd這個程式可修改使用者的密。

建立密碼對映shadow檔案

這裡我們設定為不用密碼登陸,將password格式的內容清空:

[[email protected] rootfs]$ vim etc/shadow

root::0:0:99999:7:::

~

~

~

"etc/shadow" [] 1L, 21C已寫入

在檔案系統中安裝busybox

[[email protected] rootfs]$ cd

[[email protected] ~]$ ls

fl2440  公共的  模板  視訊  圖片  文件  下載  音樂  桌面

[[email protected] ~]$ cd fl2440/

[[email protected] fl2440]$ ls

3rdparty  bootloader  driver  kernel  program  rootfs

[[email protected] fl2440]$ cd 3rdparty/

[[email protected] 3rdparty]$ ls

[[email protected] 3rdparty]$ rz

rz waiting to receive.

Starting zmodem transfer.  Press Ctrl+C to cancel.

Transferring busybox-1.20.2.tar.bz2...

  100%    2135 KB 2135 KB/s 00:00:01       0 Errors

?[[email protected] 3rdparty]$ ls

busybox-1.20.2.tar.bz2

[[email protected] 3rdparty]$ tar xjf busybox-1.20.2.tar.bz2

[[email protected] 3rdparty]$ ls

busybox-1.20.2  busybox-1.20.2.tar.bz2

[[email protected] 3rdparty]$ cd busybox-1.20.2

[[email protected] busybox-1.20.2]$ vim Makefile

#修改CROSS_COMPILER為:

CROSS_COMPILE ?= /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-

[[email protected] busybox-1.20.2]$ ls ../../rootfs/rootfs/

apps  bin  data  dev  etc  info  lib  mnt  proc  root  sbin  sys  tmp  usr  var

[[email protected] busybox-1.20.2]$ make menuconfig

#選擇:

  Busybox Settings  --->

       General Configuration  --->

             [*] Don't use /usr

       Installation Options ("make install" behavior)  --->

             What kind of applet links to install (as soft-links)  --->

(home/luxibao/fl2440/rootfs/rootfs/) BusyBox installation prefix

#其他選項結合和自己的需求定製

[[email protected] busybox-1.20.2]$ make

[[email protected] busybox-1.20.2]$  file busybox

busybox: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), stripped

[[email protected] busybox-1.20.2]$ sudo make install

 /home/luxibao/fl2440/rootfs/rootfs//bin/[ -> busybox

  /home/luxibao/fl2440/rootfs/rootfs//bin/[[ -> busybox

  /home/luxibao/fl2440/rootfs/rootfs//bin/add-shell -> busybox

  /home/luxibao/fl2440/rootfs/rootfs//bin/addgroup -> busybox

  /home/luxibao/fl2440/rootfs/rootfs//bin/adduser -> busybox

  /home/luxibao/fl2440/rootfs/rootfs//bin/arping -> busybox

  /home/luxibao/fl2440/rootfs/rootfs//bin/ash -> busybox

  /home/luxibao/fl2440/rootfs/rootfs//bin/awk -> busybox

  /home/luxibao/fl2440/rootfs/rootfs//bin/base64 -> busybox

  /home/luxibao/fl2440/rootfs/rootfs//bin/basename -> busybox

  /home/luxibao/fl2440/rootfs/rootfs//bin/beep -> busybox

省略N行............................

  /home/luxibao/fl2440/rootfs/rootfs//sbin/udhcpd -> ../bin/busybox

  /home/luxibao/fl2440/rootfs/rootfs//sbin/vconfig -> ../bin/busybox

  /home/luxibao/fl2440/rootfs/rootfs//sbin/watchdog -> ../bin/busybox

  /home/luxibao/fl2440/rootfs/rootfs//sbin/zcip -> ../bin/busybox

--------------------------------------------------

You will probably need to make your busybox binary

setuid root to ensure all configured applets will

work properly.

--------------------------------------------------

[[email protected] busybox-1.20.2]$ ls

applets                 Config.in      include     Makefile.custom  scripts

applets_sh              configs        init        Makefile.flags   selinux

arch                    console-tools  _install    Makefile.help    shell

archival                coreutils      INSTALL     miscutils        sysklogd

AUTHORS                 debianutils    libbb       modutils         testsuite

busybox                 docs           libpwdgrp   networking       TODO

busybox.links           e2fsprogs      LICENSE     printutils       TODO_unicode

busybox_unstripped      editors        loginutils  procps           util-linux

busybox_unstripped.map  examples       mailutils   README

busybox_unstripped.out  findutils      Makefile    runit

[[email protected] busybox-1.20.2]$ cd ../

[[email protected] 3rdparty]$ cd ../

[[email protected] fl2440]$ cd rootfs

[[email protected] rootfs]$ cd rootfs/

[[email protected] rootfs]$ ls

apps  data  etc   init  linuxrc  proc  sbin  tmp  var

bin   dev   info  lib   mnt      root  sys   usr

移植dropbear

首先編譯生成PC版的,在製作金鑰時用到

[[email protected] ~]$ tar -xjf dropbear-0.53.1.tar.bz2

[[email protected] ~]$ cd dropbear-0.53.1

[[email protected] dropbear-0.53.1]$./configure && make

生成的檔案:

    dropbear: ssh2 server

    dropbearkey: 金鑰生成器

    dropbearconvert: 可以轉換openssh的金鑰

dbclient: ssh2 client

[[email protected] dropbear-0.53.1]$ ./dropbearkey -t rsa -f /home/luxibao/fl2440/rootfs/rootfs/etc/dropbear/dropbear_rsa_host_key

Will output 1024 bit rsa secret key to '/home/luxibao/fl2440/rootfs/rootfs/etc/dropbear/dropbear_rsa_host_key'

Generating key, this may take a while...

Public key portion is:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgkz1a393mku4JXzyW4T014jxqQfcnuFAApQTEwRhDle3gTKNFORfoS3rJUc0ENjwwxu4VyDzsgAjrILGuP9t0tVn9oM+O0j10OyNTRY9sDXzupBguxIFruG39uUU8VSxHm+/w0j6hqGlxzwI7PEV/nlU2iv2maoZuhDceRhrM5ny1r8= [email protected]

Fingerprint: md5 6b:25:d5:fa:b7:10:3b:2b:46:e2:c1:cf:59:28:f7:a9

[[email protected] dropbear-0.53.1]$ ./dropbearkey -t dss -f /home/luxibao/fl2440/rootfs/rootfs/etc/dropbear/dropbear_dss_host_key

Will output 1024 bit dss secret key to '/home/luxibao/fl2440/rootfs/rootfs/etc/dropbear/dropbear_dss_host_key'

Generating key, this may take a while...

Public key portion is:

ssh-dss AAAAB3NzaC1kc3MAAACBAJG3OxxJZ1J8GMHvJrSPPHkoauydPmpBGsBscQWiVfC8d4lURbdOFDfh2rQe6ZEjizjoV+OOKhg3S8SWOp0R55Am0cwpeB8XJaV3iWZwldx/JrcqRVZDjXIrryEtrFTSpHkkSNsivUTRnuzcakq+/Dxhw5rC/ahrs5cCvabgQNbfAAAAFQDHmVLiFI05ZA6rcTTOJuZv3OCTawAAAIBNL2GAnd7eaigPrgUqAKkQ4jUhDywk86+RHTSfls6V5hlOtWF5g8mB6USqbO7fBd1P3ckD9SpE8XCD2lkmYBevJtNr/p+4Cuz57NlS4sN9cy9RVdDbuAaUdXV7FffenR7rhl0KSeoXtMx0QYOcHKHnifN9A+j1seWBK4AsDzAcXQAAAIBKVUH0erG2LMhDgK6maxDkeHkJe6LX8aT5uQSV9bv1ftQst0BD0nChe+00ZyldS8m1qu+aBbtEoPpmZ9UnQiu5aE+jurF4wzflLqi+brb09McZZqGtKFIlLs4mibv11c3T0dQAIapE90Y32i29I/p6ULE7KHUy++U4pYXCXJ61YQ== [email protected]

Fingerprint: md5 cd:eb:06:06:7d:6c:60:90:a3:23:60:a1:6a:09:f8:31

[[email protected] dropbear-0.53.1]$ chmod 666 /home/luxibao/fl2440/rootfs/rootfs/etc/dropbear/dropbear_*

編譯ARM版本的

[[email protected] dropbear-0.53.1]$ make  distclean

[[email protected] dropbear-0.53.1]$ ./configure CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc --build=i686 --host=arm-linux --disable-zlib

[[email protected] dropbear-0.53.1]$ make

[[email protected] dropbear-0.53.1]$ file dropbear

dropbear: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

[[email protected] dropbear-0.53.1]$  file dbclient

dbclient: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

[[email protected]]$  /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-strip dropbear

[[email protected] dropbear-0.53.1]$ mv dbclient ssh

[[email protected] dropbear-0.53.1]$ /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-strip ssh

[[email protected] dropbear-0.53.1]$ cp dropbear ssh /home/luxibao/fl2440/rootfs/rootfs/usr/sbin/

在檔案系統中建立啟動指令碼

[[email protected] rootfs]$ vim etc/init.d/S04_dropbear

#!/bin/sh

/usr/sbin/dropbear

[[email protected] rootfs]$ chmod 777 etc/init.d/S04_dropbear

[[email protected] rootfs]$ ls

apps  bin  data  dev  etc  info  init  lib  linuxrc  mnt  proc  root  sbin  sys  tmp  usr  var

* 在開發板中移植上面製作的根檔案系統後的截圖如下所示:


對根檔案系統進行修改

由於製作initramfs檔案系統啟動時會在根檔案系統中執行第一個init程式,它對uboot傳過來的引數init=/linuxrc不予理睬,所以需要在上面製作的根檔案系統裡的根目錄加入init程式,否則無法啟動。init程式和linuxrc程式一樣都是符號連結檔案,它們都是指向/bin/busybox程式。

[[email protected] rootfs]$ ln -s bin/busybox init

[[email protected] rootfs]$ ll

總用量 60

drwxrwxr-x. 2 luxibao luxibao 4096 7月  18 07:47 apps

drwxrwxr-x. 2 luxibao luxibao 4096 7月  18 12:15 bin

drwxrwxr-x. 2 luxibao luxibao 4096 7月  18 07:47 data

drwxrwxr-x. 2 luxibao luxibao 4096 7月  18 07:55 dev

drwxrwxr-x. 4 luxibao luxibao 4096 7月  18 10:31 etc

drwxrwxr-x. 2 luxibao luxibao 4096 7月  18 07:47 info

lrwxrwxrwx. 1 luxibao luxibao   11 7月  18 11:57 init -> bin/busybox

drwxrwxr-x. 3 luxibao luxibao 4096 7月  18 09:21 lib

lrwxrwxrwx. 1 root    root      11 7月  18 12:15 linuxrc -> bin/busybox

drwxrwxr-x. 6 luxibao luxibao 4096 7月  18 07:47 mnt

drwxrwxr-x. 2 luxibao luxibao 4096 7月  18 07:47 proc

drwxrwxr-x. 2 luxibao luxibao 4096 7月  18 07:47 root

drwxrwxr-x. 2 luxibao luxibao 4096 7月  18 12:15 sbin

drwxrwxr-x. 2 luxibao luxibao 4096 7月  18 07:47 sys

drwxrwxr-x. 2 luxibao luxibao 4096 7月  18 07:47 tmp

drwxrwxr-x. 6 luxibao luxibao 4096 7月  18 07:47 usr

drwxrwxr-x. 2 luxibao luxibao 4096 7月  18 08:04 var

新增核心對initramfs的支援

[[email protected] fl2440]$ ls

3rdparty  bootloader  driver  kernel  program  rootfs

[[email protected] fl2440]$ cd kernel/

[[email protected] kernel]$ ls

linux-3.0  linux-3.0.tar.bz2

[[email protected] kernel]$ cd linux-3.0

[[email protected] linux-3.0]$ export TERM=vt100

[[email protected] linux-3.0]$ make menuconfig

。 。 。 。 。 。

General setup  --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
(/home/luxibao/fl2440/rootfs/rootfs) Initramfs source file(s)   #輸入根檔案系統的所在目錄 

 。 。 。 。 。

[[email protected] linux-3.0]$ ls

arch           drivers   Kbuild                Makefile         README          System.map

block          firmware  Kconfig               mm               REPORTING-BUGS  tools

COPYING        fs        kernel                modules.builtin  samples         usr

CREDITS        include   lib                   modules.order    scripts         virt

crypto         init      linuxrom-s3c2440.bin  Module.symvers   security        vmlinux

Documentation  ipc       MAINTAINERS           net              sound           vmlinux.o

[[email protected] linux-3.0]$  du -h  linuxrom-s3c2440.bin

6.7M    linuxrom-s3c2440.bin

[[email protected] linux-3.0]$ mv linuxrom-s3c2440.bin /tftp/

製作映像檔案

新增ubootinitramfs支援

Uboot原始碼基本上不做修改。

下面對uboot進行修改。

U-Boot 2010.09 (Jul 17 2016 - 19:56:41)

DRAM:  64 MiB

NAND:  256 MiB

In:    serial

Out:   serial

Err:   serial

Net:   dm9000

Hit any key to stop autoboot:  0

[[email protected]]# set bkr 'tftp 30008000 linuxrom-s3c2440.bin;nand erase 100000 8000000;nand write 30008000 100000 800000'

[[email protected]]# set bootcmd_initramdisk 'nand read 30008000 100000 800000;bootm 30008000'

[[email protected]]#  set bootargs 'console=ttyS0,115200 mem=64M init=/linuxrc rw loglevel=7'

[

相關推薦

檔案製作檔案系統 Initramfs檔案系統製作

 根檔案系統樹製作 首先要明白的是“什麼是檔案系統”,檔案系統是對一個儲存裝置上的資料和元資料進行組織的機制。 這種機制有利於使用者和作業系統的互動。 根檔案系統之所以在前面加一個”根“,說明它是載入其它檔案系統的”根“,既然是根的話,那麼如果沒有這個根,其它的檔案

ELF檔案解析SegmentSection

ELF 是Executable and Linking Format的縮寫,即可執行和可連結的格式,是Unix/Linux系統ABI (Application Binary Interface)規範的一部分。 Unix/Linux下的可執行二進位制檔案、目的碼檔案、共享庫檔案和core dump檔案都屬於EL

安卓開發學習筆記如何用Android Stuidio匯出apk檔案

一,首先,我們在選單欄上找到這一欄: 然後點選build,再點選generate apk,然後出現以下介面: 由於之前我們並沒有進行apk檔案的生成,因此需要這個apk key做一個驗證,以防您的app上線之後被別人盜用,同時證明自己對這個app的擁有權。key store path就是您app key所

IE相容筆記相容IE9表單上傳檔案

幾年前做相容IE8的pc端專案的時候就遇到檔案上傳的需求,當時也是檢視文件來解決IE9以下不支援formData的問題。由於之前沒有寫部落格的習慣,最近又遇到這樣的需求,所以寫出來想幫助需要用到的朋友。   本身檔案上傳不難,只需要注意一些細節: 用最初的表單提交的方式f

機器學習筆記最小二乘法梯度下降

一、最小二乘法 1.一元線性擬合的最小二乘法 先選取最為簡單的一元線性函式擬合助於我們理解最小二乘法的原理。 要讓一條直接最好的擬合紅色的資料點,那麼我們希望每個點到直線的殘差都最小。 設擬合直線為

Redis學習01_redis安裝部署centos Redis學習CentOS下redis安裝部署

原文: http://www.cnblogs.com/herblog/p/9305668.html Redis學習(一):CentOS下redis安裝和部署   1.基礎知識  redis是用C語言開發的一個開源的高效能鍵值對(key-value)資料庫。它通過提

安卓學習日記瞭解安卓架構(linux核心層、系統執行庫層、應用框架層、應用層)

10)timed device: 提供了對裝置進行定時控制的功能,目前支援vibrator和LED裝置。原始碼位於drivers/staging/android /timed_output.c(timed_gpio.c)。 11)Yaffs2 :是檔案系統 Android採用Yaffs2作為MTD n

Python3+OpenCV學習筆記影象載入、顯示儲存

img = cv2.imread('Rachel.jpg')載入影象後,當然需要顯示出來,我們才能看到,所以,接下來用到第二個函式cv2.imshow(windowname, filename)“windowname”輸入顯示視窗的名稱,引數型別str,需要開啟多個視窗時,只需要“windowname”不同

淺談緩存寫法緩存的雪崩穿透

完成後 pool uri oid obj adding 其中 day 大於 基本寫法 為了方便演示,這裏使用Runtime.Cache做緩存容器,並定義個簡單操作類。如下: <pre class="brush:csharp;gutter:true;"

LINUX移植——檔案系統製作

上一篇文章當中,說了說怎樣搭建nfs伺服器的過程,這也是製作根檔案系統前必須的準備工作,當然也可以用其他方法,但從除錯的角度來說,還是nfs最適合了。這篇文章咱們正式開始製作根檔案系統,主要內容如下:

IO流的應用實現檔案的複製

package com.bjpowernode.demo03; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /** 使用FileReader/FileW

PE檔案格式學習概述

1.PE檔案簡介 PE檔案格式是Windows系統中應用最廣泛的檔案格式之一,我們常見的可執行檔案.exe、動態連結庫.dll以及驅動檔案.sys等都是PE檔案格式的。 可以通過十六進位制工具如010editor檢視PE檔案,可以看到PE檔案都有一個共同的特點,就是它們的最開頭都是4D5A,也就是ASCI

網頁開發學習製作份邀請函

網頁開發設計是在面試創新實驗室時面試官給的二面試題,讓自己設計實現一個簡單的網頁。所以我決定來做一個邀請函網頁,並將開發過程寫在部落格上供有需要的朋友們檢視。 網頁開發工具有很多,我使用的是對新手較為友好的Dreamweaver,其優點在於簡便、直觀、功能豐富,簡稱為“傻瓜化”。下載請

Vue原始碼分析入口檔案

Vue原始碼分析(一):入口檔案   首先開啟命令列,從github下載原始碼,下載到自己的工作目錄。 git clone https://github.com/vuejs/vue.git   這裡我下載的是2.5.17版本的,vue 原始碼是由各種模組用 rollup 工具

跨平臺方法獲取檔案大小引數為檔案url

在一些實際的專案中,我們需要去計算某目錄下的某個檔案的大小,從而繼續後續的業務; 如下的方法是各個平臺通用的方法,簡潔實用,已經驗證和測試過: #include <stdint.h> #include <stdio.h> #include <stdlib.h

常用工具類FileUtile 檔案相關操作

常用工具類(一):FileUtile 檔案相關操作 public class FileUtil { private static final Logger logger = LoggerFactory.getLogger(FileUtils.class); //讀取檔案

ROS檔案系統介紹

ROS的檔案系統 一個catkin軟體包稱為一個程式包package,package主要包含兩個主要檔案: (1)package.xml:package的描述資訊 (2)CMakeList.txt:構建package的主要CMake檔案,用於呼叫Catkin的函式與巨集,解析p

【Qt】通過QtCreator原始碼學習Qtpro檔案

1、學習目的 學習pro檔案的語法規則,這在跨平臺專案中會經常用到。和條件編譯相似,在pro中可以根據平臺選擇不同的編譯模組、檔案,還可以向原始碼中傳遞變數等。 2、學習方法 通過學習QtCreator原始碼中的pro檔案,來掌握pro檔案語法規則,下面以qtcreator.

Python+OGR庫學習讀取點向量檔案屬性值座標,並儲存為TXT一行一個要素值

程式碼思路: 1、匯入相關庫包,切換到當前資料夾 2、註冊驅動,開啟點向量檔案,獲取圖層 3、開啟待寫入TXT檔案 4、遍歷要素: (1)獲取當前要素‘ID’和‘cover’欄位屬性 (2)獲取當前點要素對應幾何物件和其座標值X,Y (3)將ID、cover、X、Y寫入TXT檔案 (

Java解析魔獸爭霸3錄影W3G檔案Header

魔獸爭霸3是一款非常著名的即時戰略遊戲。相信很多人都聽過sky、moon、grubby這些名字,還有塔魔infi、中國的鬼王ted、剛猛的fly、飄逸的th000等選手。遺憾的是WCG2013是魔獸爭霸3的最後一屆,我自己也去現場觀看了魔獸的總決賽。此外,還有DOTA、真三