月度归档: 2021 年 7 月

php执行shell,返回空

问题:以下shell脚本在 www 用户下执行 sudo /usr/local/webserver/nginx/sbin/nginx -t 是有返回结果的,但用http://localhost/nginx.php?act=test 访问是看不到返回值,shell指令都没执行,safe-mode 是off的,不知为何,请教高人了?
nginx.php代码如下:
<?php
if(isset($_GET[‘act’])&&!empty($_GET[‘act’])){
if($_GET[‘act’]==’test’){
$message=shell_exec(“sudo /usr/local/webserver/nginx/sbin/nginx -t”);
echo “测试结果:”.$message;
}elseif($_GET[‘act’]==’restart’){
$message=shell_exec(“sudo /usr/local/webserver/nginx/sbin/nginx -s reload”)
;
echo “重启结果:”.$message;
}
}else{
header(“Status: 404 Not Found”);
}
?>

回复:我一开始也为这个问题迷惑不解,为何 php cgi以www用户执行sudo ls -al / 命令就可以正常输出,而执行

sudo /usr/local/webserver/nginx/sbin/nginx -t 却没有输出?

没有任何输出,导致我们无法跟踪错误的原因,那么,使用Linux标准输出重定向,看看有无输出,我的php代码是(设置/wwwroot/log.txt权限为777):
/wwwroot/index.php
<?php
$s = shell_exec(“/usr/bin/sudo /home/nginx/sbin/nginx -t >/wwwroot/log.txt”);
echo $s;

请求http://localhost/index.php, 发现log.txt文件是空白的,即没有正常输出,那说明有可能发生了错误,为此,我再尝试使用Linux的标准错误输出重定向:
$s = shell_exec(“/usr/bin/sudo /home/nginx/sbin/nginx -t 2>/wwwroot/log.txt”);

注意重定向符号前的2

再请求index.php 这时,在log.txt中记录了详细的错误:
sudo: sorry, you must have a tty to run sudo

这个错误我没见过,大致意思说,当执行sudo时,必须要从终端登录(可能nginx本身的一些限制)

google搜索这个错误提示, 解决办法也很简单:
注释掉 /etc/sudoers中 ‘Defaults requiretty’ 这个就行,即前面加#

按这个办法处理,浏览器仍然没有任何输出,我的猜测:可能是nginx启动程序输出目标是终端,那么折衷的办法就是使用输出重定向了,所以,改造的代码如下:
index.php
<?php
$trace=”/wwwroot/log.txt”;

if(!is_writable($trace) || !is_readable($trace)) {
exit(“$trace must readable and writable”);
}

file_put_contents($trace,”);

echo `/usr/bin/sudo /home/nginx/sbin/nginx -t >$trace 2>&1`;

echo `top -b -n 1`;
echo file_get_contents($trace);

这是通过简接方式来观察输出的,类似这个现象的,还有使用top命令查看系统负载,top命令需要在终端窗口中执行,使用php执行shell_exec(“top -n 1”),给出的错误就是TERM environment variable not set. 解决办法就是使用-b参数执行top, 即shell_exec(“top -b -n 1”)

如果你有更好的方法,欢迎一起探讨,如果实验成功,也就可以通过web页面控制nginx了。

324. 摆动排序 II(JS实现)

324. 摆动排序 II(JS实现)
1 题目
给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]… 的顺序。
示例 1:
输入: nums = [1, 5, 1, 1, 6, 4]
输出: 一个可能的答案是 [1, 4, 1, 5, 1, 6]
示例 2:
输入: nums = [1, 3, 2, 2, 3, 1]
输出: 一个可能的答案是 [2, 3, 1, 3, 1, 2]
说明:
你可以假设所有输入都会得到有效的结果。
进阶:
你能用 O(n) 时间复杂度和 / 或原地 O(1) 额外空间来实现吗?
链接:https://leetcode-cn.com/problems/wiggle-sort-ii
2 思路
很明显,我做这道题就是先把数组排序,然后将数组分为两部分,依次构造新数组的,题解中有O(n)的算法,其先用快速选择法,找到数组的中位数,然后将小于等于中位数的数放置在左侧,大于中位数的放置在右侧,这样就成了两部分了
3代码
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var wiggleSort = function(nums) {
  nums.sort((a,b) => a-b);
  let mid = nums.length % 2 === 0 ? Math.floor(nums.length / 2) : Math.floor(nums.length / 2) + 1;
  const res = [];
  let low = mid – 1;
  let high = nums.length – 1;
  while (low >= 0 && high >= mid) {
    res.push(nums[low–]);
    res.push(nums[high–]);
  }
  if (low >= 0) res.push(nums[low–]);   //从后向前进行插入
  if (high >= mid) res.push(nums[high–]);  //从后向前进行插入
  for (let i=0; i<res.length;i++) {
    nums[i] = res[i];
  }
};

