只好关闭当前shell,重新登录。
产生原因:
该文件夹中有一个服务挂载在该文件夹某一目录下,因突然关机等异常情况导致该服务无限制等待,机器重启后也不能正常连接。
解决方法:
查看与该文件夹相应的服务挂载情况:mount -l | grep 有问题文件夹名,如mount -l | grep "/root/bakup"
umount -l 文件夹,此刻,再访问文件夹即可使用命令了!
作为一个linux用户/系统管理员, 有些时候你会遇到以下错误提示:
bash: /bin/ls: Argument list too long
bash: /bin/rm: Argument list too long
产生原因:
“Argument list too long”参数列表过长错误经常发生在用户在一行简单命令中提供了过多的参数而导致,经常在ls *, cp *, rm * 等中出现,一般是因为受到 shell 参数个数限制所致
解决方法:
方法1 : 将文件群手动划分为比较小的组合
这是最基本的方法,只是简单的使参数数量符合要求,这种方法应用范围有限,只适用于文件列表中的名字分布比较均匀,另外这也是个初级用户可以考虑的解决方案,不过需要很多重复命令和对文件名分布的观察与猜测。
方法2 : 使用find命令
通过find命令,将文件清单输出到rm命令,使其一次处理一个,这样就完全避免了过量参数的存在,另外通过不同的参数,可以指定除了名称以外的时间戳,权限,以及inode等匹配模式。
方法3: 使用xargs命令
用xargs 命令将文件以每 100 个为一组为单位处理
xargs 命令会将文件以每 100 个为一组做 rm 处理。
方法4: 使用 ls 结合 awk *** 作
可以使用 awk 一次删除一个的方式进行删除,但必须先进入该目录下。
Linux 命令 argument list too long 错误解决
https://blog.51cto.com/u_14782715/5082973
https://blog.csdn.net/fdipzone/article/details/41558461
Linux删除文件出现/bin/rm: Argument list too long解决方法
https://southcat.net/1481.html
Linux下经过 rm -f 删除大量文件时报错:Argument list too long
http://www.javashuo.com/article/p-pucmuhoh-v.html
Linux文件系统十问
https://mp.weixin.qq.com/s/pOKjwl3ONPMPSRF6RSmvaw
新建一个空文件占用多少磁盘空间?
https://mp.weixin.qq.com/s/9YeUEnRnegplftpKlW4ZCA
文件过多时ls命令为什么会卡住?
https://mp.weixin.qq.com/s/g-fFoYsBJkonV3ezdGDJKA
linux管理常见错误一:随意许可,原因是不理解许可如果对许可配置不当,就会给黑客留下机会。处理许可问题的最简单方法是使用所谓的RWE方法,即Read(读取)、Write(写入)、Execute(执行)。假设你想让一个用户能够读取一个文件但不能写入文件。为此,你可以执行:chmod
u+w,u-rx 文件名,一些新用户可能会看到一个错误,说他们没有使用文件的许可,因此他们就使用了:Chmod 777
文件名,以为这样能够避免问题。但这样做实际上会导致更多的问题,因为它给了文件的可执行的权限。
记住这一点:777将一个文件的读取、写入、执行的许可给了所有用户,666将一个文件的读取、写入权限给了所有用户,而555将文件的读取、执行权限给了所有用户,还有444、333、222、111等等。
linux管理常见错误二:忽视更新
这并不是说Linux管理员缺乏技巧。不过,许多Linux管理员在运行了Linux之后,以为日后就无事可做了,以为它安全可靠。其实,新的更新可以为一些新的漏洞打上补丁。维持更新可以在一个易受损的系统与一个安全的系统之间构造分水岭。Linux的安全来自于不断地维护。为了实现安全性,为了使用一些新的特性和稳定性,任何管理员都应当跟上Linux的更新步伐。
linux管理常见错误三:不经过严格审核,从多种渠道下载安装各种类型的应用程序
乍看起来,这也许是一个不错的主意。如果你在运行Ubuntu,你会知道包管理程序使用的是。deb软件包。不过,你找到的许多应用程序是以源代码的形式提供的。没有问题吗?这些程序安装后也许能够正常工作。但是你为什么不能随意安装程序呢?道理很简单,如果你以源的形式安装了程序,那么,你的软件包管理系统将无法跟踪你所安装的东西。
因此,在程序包A(以源的形式安装)依赖于程序包B(从一个。deb库安装的),而软件包B是从更新管理器更新的时候,会发生什么事情呢?程序包A可能运行,也可能无法运行。不过,如果程序包A和B都从。deb库安装的话,二者都能运行的机会将更高。此外,在所有的程序包都来自于同样的二进制类型时,更新程序包将更为容易。
linux管理常见错误四:将服务器启动进入到X
在一台机器是专用服务器时,你可能会想到安装X,这样一些管理任务就会简单一些。不过,这并不意味着用户需要将服务器启动进入到X.这样会浪费珍贵的内存和CPU资源。相反地,你应当在级别3上停止启动过程,进入命令行模式。这样做不但会将所有的资源留给服务器,而且还会防止泄露机器的机密。要登录到X,用户只需要以命令行方式登录,然后键入startx进入到桌面。
linux管理常见错误五:糟糕的口令
记住,root
的口令通常是linux王国的关键。所以为什么要让root的口令那么容易被破解呢?保障你的用户口令的健壮性至关重要。如果你的口令比较长,且难于记忆,可将这个口令存放在一个可被加密的位置。在需要这个口令时,可用解密软件解开这个口令使用之。
linux管理常见错误六:没有备份关键的配置文件
许多管理员都有这样的体会,在升级到某个X版本,如X11之后,却发现新版本破坏了你的xorg.conf配置文件,以至于你再也无法使用X?建议你在升级X之前,先对以前的/etc/x11/xorg.conf作一个备份,以免升级失败。当然,X的升级程序会设法为用户备份xorg.conf文件,但它却在/etc/x11目录内备份。即使这种备份看起来不错,你最好还是自己做一个备份吧。笔者的一个习惯是将其备份到/root目录中,这样,用户就可以知道只有根(root)用户能够访问此文件。记住,安全第一。这里的方法也适用于其它的关键备份,如Samba、Apache、Mysql等。
linux管理常见错误七:忽视日志文件
/var/log的存在是有理由的。这是存放所有的日志文件的唯一位置。在发生问题时,你首先需要看一下这里。检查安全问题,可看一下/var/log/secure.笔者看的第一个位置是/var/log/messages.这个日志文件保存着所有的一般性错误。在此文件中,你可以得到关于网络、媒体变更等消息。在管理一台机器时,用户可以使用某个第三方的应用程序,如logwatch,这样就可以创建为用户创建基于/var/log文件的各种报告。
linux管理常见错误八:没有安装一个可正常运行的内核
你可能不会在一台机器上安装10个以上的内核。但你需要更新内核,这种更新并没有删除以前的内核。你是怎么做的呢?你一直保持使用最近的可正常工作的内核。假设你目前正常工作的内核是2.6.22,而2.6.20是备份内核。如果你更新到2.6.26,而在新内核中一切都工作正常,你就可以删除2.6.20了。
linux管理常见错误九:逃避使用命令行
恐怕很少有人愿意记住那么多命令。在大多数情况下,图形用户界面是许多人的最爱。不过,有时,命令行使用起来更加容易、快捷、安全、可靠。逃避使用命令行是Linux管理的大忌。管理员至少应当理解命令行是如何工作的,至少还要掌握一些重要的管理命令。
linux管理常见错误十:以根用户身份登录
这是一种很危险的错误。如果用户需要根特权来执行或配置一个应用程序,可以在一个标准的用户账户中使用su切换到root用户。登录到root为什么不是一件好事儿?在用户以标准用户身份登录时,所有正在运行的X应用程序仍拥有仅限于此用户的访问权。如果用户以根用户身份登录,X就拥有了root的许可。这就会导致两个问题,一、如果用户由GUI犯了一个大错,这个错误对系统来说,有可能是一个巨大的灾难。二、以根用户的身份运行X使得系统更易于遭受攻击。
1.1 Linux内核异常处理相关文件Linux内核中,异常处理主要由两个文件完成,entry.S和traps.c,当然还有一些其它异常处理函数分布于fault.c, memory.c等等。entry.S包含异常的入口、进入异常处理C函数前的压栈、退出C函数前的出栈、一些fork函数相关的处理代码(暂不分析)、任务切换汇编处理过程(cpu_switch_to函数,暂不分析)。traps.c主要包含异常处理C函数。
本文主要分析entry.S,对于traps.c作简要介绍。
1.2 执行kernel_entry之前的栈
1.3 执行kernel_entry时的栈
1.4 执行kernel_exit 时的栈
1.5 entry.s代码分析
/*
* Low-level exception handling code
*
* Copyright (C) 2012 ARM Ltd.
* Authors: Catalin Marinas <catalin.marinas@arm.com>
* Will Deacon <will.deacon@arm.com>
*
* This program is free softwareyou can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTYwithout even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/init.h>
#include <linux/linkage.h>
#include <asm/assembler.h>
#include <asm/asm-offsets.h>
#include <asm/errno.h>
#include <asm/thread_info.h>
#include <asm/unistd.h>
#include <asm/unistd32.h>
/*
* Bad Abort numbers
*-----------------
*/
#define BAD_SYNC 0
#define BAD_IRQ 1
#define BAD_FIQ 2
#define BAD_ERROR 3
//根据该结构体内容
/*
struct pt_regs {
union {
struct user_pt_regs user_regs//结构体user_pt_regs和结构体pt_regs内容一样
struct { //共用体存储31个通用寄存器,外加sp,pc,pstate三个特殊寄存器
//该结构体用于异常处理的压栈d栈 *** 作
u64 regs[31]
u64 sp
u64 pc
u64 pstate
}
}
u64 orig_x0
u64 syscallno
}
*/
//S_FRAME_SIZE定义在asm-offsets.c中,DEFINE(S_FRAME_SIZE,sizeof(struct pt_regs))
//即结构体pt_regs的大小,结构体pt_regs的定义见上面
//S_LR定义:DEFINE(S_LR,offsetof(struct pt_regs, regs[30]))
//即31号寄存器在结构体pt_regs中的偏移量
//阅读以下内容请参考图1 和图2
.macro kernel_entry, el, regsize = 64
sub sp, sp, #S_FRAME_SIZE - S_LR // room for LR, SP, SPSR, ELR,见图2中sp'指向的位置
.if \regsize == 32
mov w0, w0 // zero upper 32 bits of x0
.endif
/*
*.macro push, xreg1, xreg2 //压栈两个寄存器
*stp \xreg1, \xreg2, [sp, #-16]! //注意!!!push指令也改变sp的值!!!
*.endm
*/
push x28, x29 //进行压栈 *** 作,push也是一个宏定义,因为ARMv8没有push指令,用stp代替
push x26, x27
push x24, x25
push x22, x23
push x20, x21
push x18, x19
push x16, x17
push x14, x15
push x12, x13
push x10, x11
push x8, x9
push x6, x7
push x4, x5
push x2, x3
push x0, x1 //此时sp指向位置见图2中sp''
.if \el == 0 //如果异常级是el0,把el0的sp栈指针给x21寄存器
mrs x21, sp_el0
.else
add x21, sp, #S_FRAME_SIZE //如果异常级不是el0,把sp指针指向的地方加上pt_regs大小后的地址放入x21,
//即指向没进入kernel_entry函数钱的sp指向的位置,见图2中x21指向的地址
.endif
mrs x22, elr_el1 //把el1的lr寄存器给x22
mrs x23, spsr_el1 //把spsr给x23
stp lr, x21, [sp, #S_LR] //把lr,x21寄存器存入sp+S_LR指向的地方
stp x22, x23, [sp, #S_PC] //把lr,存入sp+s_PC指向的位置,用于异常返回
/*
* Set syscallno to -1 by default (overridden later if real syscall).
*/
.if \el == 0
mvn x21, xzr
str x21, [sp, #S_SYSCALLNO]
.endif
/*
* Registers that may be useful after this macro is invoked:
*
* x21 - aborted SP
* x22 - aborted PC
* x23 - aborted PSTATE
*/
.endm
.macro kernel_exit, el, ret = 0
//把此时sp(即图2中sp'')+S_PC位置处开始的16字节内容分别给x21,x22
//即把栈中存的x21和x22内容取出来
ldp x21, x22, [sp, #S_PC] // load ELR, SPSR
.if \el == 0
ldr x23, [sp, #S_SP] // load return stack pointer,取出
.endif
.if \ret
ldr x1, [sp, #S_X1] // preserve x0 (syscall return),如果ret=1,则保存x0,用于系统调用,暂不分析
add sp, sp, S_X2
.else
pop x0, x1 //如果ret=0,d出x0,x1
.endif
pop x2, x3 // load the rest of the registers
pop x4, x5
pop x6, x7
pop x8, x9
msr elr_el1, x21 // set up the return data,把前面d出的x21,x22分别赋值给elr_el1,spsr_el1
msr spsr_el1, x22
.if \el == 0
msr sp_el0, x23
.endif
pop x10, x11
pop x12, x13
pop x14, x15
pop x16, x17
pop x18, x19
pop x20, x21
pop x22, x23
pop x24, x25
pop x26, x27
pop x28, x29
ldr lr, [sp], #S_FRAME_SIZE - S_LR // load LR and restore SP,把lrd出
eret // return to kernel,异常返回,该指令会把lr给pc,完成跳转
.endm
.macro get_thread_info, rd
mov \rd, sp
and \rd, \rd, #~((1 <<13) - 1) // top of 8K stack
.endm
/*
* These are the registers used in the syscall handler, and allow us to
* have in theory up to 7 arguments to a function - x0 to x6.
*
* x7 is reserved for the system call number in 32-bit mode.
*/
sc_nr .req x25 // number of system calls
scno .req x26 // syscall number
stbl .req x27 // syscall table pointer
tsk .req x28 // current thread_info
/*
* Interrupt handling.
*/
.macro irq_handler
ldr x1, handle_arch_irq
mov x0, sp
blr x1
.endm
.text
/*
* Exception vectors.
*/
.macro ventry label //这里是2^7对齐,即对齐到内存地址的0x80
.align 7
b \label
.endm
.align 11
/* ENTRY也是一个宏,定义在include/linkage.h中
* #ifndef ENTRY
* #define ENTRY(name) \
* .globl name\
* ALIGN\
* name:
* #endif
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)