程序员开发实例大全宝库

网站首页 > 编程文章 正文

linux基础20课10,硬链接、linux运行级别 晓桂科技

zazugpt 2024-08-09 12:16:39 编程文章 120 ℃ 0 评论

一. 硬链接(hard link)和软链接(符号链接,Symbolic link)

1. 软链接: 类似windows上的快捷方式

inode:每当创建一个文件和目录的时候,都会为这个文件创建一个innode编号,这些信息都是存放在innode表里

# ll /etc/grub.conf

lrwxrwxrwx 1 root root 22 Mar 27 03:14 /etc/grub.conf -> ../boot/grub/grub.conf

如何查看两个文件内容是否一致?

diff /etc/grub.conf /boot/grub/grub.conf --没有输出表示两文件一样

# md5sum /etc/grub.conf --值一样表示两文件一样

35118be6c622c3973bcb58078fd1aeed /etc/grub.conf

# md5sum /boot/grub/grub.conf

35118be6c622c3973bcb58078fd1aeed /boot/grub/grub.conf

ln - make links between files

# pwd

/test

# touch 1

# ln -s 1 /boot/2 --这样做的/boot/2是一个死链接

# ln -s /test/1 /boot/2 --正确做法使用绝对路径

# ldd /bin/ls

linux-vdso.so.1 => (0x00007fff2c14d000)

libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003d12200000)

librt.so.1 => /lib64/librt.so.1 (0x0000003d11600000)

libcap.so.2 => /lib64/libcap.so.2 (0x0000003d14200000)

libacl.so.1 => /lib64/libacl.so.1 (0x0000003511800000)

libc.so.6 => /lib64/libc.so.6 (0x0000003d10a00000)

libdl.so.2 => /lib64/libdl.so.2 (0x0000003d10600000)

/lib64/ld-linux-x86-64.so.2 (0x0000003d10200000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003d10e00000)

libattr.so.1 => /lib64/libattr.so.1 (0x0000003d1f200000)

如果mv /lib64/libselinux.so.1 /lib64/libselinux.so.1.bak这个库,可以用ln -s 做个软链接回来

如果rm /lib64/libselinux.so.1 -rf 删除了这个库,你可以使用图形的firefox去下载别人的httpd共享(其它的方法基本都行不通)

特点:

1,它会创建一个新的innode编号,相当是一个独立的文件

2,它类似于windows下的快捷方式,访问的时候多了一个中转的过程,最终访问的内容就是它链接的目标文件

3,它可以跨分区创建

4,它可以对目录进行链接

5,如果目标文件删除了,那么链接文件就变成死链接

2. 硬链接(相当于备份)

# touch 1

# ln 1 2

# ll -i

total 4

327367 -rw-r--r-- 2 root root 0 Apr 18 09:56 1

327367 -rw-r--r-- 2 root root 0 Apr 18 09:56 2

# ln 3 /boot/4

ln: creating hard link `/boot/4' to `3': Invalid cross-device link

# ln a b