322. 零钱兑换(JS实现)

322. 零钱兑换(JS实现)
1 题目
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的*少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。
示例 1:
输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
示例 2:
输入: coins = [2], amount = 3
输出: -1
链接:https://leetcode-cn.com/problems/coin-change
2 思路
这道题考察贪心+回溯算法,我们先把硬币排序,然后构造一棵树,先从大面值的硬币开始,逐级相减,直到总金额为0,即找到了目标的*优组合,题解中还可以用动态规划的方法来做
3代码
/**
 * @param {number[]} coins
 * @param {number} amount
 * @return {number}
 */
var coinChange = function(coins, amount) {
  coins.sort((a,b) => a-b);
  if (amount === 0) return 0;
  if (amount < coins[0]) return -1;
  let ans = 999999;
  d(amount, coins.length – 1, 0, coins);
  function d(num, index, len, coins) {
    if (num === 0) {
      ans = Math.min(ans, len);
      return;
    };
    if (index < 0) return;
    for (let k=Math.floor(num / coins[index]); k >=0 && k + len < ans; k–) {
        d(num – coins[index] * k, index – 1, len + k, coins);
    }
  }
  return ans === 999999 ? -1 : ans;
};

1016. 部分A+B (15)

1016. 部分A+B (15)
时间限制
100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。
现给定A、DA、B、DB,请编写程序计算PA + PB。
输入格式:
输入在一行中依次给出A、DA、B、DB,中间以空格分隔,其中0 < A, B < 1010。
输出格式:
在一行中输出PA + PB的值。
输入样例1:
3862767 6 13530293 3
输出样例1:
399
输入样例2:
3862767 1 13530293 8
输出样例2:
0
n=input().split()
a=n[0]
a1=n[1]
b=n[2]
b1=n[3]
A=a.count(a1)
B=b.count(b1)
if A==0:
    s1=’0′
else:
    s1=A*a1
if B==0:
    s2=’0′
else:
    s2=B*b1
print(int(s1)+int(s2))

1061. 判断题(15) python篇

1061. 判断题(15) python篇
1061. 判断题(15)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分。
输入格式:
输入在*行给出两个不超过100的正整数N和M,分别是学生人数和判断题数量。第二行给出M个不超过5的正整数,是每道题的满分值。第三行给出每道题对应的正确答案,0代表“非”,1代表“是”。随后N行,每行给出一个学生的解答。数字间均以空格分隔。
输出格式:
按照输入的顺序输出每个学生的得分,每个分数占一行。
输入样例:
3 6
2 1 3 3 4 5
0 0 1 0 1 1
0 1 1 0 0 1
1 0 1 0 1 0
1 1 0 0 1 1
输出样例:
13
11
12
l1=input().split()
l2=input().split()
l3=input().split()
b=0
c=[]
for i in range(int(l1[0])):
    a=input().split()
    for x,y in enumerate(a):
        if y==l3[x]:
            b = b + int(l2[x])
    c.append(b)
for i in c:
    print(i)

linux下php获取shell命令返回数据

获取cpu使用率:

例:
sensor.php:

