linux  目录结构介绍

[root@station221 ~]# ls /
bin   etc   lost+found  mnt    opt   sbin     srv       tmp
boot  home  media       net    proc  selinux  sys       usr
dev   lib   misc        notes  root  share    tftpboot  var

/bin     存放的是系统可执行的二进制文件,简单理解为命令
/sbin  系统管理员可执行的二进制文件
/etc  存放的是配置文件
lost+found  分区下才会有这个目录,存放系统出错时遗失的碎片文件
/mnt   默认的挂载目录(mount)
/media   默认挂载media的目录
/misc  默认挂载目录
/opt  扩展软件包
/tmp     存放临时文件的目录
/boot    存放引导镜象的目录
  initrd-2.6.18-164.el5.img     vmlinuz-2.6.18-164.el5
/home   用户家目录
  管理员的家目录为/root
/proc  虚拟目录(伪文件系统) ,它记录的是当前系统的各种动态信息和状态
/selinux    高级安全管理
 vim /etc/selinux/config
  SELINUX=disabled
 保存后,需要重启系统才可以生效的
/usr   用户软件目录,用户装软件一般存放在此;类似根目录里普通用户的根
/dev      一切设备都是文件  device
 /dev/sda     scsi   SATA  U盘
 /dev/hda IDE
 /dev/cdrom     光盘
 /dev/fd0 软驱
 /dev/lp  打印机
 /dev/mouse 鼠标

# echo  > /dev/sda1  --可以当成文件来重定向,但这样会崩溃系统,可以使用虚拟机来尝试

/lib 系统使用的函数库目录,程序运行过程中,会调用一些这里的库文件
/var    主要存放执行过程中经常变化的文件,比如说:日志,邮件
 /var/lib  程序执行过程中,使用的数据文件放置的目录:比如:rpm包的数据库, 的locate查找的数据库等
 /var/log  系统日志和各种服务日志存放的目录
 /var/run  一般用来存放程序运行的pid
 /var/spool/mail 每个用户收邮件的目录


关于lib 库的小实验:

[root@li ~]# ldd /bin/ls  --查看ls调用哪些库文件
        linux-gate.so.1 =>  (0x00fca000)
        librt.so.1 => /lib/librt.so.1 (0x00685000)
        libacl.so.1 => /lib/libacl.so.1 (0x004b9000)
        libselinux.so.1 => /lib/libselinux.so.1 (0x00690000)
        libc.so.6 => /lib/libc.so.6 (0x004e0000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00657000)
        /lib/ld-linux.so.2 (0x004c2000)
        libattr.so.1 => /lib/libattr.so.1 (0x0049b000)
        libdl.so.2 => /lib/libdl.so.2 (0x00651000)
        libsepol.so.1 => /lib/libsepol.so.1 (0x00b78000)

[root@li ~]# mv /lib/libsepol.so.1 /lib/libsepol.so.1 .bak --修改这个库文件的名字


发现ls ,cp ,mv 等命令都不能用了

解决方法:
图形模式打开/lib目录,使用鼠标右键点重命名,把名字改回去就OK了

 

 

===================================

mount  挂载

在linux下,所有文件系统要能被访问都必须挂载(可以挂远程和本机另一个系统的)

 

文件系统:
 ext2  第二扩展文件系统
 ext3  第三扩展文件系统
 ext4  第四扩展文件系统


windows下有的比较常见的有   fat32  ntfs 

文件系统是用来管理和组织保存在磁盘上数据的系统软件。

innode  文件或目录的门牌号

文件的日期,大小,权限,位置等等这些信息,这些称做为元数据  (metadata)

ext2 

有下面几种情况:

1,当你保存文件之前,系统崩溃,这种情况下重启电脑,更新的内容丢失了,但原来的内容还在
2,当你保存文件之后,系统崩溃,这种情况下重启电脑,更新的内容也在
3,当你正在保存文件时,系统崩溃,内容半新半旧
4,最差的情况是正在写入元数据的时候,系统崩溃,有可能会丢失

重启电脑,系统会扫描这些信息,并会拿副本来恢复,fsck    时间很长


linux 他是一个异步的方式 pdflush
 sync 同步


[root@li ~]# ps -ef |grep pdflush
root      5775    11  0 10:41 ?        00:00:00 [pdflush]
root      5831    11  0 10:45 ?        00:00:00 [pdflush]
root      5855  4481  0 10:47 pts/2    00:00:00 grep pdflush

 