ln: `a': hard link not allowed for directory

特点:

1,它不会新创建一个innode编号,不代表一个独立的文件

2,它不能跨分区创建

3,它相当于是为文件创建了一个冗余,相当于一个备份

4,不能手工对目录进行硬链接

系统上默认还是有一些目录硬链接的

# pwd

/var/mail

# pwd -P

/var/spool/mail

# ll -id /var/mail/

1705023 drwxrwxr-x. 2 root mail 4096 Jul 18 09:47 /var/mail/

# ll -id /var/spool/mail/

1705023 drwxrwxr-x. 2 root mail 4096 Jul 18 09:47 /var/spool/mail/

# ll -id /etc/init.d/

393312 drwxr-xr-x. 2 root root 4096 Jul 18 16:45 /etc/init.d/

# ll -id /etc/rc.d/init.d/

393312 drwxr-xr-x. 2 root root 4096 Jul 18 16:45 /etc/rc.d/init.d/

# ll -di /etc/httpd/logs/

1835199 drwx------. 2 root root 4096 Jul 15 00:19 /etc/httpd/logs/

# ll -di /var/log/httpd/

1835199 drwx------. 2 root root 4096 Jul 15 00:19 /var/log/httpd/

二. linux运行级别

# vim /etc/inittab

# Default runlevel. The runlevels used by RHS are:

# 0 - halt (Do NOT set initdefault to this) --关机

# 1 - Single user mode --单用户模式

# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)--多用户模式,但没有NFS,没有网络

# 3 - Full multiuser mode --带网络的文本多用户模式,如果3模式没有网络的话就和2模式一样

# 4 - unused --保留

# 5 - X11 --图形模式

# 6 - reboot (Do NOT set initdefault to this) --重启

#

id:5:initdefault: --设定开机后默认的启动级别,不要设成0或者6,如果设成0或者6致命开机不了,在grub的选择界面按E编辑这一次启动进入5模式(临时,只对这次进系统有效),进入后再修改/etc/initab(这是永久生效)

# runlevel --现在是5级别

N 5 --表示第一次的级别为5

使用ctrl+alt+F2切换登录后,再使用runlevel看到还是5级别

# init 3 --用这个命令才能完全切换到3级别

# runlevel

5 3 --表示由5级别切成3级别

切换为3级别后使用ctrl+alt+F1也切换不回来图形了,因为已经是完全的3级别了

在3级别要启动图形startx或gdm,init 5

三. 服务管理

手动启动或关闭服务,与开机自动自动启动服务无关

service httpd start

service httpd stop

service httpd restart

/etc/init.d/httpd restart

/etc/init.d/和/etc/rc.d/init.d 目录下存放的都是服务启动脚本

对于一个服务脚本,一般都有下面两行注释

# chkconfig: - 85 15

- 代表2345级别,如果要自定级别的话在这里可以用数字表示,例如:23

85 代表开机时启动的顺序号为85

15 代表关机时关闭服务的顺序号为15

# description: Apache is a World Wide Web server. It is used to serve \

# HTML files and CGI.

chkconfig - updates and queries runlevel information for system services

# chkconfig --list --查看服务开机在各个级别是否启动

NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off

acpid 0:off 1:off 2:on 3:on 4:on 5:on 6:off

anacron 0:off 1:off 2:on 3:on 4:on 5:on 6:off

apmd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

# chkconfig --list |grep httpd

httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

修改httpd服务开机后不自动启动

# chkconfig httpd off

# chkconfig --list |grep httpd

httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off

修改httpd服务开机后自动启动

# chkconfig httpd on

# chkconfig --list |grep httpd

httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

可以针对特定的级别来设定开机后自动启动或者关闭

# chkconfig httpd off --level 23

# chkconfig --list |grep httpd

httpd 0:off 1:off 2:off 3:off 4:on 5:on 6:off

删除一个服务(--只是chkconfig命令看不到了)

# chkconfig --del httpd

# chkconfig --list |grep httpd

添加一个服务(相对于chkconfig --del)

# chkconfig --add httpd

# chkconfig --list |grep httpd

httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off

如果你自己写了一个服务的启动脚本,如何让它支持chkconfig

有两点要求:1, 服务脚本要存在于/etc/init.d或者是/etc/rc.d/init.d,必须要执行权限

2, 就是要有 # chkconfig:

# description: 这两行

#!/bin/bash

#

# hello say hello

#

# chkconfig: 2345 80 10

# description: say hello to you

#

echo hello

S表示start

K表示kill

K15httpd 和 S85httpd对应chkconfig: - 85 15里的85和15这两个数字

# ls /etc/rc0.d/ 到/etc/rc6.d/里全是软链接,为什么?

答案:因为有0-6多个级别,同一个服务脚本在每个级别里有不同的应用(有些是启动,有些是关闭)。如果对一个服务脚本有修改的需求,得去0-6这七个目录里都修改一次。所以linux设计全部软链接到/etc/init.d/目录,如果要修改只改一次就可以了。

# ntsysv --level 2345

按照当前所学建议只留下haldaemon,messagebus,network,rsyslog,sshd,vmware这六个

特别是haldaemon,messagebus这两个,少一个就会造成开机后鼠标键盘动不了

优化完后,使用下面的命令查出5级别自动开机的服务,确认OK

# chkconfig --list |grep 5:on |awk '{print $1}'

四. 系统开机启动过程

开机-->bios或EFI(配置主板的程序,BIOS=basic input and output system,EFI=Extensible Firmware Interface加电自检,找到启动设备的编号)-->找到mbr(master bootloader record,它是属于硬盘的0磁盘0扇区,硬盘最前的512个节点)-->grub(双系统,选择其一启动)-->通过grub找到vmlinuz和initramfs(驱动硬件)--> 内核启动,产生init进程-->/etc/inittab(确定系统的启动级别)-->/etc/rc.sysinit(获取主机的网络环境和主机类型,测试与载入设备,是否启动selinux,模块的加载,设置系统时间.....)-->/etc/fstab-->按照inittab里的级别来对应的启动/etc/rcX.d/里的服务-->/etc/rc.local-->gdm系统登录

/etc/rc.local --写上你在登录前要自动做的命令或脚本

mount /soft/rhel-server-6.3-x86_64-dvd.iso /yum/ -o loop

# ll /etc/rc5.d/S99local --这是一个软链接,如果这个软链接没了,则你写到/etc/rc.local里的命令也不会生效

lrwxrwxrwx. 1 root root 11 Jul 14 07:26 /etc/rc5.d/S99local -> ../rc.local

让开机后自动关机的方式有很多

1,inittab默认级别改为0

2,/etc/rc.local里加一句init 0

3,在一定要自启动的服务脚本里如/etc/init.d/network里加一句init 0

4, 在环境变量文件如/root/.bash_profile里加init 0

5, 在时间任务里定义一个时间init 0

五. grub

1. grub 就是一个boot loader程序

# rpm -qa |grep grub

grub-0.97-77.el6.x86_64

# rpm -qi grub-0.97-77.el6.x86_64

Summary : Grand Unified Boot Loader.

Description :

GRUB (Grand Unified Boot Loader) is an experimental boot loader

capable of booting into most free operating systems - Linux, FreeBSD,

NetBSD, GNU Mach, and others as well as most commercial operating

systems.

# vim /boot/grub/grub.conf

--如果是使用了efi分区(/boot/efi)的话,路径则在# vim /boot/efi/EFI/redhat/grub.conf

default=0 --默认进第一个系统

timeout=5 --有5秒选择时间,这里可以写负数,指的是一直在等待,一定要用户选择

splashimage=(hd0,0)/grub/splash.xpm.gz --指的是grub界面的图片,hd0是由/boot/grub/device.map来指定

title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64)

root (hd0,0) --boot分区

kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda3 rd_NO_LUKS rd_LVM_LV=vol0/root rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us biosdevname=0 rd_NO_DM.UTF-8 rhgb quiet

initrd /initramfs-2.6.32-279.el6.x86_64.img

rhgb表示redhat graphics boot,就是会看到图片来代替启动过程中显示的文本信息,这些信息在启动后用dmesg也可以看到

quiet表示在启动过程中只有重要信息显示,类似硬件自检的消息不回显示

问题1:假设现在的系统分区情况如下

/dev/sda1 /boot

/dev/sda2 swap

/dev/sda3 /

那么它的启动应该按下面的写法

title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64)

root (hd0,0)

kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda3 rhgb quiet

initrd /initramfs-2.6.32-279.el6.x86_64.img

如果分区情况如下

/dev/sda1 /

/dev/sda2 swap

请问我的grub.conf应该如何写

title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64)

root (hd0,0)

kernel /boot/vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda1 rhgb quiet

initrd /boot/initramfs-2.6.32-279.el6.x86_64.img

问题2:假设我现在的/etc/fstab文件如下

/dev/sda1 /boot ext4 defaults 1 1

/dev/sda2 / ext4 defaults 1 2

/dev/sda3 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

我如果删除了fstab里的第一行,请问重启系统会怎么样?

结果为:启动是grub不受影响,只是系统启动后/dev/sda1分区没有挂载到/boot目录而已.

原因是grub去找vmlinuz和initramfs不是去找/boot目录的,而是去找/dev/sda1的,所以fstab不管怎么改都不会影响grub(而且按启动顺序来讲,fstab在grub之后)

问题3:假设我现在同一个硬盘上装了两个linux(我们称为linux1和linux2),分区情况如下:

/dev/sda1 /boot --第一个系统boot分区

/dev/sda2 / --第一个系统的根

/dev/sda3 swap

/dev/sda4 extended

/dev/sda5 / --第二个系统的根,它没有分boot分区

两个linux到底用的是谁的grub?

在装第二个系统时有一步叫install boot loader on /dev/sda前打勾,那么它会覆盖第一个系统的grub,就会使用第二个系统的grub;如果没有打勾,那就是用的第一系统的grub

如果使用第二个系统的grub,它里面是否能引导第一个系统呢?

如果第一系统是windows,第二个系统是linux,那么默认就可以引导windows

如果第一系统是linux,第二个系统也是linux,默认它没有第一个系统的引导记录,那么如何让它引导第一个系统?

结果就是你自己手动写上第一个系统的引导项就可以了

title linux01

root (hd0,0)

kernel /vmlinux-xxx ro root=/dev/sda2

initrd /initramfs-xxx

title linux02

root (hd0,4)

kernel /boot/vmlinux-xxx ro root=/dev/sda5

initrd /boot/initramfs-xxx

写上第一个系统的引导项后,我就可以引导进入第一个系统,同理也可以在第一个系统里再写上第二个系统的引导项,如果我现在想使用第一个系统的grub,又应该怎么做?

grub-install /dev/sda --这表示把当前系统的grub配置安装到sda的mbr里去覆盖别的系统的grub

制作GRUB开机画面底图splash.xpm.gz

(1)准备一幅图片,要求它的分辨率是640×480(因为grub只支持这个分辨率的图片),将图片格式转成xpm(因为grub只支持这个格式的图片),并且该xpm的图片色深必须是14,此要求用一个命令就可以完成:

# yum install ImageMagick (因为要用到convert工具)

# convert -resize 640x480 -colors 14 123.jpg splash.xpm

上面这句命令是将winner.png 转换成符合要求的图片splash.xpm

(2)我们可以这样检查图片是否符合grub的要求,用命令:

# more splash.xpm

在文件头部如果可以找到这些信息,则说明该图片可以被grub正常显示:

static char *10[] = {

"640 480 14 1",

(3) # gzip -9 splash.xpm

(4) 最后得到splash.xpm.gz,将其放到/boot/grub/路径下,替换掉原图片

2. grub加密码

给grub加密码 (防止别人在启动系统时修改grub进入1级别改你的root密码)

但是你有grub密码,别人还是可以通过rescue模式来进入你的系统)

# grub-md5-crypt --用此命令产生一个密码加密串

Password:

Retype password:

$1$JWQIX/$tYXWeDn3HPj9LYZezTuTI/ --输两次密码就可以产生加密串

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz --在下面加上加密信息,建议加到第一个title的上面就可以了,因为它是锁这句话之后的代码

password --md5 $1$JWQIX/$tYXWeDn3HPj9LYZezTuTI/

title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64)

root (hd0,0)

kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda3 rd_NO_LUKS rd_LVM_LV=vol0/root rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us biosdevname=0 rd_NO_DM.UTF-8 rhgb quiet

initrd /initramfs-2.6.32-279.el6.x86_64.img

3. grub排错

--grub排错引导例子: 注意:做下面实验不要使用lvm,lvm不支持下面这种做法

当grub丢失,或者 grub写的有错误时,进系统时会发现grub文件找不到或者直接到grub>的界面

grub>root (hd0,0) --进到/boot分区

grub>kernel /vmlinuz-xxxxxxx ro root=LABEL=/ --root分区不要写错,label形式或者/dev/sdax形式都可以

grub>initrd /initramfs-xxxxxxxx

grub>boot --boot代表启动

进入系统后,再修改好grub,看需要再grub-install /dev/sda

4. 硬盘安装linux系统

# df -h

/dev/sda6 47G 4.0G 40G 9% /soft

准备下面这些东西,最好都放到一个专门的分区挂载目录,我这里是/dev/sda6

/soft/rhel-server-6.3-x86_64-dvd.iso

/soft/isolinux/

/soft/images/

/soft/vmlinuz

/soft/initrd.img

重启你的操作系统,在grub界面按C键

grub > root (hd0,5)

grub > kernel /vmlinuz

grub > initrd /initrd.img

grub > boot

就会进入装系统的界面,和以前装系统的过程几乎一样,只有一个地方不一样就是有一步它会问你你的安装方式,你选择hard drive,然后再会问你iso的路径,你选择/dev/sda6就可以了

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表