<?php
exec(“top -b -n 1|grep CPU|grep -v grep|awk ‘{if(NR==1){print $8}}'”,$output);
$tmp = $output[0];
$output = array();
echo $output;

?>

%title插图%num

注:$output为获取标准输出的数组,每次循环会累加到数据中,所有进行了数组清空:
$output = array();
所以,每次数据都为*新数据存放于数组首元素中。

php 执行linux命令,shell脚本函数,获取服务器运行状态值

php 执行shell命令函数,获取服务器运行状态值
*近做到一个监测服务器运行状态相关的东西。需要通过php来调用shell命令来获取所需的信息。
下面就从获取服务器信息简单介绍一下这几个常用相关函数。

1、exec()
exec($command, array &output = null, &output = null, &return_var = null)有三个参数。执行给定的命令,但不输出结果,而是返回结果的*后一行。虽然它只返回命令结果的*后一行,但用第二个参数array 可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前*好用unset()*它清掉。只有指定了第二 个参数时,才可以用第三个参数,用来取得命令执行的状态码。
举个栗子:

$out01 = exec(‘ls -l’);
exec(‘ls -l’,$arr);
echo ‘只读取结果的*后一行’.$out01.”\n”;
var_dump(‘以数组的形式返回所有的输出’.$arr);

结果:

/usr/bin/php /Users/tao/PhpSites/csdnBlog/shell/shell.php
只读取结果的*后一行-rw-r–r– 1 tao staff 576 Nov 20 14:14 shell.php
string(44) “以数组的形式返回所有的输出Array”
-rw-r–r– 1 tao staff 576 Nov 20 14:14 shell.php

2、shell_exec()
shell_exec($cmd)只有一个参数,它会获取$cdm执行之后所有的数据。
栗子1:

$connect_num = shell_exec(‘netstat -nat|grep -i “80”|wc -l’);//获取当前服务器的80端口连接数 connect_num的值就是后面linux命令执行之后的输出内容

栗子2:

$out02 = shell_exec(‘ls -l’);

结果:

shell_exec()获取所有的返回值
total 8
-rw-r–r– 1 tao staff 638 Nov 20 14:18 shell.php

exec()和exec_shell()的区别
In short; exec()只返回$cmd命令的*后一行,exec_shell()返回全部的数据,假设*终的命令只有一行,那就随便选择了。但是,exec()命令的后两个参数,让我们可以以数组的操作方式去操作得到的数据,在某些case下,应该比读exec_shell获的的文本的数据强吧。并且还有状态码的返回。应该有些用处吧orz

3、system()
4、popen()
popen函数的执行流程:
1、使用pipe系统调用创建一个管道
2、创建一个新的进程,将拷贝标准输入或者标准输出到文件描述符。
3、关闭pipe返回的文件描述符。
4、调用execve系统调用来执行命令。
5、关闭管道
popen($cmd,$status)是通过”管道”的机制,来创建一个进程,进而来执行$cmd命令的,$status是管道的两种状态,分别是”r”和”w”,而上面所说的命令只有”r”的方式,当执行完shell命令之后,popen的返回值是一个普通的标准I/O流,所以必须要用pclose()将其关闭。
P.S.数据流的基本概念:
数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。
数据写入程序可以是一段一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。
对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。
不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。
举个栗子:

//所有连接到本机80端口的IP地址和其连接数。80端口一般是用来处理HTTP网页请求
$fp = popen(‘netstat -plan|grep :80|awk {\’print $5\’}|cut -d: -f 1|sort|uniq -c|sort -nk 1′, “r”);
$online_num = 0;
while (!feof($fp)) {
if(!feof($fp)){
$online_num += 1;
}
}
pclose($fp);
“`
再举个栗子:
“`
//获取某一时刻系统cpu和内存使用情况
$fp = popen(‘top -b -n 2 | grep -E “^(%Cpu|KiB Mem|Tasks)”‘, “r”);
$rs = “”;
while (!feof($fp)) {
$rs .= fread($fp, 1024);
}
pclose($fp);

看起来是不是普通文件的读取操作相似,将fp当做操作文本时候的简单的句柄,然后进行对I/O的操作就OK了、、

in the end
还有很多php来操作linux命令和shell脚本的函数,例如system、passthru等等。

我写了一个脚本,可在“任意”服务器上执行命令!

大家好,我是冰河~~

冰河之前维护着上千台服务器组成的服务器集群,如果每次需要在服务器上执行命令的时候,都要手动登录每台服务器进行操作的话,那也太麻烦了。你想想,如果在上千台服务器的集群中,每台服务器中只需要简单的执行一个相同的命令,那别说执行命令了,就是让你依次手动登录上千台服务器,那也够你受的了。估计依次登录上千台服务器,给你三天时间你可能都登不完,那怎么办呢?有没有什么好的方法来解决这个问题呢?
%title插图%num

别急,我们今天就是来解决这个问题的。

说实话,我在维护上千台服务器集群的时候,并没有去依次手动登录每台服务器,为啥?没错,就是因为我懒啊!我懒的去登录,并且依次登录那么多台服务器,整个人都会崩溃的。

%title插图%num

于是,我就想办法能不能写个脚本,让这个脚本接收我要执行的命令,然后将命令依次分发到集群上所有的服务器中执行,这不就解决问题了吗?说干就干。

不过,这里,有个需要注意的地方:那就是:需要提前配置好集群中每台服务器的主机名和IP地址的对应关系,能够互相使用主机名进行通信,并配置了SSH免密码登录。这一点不行担心,只要让运维在规划和分配服务器的时候,规划好就行了,无需后面再依次登录服务器处理。

为了方便小伙伴们理解,这里我们就假设集群中存在1024台服务器,每台服务器的主机名为binghe1~binghe1024。每台服务器可以通过主机名进行通信,接下来,我写了一个名称为distribute_command.sh的脚本,内容如下所示。

#!/bin/bash
pcount=$#
if (( pcount<1 )) ; then
echo no args;
exit;
fi
#先在本机上执行命令
echo ————binghe$host—————–
$@
#循环在集群中的远程节点上执行命令
for (( host=1 ; host<=1024; host=host+1)) ; do
echo ————binghe$host—————–
ssh binghe$host $@
done;

这个脚本的含义为:接收传递进来的命令,将命令分发到主机名为binghe1~binghe1024的服务器上执行,也就是说,使用这个脚本我们能够做到:同时在集群的服务器上执行相同的命令。

接下来,为distribute_command.sh脚本赋予可执行权限,如下所示。

chmod a+x ./distribute_command.sh

使用格式如下:

./distribute_command.sh 在服务器上执行的完整命令

使用示例

在集群中的每台服务器的/home目录下创建hello.txt文,内容为hello world
./distribute_command.sh echo “hello world” >> /home/hello.txt

查看集群中每台服务器上hello.txt文件的内容
./distribute_command.sh cat /home/hello.txt

删除集群中每台服务器上的hello.txt文件
./distribute_command.sh rm -rf /home/hello.txt

是不是很简单啊?所以说,有时候,不要盲目的去执行。很多时候,在做事情之前,要先思考下有没有更好的解决方案,有没有效率更加高效的解决方案。就比如这篇文章上说的,在上千台服务器上执行一条命令,如果依次手动登录每台服务器执行命令,估计花三天时间都搞不定;如果我们写了一个脚本的话,估计也就1分钟之内就搞定了。所以,效率和质量才是做事情需要追求的目标。

 

Manjaro 个人感觉是*好用的 Linux 系统

体验了几天,感觉比 Debian 系好用,软件包丰富,基于 Arch Linux 的发行版,一个字,野~

Linux manjaro Arch debian107 条回复 • 2021-07-02 14:14:26 +08:00
1 2
2
❮ ❯
silkriver 101
silkriver 4 天前
@skiy 可以参看这个短视频 https://www.bilibili.com/video/BV1Gv41177GE
christopheredwar 102
christopheredwar 4 天前 via Android
@EscYezi Pop!_OS 的理念就是开箱即用,这也是我选择的原因
DipperRoy 103
DipperRoy 4 天前
文档全抄 arch 还不承认自己是 arch 不懂这是什么自欺欺人的手法
hdfg159 104
hdfg159 4 天前
引战帖子
哈哈哈,linux mint *好用
err1y 105
err1y 3 天前 via iPhone
@love gentoo 安装完成之后稳定且反应速度*快。我有以下几台电脑:
二手的 xps13-9343 ( i5-4200u,8g 内存,gentoo 系统+i3wm )

thinkpad t470p ( i7-7700hq,16g 内存,windows 10 )

rmbp15 ( 4770hq,16g 内存,macos )

台式机( i7-4790k,16g 内存,windows10 )

所有机器里面 xps13 是性能*差的,但是 xps13 却是软件打开速度反应速度*快的,对比 node 的执行速度(使用 openpgpjs 创建证书,cpu 密集操作),node 的单核执行速度也是*快的。

其实哪个平台如果自己去编译软件的话,速度应该都差不多,但是 gentoo 的优点就在于,你别的平台一般都会选择二进制版本,gentoo 一般来讲都会用源码自行编译(除了 chrome 这种大型浏览器直接选择二进制,我自己试过编译耗时 16 小时,8g 内存不够,还得加 16g 的 swap,8g 的 swap 都卡死机了)。

而 gentoo 从内核到开发工具到界面全都是本机编译的,效率没得说(编译大火炉)。

在 xps13 的配置( 8g 内存)下,gentoo 下开 chrome 浏览器页面大约能比 arch 多开个 5-10 个页面(个人体验,没有精准对比)
err1y 106
err1y 3 天前 via iPhone
@ScepterZ fcitx5+肥猫词库体验非常棒
ScepterZ 107
ScepterZ 2 天前
@err1y 不支持双拼,而且各种小 bug,难以描述的那种,比如在 xxx 界面失效之类的,win 也有,但是少多了

红米笔记本 air 使用 Linux ,启动时内核会卡住 30 秒,求解决方案或思路

新买了台红米 air 笔记本,cpu 是 i7-10510Y,希望可以日常使用 Linux,尝试了多个发行版基本都能正常使用,唯一的问题就是启动时,当在 GRUB 选择系统页面选择系统后,画面会停留在 GURB 主题背景页面长达 30 秒,然后才能继续开机流程。

尝试了*新的 Ubuntu 系统,也是类似的问题,唯一的区别是 Ubuntu 下是选择系统后电脑黑屏 30 秒然后出现加载信息。

查看 dmesg 信息可以看到如下错误:

[ 0.244480] Simple Boot Flag at 0x44 set to 0x1 │
[ 0.244480] ACPI: bus type PCI registered │
[ 0.244480] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5 │
[ 0.244480] PCI: MMCONFIG for domain 0000 [bus 00-ff] at [mem 0xe0000000-0xefffffff] (base 0xe0000000) │
[ 0.244480] PCI: MMCONFIG at [mem 0xe0000000-0xefffffff] reserved in E820 │
[ 0.244480] PCI: Using configuration type 1 for base access │
[ 0.244621] ENERGY_PERF_BIAS: Set to ‘normal’, was ‘performance’ │
[ 0.248307] Kprobes globally optimized │
[ 0.248314] HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages │
[ 0.248314] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages │
[ 0.248314] ACPI: Added _OSI(Module Device) │
[ 0.248314] ACPI: Added _OSI(Processor Device) │
[ 0.248314] ACPI: Added _OSI(3.0 _SCP Extensions) │
[ 0.248314] ACPI: Added _OSI(Processor Aggregator Device) │
[ 0.248314] ACPI: Added _OSI(Linux-Dell-Video) │
[ 0.248314] ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio) │
[ 0.248314] ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics) │
[ 0.358456] ACPI: 17 ACPI AML tables successfully acquired and loaded │
[ 0.362525] ACPI: EC: EC started │
[ 0.362527] ACPI: EC: interrupt blocked │

