暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

关于Linux命令底层那点事

不背锅运维 2022-05-29
857

Linux操作系统有N多系统内置的命令,用途之广,功能之强悍。但在实际工作中,用来用去的命令无非就那几十个,当对陌生的命令语法、参数不熟悉的时候,可以通过help帮助进行查看,或者进行百度、谷歌。

本篇并不打算去讲那些百度便可查到的各种命令的使用方法、技巧,因为已经烂大街的各种命令就没必要去讲了。既然都烂大街了,还讲锤子呢?干运维的朋友都知道,笔者就不说废话了。本篇讲点别的!


开篇之前,先引蛇出洞

linux命令是存在于文件系统上的一个可执行程序文件,在众多命令中,比如突然出现在笔者脑海里的sed命令,如下可以看到:

[root@mysql8db ~]# which sed
/usr/bin/sed

[root@mysql8db ~]# ls -l /usr/bin/sed
-rwxr-xr-x 1 root root 76072 Apr  1  2020 /usr/bin/sed
[root@mysql8db ~]# 

[root@mysql8db ~]# od /usr/bin/sed | less
0000000 042577 043114 000402 000001 000000 000000 000000 000000
0000020 000002 000076 000001 000000 023422 000100 000000 000000
0000040 000100 000000 000000 000000 020750 000001 000000 000000
0000060 000000 000000 000100 000070 000011 000100 000035 000034
0000100 000006 000000 000005 000000 000100 000000 000000 000000
0000120 000100 000100 000000 000000 000100 000100 000000 000000
0000140 000770 000000 000000 000000 000770 000000 000000 000000
...
...

这条蛇引的好,居然拿sed命令这条蛇先开刀了。


跳过前戏,直奔主题

在这之前先提出一个问题,sed命令的功能,它是怎么起到作用的?

简单剖析

sed命令是Linux操作系统内置、且处于用户空间的一个系统命令。一般来说,系统命令,都是使用C语言编写(Linux操作系统也都是用C语言编写的)。用C语言编写的程序代码区可以看成一个函数的集合,系统命令通过执行一个个函数完成任务。也就是说,sed命令的功能之所以能做到对文件进行各种操作,在sed命令程序代码里,是有调用某些函数的(或者说API)。

进一步剖析

sed命令(也可以说是sed命令的程序),在执行之前其实已经拥有了一个函数列表,它们存在于内核,但需要通过系统调用来完成。系统调用是什么鬼?比如用户想要请求系统打开文件、关闭文件或读写文件,比如笔者在本篇要讲的sed命令程序,它就可以通过文件系统相关的系统调用来做到。再比如,用户想要获得系统时间等,就可以通过时钟相关的系统调用来做到,系统调用是用户级程序访问内核最基本的方法。比如做C开发的程序员,在实际C语言开发中一般是不会直接进行系统调用的,而是通过一些用户编程接口(API)来调用。这些API主要是通过C库(libc)实现,在调用这些函数(API)时,函数内部实际上是在进行系统调用。

上图笔者亲自所画,终于不用特别声明侵网上的版权了。哈哈!

Linux操作系统有300多个以上的系统调用,经过笔者的不断搜索和整理,列出了Linux系统调用表,笔者参考的是下面2个连接:

  • https://filippo.io/linux-syscall-table/
  • https://www.tutorialspoint.com/unix_system_calls/index.htm

希望可以做到抛砖引玉,对其有兴趣的朋友可以通过以上两个链接进行更深入的剖析。

“抄袭”的Linux系统调用表