ext3   在ext2 上加了一个日志的功能

    日志相当于是记录你的操作的一个功能,相当于数据库的redo日志


/dev/sda11            950M   18M  885M   2% /mnt
--空分区被挂载,也会被使用一定空间,就是用来存放日志或分区有关的信息


ext3文件系统的三种日志模式:
journal    --最安全,保证所有的都被记录日志,但是速度最慢
ordered  --折中的模式,也是默认的模式  
writeback  --速度最快,但只基本保证元数据被记录 


裸设备:--没有文件系统,更快;只能从逻辑层上(如:oracle数据库软件把数据存放在一个裸设备上,从系统层面不能查看数据,但可以通过登录oracle数据库,用数据库语言来查询)


[root@li ~]# mount -o data=journal /dev/sda11 /mnt/

[root@li ~]# dd if=/dev/zero of=/mnt/1.img bs=1M count=900
900+0 records in
900+0 records out
943718400 bytes (944 MB) copied, 25.9926 seconds, 36.3 MB/s    --最慢


[root@li ~]# mount -o data=ordered /dev/sda11 /mnt/

[root@li ~]# dd if=/dev/zero of=/mnt/1.img bs=1M count=900
900+0 records in
900+0 records out
943718400 bytes (944 MB) copied, 2.02364 seconds, 466 MB/s


[root@li ~]# dd if=/dev/zero of=/mnt/1.img bs=1M count=900

 

[root@li ~]# mount -o data=writeback /dev/sda11 /mnt/

[root@li ~]# dd if=/dev/zero of=/mnt/1.img bs=1M count=900
900+0 records in
900+0 records out
943718400 bytes (944 MB) copied, 1.40828 seconds, 670 MB/s --最快

 

平滑地从ext2升级到ext3文件系统
tune2fs -j /dev/sda1

 
reiserfs  性能最好,特别是对于处理大量小文件的情况  suse
xfs   SGI公司
jfs   IBM公司开发的       


nfs
gfs
ocfs 共享式集群文件系统

 

==========================================

tty 与  pts

tty  文本模式下的终端
pts  图形下的终端

# echo "hello" > /dev/pts/2

# echo "hello haha" > /dev/tty1


==============================================

用户管理

操作系统的分类:
 单用户单任务操作系统: DOS
 单用户多任务操作系统: windows 95  windows 98  windows 2000
 多用户多任务操作系统: windows 2003 server windows 2008 server
     linux unix


基于多用户的基础上,引出的用户的分类:
  管理员    root    uid=0
  系统帐号   uid 1-499   65534 --不用于登录,用于跑守护进程,服务进程,便于权限控制的
  普通用户帐号 uid  500-65535(2.6.xxx的内核支持的uid数量为 2^32-1个) 

[root@li ~]# echo $[2**32-1]
4294967295


[root@li ~]# id --查看当前登录用户的相关信息
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

[root@li ~]# id apache
uid=48(apache) gid=48(apache) groups=48(apache)


/etc/passwd --用户
/etc/shadow --用户密码和使用限制规则
/etc/group --组
/etc/gshadow --组密码

 

--vim /etc/passwd
root:x:0:0:root:/root:/bin/bash
第一列: 用户名
第二列:密码   老版本这里放的就是密码,为了安全性考虑,密码放到了/etc/shadow的第二列
  x代表/etc/shadow的第二列生效,去掉x就表示此用户登录的时候没有密码
第三列:uid     用户识别ID值,系统是通过这个值来确认是哪个用户
第四列:gid 组识别ID值
第五列:描述项 comment
第六列:家目录 
第七个:bash   当前用户使用的bash


/bin/bash --可以登录(注意不同的shell类型会有少许的区别)
/bin/false --不能登录,不能登录一些服务如FTP,可以收邮件,只能用来跑守护进程 
/bin/nologin --不能登录系统,但可以登录一些服务如FTP,也可以收邮件等


--vim /etc/shadow
root:$1$.1RfCu/n$ModWntxLJRC6SpgAXSDO81:14694:0:99999:7:::
与/etc/passwd相对应 (但这里有九列)
第一列: 用户名
第二列:密码   (这里以*号开头或!开头默认是不能登陆的,但可以用su 命令切换)
第三列:上一次修改密码的时间      linux以1970年1月1日到现在的天数来算的
第四列:修改密码后几天内不允许再修改 如果这里为5,那改过密码后5天内不能再修改 0代表不限制
第五列:多少天内必须要求你改 99999代表不限制
第六列:过期前几天给你一个告警信息
第七列:密码过期后还给的一个宽限天数 
第8列: 这里可以写一个过期天数    这里也是以1970年1月1日到现在的天数来计算的,多用于收费系统
第九列: 保留,留着以后功能扩展