[ 30.376923] No Local Variables are initialized for Method [ECMD] │

[ 30.376927] Initialized Arguments for Method [ECMD]: (1 arguments defined for method invocation) │
[ 30.376928] Arg0: 0000000036f30172 Integer 000000000000001A │

[ 30.376940] ACPI Error: Aborting method \_SB.PCI0.LPCB.H_EC.ECMD due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.376960] fbcon: Taking over console │
[ 30.376972] ACPI Error: Aborting method \_TZ.FNCL due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.376986] ACPI Error: Aborting method \_TZ.FN00._OFF due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.376997] ACPI Error: Aborting method \_SB.PCI0.LPCB.H_EC._REG due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531) │
[ 30.377037] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62 │
[ 30.377038] ACPI: EC: Boot ECDT EC used to handle transactions │
[ 30.379873] ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored │
[ 30.426569] ACPI: Dynamic OEM Table Load: │
[ 30.426598] ACPI: SSDT 0xFFFF89BC00C45800 000507 (v02 PmRef Cpu0Ist 00003000 INTL 20160527) │
[ 30.429939] ACPI: \_PR_.PR00: _OSC native thermal LVT Acked │
[ 30.433359] ACPI: Dynamic OEM Table Load: │
[ 30.433378] ACPI: SSDT 0xFFFF89BC011D2C00 0003FF (v02 PmRef Cpu0Cst 00003001 INTL 20160527) │
[ 30.436652] ACPI: Dynamic OEM Table Load: │
[ 30.436670] ACPI: SSDT 0xFFFF89BC0148D6C0 0000BA (v02 PmRef Cpu0Hwp 00003000 INTL 20160527) │
[ 30.439724] ACPI: Dynamic OEM Table Load: │
[ 30.439742] ACPI: SSDT 0xFFFF89BC00C41800 000628 (v02 PmRef HwpLvt 00003000 INTL 20160527) │
[ 30.443600] ACPI: Dynamic OEM Table Load: │
[ 30.443622] ACPI: SSDT 0xFFFF89BC011C1000 000D14 (v02 PmRef ApIst 00003000 INTL 20160527) │
[ 30.448401] ACPI: Dynamic OEM Table Load: │
[ 30.448419] ACPI: SSDT 0xFFFF89BC011D0000 000317 (v02 PmRef ApHwp 00003000 INTL 20160527) │
[ 30.451771] ACPI: Dynamic OEM Table Load: │
[ 30.451788] ACPI: SSDT 0xFFFF89BC011D2800 00030A (v02 PmRef ApCst 00003000 INTL 20160527) │
[ 30.461796] ACPI: Interpreter enabled
通过传递 acpi=off 参数给内核可以跳过卡住的过程,但是开机后触摸板不可使用,且发热严重,根据日志错误信息查阅大量资料后,基本都是说升级 BIOS 以解决 ACPI 的错误,但是这款笔记本没有 BIOS 更新而且很有可能以后也不会有,所以求助各位大神,有没有什么解决这个问题的方法或者思路?