系统调用号函数名入口点源码文件
0readsys_readfs/read_write.c
1writesys_writefs/read_write.c
2opensys_openfs/open.c
3closesys_closefs/open.c
4statsys_newstatfs/stat.c
5fstatsys_newfstatfs/stat.c
6lstatsys_newlstatfs/stat.c
7pollsys_pollfs/select.c
8lseeksys_lseekfs/read_write.c
9mmapsys_mmaparch/x86/kernel/sys_x86_64.c
10mprotectsys_mprotectmm/mprotect.c
11munmapsys_munmapmm/mmap.c
12brksys_brkmm/mmap.c
13rt_sigactionsys_rt_sigactionkernel/signal.c
14rt_sigprocmasksys_rt_sigprocmaskkernel/signal.c
15rt_sigreturnstub_rt_sigreturnarch/x86/kernel/signal.c
16ioctlsys_ioctlfs/ioctl.c
17pread64sys_pread64fs/read_write.c
18pwrite64sys_pwrite64fs/read_write.c
19readvsys_readvfs/read_write.c
20writevsys_writevfs/read_write.c
21accesssys_accessfs/open.c
22pipesys_pipefs/pipe.c
23selectsys_selectfs/select.c
24sched_yieldsys_sched_yieldkernel/sched/core.c
25mremapsys_mremapmm/mmap.c
26msyncsys_msyncmm/msync.c
27mincoresys_mincoremm/mincore.c
28madvisesys_madvisemm/madvise.c
29shmgetsys_shmgetipc/shm.c
30shmatsys_shmatipc/shm.c
31shmctlsys_shmctlipc/shm.c
32dupsys_dupfs/file.c
33dup2sys_dup2fs/file.c
34pausesys_pausekernel/signal.c
35nanosleepsys_nanosleepkernel/hrtimer.c
36getitimersys_getitimerkernel/itimer.c
37alarmsys_alarmkernel/timer.c
38setitimersys_setitimerkernel/itimer.c
39getpidsys_getpidkernel/sys.c
40sendfilesys_sendfile64fs/read_write.c
41socketsys_socketnet/socket.c
42connectsys_connectnet/socket.c
43acceptsys_acceptnet/socket.c
44sendtosys_sendtonet/socket.c
45recvfromsys_recvfromnet/socket.c
46sendmsgsys_sendmsgnet/socket.c
47recvmsgsys_recvmsgnet/socket.c
48shutdownsys_shutdownnet/socket.c
49bindsys_bindnet/socket.c
50listensys_listennet/socket.c
51getsocknamesys_getsocknamenet/socket.c
52getpeernamesys_getpeernamenet/socket.c
53socketpairsys_socketpairnet/socket.c
54setsockoptsys_setsockoptnet/socket.c
55getsockoptsys_getsockoptnet/socket.c
56clonestub_clonekernel/fork.c
57forkstub_forkkernel/fork.c
58vforkstub_vforkkernel/fork.c
59execvestub_execvefs/exec.c
60exitsys_exitkernel/exit.c
61wait4sys_wait4kernel/exit.c
62killsys_killkernel/signal.c
63unamesys_newunamekernel/sys.c
64semgetsys_semgetipc/sem.c
65semopsys_semopipc/sem.c
66semctlsys_semctlipc/sem.c
67shmdtsys_shmdtipc/shm.c
68msggetsys_msggetipc/msg.c
69msgsndsys_msgsndipc/msg.c
70msgrcvsys_msgrcvipc/msg.c
71msgctlsys_msgctlipc/msg.c
72fcntlsys_fcntlfs/fcntl.c
73flocksys_flockfs/locks.c
74fsyncsys_fsyncfs/sync.c
75fdatasyncsys_fdatasyncfs/sync.c
76truncatesys_truncatefs/open.c
77ftruncatesys_ftruncatefs/open.c
78getdentssys_getdentsfs/readdir.c
79getcwdsys_getcwdfs/dcache.c
80chdirsys_chdirfs/open.c
81fchdirsys_fchdirfs/open.c
82renamesys_renamefs/namei.c
83mkdirsys_mkdirfs/namei.c
84rmdirsys_rmdirfs/namei.c
85creatsys_creatfs/open.c
86linksys_linkfs/namei.c
87unlinksys_unlinkfs/namei.c
88symlinksys_symlinkfs/namei.c
89readlinksys_readlinkfs/stat.c
90chmodsys_chmodfs/open.c
91fchmodsys_fchmodfs/open.c
92chownsys_chownfs/open.c
93fchownsys_fchownfs/open.c
94lchownsys_lchownfs/open.c
95umasksys_umaskkernel/sys.c
96gettimeofdaysys_gettimeofdaykernel/time.c
97getrlimitsys_getrlimitkernel/sys.c
98getrusagesys_getrusagekernel/sys.c
99sysinfosys_sysinfokernel/sys.c
100timessys_timeskernel/sys.c
101ptracesys_ptracekernel/ptrace.c
102getuidsys_getuidkernel/sys.c
103syslogsys_syslogkernel/printk/printk.c
104getgidsys_getgidkernel/sys.c
105setuidsys_setuidkernel/sys.c
106setgidsys_setgidkernel/sys.c
107geteuidsys_geteuidkernel/sys.c
108getegidsys_getegidkernel/sys.c
109setpgidsys_setpgidkernel/sys.c
110getppidsys_getppidkernel/sys.c
111getpgrpsys_getpgrpkernel/sys.c
112setsidsys_setsidkernel/sys.c
113setreuidsys_setreuidkernel/sys.c
114setregidsys_setregidkernel/sys.c
115getgroupssys_getgroupskernel/groups.c
116setgroupssys_setgroupskernel/groups.c
117setresuidsys_setresuidkernel/sys.c
118getresuidsys_getresuidkernel/sys.c
119setresgidsys_setresgidkernel/sys.c
120getresgidsys_getresgidkernel/sys.c
121getpgidsys_getpgidkernel/sys.c
122setfsuidsys_setfsuidkernel/sys.c
123setfsgidsys_setfsgidkernel/sys.c
124getsidsys_getsidkernel/sys.c
125capgetsys_capgetkernel/capability.c
126capsetsys_capsetkernel/capability.c
127rt_sigpendingsys_rt_sigpendingkernel/signal.c
128rt_sigtimedwaitsys_rt_sigtimedwaitkernel/signal.c
129rt_sigqueueinfosys_rt_sigqueueinfokernel/signal.c
130rt_sigsuspendsys_rt_sigsuspendkernel/signal.c
131sigaltstacksys_sigaltstackkernel/signal.c
132utimesys_utimefs/utimes.c
133mknodsys_mknodfs/namei.c
134uselib
fs/exec.c
135personalitysys_personalitykernel/exec_domain.c
136ustatsys_ustatfs/statfs.c
137statfssys_statfsfs/statfs.c
138fstatfssys_fstatfsfs/statfs.c
139sysfssys_sysfsfs/filesystems.c
140getprioritysys_getprioritykernel/sys.c
141setprioritysys_setprioritykernel/sys.c
142sched_setparamsys_sched_setparamkernel/sched/core.c
143sched_getparamsys_sched_getparamkernel/sched/core.c
144sched_setschedulersys_sched_setschedulerkernel/sched/core.c
145sched_getschedulersys_sched_getschedulerkernel/sched/core.c
146sched_get_priority_maxsys_sched_get_priority_maxkernel/sched/core.c
147sched_get_priority_minsys_sched_get_priority_minkernel/sched/core.c
148sched_rr_get_intervalsys_sched_rr_get_intervalkernel/sched/core.c
149mlocksys_mlockmm/mlock.c
150munlocksys_munlockmm/mlock.c
151mlockallsys_mlockallmm/mlock.c
152munlockallsys_munlockallmm/mlock.c
153vhangupsys_vhangupfs/open.c
154modify_ldtsys_modify_ldtarch/x86/um/ldt.c
155pivot_rootsys_pivot_rootfs/namespace.c
156_sysctlsys_sysctlkernel/sysctl_binary.c
157prctlsys_prctlkernel/sys.c
158arch_prctlsys_arch_prctlarch/x86/um/syscalls_64.c
159adjtimexsys_adjtimexkernel/time.c
160setrlimitsys_setrlimitkernel/sys.c
161chrootsys_chrootfs/open.c
162syncsys_syncfs/sync.c
163acctsys_acctkernel/acct.c
164settimeofdaysys_settimeofdaykernel/time.c
165mountsys_mountfs/namespace.c
166umount2sys_umountfs/namespace.c
167swaponsys_swaponmm/swapfile.c
168swapoffsys_swapoffmm/swapfile.c
169rebootsys_rebootkernel/reboot.c
170sethostnamesys_sethostnamekernel/sys.c
171setdomainnamesys_setdomainnamekernel/sys.c
172ioplstub_ioplarch/x86/kernel/ioport.c
173iopermsys_iopermarch/x86/kernel/ioport.c
174create_module
NOT IMPLEMENTED
175init_modulesys_init_modulekernel/module.c
176delete_modulesys_delete_modulekernel/module.c
177get_kernel_syms
NOT IMPLEMENTED
178query_module
NOT IMPLEMENTED
179quotactlsys_quotactlfs/quota/quota.c
180nfsservctl
NOT IMPLEMENTED
181getpmsg
NOT IMPLEMENTED
182putpmsg
NOT IMPLEMENTED
183afs_syscall
NOT IMPLEMENTED
184tuxcall
NOT IMPLEMENTED
185security
NOT IMPLEMENTED
186gettidsys_gettidkernel/sys.c
187readaheadsys_readaheadmm/readahead.c
188setxattrsys_setxattrfs/xattr.c
189lsetxattrsys_lsetxattrfs/xattr.c
190fsetxattrsys_fsetxattrfs/xattr.c
191getxattrsys_getxattrfs/xattr.c
192lgetxattrsys_lgetxattrfs/xattr.c
193fgetxattrsys_fgetxattrfs/xattr.c
194listxattrsys_listxattrfs/xattr.c
195llistxattrsys_llistxattrfs/xattr.c
196flistxattrsys_flistxattrfs/xattr.c
197removexattrsys_removexattrfs/xattr.c
198lremovexattrsys_lremovexattrfs/xattr.c
199fremovexattrsys_fremovexattrfs/xattr.c
200tkillsys_tkillkernel/signal.c
201timesys_timekernel/time.c
202futexsys_futexkernel/futex.c
203sched_setaffinitysys_sched_setaffinitykernel/sched/core.c
204sched_getaffinitysys_sched_getaffinitykernel/sched/core.c
205set_thread_area
arch/x86/kernel/tls.c
206io_setupsys_io_setupfs/aio.c
207io_destroysys_io_destroyfs/aio.c
208io_geteventssys_io_geteventsfs/aio.c
209io_submitsys_io_submitfs/aio.c
210io_cancelsys_io_cancelfs/aio.c
211get_thread_area
arch/x86/kernel/tls.c
212lookup_dcookiesys_lookup_dcookiefs/dcookies.c
213epoll_createsys_epoll_createfs/eventpoll.c
214epoll_ctl_old
NOT IMPLEMENTED
215epoll_wait_old
NOT IMPLEMENTED
216remap_file_pagessys_remap_file_pagesmm/fremap.c
217getdents64sys_getdents64fs/readdir.c
218set_tid_addresssys_set_tid_addresskernel/fork.c
219restart_syscallsys_restart_syscallkernel/signal.c
220semtimedopsys_semtimedopipc/sem.c
221fadvise64sys_fadvise64mm/fadvise.c
222timer_createsys_timer_createkernel/posix-timers.c
223timer_settimesys_timer_settimekernel/posix-timers.c
224timer_gettimesys_timer_gettimekernel/posix-timers.c
225timer_getoverrunsys_timer_getoverrunkernel/posix-timers.c
226timer_deletesys_timer_deletekernel/posix-timers.c
227clock_settimesys_clock_settimekernel/posix-timers.c
228clock_gettimesys_clock_gettimekernel/posix-timers.c
229clock_getressys_clock_getreskernel/posix-timers.c
230clock_nanosleepsys_clock_nanosleepkernel/posix-timers.c
231exit_groupsys_exit_groupkernel/exit.c
232epoll_waitsys_epoll_waitfs/eventpoll.c
233epoll_ctlsys_epoll_ctlfs/eventpoll.c
234tgkillsys_tgkillkernel/signal.c
235utimessys_utimesfs/utimes.c
236vserver
NOT IMPLEMENTED
237mbindsys_mbindmm/mempolicy.c
238set_mempolicysys_set_mempolicymm/mempolicy.c
239get_mempolicysys_get_mempolicymm/mempolicy.c
240mq_opensys_mq_openipc/mqueue.c
241mq_unlinksys_mq_unlinkipc/mqueue.c
242mq_timedsendsys_mq_timedsendipc/mqueue.c
243mq_timedreceivesys_mq_timedreceiveipc/mqueue.c
244mq_notifysys_mq_notifyipc/mqueue.c
245mq_getsetattrsys_mq_getsetattripc/mqueue.c
246kexec_loadsys_kexec_loadkernel/kexec.c
247waitidsys_waitidkernel/exit.c
248add_keysys_add_keysecurity/keys/keyctl.c
249request_keysys_request_keysecurity/keys/keyctl.c
250keyctlsys_keyctlsecurity/keys/keyctl.c
251ioprio_setsys_ioprio_setfs/ioprio.c
252ioprio_getsys_ioprio_getfs/ioprio.c
253inotify_initsys_inotify_initfs/notify/inotify/inotify_user.c
254inotify_add_watchsys_inotify_add_watchfs/notify/inotify/inotify_user.c
255inotify_rm_watchsys_inotify_rm_watchfs/notify/inotify/inotify_user.c
256migrate_pagessys_migrate_pagesmm/mempolicy.c
257openatsys_openatfs/open.c
258mkdiratsys_mkdiratfs/namei.c
259mknodatsys_mknodatfs/namei.c
260fchownatsys_fchownatfs/open.c
261futimesatsys_futimesatfs/utimes.c
262newfstatatsys_newfstatatfs/stat.c
263unlinkatsys_unlinkatfs/namei.c
264renameatsys_renameatfs/namei.c
265linkatsys_linkatfs/namei.c
266symlinkatsys_symlinkatfs/namei.c
267readlinkatsys_readlinkatfs/stat.c
268fchmodatsys_fchmodatfs/open.c
269faccessatsys_faccessatfs/open.c
270pselect6sys_pselect6fs/select.c
271ppollsys_ppollfs/select.c
272unsharesys_unsharekernel/fork.c
273set_robust_listsys_set_robust_listkernel/futex.c
274get_robust_listsys_get_robust_listkernel/futex.c
275splicesys_splicefs/splice.c
276teesys_teefs/splice.c
277sync_file_rangesys_sync_file_rangefs/sync.c
278vmsplicesys_vmsplicefs/splice.c
279move_pagessys_move_pagesmm/migrate.c
280utimensatsys_utimensatfs/utimes.c
281epoll_pwaitsys_epoll_pwaitfs/eventpoll.c
282signalfdsys_signalfdfs/signalfd.c
283timerfd_createsys_timerfd_createfs/timerfd.c
284eventfdsys_eventfdfs/eventfd.c
285fallocatesys_fallocatefs/open.c
286timerfd_settimesys_timerfd_settimefs/timerfd.c
287timerfd_gettimesys_timerfd_gettimefs/timerfd.c
288accept4sys_accept4net/socket.c
289signalfd4sys_signalfd4fs/signalfd.c
290eventfd2sys_eventfd2fs/eventfd.c
291epoll_create1sys_epoll_create1fs/eventpoll.c
292dup3sys_dup3fs/file.c
293pipe2sys_pipe2fs/pipe.c
294inotify_init1sys_inotify_init1fs/notify/inotify/inotify_user.c
295preadvsys_preadvfs/read_write.c
296pwritevsys_pwritevfs/read_write.c
297rt_tgsigqueueinfosys_rt_tgsigqueueinfokernel/signal.c
298perf_event_opensys_perf_event_openkernel/events/core.c
299recvmmsgsys_recvmmsgnet/socket.c
300fanotify_initsys_fanotify_initfs/notify/fanotify/fanotify_user.c
301fanotify_marksys_fanotify_markfs/notify/fanotify/fanotify_user.c
302prlimit64sys_prlimit64kernel/sys.c
303name_to_handle_atsys_name_to_handle_atfs/fhandle.c
304open_by_handle_atsys_open_by_handle_atfs/fhandle.c
305clock_adjtimesys_clock_adjtimekernel/posix-timers.c
306syncfssys_syncfsfs/sync.c
307sendmmsgsys_sendmmsgnet/socket.c
308setnssys_setnskernel/nsproxy.c
309getcpusys_getcpukernel/sys.c
310process_vm_readvsys_process_vm_readvmm/process_vm_access.c
311process_vm_writevsys_process_vm_writevmm/process_vm_access.c
312kcmpsys_kcmpkernel/kcmp.c
313finit_modulesys_finit_modulekernel/module.c

写在最后

本篇只是拿sed命令开刀了,不仅于此,其他内置的系统命令也是一样的套路。其实,在笔者看来,各种命令的使用方法、技巧并没什么可讲,一点都不好玩。底层的实现、原理、机制才是核心,知其然也要知其所以然。这是作为技术人员所必须要追求的真理!

文章转载自不背锅运维,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论