根檔案製作(一):根檔案系統樹 和 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/
製作映像檔案
新增uboot對initramfs支援
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'
[
根檔案系統樹製作
首先要明白的是“什麼是檔案系統”,檔案系統是對一個儲存裝置上的資料和元資料進行組織的機制。
這種機制有利於使用者和作業系統的互動。
根檔案系統之所以在前面加一個”根“,說明它是載入其它檔案系統的”根“,既然是根的話,那麼如果沒有這個根,其它的檔案 ELF 是Executable and Linking Format的縮寫,即可執行和可連結的格式,是Unix/Linux系統ABI (Application Binary Interface)規範的一部分。
Unix/Linux下的可執行二進位制檔案、目的碼檔案、共享庫檔案和core dump檔案都屬於EL 一,首先,我們在選單欄上找到這一欄:
然後點選build,再點選generate apk,然後出現以下介面:
由於之前我們並沒有進行apk檔案的生成,因此需要這個apk key做一個驗證,以防您的app上線之後被別人盜用,同時證明自己對這個app的擁有權。key store path就是您app key所
幾年前做相容IE8的pc端專案的時候就遇到檔案上傳的需求,當時也是檢視文件來解決IE9以下不支援formData的問題。由於之前沒有寫部落格的習慣,最近又遇到這樣的需求,所以寫出來想幫助需要用到的朋友。
本身檔案上傳不難,只需要注意一些細節:
用最初的表單提交的方式f
一、最小二乘法
1.一元線性擬合的最小二乘法
先選取最為簡單的一元線性函式擬合助於我們理解最小二乘法的原理。
要讓一條直接最好的擬合紅色的資料點,那麼我們希望每個點到直線的殘差都最小。 設擬合直線為
原文: http://www.cnblogs.com/herblog/p/9305668.html
Redis學習(一):CentOS下redis安裝和部署
1.基礎知識
redis是用C語言開發的一個開源的高效能鍵值對(key-value)資料庫。它通過提
10)timed device: 提供了對裝置進行定時控制的功能,目前支援vibrator和LED裝置。原始碼位於drivers/staging/android /timed_output.c(timed_gpio.c)。
11)Yaffs2 :是檔案系統 Android採用Yaffs2作為MTD n 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;"
上一篇文章當中,說了說怎樣搭建nfs伺服器的過程,這也是製作根檔案系統前必須的準備工作,當然也可以用其他方法,但從除錯的角度來說,還是nfs最適合了。這篇文章咱們正式開始製作根檔案系統,主要內容如下:
package com.bjpowernode.demo03;
import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;
/**
使用FileReader/FileW 1.PE檔案簡介
PE檔案格式是Windows系統中應用最廣泛的檔案格式之一,我們常見的可執行檔案.exe、動態連結庫.dll以及驅動檔案.sys等都是PE檔案格式的。
可以通過十六進位制工具如010editor檢視PE檔案,可以看到PE檔案都有一個共同的特點,就是它們的最開頭都是4D5A,也就是ASCI
網頁開發設計是在面試創新實驗室時面試官給的二面試題,讓自己設計實現一個簡單的網頁。所以我決定來做一個邀請函網頁,並將開發過程寫在部落格上供有需要的朋友們檢視。 網頁開發工具有很多,我使用的是對新手較為友好的Dreamweaver,其優點在於簡便、直觀、功能豐富,簡稱為“傻瓜化”。下載請
Vue原始碼分析(一):入口檔案
首先開啟命令列,從github下載原始碼,下載到自己的工作目錄。
git clone https://github.com/vuejs/vue.git
這裡我下載的是2.5.17版本的,vue 原始碼是由各種模組用 rollup 工具
在一些實際的專案中,我們需要去計算某目錄下的某個檔案的大小,從而繼續後續的業務;
如下的方法是各個平臺通用的方法,簡潔實用,已經驗證和測試過:
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h
常用工具類(一):FileUtile 檔案相關操作
public class FileUtil {
private static final Logger logger = LoggerFactory.getLogger(FileUtils.class);
//讀取檔案
ROS的檔案系統
一個catkin軟體包稱為一個程式包package,package主要包含兩個主要檔案:
(1)package.xml:package的描述資訊
(2)CMakeList.txt:構建package的主要CMake檔案,用於呼叫Catkin的函式與巨集,解析p
1、學習目的
學習pro檔案的語法規則,這在跨平臺專案中會經常用到。和條件編譯相似,在pro中可以根據平臺選擇不同的編譯模組、檔案,還可以向原始碼中傳遞變數等。
2、學習方法
通過學習QtCreator原始碼中的pro檔案,來掌握pro檔案語法規則,下面以qtcreator.
程式碼思路:
1、匯入相關庫包,切換到當前資料夾 2、註冊驅動,開啟點向量檔案,獲取圖層 3、開啟待寫入TXT檔案 4、遍歷要素: (1)獲取當前要素‘ID’和‘cover’欄位屬性 (2)獲取當前點要素對應幾何物件和其座標值X,Y (3)將ID、cover、X、Y寫入TXT檔案 (
魔獸爭霸3是一款非常著名的即時戰略遊戲。相信很多人都聽過sky、moon、grubby這些名字,還有塔魔infi、中國的鬼王ted、剛猛的fly、飄逸的th000等選手。遺憾的是WCG2013是魔獸爭霸3的最後一屆,我自己也去現場觀看了魔獸的總決賽。此外,還有DOTA、真三 相關推薦
根檔案製作(一):根檔案系統樹 和 Initramfs檔案系統的製作
ELF檔案解析(一):Segment和Section
安卓開發學習筆記(一):如何用Android Stuidio匯出apk檔案?
IE相容筆記(一):相容IE9表單上傳檔案
機器學習筆記(一):最小二乘法和梯度下降
Redis學習01_redis安裝部署(centos) Redis學習(一):CentOS下redis安裝和部署
安卓學習日記(一):瞭解安卓架構(linux核心層、系統執行庫層、應用框架層、應用層)
Python3+OpenCV學習筆記(一):影象載入、顯示和儲存
淺談緩存寫法(一):緩存的雪崩和穿透
LINUX移植——根檔案系統製作(一)
IO流的應用(一):實現檔案的複製
PE檔案格式學習(一):概述
網頁開發學習(一):製作一份邀請函
Vue原始碼分析(一):入口檔案
跨平臺方法(一):獲取檔案大小(引數為檔案url)
常用工具類(一):FileUtile 檔案相關操作
ROS(一):檔案系統介紹
【Qt】通過QtCreator原始碼學習Qt(一):pro檔案
Python+OGR庫學習(一):讀取點向量檔案屬性值和座標,並儲存為TXT(一行一個要素值)
Java解析魔獸爭霸3錄影W3G檔案(一):Header