===========================================================

手动去加密码
[root@li ~]# grub-md5-crypt  --使用此命令产生加密字符串 
Password:
Retype password:
$1$rVSI30$YG2geS.fjSU4mHiS5P4vW/
[root@li ~]# grub-md5-crypt  --两次密码都为123,但产生的字符串不一样,这是正常的
Password:
Retype password:
$1$3YSI30$ZyGCzWM2IEmnIW4q4p1uS/

[root@li ~]# vim /etc/shadow --然后加到/etc/shadow
[root@li ~]# su - a --root切换普通用户,不用密码
[a@li ~]$ su - b --普通切换普通,要密码
Password:   --输入123
[b@li ~]$   --登陆成功

=================================================


计算现在离1970年1月1号的天数
[root@li ~]# echo $[`date +%s`/86400]
15154

=====================================================


用户相关的命令
useradd
usermod
userdel   --建议加一个-r参数,删除用户的同时删除相关目录
passwd

 

[root@li ~]# userdel a --删除时没有加-r参数
[root@li ~]# useradd a   --再建立一个a用户会报错
Creating mailbox file: File exists
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
[root@li ~]# id a --现在的a用户id 为505
uid=505(a) gid=505(a) groups=505(a)
[root@li ~]# ll /home/
total 24
drwx------ 4   501   501 4096 Jun 29 13:42 a  --原来的a用户id为501

[root@li ~]# userdel -r a --这次加-r参数,也删除不了,因为它不属于id 505的这个a用户
userdel: /var/spool/mail/a not owned by a, not removing
userdel: /home/a not owned by a, not removing

解决方法:
[root@li ~]# rm /home/a -rf
[root@li ~]# rm /var/mail/a -rf

 

使用passwd改密码,普通用户只能改自己,并且只能改成复杂的密码(最少8位,要字母,数字,符号组合)
 root用户可以改所有人,并且可以改成很简单的密码


finger user1  --查看用户信息
chfn  user1  --修改用户信息
chsh user1  --修改用户登录shell类型

[root@li ~]# chfn a
Changing finger information for a.
Name []: 张三
Office []: 尚观
Office Phone []: 8888
Home Phone []: 9999

Finger information changed.


--重启下面两个服务,就可以自己对本机发送邮件了
# /etc/init.d/sendmail restart
# /etc/init.d/dovecot restart

[root@li ~]# mail a --给本机a用户发邮件
Subject: 你好 a   --主题
haha
hehe    --内容
.   --点表示结束
Cc:    --抄送这里没有写,直接回车结束

[root@li ~]# finger a
Login: a                                Name: 张三
Directory: /home/a                      Shell: /bin/bash
Office: 尚观, x8888                     Home Phone: x9999
Never logged in.
New mail received Wed Jun 29 14:42 2011 (CST) --可以看到邮件
     Unread since Wed Jun 29 14:40 2011 (CST) --并且告诉了从什么时间开始的邮件没有读
No Plan.

[root@li ~]# su - a --切换到a用户
[a@li ~]$ mail  --使用此命令查看本用户收到的邮件
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/a": 1 message 1 new
>N  1 root@li.cluster.com   Wed Jun 29 14:42  17/586 
& 1  --1表示读取编号为1的邮件

 

================================


[root@localhost ~]# su - user1  --完全切换,切换后就是相当于使用user1用户登录
[user1@localhost ~]$ echo $PATH
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/user1/bin


[root@localhost ~]# su user1  --非完全切换,切换后还带有上一个用户的属性
[user1@localhost root]$ echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin

--root用户切换普通用户不需要密码, 但是普通用户切换别的用户都需要密码


===============================================
先下载auto_config_yum.sh脚本到你的桌面

[root@li ~]# sh /root/Desktop/auto_config_yum.sh  --执行脚本
[root@li ~]# yum install vnc -y --安装vnc包

[root@li ~]# vncviewer 2.2.2.35:0  --密码为111111


=============================================


组管理 

vim /etc/group
bin:x:1:root,bin,daemon

第一列:组名
第二列:与/etc/passwd第二列一样
第三列:gid
第四列:哪些用户属于这个组

vim /etc/gshadow
bin:::root,bin,daemon


groupadd 
groupdel 
groupmod
gpasswd


