今天,查看服务器资源的时候,发现服务器上有一个挂在盘满了,可用磁盘为0。按照以往操作,先找找看哪些文件比较占用磁盘空间,将一些无用的文件删除,释放磁盘空间。不幸的是,最占资源的竟然是mysql数据库。这就尴尬了,数据库的数据可不能随便乱删。再看了一眼,挂载盘空间,发现某个挂载盘空间比较充足。瞬间,计上心头——利用ln命令,创建链接。

ln命令的功能是为某一个文件在另外一个位置建立一个同步的链接。

软链接 与 硬链接 的异同

软链接可以跨文件系统 ,硬链接不可以
[root@localhost test_ln]# df -lh
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        18G   12G  5.2G  70% /
tmpfs           931M  224K  931M   1% /dev/shm
/dev/sda1       291M   39M  238M  14% /boot
[root@localhost test_ln]# cd /
[root@localhost /]# touch ln.txt
[root@localhost /]# ln -s /ln.txt /boot/ln_1.txt
[root@localhost /]# ls -l /boot/ln_1.txt 
lrwxrwxrwx. 1 root root 7 May  9 23:58 /boot/ln_1.txt -> /ln.txt
[root@localhost /]# ln -d /ln.txt /boot/ln_2.txt
ln: creating hard link `/boot/ln_2.txt' => `/ln.txt': Invalid cross-device link

上述代码中,在文件系统/dev/sda2创建了一个ln.txt文件,想要创建链接到文件系统/dev/sda1中,发现使用ln -s /ln.txt /boot/ln_1.txt可以创建软连接成功,而不能使用ln -d /ln.txt /boot/ln_2.txt创建硬链接成功。但是可以在同一系统中,创建硬链接成功,如下:

[root@localhost /]# ls -l /ln_2.txt
ls: cannot access /ln_2.txt: No such file or directory
[root@localhost /]# ln -d /ln.txt /ln_2.txt
[root@localhost /]# ls -l /ln_2.txt 
-rw-r--r--. 2 root root 0 May  9 23:57 /ln_2.txt
软链接可以对一个不存在的文件名进行链接,而硬链接不允许
[root@localhost /]# ls -l /ln2019.txt
ls: cannot access /ln2019.txt: No such file or directory
[root@localhost /]# ln -s /ln2019.txt ln2019-2.txt
[root@localhost /]# ln -d /ln2019.txt ln2019-3.txt
ln: accessing `/ln2019.txt': No such file or directory

如上,给不存在的文件/ln2019.txt创建软链接是可以成功,而硬链接不行。

软链接可以对目录进行链接,而硬链接不可以
[root@localhost /]# ls -l ln2019
ls: cannot access ln2019: No such file or directory
[root@localhost /]# mkdri ln2019
bash: mkdri: command not found
[root@localhost /]# mkdir ln2019
[root@localhost /]# ls -l /ln2019
total 0
[root@localhost /]# ln -s /ln2019 /2019-2
[root@localhost /]# ll -l /2019-2
lrwxrwxrwx. 1 root root 7 May 10 00:07 /2019-2 -> /ln2019
[root@localhost /]# ln -d /ln2019 /ln2019-3
ln: creating hard link `/ln2019-3' => `/ln2019': Operation not permitted

如上,软链接可以给目录创建,但是硬链接不允许。

软链接与硬链接的占用磁盘空间情况

软链接,相当于创建了一个快捷方式;而硬链接,以文件副本的形式存在,但不占用实际空间。
通俗的说,软链接,链接源文件没有了,链接文件相当于找不到家了,无法正常使用;而硬链接由于是以副本形式存在,链接源文件没有了,仍旧可以正常使用。

