建立最小linux系统【续】
书接上文,上一篇我们分析了rcS和ifconfig-eth0文件,接下来我们继续讲下去
passwd文件
之后在init.d的上一级目录etc下建立passwd文件,内容如下
root::0:0:root:/:/bin/sh
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:* :99:99:Nobody:/:
分析:
**/etc/passwd
**文件是Unix和类Unix系统中存储用户账户信息的文本文件,它包含了每个用户的基本信息,每一行对应一个用户账户。
每行记录包含了一系列由冒号分隔的字段,一般的格式是
用户名:密码字段:UID:GID:用户信息:家目录:shell
以第一行为例:
root::0:0:root:/:/bin/sh
:
root
:这是用户的用户名,代表系统管理员账户,拥有系统上的最高权限。
0
:这是用户的用户ID(UID),在Unix系统中,0
通常是分配给 root 用户的。
0
:这是用户的主组ID(GID),也就是用户所属的主要组的ID,通常也是0,即 root 组。
root
:这是用户的注释,通常是用户的真实姓名或其他描述信息。
/
:这是用户的家目录,即登录后默认所在的目录。对于 root 用户来说,一般是根目录。 /bin/sh
:这是用户的默认shell,即登录后使用的命令行解释器,这里是 Bourne shell。
【注释:UID 是用来唯一标识系统中的每个用户的数字,每个用户都有一个唯一的UID。通常情况下,0号UID被分配给超级用户(如root),其他用户的UID则依次增加。
GID 是用来唯一标识系统中的每个组的数字。每个组都有一个唯一的GID。用户可以属于一个或多个组,但每个用户都有一个主组,其GID通常与用户的UID对应的GID相同。与UID类似,0号GID通常被分配给超级用户组
家目录是用户登录后的默认工作目录,每个用户都有一个独立的家目录,用于存储其个人文件、配置文件和其他相关数据。家目录对于每个用户都是私有的,只有相应的用户及超级用户(root)才有权限对该目录进行读写操作。通常,用户可以在家目录中创建子目录来组织文件,并且在登录时会自动进入到自己的家目录。】
之后修改passwd的权限
建立profile 文件
然后使用命令"vim profile"在etc 目录建立profile 文件(用于设置环境变量,提供了一个用户登录会话的初始环境配置,以确保用户可以在命令行界面中方便地进行工作和操作)
# Ash profile
# vim: syntax=sh
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
USER="`id -un`"
LOGNAME=$USER
PS1='[$USER@$HOSTNAME]#'
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
前几行是注释,接下来我来解释一下
"ulimit -S -c 0 > /dev/null 2>&1":
ulimit 是一个用于管理进程资源限制的实用工具,它可以帮助用户调整和控制系统资源的使用。 '-S'表示设置软限制;
'-c 0':这是指定核心文件大小的软限制为0,-c
表示核心文件大小的软限制,后面的 0
表示这个软限制的值为0
> /dev/null
:这是将命令的标准输出重定向到 /dev/null
,/dev/null
是一个特殊的设备文件,写入到它的内容会被丢弃,相当于把命令的输出扔掉,不显示在终端上
**>&
**表示将一个文件描述符的输出重定向到另一个文件描述符
【注释:软限制指的是系统中对资源的软性限制,它是可以被用户进程修改的,但不能超过硬限制(硬限制可以通过ulimit -H
命令来查看),如果软限制设置为0,表示禁止生成核心转储文件。
核心文件大小的软限制是操作系统针对进程生成核心转储文件(core dump)时设定的最大大小限制。核心转储文件是在进程遇到严重错误(比如段错误)时生成的一个包含了进程当前内存映像的文件,它可以用于调试和分析程序崩溃的原因
文件描述符是一个用于标识和操作输入/输出资源的整数值,下面有几种常见的文件描述符:
标准输入(stdin):文件描述符为 0,用于接收程序的输入数据。
标准输出(stdout):文件描述符为 1,用于输出程序的正常执行结果。
标准错误(stderr):文件描述符为 2,用于输出程序的错误消息。】
USER="`id -un`",**id -un
**这个命令用于显示当前用户的用户名。
$
通常表示一个变量或者环境变量的引用,当你在 shell 中输入 $
后跟一个变量名时,shell 将会用该变量的值替换 $
后面的内容,所以**LOGNAME=$USER可以
** 将变量 LOGNAME
的值设置为**$USER
**,即当前用户的用户名
PS1='[USER@HOSTNAME]#':设置命令提示符(Prompt String),在这个设置中,命令提示符显示当前用户名和主机名,形式为 [用户名@主机名]#
PATH=$PATH:保持 PATH
环境变量的内容不变。
HOSTNAME=`/bin/hostname`:用**bin/hostname
** 命令获取当前主机的主机名,并将其赋值给变量 HOSTNAME
使用 export
命令将 USER
、LOGNAME
、PS1
和 PATH
这些变量导出到当前Shell的环境中
建立netd 文件
接下来使用"mkdir rc.d"命令在etc 目录建立文件夹rc.d,在rc.d 目录下使用命令"mkdir init.d"建立
init.d 文件夹,接着在init.d 文件夹,使用"vim netd"命令建立netd 文件
【注释:rc.d
文件夹是用于存放系统启动或服务管理相关的脚本或配置文件的目录。init.d
文件夹通常用于存放系统初始化脚本,这些脚本在系统启动时会被执行。netd
是一个服务脚本的文件名,用于启动或管理网络相关的服务】
#!/bin/sh
base=inetd
#See how we were called.
case "$1" in
start)
/usr/sbin/$base
;;
stop)
pid=`/bin/pidof $base`
if [-n "$pid" ]; then
kil1 -9 $pid
fi
;;
esac
exit0
以#!
开头的语法是Shebang(也称为哈希井号、井号、pound、sharp等),后面跟着路径可以告诉操作系统使用指定的解释器来执行脚本文件。"**#!/bin/sh"的意思是
**来指定使用Bourne shell来解释执行该脚本。
case "$1" in :是一个 case 语句,用于根据传递给脚本的参数 $1
的值执行不同的操作。如果 $1
的值是 start,
启动一个名为 $base
的服务。如果 $1
的值是 stop,
则使用 pidof
命令找到正在运行的服务的进程ID,并将其存储在 pid
变量中。
之后有一个条件语句,检查pid变量是否为空,如果非空,则使用 kill
命令发送信号 9 给服务的进程,以终止该进程。
【注释:
pidof
命令用于根据进程名查找进程ID
在shell脚本里面,假如base=hhhhh,那么$base就是hhhhh,是它特定的语法
】
【未完待续】