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 [email protected] 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