gid 和 groups的区别:

gid是建立文件和目录时的属组属性
groups是表示此用户在访问时拥有它们的组权限


[root@localhost ~]# groupadd uplooking
[root@localhost ~]# useradd -G uplooking up1
[root@localhost ~]# useradd -G uplooking up2
[root@localhost ~]# useradd -G uplooking up3
[root@localhost ~]# id up1
uid=503(up1) gid=504(up1) groups=504(up1),503(uplooking)
[root@localhost ~]# id up2
uid=504(up2) gid=505(up2) groups=505(up2),503(uplooking)
[root@localhost ~]# id up3
uid=505(up3) gid=506(up3) groups=506(up3),503(uplooking)

[root@localhost ~]# useradd -g uplooking up4
[root@localhost ~]# useradd -g uplooking up5
[root@localhost ~]# useradd -g uplooking up6
[root@localhost ~]# id up4
uid=506(up4) gid=503(uplooking) groups=503(uplooking)
[root@localhost ~]# id up5
uid=507(up5) gid=503(uplooking) groups=503(uplooking)
[root@localhost ~]# id up6
uid=508(up6) gid=503(uplooking) groups=503(uplooking)


[root@localhost ~]# su - up1
[up1@localhost ~]$ touch test
[up1@localhost ~]$ ll
total 0
-rw-rw-r-- 1 up1 up1 0 Mar  7 13:43 test


[root@localhost ~]# su - up4
[up4@localhost ~]$ touch test
[up4@localhost ~]$ ll
total 0
-rw-r--r-- 1 up4 uplooking 0 Mar  7 13:43 test


--总结:也就是说gid为哪个组,那么它默认创建的文件或目录的属组为gid的那个组


==========================================================


关于初始组和有效组的讨论

[root@localhost ~]# usermod -g uplooking -G up1 up1 --把up1的gid改为uplooking,同时还要属于up1组
[root@localhost ~]# id up1
uid=503(up1) gid=503(uplooking) groups=503(uplooking),504(up1)


[root@localhost ~]# su - up1
[up1@localhost ~]$ groups
uplooking up1  --前一个组为有效组,就是gid的组,表示创建的文件的属组为uplooking


[up1@localhost ~]$ newgrp up1  --把有效组切换为up1,也可以说成是组登录
[up1@localhost ~]$ groups
up1 uplooking --虽然gid仍然为uplooking,但是有效组切换为up1了,那么创建的文件属组为up1


--总结:上面可以看到gid只是默认的有效组,如果有效组进行了切换,则创建的文件或目录的属组为有效组的那个组


=============================


[root@localhost ~]# gpasswd up2  --组up2组加一个组密码
Changing the password for group up2
New Password:
Re-enter new password:


[root@localhost ~]# su - up1
[up1@localhost ~]$ groups
uplooking up1
[up1@localhost ~]$ newgrp up2 --登录一个不属于的组需要组密码。属于那个组的话就不需要组密码
Password:
[up1@localhost ~]$ groups
up2 uplooking up1 --再创建的文件或目录的属组就为up2了

 

=======================================
pwconv 同步/etc/passwd和/etc/shadow
grpconv 
=======================================

[root@li ~]# vim /etc/login.defs  --useradd创建用户时默认读取的文件

======================================


/etc/shadow 误删除了  使用pwconv同步,再修改一下密码

/etc/passwd  误删了  ,自己写一个,或者拷别的机器,先把root写上去,进入系统再慢慢处理别的用户


    
===============================

 

环境变量

env --查看环境变量
set --除环境变量还可以查看自定义变量


用户的环境变量设定文件,存放在每个用户的家目录下
.bash_history --用户的历史命令存放的地方  用history命令可以查看,它不记录当前会话所操作的命令,当你登陆时,它会记录上一次会话所操作的命令
.bash_logout --用户登出后执行的 可以在这里加上清除.bash_history的命令,在用户登出时清掉之前的操作
.bashrc  --别名设定的文件
.bash_profile --用户的环境变量设定的地方 


/etc/profile
/etc/bashrc
这两个文件是全局环境变量的配置文件,里面的配置是对所有用户生效的

 

 

例1:用户登出时清掉所有的操作记录
在用户家目录下的.bash_logout里加histroy -c (而不要使用rm -rf .bash_history)

 

例2,别名的增加
vim /root/.bashrc
加上下面一句
alias mount2='mount 2.2.2.35:/share/soft /mnt'