[root@localhost test_ln]# du -h --max-depth=1
6.2G	.
[root@localhost test_ln]# ls -lh ping.log
-rw-r--r--. 1 root root 3.4G May 10 02:00 ping.log
[root@localhost test_ln]# ln -s ping.log ping22.log
[root@localhost test_ln]# ln -d ping.log ping23.log
[root@localhost test_ln]# ls -lh ping*
lrwxrwxrwx. 1 root root    8 May 10 02:03 ping22.log -> ping.log
-rw-r--r--. 2 root root 3.4G May 10 02:00 ping23.log
-rw-r--r--. 2 root root 3.4G May 10 02:00 ping.log
-rw-r--r--. 1 root root 2.9G May 10 02:00 ping_tmp.log
[root@localhost test_ln]# du -h --max-depth=1
6.2G	.
[root@localhost test_ln]# head -n 5 ping.log ping22.log ping23.log 
==> ping.log <==
PING 192.168.153.1 (192.168.153.1) 56(84) bytes of data.
64 bytes from 192.168.153.1: icmp_seq=1 ttl=128 time=0.395 ms
64 bytes from 192.168.153.1: icmp_seq=2 ttl=128 time=0.329 ms
64 bytes from 192.168.153.1: icmp_seq=3 ttl=128 time=0.253 ms
64 bytes from 192.168.153.1: icmp_seq=4 ttl=128 time=0.271 ms

==> ping22.log <==
PING 192.168.153.1 (192.168.153.1) 56(84) bytes of data.
64 bytes from 192.168.153.1: icmp_seq=1 ttl=128 time=0.395 ms
64 bytes from 192.168.153.1: icmp_seq=2 ttl=128 time=0.329 ms
64 bytes from 192.168.153.1: icmp_seq=3 ttl=128 time=0.253 ms
64 bytes from 192.168.153.1: icmp_seq=4 ttl=128 time=0.271 ms

==> ping23.log <==
PING 192.168.153.1 (192.168.153.1) 56(84) bytes of data.
64 bytes from 192.168.153.1: icmp_seq=1 ttl=128 time=0.395 ms
64 bytes from 192.168.153.1: icmp_seq=2 ttl=128 time=0.329 ms
64 bytes from 192.168.153.1: icmp_seq=3 ttl=128 time=0.253 ms
64 bytes from 192.168.153.1: icmp_seq=4 ttl=128 time=0.271 ms
[root@localhost test_ln]# rm -f ping.log
[root@localhost test_ln]# du -h --max-depth=1
6.2G	.
[root@localhost test_ln]# rm -f ping22.log 
[root@localhost test_ln]# du -h --max-depth=1
6.2G	.
[root@localhost test_ln]# rm -f ping23.log 
[root@localhost test_ln]# du -h --max-depth=1
2.9G	.

如上,找了一个3.4G大小的文件ping.log,分别创建了软链接文件ping22.log与硬链接文件ping23.log。通过du -h --max-depth=1命令,查看当前目录占用空间,发现并没有增加空间占用,说明软链接与硬链接都不占用空间(可能不准确,至少从感知上是这样)。接着开始删除文件,先删除源文件ping.log,发现删除后,磁盘占用空间不变。接着删除软链接文件ping22.log,磁盘占用空间不变。最后删除硬链接文件ping23.log,发现磁盘占用空间少了近3.3G。可以推断,当软链接源文件删除后,软链接的快捷方式也就失效,磁盘空间释放。但是当硬链接源文件删除后,磁盘空间占用并不会释放,必须源文件与硬链接文件都删除后,才会释放磁盘空间。

源文件删除
[root@localhost test_ln]# echo "ping.log" > ping.log 
[root@localhost test_ln]# ln -s ping.log ping30.log
[root@localhost test_ln]# ln -d ping.log ping31.log
[root@localhost test_ln]# tail ping.log ping30.log ping31.log 
tail: inotify cannot be used, reverting to polling
==> ping.log <==
ping.log

==> ping30.log <==
ping.log

==> ping31.log <==
ping.log
[root@localhost test_ln]# rm -f ping.log 
[root@localhost test_ln]# tail ping.log ping30.log ping31.log 
tail: inotify cannot be used, reverting to polling
tail: cannot open `ping.log' for reading: No such file or directory
tail: cannot open `ping30.log' for reading: No such file or directory
==> ping31.log <==
ping.log
[root@localhost test_ln]# echo "rewrite to ping.log" > ping.log
[root@localhost test_ln]# tail ping.log ping30.log ping31.log 
tail: inotify cannot be used, reverting to polling
==> ping.log <==
rewrite to ping.log

==> ping30.log <==
rewrite to ping.log

==> ping31.log <==
ping.log