第 1 条附言 · 3 天前
感谢各位大佬提供的线索和思路,更新下我这边的进度: 昨晚尝试了安装4.x的内核,发现启动时就不会卡那30秒了,虽然本子的触摸板、喇叭和麦克风都不能用了,但也说明确实可以通过修改kernel来解决/绕过/缓解这个问题。

下载了5.12的内核源码,通过搜索 “AE_AML_LOOP_TIMEOUT” 这个错误的定义,顺藤摸瓜找到如下定义: root/include/acpi/acconfig.h

/* Maximum time (default 30s) of While() loops before abort */

#define ACPI_MAX_LOOP_TIMEOUT 30
所以在出现某种错误的时候才会有卡住30秒的表现。 虽然本人能力有限可能无法解决问题,但是猜测把这里的值改小,应该缩短加载内核时卡住的时间,只要影响不大我也就能接受这样用下去了……

第 2 条附言 · 2 天前
汇报下上面修改方法的效果: 果然如预期一样,把超时时间从30秒改为3秒之后,启动信息如下:

[ 0.246981] ACPI: Added _OSI(Processor Device)
[ 0.246981] ACPI: Added _OSI(3.0 _SCP Extensions)
[ 0.246981] ACPI: Added _OSI(Processor Aggregator Device)
[ 0.246981] ACPI: Added _OSI(Linux-Dell-Video)
[ 0.246981] ACPI: Added _OSI(Linux-Lenovo-NV-HDMI-Audio)
[ 0.246981] ACPI: Added _OSI(Linux-HPI-Hybrid-Graphics)
[ 0.359506] ACPI: 17 ACPI AML tables successfully acquired and loaded
[ 0.363549] ACPI: EC: EC started
[ 0.363550] ACPI: EC: interrupt blocked

