linux ln命令详解
今天,查看服务器资源的时候,发现服务器上有一个挂在盘满了,可用磁盘为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
后,软链接文件不能正常读取数据,但是硬链接文件可以正常使用,并且数据保持同步。当重命名文件改成源文件名后,软链接与硬链接都有效,且数据保持同步。
更多推荐
所有评论(0)