@图形界面与命令行界面切换
Linux预设提供了六个命令窗口终端机让我们来登录。默认我们登录的就是第一个窗口,也就是tty1,这个六个窗口分别为tty1,tty2 … tty6,你可以按下Ctrl + Alt + F1 ~ F6 来切换它们。如果你安装了图形界面,默认情况下是进入图形界面的,此时你就可以按Ctrl + Alt + F1 ~ F6来进入其中一个命令窗口界面。当你进入命令窗口界面后再返回图形界面只要按下Ctrl + Alt + F7 就回来了。如果你用的vmware 虚拟机,命令窗口切换的快捷键为 Alt + Space + F1~F6. 如果你在图形界面下请按Alt + Shift + Ctrl + F1~F6 切换至命令窗口。
@学会使用快捷键
- Ctrl + C:这个是用来终止当前命令的快捷键,当然你也可以输入一大串字符,不想让它运行直接Ctrl + C,光标就会跳入下一行。
- Tab: 这个键是最有用的键了,也是阿铭敲击概率最高的一个键。因为当你打一个命令打一半时,它会帮你补全的。不光是命令,当你打一个目录时,同样可以补全,不信你试试。
- Ctrl + D: 退出当前终端,同样你也可以输入exit。
- Ctrl + Z: 暂停当前进程,比如你正运行一个命令,突然觉得有点问题想暂停一下,就可以使用这个快捷键。暂停后,可以使用fg 恢复它。
- Ctrl + L: 清屏,使光标移动到第一行。
@linux系统目录结构
- /bin bin是Binary的缩写。这个目录存放着最经常使用的命令。
- /boot这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。
- /dev dev是Device(设备)的缩写。该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。
- /etc这个目录用来存放所有的系统管理所需要的配置文件和子目录。
- /home用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
- /lib这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
- /lost+found这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
- /media Linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux会把识别的设备挂载到这个目录下。
- /mnt系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。
- /opt 这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。
- /proc这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
- /root该目录为系统管理员,也称作超级权限者的用户主目录。
- /sbin s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
- /selinux 这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。
- /srv 该目录存放一些服务启动之后需要提取的数据。
- /sys 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs ,sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统种被创建。
- /tmp这个目录是用来存放一些临时文件的。
- /usr 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与windows下的program files目录。
- /usr/bin 系统用户使用的应用程序。
- /usr/sbin 超级用户使用的比较高级的管理程序和系统守护程序。
- /usr/src 内核源代码默认的放置目录。
- /var这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
在Linux系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。/etc: 上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在/bin/ 目录下的。值得提出的是,/bin, /usr/bin 是给系统用户使用的指令(除root外的通用账户),而/sbin, /usr/sbin 则是给root使用的指令。 /var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在/var/log 目录下,另外mail的预设放置也是在这里。
@如何和正确的关机、重启
其实,在Linux领域内大多用在服务器上,很少遇到关机的操作。毕竟服务器上跑一个服务是永无止境的,除非特殊情况下,不得已才会关机。
Linux和windows不同,在 Linux 底下,由于每个程序(或者说是服务)都是在在背景下执行的,因此,在你看不到的屏幕背后其实可能有相当多人同时在你的主机上面工作,例如浏览网页啦、传送信件啦以 FTP 传送档案啦等等的,如果你直接按下电源开关来关机时,则其它人的数据可能就此中断!那可就伤脑筋了!此外,最大的问题是,若不正常关机,则可能造成文件系统的毁损(因为来不及将数据回写到档案中,所以有些服务的档案会有问题!)。
如果你要关机,必须要保证当前系统中没有其他用户在线。可以下达 who 这个指令,而如果要看网络的联机状态,可以下达 netstat -a 这个指令,而要看背景执行的程序可以执行 ps -aux 这个指令。使用这些指令可以让你稍微了解主机目前的使用状态!(这些命令在以后的章节中会提及,现在只要了解即可!)
- sync 将数据由内存同步到硬盘中。
- shutdown 关机指令,你可以man shutdown 来看一下帮助文档。例如你可以运行如下命令关机:
- shutdown -h 10 ‘ 这个命令告诉大家,计算机将在10分钟后关机,并且会显示在登陆用户的当前屏幕中。
- shutdown -h now 立马关机
- shutdown -h 20:25 系统会在今天20:25关机
- shutdown -h +10 十分钟后关机
- shutdown -r now 系统立马重启
- shutdown -r +10 系统十分钟后重启
- reboot 就是重启,等同于 shutdown -r now
- halt 关闭系统,等同于shutdown -h now 和 poweroff
最后总结一下,不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中。关机的命令有 shutdown -h now, halt, poweroff 和 init 0 , 重启系统的命令有 shutdown -r now, reboot, init 6.
@忘记root密码
- 重启系统
3秒钟内,按一下回车键。此时你会看到如下提示信息:
GNU GRUB version 0.97 .......
CentOS (2.6.32-358.el6.i686)
阿铭没有写完全提示信息,相信你肯定能进入到这一界面。此时CentOS (2.6.32-358.el6.i686) 这一行是高亮的,即我们选中的就是这一行,这行的意思是Linux版本为CentOS,后面小括号内是内核版本信息。 另外在这个界面里,我们还可以获取一些信息,输入 ‘e’ 会在启动前编辑命令行; 输入 ‘a’ 会在启动前更改内核的一些参数; 输入 ‘c’ 则会进入命令行。而我们要做的是输入 ‘e’.
- 进入单用户模式
输入 ‘e’ 后,界面变了,显示如下信息:
root (hd0,0)
kernel /vmlinuxz-2.6.32-358.el6.i686 ro root=UUID=......(此处省略)
initrd /initramfs-2.6.32-358.el6.i686.img
暂时你不用管这些都代表什么意思,你只要跟着阿铭做即可。按一下向下的箭头键,选中第二行,输入 ‘e’,出现如下提示:
<_NO_DM rhgh quiet
你只需要在后面加一个 “single” 或者 “1” 或者 “s”
<_NO_DM rhgh quiet single
然后先按回车然后按 ‘b’,启动后就进入单用户模式。
- 修改root密码
输入修改root密码的命令 ‘passwd’:
[root@localhost /]# passwd
Changeing password for user root.
New password:
Retry new password:
passwd: all authentication tokens updated successfully.
修改后,重启系统
[root@localhost /]# reboot
@使用系统安装盘的救援模式
救援模式即rescue ,这个模式主要是应用于,系统无法进入的情况。如,grub损坏或者某一个配置文件修改出错。如何使用rescue模式呢?
- 光盘启动
阿铭做实验用的是vmware虚拟机,设置光盘启动的步骤也许和你的不一样,但道理是一样的,相信聪明的你一定不会在这里出问题。开机启动,按F2进入bios设置,按方向键选择 “Boot” 那一项,然后使用上下方向键和+/-号来移动,最终让CD-ROM Drive 挪动到最上面一行。最后按F10, 再按回车进入光盘启动界面。
- 进入rescue模式
光盘启动后,使用上下方向键选择 ‘Rescue installed system’ 回车
- 语言我们默认,直接回车
- 键盘类型,也默认,直接回车
- Rescue Method 也保持默认,因为我们使用的就是光驱里的光盘,回车
- 这一步问我吗是否在使用rescue模式的时候启用网络,这个根据实际情况,在这里阿铭选择NO(使用tab键) 回车
- 接下来这一步,提示我们Rescue 环境将会找到我们已经安装的Linux系统,并将其挂载到/mnt/sysimage 下,这一步阿铭将会选择 ‘Continue’ 然后回车
- 回车后,将会看到一个小提示框,它告诉我们Linux系统挂载到了 “/mnt/sysimage” . 如果想获得root 环境,需要执行命令 “chroot /mnt/sysimage” 继续回车
- 继续回车
- 此时又出现一个框,有三种模式可以选择:shell 模式会直接进入命令行,可以进行的操作有编辑文件、修改用户密码等; fakd 是诊断模式; reboot 会直接重启; 这一步阿铭选择第一个shell模式,然后回车
- 进入root环境
此时还不能操作Linux系统上的文件,因为目前还在光盘上的系统上,你有没有使用过windows PE系统?其实目前我们所在的环境就类似于windows上的PE系统。要想修改原来Linux系统上的文件还需要执行一个命令:
bash-4.1# chroot /mnt/sysimage
sh-4.1#
@Linux配置IP
- 自动获取IP
只有一种情况可以自动获取IP地址,那就是你的Linux所在的网络环境中有DHCP服务。[1] 总之,只要你的真机可以自动获取IP,那么安装在虚拟机的Linux同样也可以自动获取IP. 方法很简单,只需要运行一个命令。
[root@localhost ~]# dhclient
运行这条命令后,会出现一大堆信息,你不用关心是什么。然后运行 ‘ifconfig’ 命令查看IP是什么:
[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:D9:F0:52
inet addr:10.72.137.85 Bcast:10.72.137.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fed9:f052/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:27135 errors:0 dropped:0 overruns:0 frame:0
TX packets:53 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3488498 (3.3 MiB) TX bytes:7550 (7.3 KiB)
Interrupt:18 Base address:0x1080
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
通过这个命令可以查看系统有几块网卡和网卡的IP,阿铭的系统eth0的IP是 10.72.137.85. 如果你的Linux有多块网卡,那么在Linux中它会显示成eth1, eth2 依此类推。
- 手动配置IP
如果你的虚拟机不能自动获取IP,那么只能手动配置,配置方法为:
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
使用vi 命令打开 “/etc/sysconfig/network-scripts/ifcfg-eth0” 这个配置文件。关于命令 vi
阿铭会在后续章节详细介绍,暂时你只要了解这个命令是用来编辑文件的即可。输入上述命令后回车,打开了该配置文件。使用方向键的向下箭头让光标移动到最后面一行,然后按字母键 ‘o’,进入编辑模式,增加如下内容:
IPADDR=10.72.137.85
NETMASK=255.255.255.0
GATEWAY=10.72.137.1
请注意,由于阿铭不知道你的网络具体环境,所以也不晓得你应该配置什么样的IP,请不要直接照搬阿铭给出的例子,这样配置肯定是不行的,请配置成和你的真机(windows)在同一个网段的IP。关于netmask以及gateway的概念请自行在网上查询,这是关于网络技术的基础知识。另外还需要把光标移动到 “ONBOOT=no” 这一行,改为:
ONBOOT=yes
“BOOTPROTO=dhcp” 改为:
BOOTPROTO=none
之后按一下键盘左上角的 “ESC”键,然后输入 :wq
, 它会显示在屏幕的左下方,然后按回车,这样就保存该配置文件了。之后,需要重启一下网络服务:
[root@localhost ~]# service network restart
正在关闭接口 eth0: [确定]
关闭环回接口: [确定]
弹出环回接口: [确定]
弹出界面 eth0: [确定]
这样网络重启后,eth0 的IP就生效了。使用 “ifconfig eth0” 命令查看一下:
[root@localhost ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:D9:F0:52
inet addr:10.72.137.85 Bcast:10.72.137.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fed9:f052/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:27135 errors:0 dropped:0 overruns:0 frame:0
TX packets:53 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3488498 (3.3 MiB) TX bytes:7550 (7.3 KiB)
Interrupt:18 Base address:0x1080
接下来请检测一下你配置的IP是否可以ping通。阿铭使用的windows7系统,所以使用cmd打开命令窗口,进行检测。打开cmd的快捷键是 windows + r
.
C:\Users\Administrator>ping 10.72.137.85
正在 Ping 10.72.137.85 具有 32 字节的数据:
来自 10.72.137.85 的回复: 字节=32 时间=1ms TTL=64
来自 10.72.137.85 的回复: 字节=32 时间<1ms TTL=64
来自 10.72.137.85 的回复: 字节=32 时间<1ms TTL=64
来自 10.72.137.85 的回复: 字节=32 时间<1ms TTL=64
10.72.137.85 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 1ms,平均 = 0ms
- 利用vmware的NAT给Linux配置IP
这一部分内容,阿铭曾经在论坛里写过一个帖子 http://www.aminglinux.com/bbs/thread-626-1-1.html 如果你已经配置好IP且可以ping通,这一部分设置则不需要再做了,但有必要了解一下,也许有一天你会用到。这一部分配置适合这样的场景:你的办公网不能通过dhcp获得IP,或者你不想让你的Linux处在和办公网一个网段,而且也想让Linux上网。
- 设置虚拟机上的nat
Edit –> Virtual Network setting –> NAT –> Vmnet 8 Gateway IP address : 192.168.205.2 Netmask : 255.255.255.0 NAT service: Started –> 确定
- 修改虚拟机的网卡设置
双击虚拟机右下角的网卡小图标,鼠标移动过去后会显示 “Ethernet: ...” Device status 那两项都需要打对钩; Network connection 需要选择最后一项(Custom:Specific virtual network) 选择Vmnet8(NAT) 最后点ok
- 到你的电脑上 [2]
右击”网上邻居” –> 属性 –> 右击 “VMware Network Adapter VMnet8” –> 属性 –> 双击 “Internet 协议(TCP/IP)” –> 手动设置IP为 192.168.205.1 子网掩码为 255.255.255.0 网关 和 dns 都设置为 192.168.205.2 –> 确定 –> 确定
- 设置你虚拟机IP
在你的Linux上编辑eth0的配置文件
vi /etc/sysconfig/network-scripts/ifcfg-eth0
内容如下:DEVICE=eth0 BOOTPROTO=none HWADDR=00:0C:29:33:F7:3A ONBOOT=yes IPADDR=192.168.205.3 NETMASK=255.255.255.0 GATEWAY=192.168.205.2
- 设置DNS地址
运行命令
vi /etc/resolv.conf
内容如下:nameserver 192.168.205.2
- 重启网络服务
运行命令service network restart
@使用秘钥认证登录
SSH服务支持一种安全认证机制,即密钥认证。所谓的密钥认证,实际上是使用一对加密字符串,一个称为公钥(publickey), 任何人都可以看到其内容,用于加密;另一个称为密钥(privatekey),只有拥有者才能看到,用于解密。通过公钥加密过的密文使用密钥可以轻松解密,但根据公钥来猜测密钥却十分困难。 ssh的密钥认证就是使用了这一特性。服务器和客户端都各自拥有自己的公钥和密钥。如何使用密钥认证登录linux服务器呢?
- 下载生成密钥工具
在本章前面阿铭提供的putty下载地址里,你一定看到了很多可以下载的东西,不过阿铭只让你下载了一个putty.exe. 因为当时只用到这一个工具,其实完整的putty程序包含很多个小工具的,所以这次阿铭建议你直接下载个完整包 http://the.earth.li/~sgtatham/putty/latest/x86/putty.zip 下载后解压,其中puyttygen.exe就是咱们这一小节中所要用到的密钥生成工具。
- 生成密钥对
关于密钥的工作原理,如果你感兴趣可以到网上查一查,阿铭不想介绍太多无关知识点,不过,了解一下也没有什么不好。双击puttygen.exe, 右下角 “Number of bits in a generated key” 把 “1024” 改成 “2048”, 然后点 “Generate”, 这样就开始生成密钥了,请来回动一下鼠标,这样才可以快速生成密钥对,大约十几秒后就完成了。 “Key comment:” 这里可以保持不变也可以自定义,其实就是对该密钥的简单介绍; “Kye passphrase:” 这里用来给你的密钥设置密码,这样安全一些,当然也可以留空,阿铭建议你设置一个密码;”Confirm passphrase:” 这里再输入一遍刚刚你设置的密码。
- 保存私钥
点 “Save private key”, 选择一个存放路径,定义一个名字,点 “保存”。请保存到一个比较安全的地方,谨防丢掉或被别人看到。
- 复制公钥到Linux
回到刚才生成密钥的窗口,在 “Key” 的下方有一段长长的字符串,这一串就是公钥的内容了,把整个公钥字符串复制下来。然后粘贴到你的Linux的 /root/.ssh/authorized_keys
文件里。下面请跟着阿铭一起来做操作:
[root@localhost ~]# mkdir /root/.ssh
[root@localhost ~]# chmod 700 /root/.ssh
首先创建/root/.ssh 目录,因为这个目录默认是不存在的,然后是更改权限。 关于 mkdir
和 chmod
两个命令,阿铭会在后续章节详细介绍,暂时你只要知道是用来创建目录和更改权限的就行了。然后是把公钥内容粘贴进 /root/.ssh/authorized_keys 文件。
[root@localhost ~]# vi /root/.ssh/authorized_keys
回车后,按一下 ‘i’ 进入编辑模式,然后直接点击鼠标右键就粘贴了,这是putty工具非常方便的一个功能。粘贴后,按一下 ‘Esc’ 键,然后输入 :wq
回车保存退出该文件。
- 关闭Selinux
如果不关闭selinux, [3] 使用密钥登陆会提示 “Server refused our key”, 关闭方法:
[root@localhost ~]# setenforce 0
这个只是暂时命令行关闭selinux, 下次重启Linux后selinux还会开启。永久关闭selinux的方法是:
[root@localhost ~]# vi /etc/selinux/config
回车后,把光标移动到 “SELINUX=enforcing” 按一下 i
键,进入编辑模式,修改为
SELINUX=disabled
按 “Esc”, 输入 :wq
回车,然后重启系统
- 设置putty通过密钥登陆
打开putty.exe点一下你保存好的session,然后点右侧的 “Load”, 在左侧靠下面点一下 “SSH” 前面的 +
然后选择 “Auth”, 看右侧 “Private key file for authentication:” 下面的长条框里目前为空,点一下 “Browse”, 找到我们刚刚保存好的私钥,点”打开”。此时这个长条框里就有了私钥的地址,当然你也可以自行编辑这个路径。然后再回到左侧,点一下最上面的 “Session”, 在右侧再点一下 “Save”.
- 使用密钥验证登陆Linux
保存好后session, 点一下右下方的 “Open”. 出现登陆界面,你会发现和原来的登陆提示内容有所不同了。
login as: root
Authenticating with public key "rsa-key-20130509"
Passphrase for key "rsa-key-20130509":
Last login: Thu May 9 16:17:13 2013 from 10.72.137.43
[root@localhost ~]#
现在不再输入root密码,而是需要输入密钥的密码,如果你先前在生产密钥的时候没有设置密码,你输入root后会直接登陆系统。
@绝对路径与相对路径
在Linux中什么是一个文件的路径呢,说白了就是这个文件存在的地方,例如在上一章提到的/root/.ssh/authorized_keys
这就是一个文件的路径。如果你告诉系统这个文件的路径,那么系统就可以找到这个文件。在Linux的世界中,存在着绝对路径和相对路径。
绝对路径:路径的写法一定由根目录 ‘/’写起,例如 /usr/local/mysql
这就是绝对路径。
相对路径:路径的写法不是由根目录 ‘/’写起,例如,首先用户进入到/, 然后再进入到home ,命令为 cd/home
然后 cd test
此时用户所在的路径为 /home/test
第一个cd命令后跟 ‘/home’ 第二个cd命令后跟 ‘test’, 并没有斜杠,这个 ‘test’ 是相对于 ‘/home’ 目录来讲的,所以叫做相对路径。
命令:cd
这个命令是用来变更用户所在目录的,后面如果什么都不跟,就会直接到当前用户的根目录下,我们做实验用的是 ‘root’ 账户,所以运行 cd
后,会进入root账户的根目录 ‘/root’. 后面跟目录名,则会直接切换到指定目录下:
[root@localhost ~]# cd /tmp/
[root@localhost tmp]# pwd
/tmp
[root@localhost tmp]# cd
[root@localhost ~]# pwd
/root
pwd
这个命令打印出当前所在目录,cd
后面只能是目录名,而不能是文件名,如果跟了文件名会报错:
[root@localhost ~]# cd /etc/passwd
-bash: cd: /etc/passwd: 不是目录
./
表示当前目录,../
表示当前目录的上一级目录:
[root@localhost ~]# cd /usr/local/lib/
[root@localhost lib]# pwd
/usr/local/lib
[root@localhost lib]# cd ./
[root@localhost lib]# pwd
/usr/local/lib
[root@localhost lib]# cd ../
[root@localhost local]# pwd
/usr/local
上例中,首先进入到 /usr/local/lib/
目录下,然后再进入 ./
其实还是进入到当前目录下,用 pwd
查看当前目录,并没有发生变化,然后再进入 ../
则是进入到了 /usr/local/
目录下,即 /usr/local/lib
目录的上一级目录。
命令:mkdir
用来创建目录的,这个命令在上一章节中用到过。 ‘mkdir’ 其实就是make directory的缩写。其语法为 mkdir [-mp] [目录名称] ,其中-m, -p为其选项, ‘-m’ 这个选项用来指定要创建目录的权限,不常用,阿铭不做重点解释。 ‘-p’ 这个选项很管用,先来做个试验,你会一目了然的:
[root@localhost ~]# mkdir /tmp/test/123
mkdir: 无法创建目录 '/tmp/test/123': 没有那个文件或目录
[root@localhost ~]# mkdir -p /tmp/test/123
[root@localhost ~]# ls /tmp/test
123
当我们想创建 /tmp/test/123
目录,可是提示不能创建,原因是 /tmp/test
目录不存在,你会说,这个Linux怎么这样傻,/tmp/test
目录不存在就自动创建不就OK了嘛,的确Linux确实很傻,如果它发现要创建的目录的上一级目录不存在就会报错。然而Linux并不是那么傻,因为它也为我们想好了解决办法,即 ‘-p’ 选项,这个选项可以帮我们创建一大串级联目录,这个选项还有一个好处,那就是当你创建一个已经存在的目录时,不会报错:
[root@localhost ~]# ls -ld /tmp/test/123
drwxr-xr-x. 2 root root 4096 5月 9 19:10 /tmp/test/123
[root@localhost ~]# mkdir /tmp/test/123
mkdir: 无法创建目录 '/tmp/test/123': 文件已存在
[root@localhost ~]# mkdir -p /tmp/test/123
[root@localhost ~]# ls -ld /tmp/test/123
drwxr-xr-x. 2 root root 4096 5月 9 19:10 /tmp/test/123
在上一章节里,阿铭已经介绍过 ls
命令,但是并没有向你介绍它的 ‘-d’ 选项,这个选项是针对目录的,通常都是和 ‘-l’ 同时使用写成 ‘-ld’. 它可以查看指定目录的属性,比如在本例中,它可以查看 ‘/tmp/test/123’ 目录的创建时间。 mkdir -p
后面跟一个已经存在的目录名时,它不会做任何事情,只是不报错而已。
命令:rmdir
用来删除空目录,后面可以是一个也可以是多少,多个的话用空格分隔。该命令阿铭很少使用,因为它只能删除目录,不能删除文件,还有一个命令 rm
既可以删除目录又可以删除文件,阿铭用的比较多。rmdir 有一个和mkdir一样的选项 ‘-p’, 同样可以级联删除一大串目录,但是级联的目录中其中一个目录里还有目录或者文件时就不好用了。
[root@localhost ~]# ls /tmp/test
123
[root@localhost ~]# rmdir /tmp/test/
rmdir: 删除 '/tmp/test/' 失败: 目录非空
[root@localhost ~]# rmdir /tmp/test/123
[root@localhost ~]# ls /tmp/test
[root@localhost ~]#
所以,得出的结论是, ‘rmdir’ 只能删除空目录,即使加上 ‘-p’ 选项也只能删除一串的空目录,可见这个命令有很大的局限性,偶尔用下还可以。
命令:rm
这个命令是最常用的, ‘rm’ 同样也有很多选项。你可以通过 man rm
来获得详细帮助信息。在这里阿铭只介绍最常用的两个选项。
‘-r’ : 删除目录用的选项,等同于rmdir.
[root@localhost ~]# mkdir -p /tmp/test/123
[root@localhost ~]# rm -r /tmp/test/123
rm:是否删除目录 '/tmp/test/123'? y
但是和rmdir不同的是,使用 rm -r
删除目录时,会问一下是否删除,如果输入 ‘y’ 则会删除,输入 ‘n’ 则不删除。当然 rm -r
也不会向rmdir不能删除非空目录,它是可以删除非空目录的。
‘-f’ : 表示强制删除,不再提示是否要删除,而是直接就删除了,而后面跟一个不存在的文件或者目录时,也不会报错,如果不加 ‘-f’ 选项会报错。
[root@localhost ~]# rm /tmp/test/123/123
rm: 无法删除 '/tmp/test/123/123': 没有那个文件或目录
[root@localhost ~]# rm -f /tmp/test/123/123
要删除一个目录时,即使加上 ‘-f’ 选项也会报错,所以删除目录一定要加 ‘-r’ 选项。
[root@localhost ~]# rm -f /tmp/test/123
rm: 无法删除 '/tmp/test/123': 是一个目录
[root@localhost ~]# rm -rf /tmp/test/123
关于rm,阿铭使用最多便是 ‘-rf’ 两个选项合用了。不管删除文件还是目录都可以。但是方便的同时也要多注意,万一你的手太快后边跟了/那样就会把你的系统文件全部删除的,切记切记。
@环境变量PATH
在讲环境变量之前先介绍一个命令 which
, 它用来查找某个命令的绝对路径。
[root@localhost ~]# which rmdir
/bin/rmdir
[root@localhost ~]# which rm
alias rm='rm -i'
/bin/rm
[root@localhost ~]# which ls
alias ls='ls --color=auto'
/bin/ls
‘rm’ 和 ‘ls’ 是两个特殊的命令,使用 alias
命令做了别名。我们用的 ‘rm’ 实际上是 ‘rm -i’ 加上 ‘-i’ 选项后,删除文件或者命令时都会问一下是否确定要删除,这样做比较安全。 ‘alias’ 可以设置命令的别名也可以设置文件的别名,阿铭会在以后章节中详细介绍。 ‘which’ 这个命令阿铭平时只用来查询某个命令的绝对路径,不常使用。
上边提到了alias,也提到了绝对路径的/bin/rm ,然后你意识到没有,为什么我们输入很多命令时是直接打出了命令,而没有去使用这些命令的绝对路径?这是因为环境变量PATH在起作用了。请输入 echo $PATH,这里的echo其实就是打印的意思,而PATH前面的$表示后面接的是变量。
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
因为/bin 在PATH的设定中,所以自然就可以找到ls了。如果你将 ls 移动到 /root 底下的话,然后你自己本身也在 /root 底下,但是当你执行 ls 的时候,他就是不理你?怎么办?这是因为 PATH 没有 /root 这个目录,而你又将 ls 移动到 /root 底下了,自然系统就找不到可执行文件了,因此就会告诉你 ‘command not found!’
[root@localhost ~]# mv /bin/ls /root/
[root@localhost ~]# ls
-bash: /bin/ls: 没有那个文件或目录
‘mv’ 用来移动目录或者文件,还可以重命名,稍后讲解。
那么该怎么克服这种问题呢?有两个方法,一种方法是直接将 /root 的路径加入 $PATH 当中!如何增加?可以使用命令 PATH=$PATH:/root
:
[root@localhost ~]# PATH=$PATH:/root
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root
[root@localhost ~]# ls
anaconda-ks.cfg install.log install.log.syslog ls
另一种方法就是使用绝对路径:
[root@localhost ~]# /root/ls
anaconda-ks.cfg install.log install.log.syslog ls
命令: cp
copy的简写,即拷贝。格式为 cp [选项] [ 来源文件 ] [目的文件]
,例如我想把test1 拷贝成test2 ,这样即可 cp test1 test2,以下介绍几个常用的选项:
-r : 如果你要拷贝一个目录,必须要加-r选项,否则你是拷贝不了目录的, 和 ‘rm’ 类似。
[root@localhost ~]# mkdir 123
[root@localhost ~]# cp 123 456
cp: 略过目录'123'
[root@localhost ~]# cp -r 123 456
[root@localhost ~]# ls -l
总用量 44
drwxr-xr-x. 2 root root 4096 5月 10 04:05 123
drwxr-xr-x. 2 root root 4096 5月 10 04:05 456
-i : 安全选项,和 ‘rm’ 类似,如果遇到一个存在的文件,会问是否覆盖。在Redhat/CentOS系统中,我们使用的cp其实是cp -i
[root@localhost ~]# which cp
alias cp='cp -i'
/bin/cp
下面简单做一个小试验,很快你就会明白-i 选项的作用了。
[root@localhost ~]# cd 123
[root@localhost 123]# ls
[root@localhost 123]# touch 111
[root@localhost 123]# touch 222
[root@localhost 123]# cp -i 111 222
cp:是否覆盖 '222'? n
[root@localhost 123]# echo 'abc' > 111
[root@localhost 123]# echo 'def' > 222
[root@localhost 123]# cat 111 222
abc
def
[root@localhost 123]# /bin/cp 111 222
[root@localhost 123]# cat 111
abc
[root@localhost 123]# cat 222
abc
例子中的 ‘touch’ 看字面意思就是 ‘摸一下’,没错,如果有这个文件,则会改变文件的访问时间,如果没有这个文件就会创建这个文件。前面说过 ‘echo’ 用来打印,在这里所echo的内容 ‘abc’ 和 ‘def’ 并没有显示在屏幕上,而是分别写进了文件 111和222, 其写入作用的就是这个大于号 ‘>’ 在linux中这叫做重定向,即把前面产生的输出写入到后面的文件中。在以后的章节中会做详细介绍,这里你要明白它的含义即可。而 ‘cat’ 命令则是读一个文件,并把读出的内容打印到当前屏幕上。该命令也会在后续章节中详细介绍。
命令: mv
‘mv’ 是move的简写。格式为 mv [ 选项 ] [源文件] [目标文件]
下面介绍几个常用的选项。
-i : 和cp的-i 一样,当目标文件存在时会问用户是否要覆盖。在Redhat/CentOS系统中,我们使用的mv其实是mv -i
该命令有几种情况:
1) 目标文件是目录,而且目标文件不存在;
2) 目标文件是目录,而且目标文件存在;
3) 目标文件不是目录不存在;
4) 目标文件不是目录存在;
目标文件是目录,存在和不存在,移动的结果是不一样的,如果存在,则会把源文件移动到目标文件目录中。否则,就直接移动了,相当于重命名。这样说也许你会觉得有点不好理解,看例子吧。
[root@localhost ~]# mkdir dira dirb
[root@localhost ~]# ls
anaconda-ks.cfg dira dirb install.log install.log.syslog
[root@localhost ~]# mv dira dirc
[root@localhost ~]# ls
anaconda-ks.cfg dirb dirc install.log install.log.syslog
目标文件为目录,并且目标目录不存在,相当于把 ‘dira’ 重命名为 ‘dirc’.
[root@localhost ~]# mv dirc dirb
[root@localhost ~]# ls
anaconda-ks.cfg dirb install.log install.log.syslog
[root@localhost ~]# ls dirb
dirc
目标文件为目录,且目标目录存在,则会把 ‘dirc’ 移动到 ‘dirb’ 目录里。
[root@localhost ~]# touch filed
[root@localhost ~]# ls
anaconda-ks.cfg dirb filed install.log install.log.syslog
[root@localhost ~]# mv filed filee
[root@localhost ~]# ls
anaconda-ks.cfg dirb filee install.log install.log.syslog
[root@localhost ~]# mv filee dirb
[root@localhost ~]# ls
anaconda-ks.cfg dirb install.log install.log.syslog
[root@localhost ~]# ls dirb
dirc filee
目标文件不是目录,且不存在,则会重命名文件。
@几个和文档相关的命令
命令: cat
比较常用的一个命令,即查看一个文件的内容并显示在屏幕上, 后面可以不加任何选项直接跟文件名,阿铭介绍两个常用的选项:
-n : 查看文件时,把行号也显示到屏幕上。
[root@localhost ~]# echo '111111111' > dirb/filee
[root@localhost ~]# echo '222222222' >> dirb/filee
[root@localhost ~]# cat dirb/filee
111111111
222222222
[root@localhost ~]# cat -n dirb/filee
1 111111111
2 222222222
上例中出现了一个 ‘>>’ 这个符号跟前面介绍的 ‘>’ 的作用都是重定向,即把前面输出的东西输入到后边的文件中,只是 ‘>>’ 是追加的意思,而用 ‘>’ 如果文件中有内容则会删除文件中内容,而 ‘>>’ 则不会。
-A : 显示所有东西出来,包括特殊字符
[root@localhost ~]# cat -A dirb/filee
111111111$
222222222$
命令: tac
和 ‘cat’ 一样,用来把文件的内容显示在屏幕上,只不过是先显示最后一行,然后是倒数第二行,最后显示的是第一行。
[root@localhost ~]# tac dirb/filee 222222222 111111111
命令: more
也是用来查看一个文件的内容,后面直接跟文件名,当文件内容太多,一屏幕不能占下,而你用 ‘cat’ 肯定是看不前面的内容的,那么使用 ‘more’ 就可以解决这个问题了。当看完一屏后按空格键继续看下一屏。但看完所有内容后就会退出。如果你想提前退出,只需按 ‘q’ 键即可。
命令: less
作用跟more一样,后面直接跟文件名,但比more好在可以上翻,下翻。空格键同样可以翻页,而按 ‘j’ 键可以向下移动(按一下就向下移动一行),按 ‘k’ 键向上移动。在使用more和less查看某个文件时,你可以按一下 ‘/’ 键,然后输入一个word回车,这样就可以查找这个word了。如果是多个该word可以按 ‘n’ 键显示下一个。另外你也可以不按 ‘/’ 而是按 ‘?’ 后边同样跟word来搜索这个word,唯一不同的是, ‘/’ 是在当前行向下搜索,而 ‘?’ 是在当前行向上搜索。
命令: head
‘head’后直接跟文件名,则显示文件的前十行。如果加 -n 选项则显示文件前n行。
[root@localhost ~]# head /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@localhost ~]# head -n 1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# head -n2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
‘-n’后可以有空格也可以无空格。
命令: tail
和head一样,后面直接跟文件名,则显示文件最后十行。如果加-n 选项则显示文件最后n行。
[root@localhost ~]# head -n2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@localhost ~]# tail /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:'Saslauthd user':/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
[root@localhost ~]# tail -n2 /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
-f : 动态显示文件的最后十行,如果文件是不断增加的,则用-f 选项。如:tail -f /var/log/messages
该选项特别特别常用,请熟记
@文件的所属主,以及所属组
一个linux目录或者文件,都会有一个所属主和所属组。所属主,即文件的拥有者,而所属组,即该文件所属主所在的一个组。Linux这样设置文件属性的目的是为了文件的安全。例如,test文件的所属主是user0 而test1文件的所属主是user1,那么user1是不能查看test文件的,相应的user0也不能查看test1文件。有时我们也会有这样的需求,让一个文件同时让user0和user1来查看,这怎么实现呢?
这时 ‘所属组’ 就派上用场了。即,创建一个群组users,让user0和user1同属于users组,然后建立一个文件test2,且其所属组为users,那么user0和user1都可以访问test2文件。Linux文件属性不仅规定了所属主和所属组,还规定了所属主(user)、所属组(group)以及其他用户(others)对该文件的权限。你可以通过ls -l 来查看这些属性。
[root@localhost ~]# ls -l 总用量 40 -rw-------. 1 root root 980 5月 7 18:00 anaconda-ks.cfg drwxr-xr-x. 3 root root 4096 5月 10 05:10 dirb
@Linux文件属性
上例中,用ls –l 查看当前目录下的文件时,共显示了9列内容(用空格划分列),都代表了什么含义呢?
第1列,包含的东西有该文件类型和所属主、所属组以及其他用户对该文件的权限。第一列共11位有的文件是10位,没有最后面的一位。 其中第一位用来描述该文件的类型。上例中,我们看到的类型有 ‘d’, ‘-‘ ,其实除了这两种外还有 ‘l’, ‘b’, ‘c’, ‘s’ 等。
‘d’ 表示该文件为目录;
‘-‘ 表示该文件为普通文件;
‘l’ 表示该文件为链接文件(linux file),上边提到的软链接即为该类型;
[root@localhost ~]# ls -l /etc/rc.local
lrwxrwxrwx. 1 root root 13 5月 7 17:54 /etc/rc.local -> rc.d/rc.local
上例中,第一列第一位是 ‘l’ 表示该文件为链接文件,稍后阿铭详细介绍。
‘b’ 表示该文件为块设备,比如 /dev/sda 就是这样的文件。
‘c’ 表示该文件为串行端口设备,例如键盘、鼠标。
‘s’ 表示该文件为套接字文件(socket),用于进程间通信。
后边的9位,每三个为一组。均为rwx 三个参数的组合。其中r 代表可读,w代表可写,x代表可执行。前三位为所属主(user)的权限,中间三位为所属组(group)的权限,最后三位为其他非本群组(others)的权限。下面拿一个具体的例子来述说一下。
一个文件的属性为 ‘-rwxr-xr–.’ ,它代表的意思是,该文件为普通文件,文件拥有者可读可写可执行,文件所属组对其可读不可写可执行,其他用户对其只可读。对于一个目录来讲,打开这个目录即为执行这个目录,所以任何一个目录必须要有x权限才能打开并查看该目录。例如一个目录的属性为 ‘drwxr–r–.’ 其所属主为root,那么除了root外的其他用户是不能打开这个目录的。
关于第一列的最后一位的 .
,阿铭要说一下,之前的CentOS 5 是没有这个点的,这主要是因为新版本的ls把selinux或者acl的属性加进来了,当文件或者目录只使用了selinux context的属性,这里是一个点。如果设置了acl,后面将是一个加号 ‘+’. 关于selinux 和 acl 阿铭不再详细介绍,你只要了解是怎么回事即可,如果你感兴趣可以网上搜索相关知识也可以通过阿铭在本章后面提供的扩展学习链接进行学习。
第2列,表示为链接占用的节点(inode), [1] 为目录时,通常与该目录底下还有多少目录有关系。
第3列,表示该文件的所属主。
第4列,表示该文件的所属组。
第5列,表示该文件的大小。
第6列、第7列和第8列为该文件的最近的修改日期,分别为月份日期以及时间,也就是所谓的mtime.
第9列,文件名。
@更改文件权限
- 更改所属组 chgrp
语法:chgrp [组名] [文件名]
[root@localhost ~]# groupadd testgroup
[root@localhost ~]# touch test1
[root@localhost ~]# ls -l test1
-rw-r--r-- 1 root root 0 5月 10 08:41 test1
[root@localhost ~]# chgrp testgroup test1
[root@localhost ~]# ls -l test1
-rw-r--r-- 1 root testgroup 0 5月 10 08:41 test1
这里用到了 ‘groupadd’ 命令,其含义为增加一个用户组。该命令在以后章节中做详细介绍,你只要知道它是用来增加用户组的即可。除了更改文件的所属组,还可以更改目录的所属组。
[root@localhost ~]# ls -l dirb/
总用量 8
drwxr-xr-x. 2 root root 4096 5月 10 05:08 dirc
-rw-r--r--. 1 root root 20 5月 10 05:37 filee
[root@localhost ~]# ls -ld dirb/
drwxr-xr-x. 3 root root 4096 5月 10 05:10 dirb/
[root@localhost ~]# chgrp testgroup dirb
[root@localhost ~]# ls -ld dirb/
drwxr-xr-x. 3 root testgroup 4096 5月 10 05:10 dirb/
[root@localhost ~]# ls -l dirb/
总用量 8
drwxr-xr-x. 2 root root 4096 5月 10 05:08 dirc
-rw-r--r--. 1 root root 20 5月 10 05:37 filee
‘chgrp’命令也可以更改目录的所属组,但是只能更改目录本身,而目录下面的目录或者文件没有更改,要想级联更改子目录以及子文件,有个选项可以实现:
[root@localhost ~]# chgrp -R testgroup dirb
[root@localhost ~]# ls -l dirb
总用量 8
drwxr-xr-x. 2 root testgroup 4096 5月 10 05:08 dirc
-rw-r--r--. 1 root testgroup 20 5月 10 05:37 filee
‘chgroup’ 命令阿铭使用的不多,因为还有一个命令可以替代。
- 更改文件的所属主 chown
语法: chown [ -R ] 账户名 文件名
chown [ -R ] 账户名:组名 文件名
这里的-R选项只作用于目录,作用是级联更改,即不仅更改当前目录,连目录里的目录或者文件全部更改。
[root@localhost ~]# mkdir test // 创建 'test' 目录
[root@localhost ~]# useradd user1 // 创建用户 'user1', 关于 'useradd' 命令会在后续章节介绍。
[root@localhost ~]# touch test/test2 // 在test目录下创建test2文件
[root@localhost ~]# chown user1 test
[root@localhost ~]# ls -l test
总用量 0
-rw-r--r-- 1 root root 0 5月 10 09:00 test2
[root@localhost ~]# ls -ld test // test目录所属主已经由 'root' 改为 'user1'.
drwxr-xr-x 2 user1 root 4096 5月 10 09:00 test
[root@localhost ~]# ls -l test // 但是test目录下的test2文件所属主依旧是 'root'.
总用量 0
-rw-r--r-- 1 root root 0 5月 10 09:00 test2
[root@localhost ~]# chown -R user1:testgroup test
[root@localhost ~]# ls -l test
总用量 0
-rw-r--r-- 1 user1 testgroup 0 5月 10 09:00 test2
chown -R user1:testgroup test //把test目录以及目录下的文件都修改成所属主为user1, 所属组为testgroup.
- 改变用户对文件的读写执行权限 chmod
在linux中为了方便更改这些权限,linux使用数字去代替rwx, 具体规则为 ‘r’ 等于4, ‘w’ 等于2, ‘x’ 等于1, ‘-‘ 等于0. 举个例子: ‘-rwxrwx—’ 用数字表示就是 ‘770’, 具体是这样来的: ‘rwx’ = 4+2+1=7; ‘rwx’ = 4+2+1=7; ‘- - -‘ = 0+0+0=0.
chmod 语法: chmod [-R] xyz 文件名
(这里的xyz,表示数字)
‘-R’ 选项作用同chown,级联更改。
值得提一下的是,在linux系统中,默认一个目录的权限为 755,而一个文件的默认权限为644.
[root@localhost ~]# ls -ld test
drwxr-xr-x 2 user1 testgroup 4096 5月 10 09:00 test
[root@localhost ~]# ls -l test
总用量 0
-rw-r--r-- 1 user1 testgroup 0 5月 10 09:00 test2
[root@localhost ~]# chmod 750 test
[root@localhost ~]# ls -ld test
drwxr-x--- 2 user1 testgroup 4096 5月 10 09:00 test
[root@localhost ~]# ls -l test/test2
-rw-r--r-- 1 user1 testgroup 0 5月 10 09:00 test/test2
[root@localhost ~]# chmod 700 test/test2
[root@localhost ~]# chmod -R 700 test
[root@localhost ~]# ls -ld test
drwx------ 2 user1 testgroup 4096 5月 10 09:00 test
[root@localhost ~]# ls -l test
总用量 0
-rwx------ 1 user1 testgroup 0 5月 10 09:00 test2
如果你创建了一个目录,而该目录不想让其他人看到内容,则只需设置成 ‘rwxr—–’ (740) 即可。’chmod’ 还支持使用rwx的方式来设置权限。从之前的介绍中我们可以发现,基本上就九个属性分别是(1)user (2)group (3)others, 我们可以使用u, g, o 来代表它们三个的属性,此外, a 则代表 all 亦即全部。阿铭举例来介绍他们的用法:
[root@localhost ~]# chmod u=rwx,og=rx test/test2
[root@localhost ~]# ls -l test/test2
-rwxr-xr-x 1 user1 testgroup 0 5月 10 09:00 test/test2
这样可以把 ‘test/test2’ 文件权限修改为 ‘rwxr-xr-x’. 另外还可以针对u, g, o, a增加或者减少某个权限(读,写,执行),例如:
[root@localhost ~]# chmod u-x test/test2
[root@localhost ~]# ls -l test
总用量 0
-rw-r-xr-x 1 user1 testgroup 0 5月 10 09:00 test2
[root@localhost ~]# chmod a-x test/test2
[root@localhost ~]# ls -l test/test2
-rw-r--r-- 1 user1 testgroup 0 5月 10 09:00 test/test2
[root@localhost ~]# chmod u+x test/test2
[root@localhost ~]# ls -l test/test2
-rwxr--r-- 1 user1 testgroup 0 5月 10 09:00 test/test2
命令: umask
上边也提到了默认情况下,目录权限值为755, 普通文件权限值为644, 那么这个值是由谁规定呢?追究其原因就涉及到了 ‘umask’.
umask语法: umask xxx
(这里的xxx代表三个数字)
查看umask值只要输入 ‘umask’ 然后回车。
[root@localhost ~]# umask
0022
umask预设是0022,其代表什么含义?先看一下下面的规则:
1)若用户建立为普通文件,则预设 ‘没有可执行权限’, 只有’rw’两个权限。最大为666 (‘-rw-rw-rw-‘).
2)若用户建立为目录,则预设所有权限均开放,即777 (‘drwxrwxrwx’).
umask数值代表的含义为,上边两条规则中的默认值(文件为666,目录为777)需要减掉的权限。所以目录的权限为 'rwxrwxrwx' - '----w--w-' = 'rwxr-xr-x'
,普通文件的权限为 'rw-rw-rw-' - '----w--w-' = 'rw-r--r--'
. umask的值是可以自定义的,比如设定umask 为 002,你再创建目录或者文件时,默认权限分别为'rwxrwxrwx' - '-------w-' = 'rwxrwxr-x'
和 'rw-rw-rw-' - '-------w-' = 'rw-rw-r--'
.
[root@localhost ~]# umask 002
[root@localhost ~]# mkdir test2
[root@localhost ~]# ls -ld test2
drwxrwxr-x 2 root root 4096 5月 10 09:44 test2
[root@localhost ~]# touch test3
[root@localhost ~]# ls -l test3
-rw-rw-r-- 1 root root 0 5月 10 09:45 test3
可以看到创建的目录权限默认变为775, 而文件默认权限变为664. 然后再把umask改回来。
[root@localhost ~]# umask 022
[root@localhost ~]# touch test4
[root@localhost ~]# ls -l test4
-rw-r--r-- 1 root root 0 5月 10 09:45 test4
umask 可以在 /etc/bashrc
里面更改,预设情况下,root的umask为022,而一般使用者则为002,因为可写的权限非常重要,因此预设会去掉写权限。
- 修改文件的特殊属性
命令 : chattr
语法: chattr [+-=][ASaci [文件或者目录名]
‘+-=’ : 分别为增加、减少、设定
‘A’ : 增加该属性后,文件或目录的atime将不可被修改;
‘S’ : 增加该属性后,会将数据同步写入磁盘中;
‘a’ : 增加该属性后,只能追加不能删除,非root用户不能设定该属性;
‘c’ : 自动压缩该文件,读取时会自动解压;
‘i’ : 增加后,使文件不能被删除、重命名、设定链接接、写入、新增数据;
[root@localhost ~]# chattr +i test2
[root@localhost ~]# touch test2/test1
touch: 无法创建'test2/test1': 权限不够
[root@localhost ~]# chattr -i test2
[root@localhost ~]# touch test2/test1
[root@localhost ~]# chattr +i test2
[root@localhost ~]# rm -f test2/test1
rm: 无法删除'test2/test1': 权限不够
对 ‘test2’ 目录增加 ‘i’ 权限后,即使是root账户也不能在 ‘test2’ 里创建或删除test1文件。
[root@localhost ~]# chattr -i test2
[root@localhost ~]# touch test2/test3
[root@localhost ~]# ls test2
test1 test3
[root@localhost ~]# chattr +a test2
[root@localhost ~]# rm -f test2/test1
rm: 无法删除 'test2/test1': 不允许的操作
[root@localhost ~]# touch test2/test4
[root@localhost ~]# ls test2
test1 test3 test4
test2目录增加 ‘a’ 权限后,只可以在里面创建文件,而不能删除文件。文件同样可以适用这些权限。
[root@localhost ~]# chattr +a test2/test1
[root@localhost ~]# echo '11111' > test2/test1
-bash: test2/test1: 不允许的操作
[root@localhost ~]# echo '11111' >> test2/test1
[root@localhost ~]# cat test2/test1
11111
[root@localhost ~]# chattr +i test2/test3
[root@localhost ~]# echo '11111' >> test2/test3
-bash: test2/test3: 权限不够
[root@localhost ~]# echo '11111' > test2/test3
-bash: test2/test3: 权限不够
[root@localhost ~]# rm -f test2/test3
rm: 无法删除'test2/test3': 权限不够
命令 : lsattr
该命令用来读取文件或者目录的特殊权限,语法为 lsattr [-aR] [文件/目录名]
‘-a’ : 类似与ls 的-a 选项,即连同隐藏文件一同列出;
‘-R’ : 连同子目录的数据一同列出
[root@localhost ~]# lsattr test2
-----a-------e- test2/test1
----i--------e- test2/test3
-------------e- test2/test4
[root@localhost ~]# lsattr -aR test2
----i--------e- test2/.
-----a-------e- test2/test1
-------------e- test2/..
----i--------e- test2/test3
-------------e- test2/test4
@搜索文件
- ‘which’ 用来查找可执行文件的绝对路径。
在前面已经用到该命令,需要注意的一点是,which只能用来查找PATH环境变量中出现的路径下的可执行文件。这个命令用的也是蛮多的,有时候我们不知道某个命令的绝对路径,which 一下很容易就知道了。
- ‘whereis’ 通过预先生成的一个文件列表库去查找跟给出的文件名相关的文件。
语法: whereis [-bmsu] [文件名称]
‘-b’ : 只找binary 文件
‘-m’ : 只找在说明文件manual路径下的文件
‘-s’ : 只找source来源文件
‘-u’ : 没有说明档的文件
说明:whereis 阿铭几乎很少用到,如果你感兴趣请深入研究。
- ‘locate’ 类似于’whereis’, 也是通过查找预先生成的文件列表库来告诉用户要查找的文件在哪里。
后边直接跟文件名。如果你的linux没有这个命令,请安装软件包 ‘mlocate’, 这个软件包在你的系统安装盘里,后缀名是RPM,随后介绍的find命令会告诉你如何查找这个包。如果你装的CentOS你可以使用这个命令来安装 yum install -y mlocate
前提是你的CentOS能连网。至于yum这个命令如何使用,到后续章节你自然会明白。如果你刚装上这个命令,初次使用会报错。
[root@localhost ~] # locate passwd
locate: can not open `/var/lib/mlocate/mlocate.db': No such file or directory
这是因为系统还没有生成那个文件列表库。你可以使用 updatedb
命令立即生成(更新)这个库。如果你的服务器上正跑着重要的业务,那么你最好不要去运行这个命令,因为一旦运行,服务器的压力会变大。这个数据库默认情况下每周更新一次。所以你用locate命令去搜索一个文件,正好是在两次更新时间段内,那你肯定是得不到结果的。你可以到/etc/updated.conf 去配置这个数据库生成(更新)的规则。’locate’所搜索到的文件列表,不管是目录名还是文件名,只要包含我们要搜索的关键词,都会列出来,所以’locate’不适合精准搜索,这个命令阿铭使用的也并不多,你只要明白有这么一个工具即可,用到时再去深究其用法吧。
- ‘find’ 这个搜索工具是阿铭用的最多的一个,所以请你务必要熟悉它。
语法 : find [路径] [参数]
下面介绍几个阿铭经常用的参数
‘-atime +n/-n’ : 访问或执行时间大于/小于n天的文件
‘-ctime +n/-n’ : 写入、更改inode属性(例如更改所有者、权限或者链接)时间大于/小于n天的文件
‘-mtime +n/-n’ : 写入时间大于/小于n天的文件
[root@localhost ~]# find /tmp/ -mtime -1
/tmp/
/tmp/.ICE-unix
/tmp/test
[root@localhost ~]# find /tmp/ -atime +10
[root@localhost ~]# find /tmp/ -atime +1
/tmp/yum.log
/tmp/.bash_history
看到这里,你对这三个time是不是有些晕了,那阿铭就先给你介绍一下这三个time属性。
文件的 Access time也就是 ‘atime’ 是在读取文件或者执行文件时更改的。文件的 Modified time也就是 ‘mtime’ 是在写入文件时随文件内容的更改而更改的。文件的 Change time也就是 ‘ctime’ 是在写入文件、更改所有者、权限或链接设置时随inode的内容更改而更改的。 因此,更改文件的内容即会更改mtime和ctime,但是文件的ctime可能会在 mtime 未发生任何变化时更改,例如,更改了文件的权限,但是文件内容没有变化。 如何获得一个文件的atime mtime 以及ctime ?
‘stat’ 命令可用来列出文件的 atime、ctime 和 mtime。
[root@localhost ~]# stat test/test2
File: 'test/test2'
Size: 0 Blocks: 0 IO Block: 4096 普通空文件
Device: 803h/2051d Inode: 261657 Links: 1
Access: (0744/-rwxr--r--) Uid: ( 500/ user1) Gid: ( 500/testgroup)
Access: 2013-05-10 09:00:36.092000531 +0800
Modify: 2013-05-10 09:00:36.092000531 +0800
Change: 2013-05-10 09:30:58.788996594 +0800
atime不一定在访问文件之后被修改,因为:使用ext3文件系统的时候,如果在mount的时候使用了noatime参数那么就不会更新atime的信息。总之, 這三個 time stamp 都放在 inode 中。若 mtime, atime 修改inode 就一定會改, 既然 inode 改了, 那 ctime 也就跟着要改了。
阿铭继续’find’常用选项:
‘-name filename’ 直接查找该文件名的文件,这个选项使用很多。
[root@localhost ~]# find . -name test2
./test/test2
./test2
‘-type filetype’ 通过文件类型查找。文件类型在前面部分已经简单介绍过,相信你已经大体上了解了。filetype 包含了 f, b, c, d, l, s 等。
[root@localhost ~]# find /tmp/ -type d
/tmp/
/tmp/.ICE-unix
/tmp/test
[root@localhost ~]# find /tmp/ -type f
/tmp/yum.log
/tmp/.bash_history
/tmp/ip.txt
@查看磁盘或目录的容量
命令 : df
“df” 查看已挂载磁盘的总容量、使用容量、剩余容量等,可以不加任何参数,默认是按k为单位显示的。
[root@localhost ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda3 14347632 1490876 12127924 11% /
tmpfs 163308 0 163308 0% /dev/shm
/dev/sda1 99150 26808 67222 29% /boot
“df” 常用选项有 “-i” “-h” “-k” “-m”等
“-i” 查看inodes使用状况
文件系统 Inode 已用(I) 可用(I) 已用(I)%% 挂载点
/dev/sda3 912128 66195 845933 8% /
tmpfs 40827 1 40826 1% /dev/shm
/dev/sda1 25688 38 25650 1% /boot
“-h” 使用合适的单位显示,例如 ‘G’
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda3 14G 1.5G 12G 11% /
tmpfs 160M 0 160M 0% /dev/shm
/dev/sda1 97M 27M 66M 29% /boot
“-k”, “-m” 分别以K, M 为单位显示
[root@localhost ~]# df -k
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda3 14347632 1490880 12127920 11% /
tmpfs 163308 0 163308 0% /dev/shm
/dev/sda1 99150 26808 67222 29% /boot
[root@localhost ~]# df -m
文件系统 1M-块 已用 可用 已用% 挂载点
/dev/sda3 14012 1456 11844 11% /
tmpfs 160 0 160 0% /dev/shm
/dev/sda1 97 27 66 29% /boot
简单介绍一下各列所表示的含义,其实如果你的Linux和阿铭的虚拟机一样也是中文显示的话,那么不用说太多,看字面意思就明白了。第一列是分区的名字,第二列为该分区总共的容量,第三列为已经使用了多少,第四列为还剩下多少,第五列为已经使用百分比,如果这个数值到达90%以上,那么你就应该关注了,磁盘分区满了可不是什么好事情,会引起系统崩溃的。最后一列为挂载点,你是否还记得,阿铭在装系统的时候,有说到这个词,”/dev/shm” 为内存挂载点,如果你想把文件放到内存里,就可以放到/dev/shm/目录下。
命令 : du
“du” 用来查看某个目录或文件所占空间大小.
语法 : du [-abckmsh] [文件或者目录名]
常用的参数有:
“-a” 全部文件与目录大小都列出来。如果不加任何选项和参数只列出目录(包含子目录)大小。
[root@localhost ~]# du dirb
4 dirb/dirc
12 dirb
[root@localhost ~]# du -a dirb
4 dirb/filee
4 dirb/dirc
12 dirb
如果du不指定单位的话,默认显示单位为K.
“-b” 列出的值以bytes为单位输出。
“-k” 以KB为单位输出,和默认不加任何选项的输出值是一样的。
“-m” 以MB为单位输出
“-h” 系统自动调节单位,例如文件太小可能就几K,那么就以K为单位显示,如果大到几G,则就以G为单位显示。
[root@localhost ~]# du -b /etc/passwd
1181 /etc/passwd
[root@localhost ~]# du -k /etc/passwd
4 /etc/passwd
[root@localhost ~]# du -m /etc/passwd
1 /etc/passwd
[root@localhost ~]# du -h /etc/passwd
4.0K /etc/passwd
“-c” 最后加总
[root@localhost ~]# du -c dirb
4 dirb/dirc
12 dirb
12 总用量
[root@localhost ~]# du dirb
4 dirb/dirc
12 dirb
“-s” 只列出总和
[root@localhost ~]# du -s dirb
12 dirb
阿铭习惯用 du -sh filename
这样的形式。
@磁盘的分区和格式化
- 先关闭正在运行的Linux系统
init 0
. - 到vmware的Linux虚拟机界面,点 “Edit virtual machine settings”, 点一下左侧靠下面的 “Add...” 按钮。
- 在左侧选中 “Hard Disk” 默认就是这一行,点右下角的 “Next”, 继续点 “Next”.
- “Virtual disk type” 选择 IDE, 点 “Next”
- 继续点 “Next”, “Disk size” 默认即可,最后点 “Finish”.
命令 : fdisk
fdisk 是Linux下硬盘的分区工具,是一个非常实用的命令,但是fdisk只能划分小于2T的分区。
语法 : fdisk [-l ] [设备名称]
选项只有一个。
“-l” 后边不跟设备名会直接列出系统中所有的磁盘设备以及分区表,加上设备名会列出该设备的分区表。
[root@localhost ~]# fdisk -l
Disk /dev/sda: 17.2 GB, 17179869184 bytes
255 heads, 63 sectors/track, 2088 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00018d63
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 102400 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 13 274 2097152 82 Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3 274 2089 14576640 83 Linux
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
[root@localhost ~]# fdisk -l /dev/sda
Disk /dev/sda: 17.2 GB, 17179869184 bytes
255 heads, 63 sectors/track, 2088 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00018d63
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 102400 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 13 274 2097152 82 Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3 274 2089 14576640 83 Linux
可以看到刚才阿铭加的一块磁盘 /dev/sdb 的信息。
“fdisk” 如果不加 “-l” 则进入另一个模式,在该模式下,可以对磁盘进行分区操作。
[root@localhost ~]# fdisk /dev/sda
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help):
如果你输入 ‘m’ 会列出常用的命令:
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
如果你的英文好,我想你不难理解这些字母的功能。阿铭常用的有’p’, ‘n’, ‘d’, ‘w’, ‘q’.
“p” 打印当前磁盘的分区情况。
Command (m for help): p
Disk /dev/sda: 17.2 GB, 17179869184 bytes
255 heads, 63 sectors/track, 2088 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00018d63
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 102400 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 13 274 2097152 82 Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3 274 2089 14576640 83 Linux
‘n’ 建立一个新的分区。
‘w’ 保存操作。
‘q’ 退出。
‘d’ 删除一个分区
下面阿铭会把刚才增加的磁盘/dev/sdb进行分区操作。先使用 ‘p’ 命令看一下/dev/sdb的分区状况:
[root@localhost ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xf4121235.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xf4121235
Device Boot Start End Blocks Id System
Command (m for help):
可以看到目前/dev/sdb没有任何分区,下面阿铭给它建立第一个分区:
Command (m for help): n
Command action
e extended
p primary partition (1-4)
使用 ‘n’ 命令新建分区,它会提示是要 ‘e’ (扩展分区) 还是 ‘p’ (主分区) [1] 阿铭的选择是 ‘p’, 于是输入 ‘p’ 然后回车
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1044, default 1): 1
Last cylinder, +cylinders or +size{K,M,G} (1-1044, default 1044): +1000M
输入 ‘p’ 后,会提示分区数,这里阿铭写 ‘1’, 因为是第一个分区,当然你也可以写 ‘2’ 或 ‘3’, 如果你直接回车的话,会继续提示你必须输入一个数字,接着又提示第一个柱面从哪里开始,默认是 ‘1’, 你可以写一个其他的数字,不过这样就浪费了空间,所以还是写 ‘1’ 吧,或者你直接回车也会按 ‘1’ 处理,接着是让输入最后一个柱面的数值,也就是说你需要给这个分区分多大空间,关于柱面是多大阿铭不再细究,你只需要掌握阿铭教给你的方法即可,即写 “+1000M”, 这样即方便又不容易出错。用 ‘p’ 查看已经多出了一个分区:
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0600660a
Device Boot Start End Blocks Id System
/dev/sdb1 1 128 1028128+ 83 Linux
继续上面的操作,一直创建主分区到4, 然后再一次创建分区的时候则会提示:
Command (m for help): n
You must delete some partition and add an extended partition first
这是因为,在linux中最多只能创建4个主分区,那如果你想多创建几个分区如何做?很容易,在创建完第三个分区后,创建第四个分区时选择扩展分区。
Command (m for help): n
Command action
e extended
p primary partition (1-4)
e
Selected partition 4
First cylinder (385-1044, default 385):
Using default value 385
Last cylinder, +cylinders or +size{K,M,G} (385-1044, default 1044):
Using default value 1044
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xef267349
Device Boot Start End Blocks Id System
/dev/sdb1 1 128 1028128+ 83 Linux
/dev/sdb2 129 256 1028160 83 Linux
/dev/sdb3 257 384 1028160 83 Linux
/dev/sdb4 385 1044 5301450 5 Extended
扩展分区,在最后一列显示为 “Extended”, 接下来继续创建分区:
Command (m for help): n
First cylinder (385-1044, default 385):
Using default value 385
Last cylinder, +cylinders or +size{K,M,G} (385-1044, default 1044): +1000M
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xef267349
Device Boot Start End Blocks Id System
/dev/sdb1 1 128 1028128+ 83 Linux
/dev/sdb2 129 256 1028160 83 Linux
/dev/sdb3 257 384 1028160 83 Linux
/dev/sdb4 385 1044 5301450 5 Extended
/dev/sdb5 385 512 1028128+ 83 Linux
这时候再分区和以前有区别了,不再选择是主分区还是扩展分区了,而是直接定义大小。有一点阿铭要讲一下,当分完三个主分区后,第四个扩展分区需要把剩余的磁盘空间全部划分给扩展分区,不然的话剩余的空间会浪费,因为分完扩展分区后,再划分新的分区时是在已经划分的扩展分区里来分的。其中/dev/sdb4为扩展分区,这个分区是不可以格式化的,你可以把它看成是一个空壳子,能使用的为/dev/sdb5, 其中/dev/sdb5为/dev/sdb4的子分区,这个子分区叫做逻辑分区。如果你发现分区分的不合适,想删除掉某个分区怎么办?这就用到了 ‘d’ 命令:
Command (m for help): d
Partition number (1-5): 1
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x7b9a6af3
Device Boot Start End Blocks Id System
/dev/sdb2 129 256 1028160 83 Linux
/dev/sdb3 257 384 1028160 83 Linux
/dev/sdb4 385 1044 5301450 5 Extended
/dev/sdb5 385 512 1028128+ 83 Linux
Command (m for help): d
Partition number (1-5): 5
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x7b9a6af3
Device Boot Start End Blocks Id System
/dev/sdb2 129 256 1028160 83 Linux
/dev/sdb3 257 384 1028160 83 Linux
/dev/sdb4 385 1044 5301450 5 Extended
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (385-1044, default 385):
Using default value 385
Last cylinder, +cylinders or +size{K,M,G} (385-1044, default 1044): +1000M
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x7b9a6af3
Device Boot Start End Blocks Id System
/dev/sdb2 129 256 1028160 83 Linux
/dev/sdb3 257 384 1028160 83 Linux
/dev/sdb4 385 1044 5301450 5 Extended
/dev/sdb5 385 512 1028128+ 83 Linux
Command (m for help): d
Partition number (1-5): 4
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x7b9a6af3
Device Boot Start End Blocks Id System
/dev/sdb2 129 256 1028160 83 Linux
/dev/sdb3 257 384 1028160 83 Linux
输入 ‘d’ 会提示要删除哪个分区,可以选择从 1-5 其中1-3是主分区(sdb1, sdb2, sdb3),4是扩展分区(sdb4),5是逻辑分区 [1] (sdb5),如果输入5,则直接把逻辑分区sdb5删除掉,但是如果输入4的话,会把整个扩展分区sdb4干掉,当然也包含扩展分区里面的逻辑分区sdb5。在刚才的分区界面直接 Ctrl + C 退出来,这样刚刚的分区全部都取消了,咱们重新来做分区:
[root@localhost ~]# fdisk /dev/sdb
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x7b9a6af3
Device Boot Start End Blocks Id System
Command (m for help): n
Command action
e extended
p primary partition (1-4)
e
Partition number (1-4): 1
First cylinder (1-1044, default 1): 1
Last cylinder, +cylinders or +size{K,M,G} (1-1044, default 1044): 1044
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x7b9a6af3
Device Boot Start End Blocks Id System
/dev/sdb1 1 1044 8385898+ 5 Extended
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
如果把第一个分区分为扩展分区,并且把全部空间都分给扩展分区的话,再继续分区的话,会提示的分区类型为主分区还是逻辑分区(logical), 用 ‘l’ 表示逻辑分区,逻辑分区的id是从5开始的,因为前四个id为主分区或者扩展分区。既然阿铭把所有磁盘空间都分为了扩展分区,如果你在这里选择 ‘p’ 则会报错:
Command action
l logical (5 or over)
p primary partition (1-4)
p
Partition number (1-4): 2
No free sectors available
这是因为没有足够空间分给主分区了,那我们就分逻辑分区:
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (1-1044, default 1): 1
Last cylinder, +cylinders or +size{K,M,G} (1-1044, default 1044): +1000M
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x7b9a6af3
Device Boot Start End Blocks Id System
/dev/sdb1 1 1044 8385898+ 5 Extended
/dev/sdb5 1 128 1028097 83 Linux
Command (m for help): n
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (129-1044, default 129): 129
Last cylinder, +cylinders or +size{K,M,G} (129-1044, default 1044): +1000M
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x7b9a6af3
Device Boot Start End Blocks Id System
/dev/sdb1 1 1044 8385898+ 5 Extended
/dev/sdb5 1 128 1028097 83 Linux
/dev/sdb6 129 256 1028128+ 83 Linux
分区完后,需要输入 ‘w’ 命令来保存我们的配置:
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
再使用 fdisk -l /dev/sdb
查看分区情况:
[root@localhost ~]# fdisk -l /dev/sdb
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x7b9a6af3
Device Boot Start End Blocks Id System
/dev/sdb1 1 1044 8385898+ 5 Extended
/dev/sdb5 1 128 1028097 83 Linux
/dev/sdb6 129 256 1028128+ 83 Linux
通过以上操作,相信你也学会了用fdisk来分区了吧。但阿铭要提醒你,不要闲着没事分区玩儿,这操作的危险性是很高的,一不留神就把服务器上的数据全部给分没有了。所以在你执行分区操作的时候,请保持百分之二百的细心,切记切记
@格式化磁盘分区
命令 : mke2fs, mkfs.ext2, mkfs.ext3, mkfs.ext4
当用man查询这四个命令的帮助文档时,你会发现我们看到了同一个帮助文档,这说明四个命令是一样的。mke2fs常用的选项有:
‘-b’ 分区时设定每个数据区块占用空间大小,目前支持1024, 2048 以及4096 bytes每个块。
‘-i’ 设定inode的大小
‘-N’ 设定inode数量,有时使用默认的inode数不够用,所以要自定设定inode数量。
‘-c’ 在格式化前先检测一下磁盘是否有问题,加上这个选项后会非常慢
‘-L’ 预设该分区的标签label
‘-j’ 建立ext3格式的分区,如果使用mkfs.ext3 就不用加这个选项了
‘-t’ 用来指定什么类型的文件系统,可以是ext2, ext3 也可以是 ext4.
[root@localhost ~]# mke2fs -t ext4 /dev/sdb5
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
64256 inodes, 257024 blocks
12851 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=264241152
8 block groups
32768 blocks per group, 32768 fragments per group
8032 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
正在写入inode表: 完成
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
指定文件系统格式为ext4, 该命令等同于 mkfs.ext4 /dev/sdb5
. 目前CentOS 6 默认文件系统格式为ext4, 所以以后你遇到需要格式磁盘分区的时候,直接指定格式为ext4即可,但早期的版本CentOS 5 是使用ext3作为默认的文件系统的,所以你可以根据操作系统的版本来决定格式化什么格式的文件系统。在上面的例子中,你是否有注意到一些指标呢?其中一个指标是 “块大小=4096” 这里涉及到一个 “块” 的概念,磁盘在被格式化的时候会预先规定好每一个块的大小,然后再把所有的空间分割成一个一个的小块,存数据的时候也是一个块一个块的去写入。所以如果你的磁盘存的都是特别小特别小的文件,比如说1k或者2k,那么建议在格式化磁盘的时候指定块数值小一点。ext文件系统默认块大小为4096也就是4k. 在格式化的时候,可以指定块大小为1024, 2048, 4096(它们是成倍增加的),虽然格式化的时候可以指定块大小超过4096,但是一旦超过4096则不能正常挂载,如何指定块大小?
[root@localhost ~]# mke2fs -t ext4 -b 8192 /dev/sdb5
Warning: blocksize 8192 not usable on most systems.
mke2fs 1.41.12 (17-May-2010)
mke2fs: 8192-byte blocks too big for system (max 4096)
无论如何也要继续? (y,n) y
Warning: 8192-byte blocks too big for system (max 4096), forced to continue
文件系统标签=
操作系统:Linux
块大小=8192 (log=3)
分块大小=8192 (log=3)
Stride=0 blocks, Stripe width=0 blocks
64256 inodes, 128512 blocks
6425 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=134201344
2 block groups
65528 blocks per group, 65528 fragments per group
32128 inodes per group
Superblock backups stored on blocks:
65528
正在写入inode表: 完成
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
指定块大小为8192会提示,块值设置太大了,我们直接输入 ‘y’ 强制格式化,你还可以尝试指定更大的数字。
[root@localhost ~]# mke2fs -t ext4 -L TEST -b 8192 /dev/sdb5
可以使用 ‘-L’ 来指定标签。标签会在挂载磁盘的时候使用,另外也可以写到配置文件里,稍后阿铭介绍。关于格式化的这一部分,阿铭建议你除非有需求,否则不需要指定块大小,也就是说,你只需要记住这两个选项: ‘-t’ 和 ‘-L’ 即可。
命令 : e2label
用来查看或修改分区的标签,阿铭很少使用,你只要了解一下即可。
[root@localhost ~]# e2label /dev/sdb5
TEST
[root@localhost ~]# e2label /dev/sdb5 TEST123
[root@localhost ~]# e2label /dev/sdb5
TEST123
挂载/卸载磁盘
在上面的内容中讲到了磁盘的分区和格式化,那么格式化完了后,如何去用它呢?这就涉及到了挂载这块磁盘。格式化后的磁盘其实是一个块设备文件,类型为b,也许你会想,既然这个块文件就是那个分区,那么直接在那个文件中写数据不就写到了那个分区中么?当然不行。
在挂载某个分区前需要先建立一个挂载点,这个挂载点是以目录的形式出现的。一旦把某一个分区挂载到了这个挂载点(目录)下,那么再往这个目录写数据使,则都会写到该分区中。这就需要你注意一下,在挂载该分区前,挂载点(目录)下必须是个空目录。其实目录不为空并不影响所挂载分区的使用,但是一旦挂载上了,那么该目录下以前的东西就不能看到了。只有卸载掉该分区后才能看到。
命令 : mount
如果不加任何选项,直接运行 “mount” 命令,会显示如下信息:
[root@localhost ~]# mount
/dev/sda3 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
这个命令可以查看当前系统已经挂载的所有分区,以及分区文件系统的类型,挂载点和一些选项等信息,所以你如果想知道某个分区的文件系统类型直接用该命令查看即可。下面我们先建立一个空目录,然后在目录里建一个空白文档。
[root@localhost ~]# mkdir /newdir
[root@localhost ~]# touch /newdir/newfile.txt
[root@localhost ~]# ls /newdir/newfile.txt
/newdir/newfile.txt
然后把刚才格式化的 /dev/sdb5 挂载到 /newdir 上。
[root@localhost ~]# mount /dev/sdb5 /newdir/
mount: wrong fs type, bad option, bad superblock on /dev/sdb5,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so
不能完成挂载,根据提示可以查看一下错误信息:
[root@localhost ~]# dmesg |tail
eth0: no IPv6 routers present
sdb: sdb1 < sdb5 >
sdb:
sdb: sdb1 < sdb5 sdb6 >
EXT4-fs (sdb5): bad block size 8192
EXT4-fs (sdb5): bad block size 8192
EXT4-fs (sdb5): bad block size 8192
EXT4-fs (sdb5): bad block size 8192
EXT4-fs (sdb5): mounted filesystem with ordered data mode. Opts:
EXT4-fs (sdb5): bad block size 8192
可以看到,我的/dev/sdb5指定的块值8192不合法,所以只能重新格式化磁盘。
[root@localhost ~]# mke2fs -t ext4 -L TEST /dev/sdb5
使用默认块值即可。我们继续挂载sdb5:
[root@localhost ~]# mount /dev/sdb5 /newdir/
[root@localhost ~]# ls /newdir/
lost+found
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda3 14G 1.5G 12G 11% /
tmpfs 160M 0 160M 0% /dev/shm
/dev/sda1 97M 27M 66M 29% /boot
/dev/sdb5 989M 18M 921M 2% /newdir
把 /dev/sdb5 挂载到 /newdir 后,原来在 /newdir 下的 newfile.txt 被覆盖了,通过 df -h
可以看到刚刚挂载的分区,我们也可以使用LABEL的方式挂载分区:
[root@localhost ~]# umount /newdir/
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda3 14G 1.5G 12G 11% /
tmpfs 160M 0 160M 0% /dev/shm
/dev/sda1 97M 27M 66M 29% /boot
[root@localhost ~]# mount LABEL=TEST /newdir
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda3 14G 1.5G 12G 11% /
tmpfs 160M 0 160M 0% /dev/shm
/dev/sda1 97M 27M 66M 29% /boot
/dev/sdb5 989M 18M 921M 2% /newdir
本例中用到了 “umount” 命令,这个是用来卸载磁盘分区的,稍后阿铭介绍。mount 命令常用的选项有:’-a’, ‘-t’, ‘-o’. 在讲 ‘-a’ 选项前,我们有必要先了解一下这个文件 /etc/fstab.
[root@localhost ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue May 7 17:51:27 2013
#
# 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=95297b81-538d-4d96-870a-de90255b74f5 / ext4 defaults 1 1
UUID=a593ff68-2db7-4371-8d8c-d936898e9ac9 /boot ext4 defaults 1 2
UUID=ff042a91-b68f-4d64-9759-050c51dc9e8b 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
这个文件是系统启动时,需要挂载的各个分区。第一列就是分区的标识,可以写分区的LABEL,也可以写分区的UUID(等会阿铭会着重讲一下这个概念),当然也可以写分区名(/dev/sda1);第二列是挂载点;第三列是分区的格式;第四列则是mount的一些挂载参数,等下会详细介绍一下有哪些参数,一般情况下,直接写defaults即可;第五列的数字表示是否被dump备份,是的话这里就是1,否则就是0;第六列是开机时是否自检磁盘。1,2都表示检测,0表示不检测,在Redhat/CentOS中,这个1,2还有个说法,/ 分区必须设为1,而且整个fstab中只允许出现一个1,这里有一个优先级的说法。1比2优先级高,所以先检测1,然后再检测2,如果有多个分区需要开机检测那么都设置成2吧,1检测完了后会同时去检测2。下面该说说第四列中常用到的参数了。
“async/sync” : async表示和磁盘和内存不同步,系统每隔一段时间把内存数据写入磁盘中,而sync则会时时同步内存和磁盘中数据;
“auto/noauto” : 开机自动挂载/不自动挂载;
“default” : 按照大多数永久文件系统的缺省值设置挂载定义,它包含了rw, suid, dev, exec, auto, nouser, async
“ro” : 按只读权限挂载 ;
“rw” : 按可读可写权限挂载 ;
“exec/noexec” : 允许/不允许可执行文件执行,但千万不要把根分区挂载为noexec,那就无法使用系统了,连mount命令都无法使用了,这时只有重新做系统了;
“user/nouser” : 允许/不允许root外的其他用户挂载分区,为了安全考虑,请用nouser ;
“suid/nosuid” : 允许/不允许分区有suid属性,一般设置nosuid ;
“usrquota” : 启动使用者磁盘配额模式,磁盘配额相关内容在后续章节会做介绍;
“grquota” : 启动群组磁盘配额模式;
学完这个/etc/fstab后,我们就可以自己修改这个文件,增加一行来挂载新增分区。例如,阿铭增加了这样一行:
LABEL=TEST /newdir ext4 defaults 0 0
然后卸载掉刚才我们已经挂载的/dev/sdb5
[root@localhost ~]# umount /dev/sdb5
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda3 14G 1.5G 12G 11% /
tmpfs 160M 0 160M 0% /dev/shm
/dev/sda1 97M 27M 66M 29% /boot
使用 df -h
查看已经成功卸载 /dev/sdb5 下面执行命令 mount -a
[root@localhost ~]# mount -a
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda3 14G 1.5G 12G 11% /
tmpfs 160M 0 160M 0% /dev/shm
/dev/sda1 97M 27M 66M 29% /boot
/dev/sdb5 989M 18M 921M 2% /newdir
此时,多出来一个 /dev/sdb5 挂载到了 /newfir 下。这就是 mount -a
命令执行的结果,这个 ‘-a’ 选项会把/etc/fstab中出现的所有磁盘分区挂载上。
[root@localhost ~]# umount /newdir
[root@localhost ~]# mount -t ext4 /dev/sdb5 /newdir
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda3 14G 1.5G 12G 11% /
tmpfs 160M 0 160M 0% /dev/shm
/dev/sda1 97M 27M 66M 29% /boot
/dev/sdb5 989M 18M 921M 2% /newdir
‘-t’ 选项用来指定挂载的分区类型,默认不指定会自动识别。
‘-o’ 选项用来指定挂载的分区有哪些特性,即上面 “/etc/fatab” 配置文件中第四列的那些。阿铭经常这样使用这个 ‘-o’ 选项:
[root@localhost ~]# mkdir /newdir/dir1
[root@localhost ~]# mount -o remount,ro,sync,noauto /dev/sdb5 /newdir
[root@localhost ~]# mkdir /newdir/dir2
mkdir: 无法创建目录 "/newdir/dir2": 只读文件系统
由于指定了 ‘ro’ 参数,所以该分区只读了。通过 mount
命令也可以看到 /dev/sdb5 有 ‘ro’ 选项
[root@localhost ~]# mount
/dev/sda3 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/sdb5 on /newdir type ext4 (ro,sync)
下面阿铭重新挂载,让它恢复读写。
[root@localhost ~]# mount -o remount /dev/sdb5 /newdir
[root@localhost ~]# mkdir /newdir/dir2
[root@localhost ~]# ls /newdir/
dir1 dir2 lost+found
命令 : blkid
阿铭在日常的运维工作中遇到过这样的情况,一台服务器上新装了两块磁盘,磁盘a(在服务器上显示为sdc)和磁盘b(在服务器上显示为sdd),有一次把这两块磁盘都拔掉了,然后再重新插上,重启机器,结果磁盘编号调换了,a变成了sdd,b变成了sdc(这是因为把磁盘插错了插槽),问题来了。通过上边的学习,你挂载磁盘是通过/dev/hdb1 这样的分区名字来挂载的,如果先前加入到了/etc/fstab 中,结果系统启动后则会挂载错分区。那么怎么样避免这样的情况发生?
这就用到了UUID,可以通过 blkid
命令获取各分区的UUID:
/dev/sda1: UUID="a593ff68-2db7-4371-8d8c-d936898e9ac9" TYPE="ext4"
/dev/sda2: UUID="ff042a91-b68f-4d64-9759-050c51dc9e8b" TYPE="swap"
/dev/sda3: UUID="95297b81-538d-4d96-870a-de90255b74f5" TYPE="ext4"
/dev/sdb5: LABEL="TEST" UUID="c61117ca-9176-4d0b-be4d-1b0f434359a7" TYPE="ext4"
/dev/sdb6: UUID="c271cb5a-cb46-42f4-9eb4-d2b1a5028e18" SEC_TYPE="ext2" TYPE="ext3"
这样可以获得全部磁盘分区的UUID,如果格式化的时候指定了 LABEL 则该命令也会显示LABEL值,甚至连文件系统类型也会显示。当然这个命令后面也可以指定哪个分区:
[root@localhost ~]# blkid /dev/sdb5
/dev/sdb5: LABEL="TEST" UUID="c61117ca-9176-4d0b-be4d-1b0f434359a7" TYPE="ext4"
获得UUID后,如何使用它呢?
[root@localhost ~]# umount /newdir
[root@localhost ~]# mount UUID="c61117ca-9176-4d0b-be4d-1b0f434359a7" /newdir
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda3 14G 1.5G 12G 11% /
tmpfs 160M 0 160M 0% /dev/shm
/dev/sda1 97M 27M 66M 29% /boot
/dev/sdb5 989M 18M 921M 2% /newdir
也可以把下面这行写到 /etc/fstab 中
UUID=c61117ca-9176-4d0b-be4d-1b0f434359a7 /newdir ext4 defaults 0 0
如果想让某个分区开机后就自动挂载,有两个办法可以实现:
- 在 /etc/fstab 中添加一行,如上例中那行;
- 把挂载命令写到 /etc/rc.d/rc.local 文件中去,阿铭会经常把想要开机启动的命令加到这个文件中。系统启动完后会执行这个文件中的命令,所以只要你想开机后运行什么命令统统写入到这个文件下面吧,直接放到最后面即可,阿铭把挂载的命令放到该文件的最后一行了:
[root@localhost ~]# cat /etc/rc.d/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
mount UUID="c61117ca-9176-4d0b-be4d-1b0f434359a7" /newdir
以上两种方法,任选其一,阿铭介绍第二种方法其实也是教给你一个小知识,如何让一些操作行为随系统启动而自动执行。另外,阿铭需要给你一个小建议,那就是挂载磁盘分区的时候,尽量使用UUID或者LABEL这两种方法。
命令 : umount
在上面的小实验中,阿铭多次用到这个命令,这个命令也简单的很,后边可以跟挂载点,也可以跟分区名(/dev/hdb1), 但是不可以跟LABEL和UUID.
[root@localhost ~]# umount /dev/sdb5
[root@localhost ~]# mount UUID="c61117ca-9176-4d0b-be4d-1b0f434359a7" /newdir
[root@localhost ~]# umount /newdir
[root@localhost ~]# mount UUID="c61117ca-9176-4d0b-be4d-1b0f434359a7" /newdir
umount 命令有一个非常有用的选项那就是 ‘-l’, 有时候你会遇到不能卸载的情况:
[root@localhost newdir]# umount /newdir
umount: /newdir: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
这是因为当前目录为要卸载的分区上,解决办法有两种,一是到其他目录,二是使用 ‘-l’ 选项:
[root@localhost newdir]# umount -l /newdir
[root@localhost newdir]# df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda3 14G 1.5G 12G 11% /
tmpfs 160M 0 160M 0% /dev/shm
/dev/sda1 97M 27M 66M 29% /boot
@建立一个swap文件增加虚拟内存
从装系统时就接触过这个swap了,它类似与windows的虚拟内存,分区的时候一般大小为内存的2倍,如果你的内存超过8G,那么你分16G似乎是没有必要了。分16G足够日常交换了。然而,还会有虚拟内存不够用的情况发生。如果真遇到了,莫非还要重新给磁盘分区?当然不能,那我们就增加一个虚拟的磁盘出来。基本的思路就是:建立swapfile -> 格式化为swap格式 -> 启用该虚拟磁盘。
[root@localhost ~]# dd if=/dev/zero of=/tmp/newdisk bs=4k count=102400
记录了102400+0 的读入
记录了102400+0 的写出
419430400字节(419 MB)已复制,2.59193 秒,162 MB/秒
“dd” 这个命令阿铭经常用到,所以请你也要掌握它的使用方法,其实也不难,用 “if” 指定源,基本上除了 “/dev/zero” 外基本上不会写别的,而/dev/zero 是UNIX系统特有的一个文件,它可以提供源源不断的 “0”, 关于它的其他信息请你在网上查一下资料。 “of” 指定目标文件, “bs” 定义块的大小, “count” 定义块的数量,这两个参数的多少决定了目标文件的大小,目标文件大小 = bs x count. 阿铭用dd建了一个大小为400M的文件,然后格式化成swap格式:
[root@localhost ~]# mkswap -f /tmp/newdisk
Setting up swapspace version 1, size = 409596 KiB
no label, UUID=29832cab-04b9-4083-a667-9a5795a5d490
格式化完后,就可以挂载上使用了:
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 318 314 4 0 5 278
-/+ buffers/cache: 30 288
Swap: 2047 0 2047
[root@localhost ~]# swapon /tmp/newdisk
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 318 314 4 0 5 278
-/+ buffers/cache: 31 287
Swap: 2447 0 2447
前后对比swap分区多了400M空间。其中 “free” 这个命令用来查看内存使用情况, “-m” 表示以M为单位显示,阿铭会在后面介绍该命令。
磁盘配额
磁盘配合其实就是给每个用户分配一定的磁盘额度,只允许他使用这个额度范围内的磁盘空间。在linux系统中,是多用户多任务的环境,所以会有很多人共用一个磁盘的情况。针对每个用户去限定一定量的磁盘空间是有必要的,这样才显得公平。随着硬件成本的降低,服务器上的磁盘资源似乎不再刻意的去限制了,所以磁盘配额也就可有可无了,但是你也需要了解一下这部分内容,用到时必须会操作。
在linux中,用来管理磁盘配额的东西就是quota了。如果你的linux上没有quota,则需要你安装这个软件包 quota-3.13-5.el5.RPM (其实版本是多少无所谓了,关键是这个软件包)。quota在实际应用中是针对整个分区进行限制的。比如,如果我们限制了/dev/sdb1这个分区,而/dev/sdb1 是挂载在/home 目录下的,那么/home 所有目录都会受到限制。
quota 这个模块主要分为quota quotacheck quotaoff quotaon quotastats edquota setquota warnquota repquota这几个命令,下面就分别介绍这些命令。
命令 : quota
“quota” 用来显示某个组或者某个使用者的限额。
语法:quota [-guvs] [user,group]
“-g” 显示某个组的限额
“-u” 显示某个用户的限额
“-v” 显示的意思
“-s” 选择inod或硬盘空间来显示
命令 : quotacheck
“quotacheck” 用来扫描某一个磁盘的quota空间。
语法:quotacheck [-auvg] /path
“-a” 扫描所有已经mount的具有quota支持的磁盘
“-u” 扫描某个使用者的文件以及目录
“-g” 扫描某个组的文件以及目录
“-v” 显示扫描过程
“-m” 强制进行扫描
命令 : edquota
“edquota” 用来编辑某个用户或者组的quota值。
语法:edquota [-u user] [-g group] [-t]
“-u” 编辑某个用户的quota
“-g” 编辑某个组的quota
“-t” 编辑宽限时间
“-p” 拷贝某个用户或组的quota到另一个用户或组
当运行 edquota -u user
时,系统会打开一个文件,你会看到这个文件中有7列,它们分别代表的含义是:
“Filesystem” 磁盘分区,如/dev/sdb5
“blocks” 当前用户在当前的Filesystem中所占用的磁盘容量,单位是Kb。该值请不要修改。
“soft/hard” 当前用户在该Filesystem内的quota值,soft指的是最低限额,可以超过这个值,但必须要在宽限时间内将磁盘容量降低到这个值以下。hard指的是最高限额,即不能超过这个值。当用户的磁盘使用量高于soft值时,系统会警告用户,提示其要在宽限时间内把使用空间降低到soft值之下。
“inodes” 目前使用掉的inode的状态,不用修改。
命令 : quotaon
“quotaon” 用来启动quota,在编辑好quota后,需要启动才能是quota生效
语法:quotaon [-a] [-uvg directory]
“-a” 全部设定的quota启动
“-u” 启动某个用户的quota
“-g” 启动某个组的quota
“-s” 显示相关信息
命令 : quotaoff
“quotaoff” 用来关闭quota, 该命令常用只有一种情况 quotaoff -a
关闭全部的quota.
以上讲了很多quota的相关命令,那么接下来阿铭教你如何在实践应用中去做这个磁盘配额。整个执行过程如下:
首先先确认一下,你的/home目录是不是单独的挂载在一个分区下,用df 查看即可。如果不是则需要你跟我一起做。否则这一步即可省略。
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda3 14347632 1899376 11719424 14% /
tmpfs 163308 0 163308 0% /dev/shm
/dev/sda1 99150 26808 67222 29% /boot
阿铭的linux系统中,/home并没有单独占用一个分区。所以需要把/home目录挂载在一个单独的分区下,因为quota是针对分区来限额的。下面阿铭把 /dev/sdb5 挂载到/home 目录下, 编辑 /etc/fstab 把刚才添加的那行修改为:
UUID=c61117ca-9176-4d0b-be4d-1b0f434359a7 /home ext4 defaults 0 0
保存 /etc/fstab 后,运行 mount -a
命令挂载全部的分区。
[root@localhost ~]# mount -a
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda3 14G 1.9G 12G 14% /
tmpfs 160M 0 160M 0% /dev/shm
/dev/sda1 97M 27M 66M 29% /boot
/dev/sdb5 989M 18M 921M 2% /home
此时的 /home 为一个单独分区了。
- 建立测试账户
首先建立一个test用户,则同时建立了一个test组。其中uid和gid都为511 ,然后又建立一个test1账号,使其加入test组,查看/etc/passwd文件发现test和test1用户的gid都为511.
[root@localhost ~]# useradd test
[root@localhost ~]# grep test /etc/passwd
test:x:511:511::/home/test:/bin/bash
[root@localhost ~]# useradd -g 511 test1
[root@localhost ~]# grep test1 /etc/passwd
test1:x:512:511::/home/test1:/bin/bash
- 打开磁盘的quota功能
默认linux并没有对任何分区做quota的支持,所以需要我们手动打开磁盘的quota功能,你是否记得,在前面内容中分析/etc/fstab文件的第四列时讲过这个quota选项(usrquota, grpquota),没错,要想打开这个磁盘的quota支持就是需要修改这个第四列的。用vi编辑/etc/fstab 编辑刚才加的那一行,如下:
UUID=c61117ca-9176-4d0b-be4d-1b0f434359a7 /home ext4 defaults,usrquota,grpquota 0 0
保存 /etc/fstab 后,重新挂载/home分区。
[root@localhost ~]# umount /home/
[root@localhost ~]# mount -a
[root@localhost ~]# mount
/dev/sda3 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/sdb5 on /home type ext4 (rw,usrquota,grpquota)
使用 mount
命令可以查看到 /home 分区已经加上了 “usrquota,grpquota” 两个配额相关的参数。
- 扫描磁盘的使用者使用状况,并产生重要的aquota.group与aquota.user
这一步就需要用到quotacheck了,aquota.group与aqouta.user分别是组以及用户磁盘配额需要的配置文件。如果没有这两个文件,则磁盘配额是不会生效的。
[root@localhost ~]# quotacheck -augv
可能会有一些错误信息,不要管它。看一看你的/home分区下是否多了两个文件(aquota.group, aquota.user)
[root@localhost ~]# ll /home/
总用量 44
-rw------- 1 root root 7168 5月 12 02:07 aquota.group
-rw------- 1 root root 8192 5月 12 02:07 aquota.user
drwxr-xr-x 2 root root 4096 5月 12 00:11 dir1
drwx------ 2 root root 16384 5月 11 23:18 lost+found
drwx------ 3 test test 4096 5月 12 01:59 test
drwx------ 3 test1 test 4096 5月 12 02:00 test1
如果有了,则可以进入下一步了。
- 启动quota配额
[root@localhost ~]# quotaon -av
/dev/sdb5 [/home]: group quotas turned on
/dev/sdb5 [/home]: user quotas turned on
- 编辑用户磁盘配额
先来设定test账户的配额,然后直接把test的配额拷贝给test1即可。这里就需要用到edquota了。
[root@localhost ~]# edquota -u test
将下面内容
/dev/sdb5 20 0 0 5 0 0
修改为:
/dev/sdb5 20 20000 30000 5 0 0
其中单位是Kb,所以soft 值大约为20Mb,hard值为30Mb,保存这个文件,保存的方式跟vi一个文件的方式一样的。下面将test的配额复制给test1.
[root@localhost ~]# edquota -p test test1
下面继续设定宽限时间:
[root@localhost ~]# edquota -t
将7days 改为 1days
/dev/sdb5 1days 1days
下面查看一下test以及test1用户的配额吧。
[root@localhost ~]# quota -uv test test1
Disk quotas for user test (uid 511):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdb5 20 20000 30000 5 0 0
Disk quotas for user test1 (uid 512):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdb5 20 20000 30000 5 0 0
- 编辑组磁盘配额
[root@localhost ~]# edquota -g test
修改为:
/dev/sdb5 40 40000 50000 10 0 0
设定组test的soft配额值为40M,hard值为50M。下面查看组test的配额。
[root@localhost ~]# quota -gv test
Disk quotas for group test (gid 511):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdb5 40 40000 50000 10 0 0
- 设定开机启动
前面已经讲到启动磁盘配额的命令是 quotaon -aug
所以要想开机启动,只需将这条命令加入到 /etc/rc.d/rc.local文件即可。
[root@localhost ~]# echo "quotaon -aug" >> /etc/rc.d/rc.local
@vim
vi 和vim最大的区别就是编辑一个文本时,vi不会显示颜色,而vim会显示颜色。显示颜色更易于用户进行编辑。其他功能没有什么区别。所以在linux系统下,使用vi还是vim完全取决你的个人爱好而已。阿铭从一开始学linux就一直使用vim,所以也会一直以vim的角色来教授给你。
也许你刚刚安装的CentOS系统上没有这个命令,请这样安装它 yum install -y vim-enhanced
vim的三种模式:一般模式、编辑模式、命令模式。这需要你牢记的,因为以前阿铭刚刚从事linux工作的时候去面试,很多单位的笔试题就有这个知识点。
- 一般模式: 当你vim filename 编辑一个文件时,一进入该文件就是一般模式了。在这个模式下,你可以做的操作有,上下移动光标;删除某个字符;删除某行;复制、粘贴一行或者多行。
- 编辑模式:一般模式下,是不可以修改某一个字符的,只能到编辑模式了。从一般模式进入编辑模式,只需你按一个键即可(i, I, a, A, o, O, r, R)。当进入编辑模式时,会在屏幕的最下一行出现“INSERT或REPLACE”的字样。从编辑模式回到一般模式只需要按一下键盘左上方的ESC键即可。
- 命令模式:在一般模式下,输入 ”:” 或者 “/” 即可进入命令模式。在该模式下,你可以搜索某个字符或者字符串,也可以保存、替换、退出、显示行号等等。
下面阿铭教你如何在一个空白文档中写入一段文字,然后保存。
[root@localhost ~]# vim test.txt
输入vim test.txt直接回车进入一般模式。然后按 “i” 字母进入编辑模式,在窗口的左下角会显示 “– 插入 –” 或者 “– INSERT –” 这说明进入插入模式,可以编辑文档。下面阿铭随便写一段文字:
This is a test file.
And this is the first time to using "vim".
It's easy to use "vim".
I like to using it, do you like it?
如果你编辑完了,想保存的话,需要先按一下键盘左上角的 “Esc” 键,此时 “– 插入 –” 或者 “– INSERT –” 消失,然后输入 ”:wq” 回车就会保存刚才的文字了。
This is a test file.
And this is the first time to using "vim".
It's easy to use "vim".
I like to using it, do you like it?
~
~
:wq
这时,看一下test.txt文档的内容吧:
[root@localhost ~]# cat test.txt
This is a test file.
And this is the first time to using "vim".
It's easy to use "vim".
I like to using it, do you like it?
其实 “vim” 为全键盘操作的编辑器,所以在各个模式下都有很多功能键。下面列举一下,其中阿铭认为常用的会用红色标出,需要你多加练习,另外不常用的你也需要知道。
暂时就讲这么多了。如果你能全部掌握,那你一定是vim高手啦。如果你觉得太多,只要记住阿铭标红部分即可,其他的用时再过来查就ok啦。下面阿铭给你留一个小作业,希望你能认真完成!
- 请把/etc/init.d/iptables 复制到/root/目录下,并重命名为test.txt
- 用vim打开test.txt并设置行号
- 分别向下、向右、向左、向右移动5个字符
- 分别向下、向上翻两页
- 把光标移动到第49行
- 让光标移动到行末,再移动到行首
- 移动到test.txt文件的最后一行
- 移动到文件的首行
- 搜索文件中出现的 iptables 并数一下一共出现多少个
- 把从第一行到第三行出现的iptables 替换成iptable
- 还原上一步操作
- 把整个文件中所有的iptables替换成iptable
- 把光标移动到25行,删除字符 “$”
- 还原上一步操作
- 删除第50行
- 还原上一步操作
- 删除从37行到42行的所有内容
- 还原上一步操作
- 复制48行并粘贴到52行下面
- 还原上一步操作(按两次u)
- 复制从37行到42行的内容并粘贴到44行上面
- 还原上一步操作(按两次u)
- 把37行到42行的内容移动到19行下面
- 还原上一步操作(按两次u)
- 光标移动到首行,把/bin/sh 改成 /bin/bash
- 在第一行下面插入新的一行,并输入”# Hello!”
- 保存文档并退出