[ 3.375610] No Local Variables are initialized for Method [ECMD]

[ 3.375613] Initialized Arguments for Method [ECMD]: (1 arguments defined for method invocation)
[ 3.375615] Arg0: 0000000095332ad2 <Obj> Integer 000000000000001A

[ 3.375626] ACPI Error: Aborting method \_SB.PCI0.LPCB.H_EC.ECMD due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531)
[ 3.375646] fbcon: Taking over console
[ 3.375657] ACPI Error: Aborting method \_TZ.FNCL due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531)
[ 3.375671] ACPI Error: Aborting method \_TZ.FN00._OFF due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531)
[ 3.375682] ACPI Error: Aborting method \_SB.PCI0.LPCB.H_EC._REG due to previous error (AE_AML_LOOP_TIMEOUT) (20200925/psparse-531)
[ 3.375723] ACPI: EC: EC_CMD/EC_SC=0x66, EC_DATA=0x62
[ 3.375724] ACPI: EC: Boot ECDT EC used to handle transactions
[ 3.378597] ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored
修改前的开机耗时:

Startup finished in 2.553s (firmware) + 12.865s (loader) + 35.965s (kernel) + 19.797s (userspace) = 1min 11.181s
graphical.target reached after 19.790s in userspace
修改后:

Startup finished in 2.553s (firmware) + 7.104s (loader) + 10.335s (kernel) + 12.147s (userspace) = 32.141s
graphical.target reached after 12.139s in userspace
先这样用了,有空再慢慢折腾,看看以后会不会官方更新BIOS或者内核升级可以彻底解决问题~~

acpi osi error intl42 条回复 • 2021-07-04 23:08:45 +08:00
feelinglucky 1
feelinglucky 4 天前
看起来是 ACPI 的问题,试试 BIOS 里面设置 XHCI Handoff 为 Enabled 看看?
debuggerx 2
debuggerx 4 天前
@feelinglucky 笔记本 BIOS 里什么选项都没有,只有个安全启动开关和 usb 充电选项,也都切换试过了,没用 /(ㄒoㄒ)/~~
generic 3
generic 4 天前
内核命令行参数 acpi_osi=Linux 试一下?
debuggerx 4
debuggerx 4 天前
@generic 试过了的,没有效果。。。
kokutou 5
kokutou 4 天前
试试 archlinux 带的是*新的内核.
iceecream 6
iceecream 4 天前
只能等 bios 和 EC 更新了
scybhe 7
scybhe 4 天前 via Android
试试禁用独显?来自 https://bbs.archlinux.org/viewtopic.php?id=237867
shayu*0001 8
shayu*0001 4 天前
输入 systemd-analyze blame

