1.创建根文件系统树目录结构
根文件系统目录树用来存放Linux的基本命令、系统配置、动态库、设备节点、应用程序等所有文件,这些文件是存放在我们的Linux服务器上,在接下来的内容中我们将使用不同的工具将他制作成不同格式的根文件系统。
zhanghang@ubuntu:~/fl2440/linux$ cd rootfs/
zhanghang@ubuntu:~/fl2440/linux/rootfs$ mkdir -p {apps,bin,data,dev,info,proc,root,sbin,sys,tmp,var,etc/init.d,mnt/{usb,mmc},usr/{,bin,sbin,lib},lib/{,modules/{,3.0.0}}}
zhanghang@ubuntu:~/fl2440/linux/rootfs$ tree
.
|-- bin 系统基本命令bin
|-- sbin 系统管理命令
|-- dev 系统设备节点所在路径
|-- root root用户home
|-- etc 系统配置文件所在路径
| `-- init.d 系统初始化、启动程序脚本
|-- lib 系统动态库路径
| `-- modules
| `-- 3.0.0 linux内核驱动模块需要该路径
|-- usr
| |-- bin 用户基本命令路径
| |-- lib 用户动态库文件
| `-- sbin 用户管理命令路径
|-- apps nandflash apps分区挂载点,用来存放应用程序
|-- data nandflash data分区挂载点,用来存放数据
|-- info nandflash info分区挂载点,用来存放设备信息
|-- mnt 系统挂载点
| |-- mmc SD卡挂载点
| `-- usb U盘挂载点
|-- proc linux proc文件系统挂载点
|-- sys linux sys文件系统挂载点
|-- tmp linux tmp文件系统挂载点
`-- var 系统日志等文件存放路径
23 directories, 0 files
2.安装动态库
Linux下所有的应用程序运行都离不开动态库,程序在运行时默认会在**/lib路径下查找相关的动态库文件。如果动态库文件不在该路径下,可以通过LD_LIBRARY_PATH环境变量来指定其它需要加载的动态库路。因为开发板上所有的程序都是使用交叉编译器编译的,所以我们需要将交叉编译器里的
动态库文件拷贝到根文件系统树的lib**路径下:
zhanghang@ubuntu:~/fl2440/linux/rootfs$ cd lib/
zhanghang@ubuntu:~/fl2440/linux/rootfs/lib$ find /opt/xtools/arm920t/ -name "*.so*" | grep -v gconv | xargs -i cp -af {} ./ //将/opt/xtools/arm920t路径下除gconv相关的所有动态库(.so)文件拷贝到当前路径
zhanghang@ubuntu:~/fl2440/linux/rootfs/lib$ ls
ld-2.9.so libm-2.9.so libnss_nis.so.2
ld-linux.so.3 libmemusage.so libpcprofile.so
libanl-2.9.so libm.so libpthread-2.9.so
libanl.so libm.so.6 libpthread.so
libanl.so.1 libnsl-2.9.so libpthread.so.0
libbfd-2.20.1.20100303.so libnsl.so libresolv-2.9.so
libbfd.so libnsl.so.1 libresolv.so
libBrokenLocale-2.9.so libnss_compat-2.9.so libresolv.so.2
libBrokenLocale.so libnss_compat.so librt-2.9.so
libBrokenLocale.so.1 libnss_compat.so.2 librt.so
libc-2.9.so libnss_dns-2.9.so librt.so.1
libcrypt-2.9.so libnss_dns.so libSegFault.so
libcrypt.so libnss_dns.so.2 libstdc++.so
libcrypt.so.1 libnss_files-2.9.so libstdc++.so.6
libc.so libnss_files.so libstdc++.so.6.0.15
libc.so.6 libnss_files.so.2 libstdc++.so.6.0.15-gdb.py
libdl-2.9.so libnss_hesiod-2.9.so libthread_db-1.0.so
libdl.so libnss_hesiod.so libthread_db.so
libdl.so.2 libnss_hesiod.so.2 libthread_db.so.1
libgcc_s.so libnss_nis-2.9.so libutil-2.9.so
libgcc_s.so.1 libnss_nisplus-2.9.so libutil.so
liblto_plugin.so libnss_nisplus.so libutil.so.1
liblto_plugin.so.0 libnss_nisplus.so.2 modules
liblto_plugin.so.0.0.0 libnss_nis.so
列出失效文件:
zhanghang@ubuntu:~/fl2440/linux/rootfs/lib$ ls -l `find -L -type l`
lrwxrwxrwx 1 zhanghang zhanghang 21 Apr 27 07:56 ./libanl.so -> ../../lib/libanl.so.1
lrwxrwxrwx 1 zhanghang zhanghang 30 Apr 27 07:56 ./libBrokenLocale.so -> ../../lib/libBrokenLocale.so.1
lrwxrwxrwx 1 zhanghang zhanghang 23 Apr 27 07:56 ./libcrypt.so -> ../../lib/libcrypt.so.1
lrwxrwxrwx 1 zhanghang zhanghang 20 Apr 27 07:56 ./libdl.so -> ../../lib/libdl.so.2
lrwxrwxrwx 1 zhanghang zhanghang 19 Apr 27 07:56 ./libm.so -> ../../lib/libm.so.6
lrwxrwxrwx 1 zhanghang zhanghang 21 Apr 27 07:56 ./libnsl.so -> ../../lib/libnsl.so.1
lrwxrwxrwx 1 zhanghang zhanghang 28 Apr 27 07:56 ./libnss_compat.so -> ../../lib/libnss_compat.so.2
lrwxrwxrwx 1 zhanghang zhanghang 25 Apr 27 07:56 ./libnss_dns.so -> ../../lib/libnss_dns.so.2
lrwxrwxrwx 1 zhanghang zhanghang 27 Apr 27 07:56 ./libnss_files.so -> ../../lib/libnss_files.so.2
lrwxrwxrwx 1 zhanghang zhanghang 28 Apr 27 07:56 ./libnss_hesiod.so -> ../../lib/libnss_hesiod.so.2
lrwxrwxrwx 1 zhanghang zhanghang 29 Apr 27 07:56 ./libnss_nisplus.so -> ../../lib/libnss_nisplus.so.2
lrwxrwxrwx 1 zhanghang zhanghang 25 Apr 27 07:56 ./libnss_nis.so -> ../../lib/libnss_nis.so.2
lrwxrwxrwx 1 zhanghang zhanghang 24 Apr 27 07:56 ./libresolv.so -> ../../lib/libresolv.so.2
lrwxrwxrwx 1 zhanghang zhanghang 20 Apr 27 07:56 ./librt.so -> ../../lib/librt.so.1
lrwxrwxrwx 1 zhanghang zhanghang 27 Apr 27 07:56 ./libthread_db.so -> ../../lib/libthread_db.so.1
lrwxrwxrwx 1 zhanghang zhanghang 22 Apr 27 07:56 ./libutil.so -> ../../lib/libutil.so.1
在上面的输出中有很多红色的文件为失效的符号链接(…/…/lib/libxxxx),我们可以创建并使用下面脚本来重新制作符号链接到本地路径下:
zhanghang@ubuntu:~/fl2440/linux/rootfs/lib$ vim symlink.sh
#!/bin/bash
# find all the invalid symlink file and remove "./" before it
for sf in `find -L -type l | cut -d'/' -f2` ; do
# parser and get symlink target file name
file=`ls -l $sf | awk -F '/' '{ print $NF }'`
# remove invalid symlink file and generate new one
rm -f $sf && ln -s $file $sf
done
zhanghang@ubuntu:~/fl2440/linux/rootfs/lib$ sh symlink.sh && rm -f symlink.sh
zhanghang@ubuntu:~/fl2440/linux/rootfs/lib$ ls
ld-2.9.so libcrypt-2.9.so liblto_plugin.so.0 libnss_compat.so.2 libnss_nisplus-2.9.so libresolv.so.2 libthread_db.so.1
ld-linux.so.3 libcrypt.so liblto_plugin.so.0.0.0 libnss_dns-2.9.so libnss_nisplus.so librt-2.9.so libutil-2.9.so
libanl-2.9.so libcrypt.so.1 libm-2.9.so libnss_dns.so libnss_nisplus.so.2 librt.so libutil.so
libanl.so libc.so libmemusage.so libnss_dns.so.2 libnss_nis.so librt.so.1 libutil.so.1
libanl.so.1 libc.so.6 libm.so libnss_files-2.9.so libnss_nis.so.2 libSegFault.so modules
libbfd-2.20.1.20100303.so libdl-2.9.so libm.so.6 libnss_files.so libpcprofile.so libstdc++.so
libbfd.so libdl.so libnsl-2.9.so libnss_files.so.2 libpthread-2.9.so libstdc++.so.6
libBrokenLocale-2.9.so libdl.so.2 libnsl.so libnss_hesiod-2.9.so libpthread.so libstdc++.so.6.0.15
libBrokenLocale.so libgcc_s.so libnsl.so.1 libnss_hesiod.so libpthread.so.0 libstdc++.so.6.0.15-gdb.py
libBrokenLocale.so.1 libgcc_s.so.1 libnss_compat-2.9.so libnss_hesiod.so.2 libresolv-2.9.so libthread_db-1.0.so
libc-2.9.so liblto_plugin.so libnss_compat.so libnss_nis-2.9.so libresolv.so libthread_db.so
3、安装busybox
Linux系统在执行一条命令时,默认会到/bin、/sbin、/usr/bin、/usr/sbin这些路径下找,如果找不到则提示command not found,当然我们也可以通过PATH环境变量告诉系统其它命令存放的路径。现在根文件系统树下这些路径里并没有Linux系统相关命令。
BusyBox 是一个集成了一百多个最常用Linux命令和工具的软件,如ls、cat、ifconfig、vim、grep、sed、awk、find、mount、telnet等。有些人将BusyBox 称为 Linux 工具里的瑞士军刀,简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令。我们通过下载busybox源码、配置编译并安装它就会提供这些Linux的基本命令的实现,它们将会被安装到根文件系统树的 bin、sbin、usr/bin、usr/sbin等路径下。
zhanghang@ubuntu:~/fl2440$ ls
3rdparty bootloader crosstool driver images linux program
zhanghang@ubuntu:~/fl2440$ cd 3rdparty/
zhanghang@ubuntu:~/fl2440/3rdparty$ wget https://busybox.net/downloads/busybox-1.27.1.tar.bz2
zhanghang@ubuntu:~/fl2440/3rdparty$ tar -xjf busybox-1.27.1.tar.bz2
zhanghang@ubuntu:~/fl2440/3rdparty$ rm busybox-1.27.1.tar.bz2
zhanghang@ubuntu:~/fl2440/3rdparty$ cd busybox-1.27.1/
zhanghang@ubuntu:~/fl2440/3rdparty/busybox-1.27.1$ ls
applets AUTHORS coreutils editors init LICENSE Makefile.custom miscutils procps scripts testsuite
applets_sh Config.in debianutils examples INSTALL loginutils Makefile.flags modutils qemu_multiarch_testing selinux TODO
arch configs docs findutils libbb mailutils Makefile.help networking README shell TODO_unicode
archival console-tools e2fsprogs include libpwdgrp Makefile make_single_applets.sh printutils runit sysklogd util-linux
类似Linux内核,对busybox进行配置,选择哪些Linux命令需要编译,哪些不需要
zhanghang@ubuntu:~/fl2440/3rdparty/busybox-1.27.1$ export TERM=vt100
zhanghang@ubuntu:~/fl2440/3rdparty/busybox-1.27.1$ make menuconfig
Busybox Settings --->
[ ] Enable options for full-blown desktop systems 我们的Linux不带桌面,可以去掉这个选项节约代码
[*] Build BusyBox as a static binary (no shared libs) 使用静态链接,不使用动态库
(/opt/xtools/arm920t/bin/arm-linux-) Cross Compiler prefix 设置自己的交叉编译器路径
(../../linux/rootfs/) BusyBox installation prefix 设置busybox的安装路径,它应该是根文件系统树的路径
Linux System Utilities --->
[ ] nsenter 将该选项去掉,否则编译出现错误: undefined reference to `setns'
Coreutils --->
[*] sync
[ ] Enable -d and -f flags (requires syncfs(2) in libc) 将该选项去掉,否则编译出现错误: undefined reference to `syncfs'
Print Utilities ---> 打印机我们不用的话,里面的全部不要选,可以节约空间
Mail Utilities ---> 邮件收发我们不用的话,里面的全部不要选,可以节约空间
Busybox Settings--->
Build Options--->
[*] Build BusyBox as a static binary (no shared libs)
Miscellaneous Utilities--->
[*] flash_eraseall//这个选项在后面擦除对应分区有用
zhanghang@ubuntu:~/fl2440/3rdparty/busybox-1.27.1$ make &&make insall//编译并安装busybox到根文件系统树路径下
...
../../linux/rootfs///usr/sbin/rtcwake -> ../../bin/busybox
../../linux/rootfs///usr/sbin/setfont -> ../../bin/busybox
../../linux/rootfs///usr/sbin/setlogcons -> ../../bin/busybox
../../linux/rootfs///usr/sbin/svlogd -> ../../bin/busybox
../../linux/rootfs///usr/sbin/telnetd -> ../../bin/busybox
../../linux/rootfs///usr/sbin/tftpd -> ../../bin/busybox
../../linux/rootfs///usr/sbin/ubiattach -> ../../bin/busybox
../../linux/rootfs///usr/sbin/ubidetach -> ../../bin/busybox
../../linux/rootfs///usr/sbin/ubimkvol -> ../../bin/busybox
../../linux/rootfs///usr/sbin/ubirename -> ../../bin/busybox
../../linux/rootfs///usr/sbin/ubirmvol -> ../../bin/busybox
../../linux/rootfs///usr/sbin/ubirsvol -> ../../bin/busybox
../../linux/rootfs///usr/sbin/ubiupdatevol -> ../../bin/busybox
../../linux/rootfs///usr/sbin/udhcpd -> ../../bin/busybox
--------------------------------------------------
You will probably need to make your busybox binary
setuid root to ensure all configured applets will
work properly.
--------------------------------------------------
zhanghang@ubuntu:~/fl2440/3rdparty/busybox-1.27.1$
切换到根文件系统树路径下,创建符号链接指向busybox程序,如果使用initramfs根文件系统启动需要该命令:
zhanghang@ubuntu:~/fl2440/3rdparty/busybox-1.27.1$ cd ../../linux/rootfs/
zhanghang@ubuntu:~/fl2440/linux/rootfs$ ln -s bin/busybox init
列出根文件系统目录树下的linux命令,这些命令其实都是符号链接到busybox:
zhanghang@ubuntu:~/fl2440/linux/rootfs$ ls ../../linux/rootfs/
apps data etc init linuxrc proc sbin tmp var
bin dev info lib mnt root sys usr
zhanghang@ubuntu:~/fl2440/linux/rootfs$ ls ../../linux/rootfs/bin/
ash dd getopt linux64 mt rmdir sync
base64 df grep ln mv rpm tar
busybox dmesg gunzip login netstat run-parts touch
cat dnsdomainname gzip ls nice scriptreplay true
chattr dumpkmap hostname lsattr pidof sed umount
chgrp echo hush lzop ping setarch uname
chmod ed ionice mkdir ping6 setpriv usleep
chown egrep iostat mknod pipe_progress setserial vi
conspy false ipcalc mktemp printenv sh watch
cp fatattr kbd_mode more ps sleep zcat
cpio fdflush kill mount pwd stat
cttyhack fgrep link mountpoint rev stty
date fsync linux32 mpstat rm su
4.创建/dev路径下的设备节点
Linux下所有的东西都是文件,其中设备也是当作文件来处理。/dev路径下存放所有的Linux的设备文件,我们需要使用root权限执行mknod命令在这里创建系统启动必须的设备文件节点,其他的设备节点将有mdev动态创建。
5.创建/var路径下文件
/var路径会存放系统运行时的一些文件(如系统日志文件/var/log/messages),我们在该路径下创建相应的符号链接到/tmp路径下。
6.创建/etc路径下文件
6.1 创建 /etc/inittab 文件
Linux内核自举启动完成之后,最后将创建init进程并执行根文件系统中的/init或/initrc程序,该程序解析并执行/etc/inittab配置文件,在此文件中配置了init进程在系统启动要启动哪些应用程序。
zhanghang@ubuntu:~/fl2440/linux/rootfs$ vim etc/inittab
# 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 == 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 to auto generate device nod and auto mount SD card and USB storage
::sysinit:/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
::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
#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, which used to start other application
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/killall klogd
null::shutdown:/bin/killall syslogd
null::shutdown:/bin/umount -a -r
6.2 创建/etc/fstab文件
Linux下的mount -a命令将自动挂载/etc/fstab文件中指定的所有需要系统自动挂载的文件。在/etc/inittab中会使用该命令在上电时自动挂载相应的文件系统,这里面主要是挂载一些伪文件系统,这些伪文件系统主要是导出Linux内核运行的相关信息,如比较重要的tmpfs、sysfs、proc文件系统等。
zhanghang@ubuntu:~/fl2440/linux/rootfs$ vim etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount pt> <type> <options> <dump> <pass>
/dev/root / ext2 rw,noauto 0 1
proc /proc proc defaults 0 0
usbfs /proc/bus/usb usbfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
ramfs /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
6.3 创建hostname文件
zhanghang@ubuntu:~/fl2440/linux/rootfs$ vim etc/hostname
LingYunFL2440
6.4 创建系统启动脚本
系统所有的启动脚本我们都将放在/etc/init.d路径下,接下来我们将创建这些系统启动脚本:
zhanghang@ubuntu:~/fl2440/linux/rootfs$ cd etc/init.d/
启动脚本一、 /etc/init.d/rcS
/etc/inittab脚本会使用命令/etc/init.d/rcS启动所有其它的应用程序,下面创建etc/rcS脚本,该脚本将执行/etc/init.d/下所有文件名以S开头且后面紧跟至少包括2个字符的文件。
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc/init.d$ vim rcS
#!/bin/sh
# Start all scripts in /etc/init.d, executing them in numerical order.
for i in /etc/init.d/S??* ; do
$i
done
给执行的权限
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc/init.d$ chmod a+x rcS
启动脚本二、 /etc/init.d/S10_network
假设我们希望系统启动时自动设置网卡的IP地址,则可以创建一个文件名以S开头且后面紧跟至少包括2个字符的启动脚本,并给执行权限
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc/init.d$ vim S10_network
#!/bin/sh
ifconfig eth0 192.168.2.168 netmask 255.255.255.0 up
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc/init.d$ chmod a+x S10_network
启动脚本三、 /etc/init.d/S99_rcsApp
今后我们很多应用程序将会存放在/apps分区下,有时我们希望这些应用程序的启动脚本也存放在该分区下以便于管理。这时我们可以参考rcS脚本的实现机制,让它也执行在/apps/etc下的所有启动脚本。
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc/init.d$ vim S99_rcsApp
#!/bin/sh
# Start all scripts in /apps/etc/init.d, executing them in numerical order.
for i in /apps/etc/init.d/S??* ; do
$i
done
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc/init.d$ chmod a+x S99_rcsApp
6.5 创建shell的配置文件
在Linux服务器上,我们可以通过修改/.bash_profile或/.bashrc文件来修改Shell的配置文件,如修改PATH、LD_LIBRARY_PATH环境变量等,也可以在里面定义命令别名。在嵌入式环境下,我们这些Shell的配置保存在/etc/profile文件中。这时我们可以创建该文件配置嵌入式环境busybox里的
shell(ash)。
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc/init.d$ cd ..
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc$ ls
fstab hostname init.d inittab
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc$ vim profile
# Busybox Shell(ash) configure file
export PATH=/bin:sbin:/usr/bin:/usr/sbin:/apps/bin:/apps/tools
export PS1='\w >: '
export USER=`id -un`
export LOGNAME=$USER
export HOSTNAME=`/bin/hostname`
export HISTSIZE=500
export HISTFILESIZE=500
export PAGER='/bin/more'
export EDITOR='/bin/vi'
export INPUTRC=/etc/inputrc
export LD_LIBRARY_PATH=/lib:/usr/lib:/apps/lib
export network_cfg_dir=/apps/etc/network
### Some alias command
alias vim='vi'
alias ll='ls -l'
alias l.='ls -d .*'
alias df='df -h'
6.6 创建Linux登录帐号文件
Linux系统中的登录帐号信息保存在/etc/group、/etc/passwd和/etc/shadow文件中。
/etc/group文件保存了用户组信息;
/etc/passwd文件保存了用户信息;
/etc/shadow文件保存来相应用户的密码;
下面我们需要在根文件系统中创建这些系统帐号文件,在这里我们只创建root帐号,其他帐号的过程类似。当然也可以在系统启动后以root帐号权限来添加。
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc$ vim group
root:x:0:root
该文件的格式为:
groupname:password:gid:members
第一个字段为用户组名称;
第二个字段为用户组密码,当为x时密码是映射到/etc/gshadow中的,是非逆的;
第三个字段为GID,及组号,为正整数或0,0被付于了root用户组;系统通常会预留一些较靠前的GID给系统虚拟用户之用,每个系统预留的GID都
不同,一般普通用户的GID从500开始;
第四个字段为用户列表,每个用户间用逗号分隔;
二、 /etc/passwd文件
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc$ vim passwd
root:x:0:0:root:/:/bin/sh
该文件的格式为:
username:password:uid:gid:fullname:homedir:shell
第一个字段为登录用户名
第二个字段为密码,这里设置为x表示密码被映射到/etc/shadow文件中
第三个字段为用户ID(UID)
第四个字段为用户所属组ID(GID)
第五个字段为用户名全称
第六个字段为用户根目录
第七个字段为用户所用shell的类型
Unix系统最初是用明文保存密码的,后来由于安全的考虑,采用crypt()算法加密密码并存在/etc/passwd文件。现在,由于计算机处理能力的提高,使密码破解变得越来越容易。/etc/passwd文件是所有合法用户都可访问的,大家都可互相看到密码的加密字符串,这给系统带来很大的安全威胁。现代的Unix系统使用影子密码系统,它把密码从/etc/passwd文件中分离出来,真正的密码保存在/etc/shadow文件中,shadow文件只能由超级用户访问。这样入侵者就不能获得加密密码串,用于破解。使用shadow密码文件后,/etc/passwd文件中所有帐户的password域的内容为"x",如果password域的内容为"*",则该帐号被停用。
三、 /etc/shadow文件
/etc/shadow文件保存了相应帐号的密文,这个文件内容不能直接创建。如果我们想在嵌入式Linux系统中设置root的登录密码为123456,则我们先在自己的Linux服务器或虚拟机上修改root密码为123456,然后再将Linux服务器或虚拟机上的/etc/shadow文件里root帐号的密码密文部分拷贝出来,创建根文件系统树里的etc/shadow时将密文部分用这个密文替换。这个过程做完后记得将自己的Linux服务器或虚拟机的root密码还原回去。
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc$ sudo passwd root//修改自己Linux主机上的root密码为 123456
[sudo] password for zhanghang:
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc$ sudo cat /etc/shadow | grep root//记录下来root帐号的加密密文信息
root:$6$HiB5umsh$tL1naygSF9ZALshVWBBJCt6Cr6gLIJWT4UVWZgSfT7NSvUigvMpV1G/Fxn2r7eZbTPkGiGv4pCYHqVfqsdH2b/:18014:0:99999:7:::
.../恢复自己Linux主机上的root密码...
现在我们创建根文件系统树下的/etc/shadow文件, 参考下文内容只将上面root帐号的加密密文部分( 6 6 6Gc****lUkrTw1)拷贝过来,其它部分保持不变:
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc$ vim shadow
root:$6$HiB5umsh$tL1naygSF9ZALshVWBBJCt6Cr6gLIJWT4UVWZgSfT7NSvUigvMpV1G/Fxn2r7eZbTPkGiGv4pCYHqVfqsdH2b/:18014:0:99999:7:::
该文件的格式为:
username:password:last_change:min_change:max_change:warm:failed_expire:expiration:reserved
第一字段:用户名(也被称为登录名),在/etc/shadow中,用户名和/etc/passwd 是相同的,这样就把passwd 和shadow中用的用户记录联系在
一起;这个字段是非空的;
第二字段:密码加密后的密文,这个字段是非空的;
第三字段:上次修改密码的时间;这个时间是从1970年01月01日算起到最近一次修改口令的时间间隔(天数);
第四字段:两次修改密码间隔最少的天数;如果这个字段的值为空,帐号永久可用;
第五字段:两次修改密码间隔最多的天数;如果这个字段的值为空,帐号永久可用;
第六字段:提前多少天警告用户密码将过期;如果这个字段的值为空,帐号永久可用;
第七字段:在密码过期之后多少天禁用此用户;如果这个字段的值为空,帐号永久可用;
第八字段:用户过期日期;此字段指定了用户作废的天数(从1970年的1月1日开始的天数),如果这个字段的值为空,帐号永久可用;
第九字段:保留字段,目前为空,以备将来发展之用;
6.6 创建Linux其他文件
一、 /etc/resolv.conf文件
该文件用来设置Linux系统的DNS服务器,DNS服务器用来将域名转换成IP地址。
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc$ vim resolv.conf
nameserver 114.114.114.114
nameserver 4.2.2.2
二、 /etc/hosts文件
/etc/hosts文件存放本机静态绑定的域名,如下面在本机上域名localhost就会被解析成127.0.0.1,不需要DNS来做解析。
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc$ vim hosts
127.0.0.1 localhost
三、 /etc/TZ文件
/etc/TZ文件配置了系统的时区
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc$ vim TZ
MST7MDT
四、 /etc/issue文件
/etc/issue文件里存放在console上登录系统时提示的警告信息
zhanghang@ubuntu:~/fl2440/linux/rootfs/etc$ vim issue
Default Logon Username: root Password: 123456
zhanghang@ubuntu:~/fl2440/linux$ du -sh rootfs
12M rootfs
至此Linux根文件系统树所需要的基本文件都已经有了,接下来我们可以使用Linux内核启动这个根文件系统。
后面会讲到根文件系统的不同制作。。。