保存退出后 使用source /root/.bashrc使它生效

 

例3.实现user1用户可以使用/sbin/下的所有命令

su - a
[a@li ~]$ vim ~/.bash_profile

PATH=$PATH:$HOME/bin:/sbin --这里多加一个/sbin的目录

export PATH


[a@li ~]$ source ~/.bash_profile --./或者source使它生效


[a@li ~]$ ifconfig  --可以查看

[a@li ~]$ init 0
init: must be superuser.
[a@li ~]$ shutdown
shutdown: you must be root to do that!
[a@li ~]$ ifconfig eth0 10.1.1.36 netmask 255.255.255.0
SIOCSIFADDR: Permission denied
SIOCSIFFLAGS: Permission denied
SIOCSIFNETMASK: Permission denied
SIOCSIFBROADCAST: Permission denied

--但是上面的一些操作都是不可以的,它们都由内部被权限控制了
--那么如何可以让普通用户能关机呢?  就要用到讲权限时用到的特殊权限位 S位

 

date 命令
[root@li ~]# date +%Y-%m-%d
2011-04-15
[root@li ~]# date +%Y/%m/%d
2011/04/15
[root@li ~]# date '+%Y/%m/%d %H:%M:%S'
2011/04/15 16:08:05
[root@li ~]# date '+%Y-%m-%d %H:%M:%S'
2011-04-15 16:08:11


[root@li ~]# date -s 20120101 --修改时间
Sun Jan  1 00:00:00 CST 2012

[root@li ~]# date -s '20110629 16:36:40'  --改的时候加入时分秒,中间有空格需要使用引号


练习:  使用date命令显示昨天的日期,三天前,五天后的日期,2012年0点与1970年0点之间的秒数(man date)

# date -d yesterday
# date -d "-1 days"
# date -d "3 days ago"
# date -d "3 yesterday"

# date -d "5 tomorrow"
# date -d "+5 days"

# date +%s -d '20120101'

 

1.系统自动把任何登录系统的用户信息给保存到/tmp/login文件里
要求格式为: 用户名 2011-06-29 16:40:11
提示:先做下面两步:
touch /tmp/login
chmod 777 /tmp/login --这是把此文件的权限改为所有的用户可写
用户名如何显示?   有一个显示当前登录用户的环境变量 (env去查找)

vim /etc/profile  --在此文件最后一行加上下面一句话

echo "$USER `date +'%Y-%m-%d %H:%M:%S'`" >> /tmp/login

 

 
2.实现每天root用户登录后,自动密码的修改
比如说今天登录后,
root的密码就自动被修改为uplooking20110629(后面的数字为登录当天的时间) 
 --提示man passwd 去查找 --stdin
 # echo uplooking | passwd --stdin root > /dev/null

# vim /root/.bash_profile  --在最后加上下面一句

echo "uplooking`date +%Y%m%d`" | passwd --stdin root >
 /dev/null

# source /root/.bash_profile


3,实现每天关机退出root用户登录之前,自动把2.2.2.35上的笔记同步到自己机器上的/notes目录下

# vim /root/.bash_logout

rsync -a 2.2.2.35::notes /notes


4。建立三个用户
a,b,c 
建两个组group1,group2,组密码都为123

要求: 
 1.a用户创建的文件的默认属组为group2,同时它属于group1组
 2.不存在a,b这两个组,但存在c组,不存在group1,group2这两个用户
 3.b用户gid为group1,不属于其它组
 4.c用户gid为c,还同时属于group1,group2
 5.b用户在自己的家目录下创建一个test文件,要求test文件属于group2组


[root@li ~]# groupadd group1
[root@li ~]# groupadd group2
[root@li ~]# gpasswd group1
[root@li ~]# gpasswd group2

[root@li ~]# useradd -g group2 -G group1 a
[root@li ~]# id a
uid=512(a) gid=511(group2) groups=511(group2),510(group1)
[root@li ~]# useradd -g group1 b
[root@li ~]# id b
uid=513(b) gid=510(group1) groups=510(group1)

[root@li ~]# useradd -G group1,group2 c
[root@li ~]# id c
uid=514(c) gid=514(c) groups=514(c),510(group1),511(group2)


[root@li ~]# su - b
[b@li ~]$ pwd
/home/b
[b@li ~]$ groups
group1
[b@li ~]$ newgrp group2
Password:
[b@li ~]$ touch test
[b@li ~]$ ll
total 0
-rw-r--r-- 1 b group2 0 Apr 15 15:07 test