看看哪个占用了*长时间
ihipop 9
ihipop 4 天前 via Android
*新内核也不行的话,试试 acpi osi 改 Windows 呢?
germain 10
germain 4 天前
grub (modprobe.blacklist) 里面 block 你的 nv 的 module 就行了。

xiadong1994 11
xiadong1994 4 天前 via iPhone
https://unix.stackexchange.com/questions/592694/acpi-errors-preventing-boot-when-using-kernel-version-5
redeemer 12
redeemer 4 天前 via iPhone
好像是 EC 的 interrupt blocked 占用了 30 秒。是不是内核没有适配你这个笔记本 EC 的驱动啊
imnpc 13
imnpc 4 天前
看日志 应该是 BIOS 配置的时候没有考虑到 Linux 或者没有做*新匹配
正常出厂的时候会针对 windows linux 的一些不同做好匹配的
他这个笔记本可能只考虑支持 windows
debuggerx 14
debuggerx 4 天前
@kokutou 回头试试编译和*新内核看看情况会不会好点吧
debuggerx 15
debuggerx 4 天前
@iceecream 空等啥时候是个头啊 T_T 有啥反馈途径能联系到开发么 小米社区现在基本就是废的。。。
debuggerx 16
debuggerx 4 天前
@shayu*0001 systemd-analyze blame 是看开启启动服务占用时长的 我是加载内核的时候就出问题咯
debuggerx 17
debuggerx 4 天前
@ihipop 试了几个,也是没有效果,Windows 2009/2012/2015 等等。。
debuggerx 18
debuggerx 4 天前
@germain 核显轻薄本,没有独显的……
debuggerx 19
debuggerx 4 天前
@xiadong1994 这个我也搜到过,可是我的机器没独显的……
debuggerx 20
debuggerx 4 天前
@redeemer 对的,我猜也是这样,现在就在想有没有啥改善的方法,只要能跳过这个恶心的 30 秒就行,其他使用起来感觉都还好。
debuggerx 21
debuggerx 4 天前
@imnpc 翻车了 T_T 趁着 618 买了这台红米和宏碁的 swift3 pro,就想对比着选个跑 Linux 更完美的,结果 swift 那边直接装不上,折腾了好几天没解决,红米这边只是会开机卡一会儿,我就以为只是小问题好解决……结果现在过了 7 天无理由退货,才发现问题没有那么简单,只能硬着头皮解决了……
aneostart173 22
aneostart173 4 天前
11 代 intel 大部分 linux 发行版都有问题,据说是 intel 新驱动的锅。
germain 23
germain 4 天前
@debuggerx 不好意思没细看 log,看着差不多就回了。 你这能退货就赶紧退货吧。BOIS 的锅一般不是其它软件能解决的。

https://bugzilla.kernel.org/show_bug.cgi?id=109511
debuggerx 24
debuggerx 4 天前
@germain 看#21,已经超过退货时间了 T_T 而且这台本子除了这个问题 其他方面我还都挺满意的……
这个 bug 处理链接我也看过了,可我还没找到一个能和红米笔记本的开发进行沟通的有效途径,目前的想法是看看通过编译自定义内核能不能绕过或者缓解这个问题。
germain 25
germain 4 天前
@debuggerx 你可以尝试一下 Enable “EC read/write access through /sys/kernel/debug/ec”

CONFIG_ACPI_EC_DEBUGFS: 默认关闭 │
libook 26
libook 4 天前
笔记本硬件有很多是专用硬件,有的不够开放,相应的会难以适配 Linux,这方面 Ubuntu 出了个认证项目(可以去 Ubuntu 官网查),通过 Ubuntu 认证的才会保证跑 Ubuntu 没问题,其他的设备基本都是看运气。

红米本还是个冷门本吧,这东西是销量越高相应的 Linux 适配资料就越多,前提是能 Hack,有的*度封闭的设备完全封禁了适配 Linux 的门路。

看有什么需求必须用 Linux,如果仅仅是想用 Linux 开发环境开发一些应用级别的项目,其实可以用 Win10+WSL2,这块越来越成熟了,我现在开发 Web 全栈项目 WSL2 是完全能胜任的。