重新创建被删除的源文件ping.log,软链接文件ping30.log恢复链接,且数据同步,链接依旧有效。而硬链接文件ping31.log,则还是之前数据,与最初建立源文件的ping.log数据内容不一致。也就是说,硬链接会在源文件删除后,链接会失效。

源文件移动至其它目录
[root@localhost test_ln]# mv temp/ping.log .
[root@localhost test_ln]# echo "move ping.log back. " >> ping.log
[root@localhost test_ln]# head ping.log
ping.log
move ping.log back. 
[root@localhost test_ln]# tail ping5.log ping6.log
tail: inotify cannot be used, reverting to polling
==> ping5.log <==
ping.log
move ping.log back. 

==> ping6.log <==
ping.log
move ping.log back. 

被移动的源文件,重新移动至原来的目录,软链接与硬链接可以正常读取数据,并且数据是同步的。说明,源文件被移动后,链接关系可在文件移动回来后恢复。但是软链接不能读取,硬链接是可以。既然如此,那么文件被移动后,硬链接是不是一直有效呢?

[root@localhost test_ln]# echo "ping.log" > ping.log
[root@localhost test_ln]# ln -d ping.log ping8.log
[root@localhost test_ln]# mv ping.log temp/
[root@localhost test_ln]# head ping8.log
ping.log
[root@localhost test_ln]# echo "ping.log move to temp directory" >> temp/ping.log 
[root@localhost test_ln]# tail temp/ping.log ping8.log
==> temp/ping.log <==
ping.log
ping.log move to temp directory

==> ping8.log <==
ping.log
ping.log move to temp directory

事实证明:软链接与硬链接的源文件被移动后,链接并没有失效。此时,软链接由于是一个“快捷方式”,找不到文件而无法正常使用,而硬链接是有一个副本,源文件并没有丢失,仍可正常使用,并且数据正常同步。当文件移回原目录时,软链接与硬链接都正常。

源文件重命名
[root@localhost test_ln]# echo "ping.log" > ping.log
[root@localhost test_ln]# ln -s ping.log ping20.log
[root@localhost test_ln]# ln -d ping.log ping21.log
[root@localhost test_ln]# tail ping.log ping20.log ping21.log 
tail: inotify cannot be used, reverting to polling
==> ping.log <==
ping.log

==> ping20.log <==
ping.log

==> ping21.log <==
ping.log
[root@localhost test_ln]# mv ping.log ping_new.log
[root@localhost test_ln]# tail ping_new.log ping20.log ping21.log 
tail: inotify cannot be used, reverting to polling
==> ping_new.log <==
ping.log
tail: cannot open `ping20.log' for reading: No such file or directory

==> ping21.log <==
ping.log
[root@localhost test_ln]# echo "ping.log rename to ping_new.log">>ping_new.log 
[root@localhost test_ln]# tail ping_new.log ping20.log ping21.log 
tail: inotify cannot be used, reverting to polling
==> ping_new.log <==
ping.log
ping.log rename to ping_new.log
tail: cannot open `ping20.log' for reading: No such file or directory

==> ping21.log <==
ping.log
ping.log rename to ping_new.log


[root@localhost test_ln]# mv ping_new.log ping.log
[root@localhost test_ln]# tail ping_new.log ping20.log ping21.log 
tail: inotify cannot be used, reverting to polling
tail: cannot open `ping_new.log' for reading: No such file or directory
==> ping20.log <==
ping.log
ping.log rename to ping_new.log

==> ping21.log <==
ping.log
ping.log rename to ping_new.log
[root@localhost test_ln]# echo "rename back" >> ping.log 
[root@localhost test_ln]# tail ping_new.log ping20.log ping21.log 
tail: inotify cannot be used, reverting to polling
tail: cannot open `ping_new.log' for reading: No such file or directory
==> ping20.log <==
ping.log
ping.log rename to ping_new.log
rename back

==> ping21.log <==
ping.log
ping.log rename to ping_new.log
rename back

如上,软链接文件ping20.log,硬链接文件ping21.log文件的源文件为ping.log。当重命名源文件为ping_new.log后,软链接文件不能正常读取数据,但是硬链接文件可以正常使用,并且数据保持同步。当重命名文件改成源文件名后,软链接与硬链接都有效,且数据保持同步。

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