不过如果开发系统级别的项目和硬件项目的话 WSL 可能无法满足需求,此时可以考虑虚拟机,只不过会比较耗电,但能解决所有硬件适配问题。
generic 27
generic 4 天前
@debuggerx 我红米 pro15 amd 版也有问题,比如特定内核版本上才能 suspend-resume 成功,比如合上屏幕不产生事件。bios 设置也是什么选项都没有。要 Linux 兼容性还是 dell 或者联想好一点。
generic 28
generic 4 天前
@debuggerx 硬核搞法就是自己去改 bios acpi 字节码: https://wiki.archlinux.org/title/DSDT
shayu*0001 29
shayu*0001 3 天前
@debuggerx 恩,没仔细看。EC 是 Embedded Controller,这个东西是很多低级功能的掌控者,电压控制,休眠,部分外设都是通过它来控制的,现在的 UEFI   BIOS,好多都把 EC 的 Firmware 版本单独列出来了。比如联想现在发布 Thinkpad BIOS:

<1.52>
UEFI: 1.52 / ECP: 1.20
-[重要] 安全修复地址 LEN-22133 推测执行侧信道变体 4and 3a (CVE-2018-3639, CVE-2018-3640).有关更多信息请参阅联想安全咨询页面:( https://support.lenovo.com/product_security/home)

<1.51>
UEFI: 1.51 / ECP: 1.20
– [重要] 安全补丁修复 LEN-19568 Intel Active Management Technology MEBx Access Control Bypass.

<1.50>
UEFI: 1.50 / ECP: 1.20
– [重要] 解决 CVE-2017-5715.

前面是 UEFI,后面这个 ECP 就是 Embedded Controller Program 的缩写。很多高阶的电源管理功能,比如 USB 口关机给外设充电,限制电池充电上限,都是放在 ECP 里面控制的。这个如果是 ECP 里面的 Bug,你确实只能等厂家修复,个人没办法。有的笔记本提供降级功能,可以试着降回去再看看。

现在计算机需要的功能太多,随之带来的 BIOS 也变得太复杂。
sprite82 30
sprite82 3 天前
退不了了,那就直接 win+wsl 或者直接 VMware 资源都给虚拟机
debuggerx 31
debuggerx 3 天前
@germain #25 感谢!有时间试试这个慢慢调,现在准备直接粗暴一点,把那个 AE_AML_LOOP_TIMEOUT 改小试试
debuggerx 32
debuggerx 3 天前
@libook 就是习惯 Linux 了吧,顺手,Deepin 快 10 年的老用户了~
主要是过去 5 年用的小米笔记本 air13,体验很棒(因为当时 deepin 有给专门适配过),这次就误以为自家的红米也能愉快 Linux 了。。。
debuggerx 33
debuggerx 3 天前
@generic 试了下修改 DSDT 的教程,发现反编译哪一步就过不去,貌似小米的本子不是用的 Intel/Microsoft 的编译器,而是 XMCC ? 现在还是准备从 kernel 下手了。
debuggerx 34
debuggerx 3 天前
@shayu*0001 是的,谢谢,感觉确实个人没法彻底解决,只能想办法看能不能尽量优化了
generic 35
generic 3 天前 via Android
@debuggerx 你参考我这个试试 https://zhuanlan.zhihu.com/p/385750248
不过我的问题有明确的报错,你是卡住超时,估计比较难定位。
danc 36
danc 3 天前
我是 i7-10750H 装的 ubuntu 20.04 ,适配的还挺好的,唯有键盘灯颜色目前还没得调整。还有,如果是单核显说着混合模式,关机时会卡主 30s,这个倒影响不大。
danc 37
danc 3 天前
@danc 如果是单开核显,或者混合模式
danc 38
danc 3 天前
对了,还有一些软件方面的问题。在混合模式下,大部分应用启动时可以选择“使用独立显卡启动”,vscode“使用独立显卡启动”代码编辑区域是黑屏
debuggerx 39
debuggerx 2 天前
@generic 感谢,试了下你的思路,然而没能找到问题代码,情况没有改善
james122333 40
james122333 2 天前
所以 uefi 十分讨厌
而 arm 设备搞签名验证的也是
levinit 41
levinit 2 天前
新本子,上新内核 用 arch 之类的
liuxu 42
liuxu 14 小时 50 分钟前
ubuntu21.04 还有问题话基本就只能等更新内核了

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速