tiann / KernelSU

A Kernel based root solution for Android
https://kernelsu.org
GNU General Public License v3.0
9.87k stars 1.6k forks source link

Running in ChromeOS #637

Closed supechicken closed 1 year ago

supechicken commented 1 year ago

Describe the bug The kernelsu/ksud.c:111:12: error: unused function 'count' error appeared when running build/build.sh, tried export CFLAGS='-Wno-error -Wno-unused-function' but with no luck

*Kernel compiled successfully without KernelSU patch

To Reproduce Steps to reproduce the behavior:

repo init -u https://android.googlesource.com/kernel/manifest -b common-android12-5.10-arcvm-gki-base
repo sync
curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -

sed -i "s/check_defconfig//" common/build.config.gki
sed -i "s/DEFCONFIG=gki_defconfig/DEFCONFIG=x86_64_arcvm_defconfig/" common/build.config.gki
cp common/arch/x86/configs/x86_64_arcvm_defconfig common/arch/x86/configs/x86_64_defconfig

LTO=thin CFLAGS='-Wno-error -Wno-unused-function' CXXFLAGS='-Wno-error -Wno-unused-function' BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

Smartphone (please complete the following information):

EDIT: This error shows after commenting out static int count:

/home/supechicken/android-kernel/common/drivers/kernelsu/ksud.c:87:27: error: unused function 'get_user_arg_ptr' [-Werror,-Wunused-function]
static const char __user *get_user_arg_ptr(struct user_arg_ptr argv, int nr)
supechicken commented 1 year ago

For those who are looking for a workaround:

# remove -Werror from all Makefiles
makefiles="$(find . -type f -name Makefile | tr "\n" ' ') $(find . -type f -name Kbuild | tr "\n" ' ')"

for i in $makefiles; do
  sed -i 's/-Werror=/-Wno-error=/g' "$i"
  sed -i 's/-Werror/-w/g' "$i"
  sed -i 's/-Wall/-w/g' "$i"
done
natsumerinchan commented 1 year ago

https://github.com/tiann/KernelSU/blob/main/kernel/ksud.c#L111

static int count(struct user_arg_ptr argv, int max) __attribute__ ((unused))

I add __attribute__ ((unused)) and it compiled successfully, but I have not installed ChromeOS,could you please help me test if it works properly? bzImage.zip

supechicken commented 1 year ago

It doesn't work for me, but it is probably related to the configuration stuff (just tried with replacing all defconfig under common/arch/x86/configs/ with x86_64_arcvm_defconfig and it works :) )

1457384613gh commented 1 year ago

it works :) )

成功了吗? 模块可以工作吗?

1457384613gh commented 1 year ago

image

image

果然是的,这个也可以挂载。 原大小 9.8 MB,修补后 20.2MB,体积加倍啊。

1457384613gh commented 1 year ago

等了好久,打不开,就像手机无法开机那样。 是不是跟宿主系统的内核有关啊???我宿主系统换了内核。

Screenshot 2023-06-16 09 03 53

1457384613gh commented 1 year ago

宿主系统的内核,调不到 5.10.168

Screenshot 2023-06-16 09 21 23

1457384613gh commented 1 year ago

😭😭😭😭😭😭 就像手机卡开机Logo一样,进不去。 变成 虚拟砖 了,刚刚 救砖,救 虚拟砖 成功。 @supechicken 你的机子能进去吗?

natsumerinchan commented 1 year ago

Compile with x86_64_arcvm_defconfig

bzImage.zip

1457384613gh commented 1 year ago

Compile with x86_64_arcvm_defconfig\n\nbzImage.zip

啊…… 真快!!! 我吃完午餐就去试啵!

1457384613gh commented 1 year ago

太棒了,成功啦。 @natsumerinchan 但是啊,chromeOS 没有【拨号】,启动器也没有【LSPosed】的图标,怎么打开 【LSPosed】呢??? termux 能输入命令打开【LSPosed】吗?

imageimage

supechicken commented 1 year ago

按一下notification就行了

supechicken commented 1 year ago

😭😭😭😭😭😭 就像手机卡开机Logo一样,进不去。 变成 虚拟砖 了,刚刚 救砖,救 虚拟砖 成功。 @supechicken 你的机子能进去吗?

RDT_20230616_1235022011108248184961609

(這是我自己編譯的)

1457384613gh commented 1 year ago

通知栏 可以进去,但是没有创建快捷方式的按钮。

image

tiann commented 1 year ago

如果你们感兴趣的话,非常欢迎加一个 ChromeOS 的 CI!

supechicken commented 1 year ago

如果你们感兴趣的话,非常欢迎加一个 ChromeOS 的 CI!

好的,等我先研究一下github action再開pr

1457384613gh commented 1 year ago

Dex 优化器 不支持,挂载失败,这个是不是要去 LSPosed 那边 issue 一下啊? image

supechicken commented 1 year ago

先看看ARCVM的kernel log,或許裡面有失敗原因

natsumerinchan commented 1 year ago

Dex 优化器 不支持,挂载失败,这个是不是要去 LSPosed 那边 issue 一下啊? image

用CI版本的LSPosed https://t.me/LSPosedArchives

1457384613gh commented 1 year ago

支持 Dex了,但不支持快捷方式 image

natsumerinchan commented 1 year ago

支持 Dex了,但不支持快捷方式 image

可能是ChromeOS本身不支持创建快捷方式?

natsumerinchan commented 1 year ago

太棒了,成功啦。 @natsumerinchan 但是啊,chromeOS 没有【拨号】,启动器也没有【LSPosed】的图标,怎么打开 【LSPosed】呢??? termux 能输入命令打开【LSPosed】吗?

imageimage

am start -a android.intent.action.MAIN -c org.lsposed.manager.LAUNCH_MANAGER com.android.shell/.BugreportWarningActivity

来自https://github.com/ya0211/MRepo/issues/19#issuecomment-1537081000

1457384613gh commented 1 year ago

chromeOS 支持 把 安卓的图标都映射到 启动器上。 image

1457384613gh commented 1 year ago

现在好了,chromeOS 有

感觉,可玩性可以跟 Android x86 媲美了,稳定性也比 Android x86 强。 分享你们个 grub2,比 Win2Grub要强多了,专门用来 双启动 或 多启动 chromeOS 的。 用起来超级方便的。 https://github.com/M-L-P/grub2-brunch

1457384613gh commented 1 year ago

再分享你们个 基于 rEFInd 的 多启动管理器, 用来管理这些启动项。 制作了现代化主题的。 用起来也很方便的说。 https://github.com/M-L-P/rEFInd-theme-Yours image

natsumerinchan commented 1 year ago

现在好了,chromeOS 有

  • 安卓的超级用户权限;
  • 支持安装模块;
  • 官方支持的稳定的桌面端的 chrome 浏览器;
  • 未来版本自带 AI;

感觉,可玩性可以跟 Android x86 媲美了,稳定性也比 Android x86 强。 分享你们个 grub2,比 Win2Grub要强多了,专门用来 双启动 或 多启动 chromeOS 的。 用起来超级方便的。 https://github.com/M-L-P/brunch-grub2

特别是ChromeOS的SELinux能强制执行

1457384613gh commented 1 year ago

虽然安卓版本不是特别高,但毕竟是谷歌的亲儿子,未来肯定会升级安卓版本的。 感觉性能比 WSA 强多了。

natsumerinchan commented 1 year ago

虽然安卓版本不是特别高,但毕竟是谷歌的亲儿子,未来肯定会升级安卓版本的。 感觉性能比 WSA 强多了。

话说ChromeOS上allowlist能不能正常保存,会不会像WSA那样重启就丢权限

1457384613gh commented 1 year ago

我试过了,重启没丢权限。 还尝试更换宿主系统的内核,成功了,可以换到 6.1 内核。 image

1457384613gh commented 1 year ago

总结下步骤。 下载并解压 zip,把 bzImage 重命名为 vmlinux, 然后,进入 crosh,输入以下命令。 shell cd /opt/google/vms/android ls -l sudo mv vmlinux vmlinux_real ls -l cd ~/Downloads ls -l sudo cp vmlinux /opt/google/vms/android cd /opt/google/vms/android ls -l 然后重启。

感觉可以整理成一个【一键KernelSU.sh】的脚本。 curl -s http://...../...../...../一键KernelSU.sh | sudo bash

natsumerinchan commented 1 year ago

总结下步骤。 下载并解压 zip,把 bzImage 重命名为 vmlinux, 然后,进入 crosh,输入以下命令。 shell cd /opt/google/vms/android ls -l sudo mv vmlinux vmlinux_real ls -l cd ~/Downloads ls -l sudo cp vmlinux /opt/google/vms/android cd /opt/google/vms/android ls -l 然后重启。

感觉可以整理成一个【一键KernelSU.sh】的脚本。 curl -s http://...../...../...../一键KernelSU.sh | sudo bash

把这个脚本整进压缩包里 ./ksu_arcvm.sh install: 安装KernelSU并备份原kernel ./ksu_arcvm.sh uninstall: 卸载并还原 ./ksu_arcvm.sh -h/--help: 显示帮助

#!/bin/sh
set -eu
ANDROID_ROOT=/opt/google/vms/android

ksu_help() {
    printf "Usage: $0 [options]\n"
    printf "\nOptions:\n"
    printf "  install                       Install KernelSU and backup original\n"
    printf "                                kernel for ChromeOS ARCVM\n"
    printf "  uninstall                     Remove KernelSU and restore original\n" 
    printf "                                kernel for ChromeOS ARCVM\n"
    printf "  -h, --help                    Display this help message and exit\n"
}

ksu_install() {
    if [ -d $ANDROID_ROOT ]; then
        ls -l $ANDROID_ROOT
        if [ ! -e $ANDROID_ROOT/vmlinux_bak ]; then
            sudo mv $ANDROID_ROOT/vmlinux $ANDROID_ROOT/vmlinux_bak
        else
            sudo rm $ANDROID_ROOT/vmlinux
        fi
        if [ -e ./bzImage ]; then
            sudo cp ./bzImage $ANDROID_ROOT/vmlinux
            sudo ls -l $ANDROID_ROOT
        else
            echo "[ERROR] bzImage is not exist."
            exit 127
        fi
    else
        echo "[ERROR] $ANDROID_ROOT is not exist."
        exit 127
    fi
}

ksu_uninstall() {
    if [ -d $ANDROID_ROOT ]; then
        if [ ! -d $ANDROID_ROOT/vmlinux_bak ]; then
            echo "$ANDROID_ROOT/vmlinux_bak is not found."
            echo "Maybe you have uninstall or you have not install KernelSU."
            exit 0
        fi
        sudo rm $ANDROID_ROOT/vmlinux
        sudo mv $ANDROID_ROOT/vmlinux_bak $ANDROID_ROOT/vmlinux
    else
        echo "[ERROR] $ANDROID_ROOT is not exist."
        exit 127
    fi
}

if [ -z "${1-}" ] || [ "${1-}" == "-h" ] || [ "${1-}" == "--help" ]; then
    ksu_help
elif [ "${1-}" == "install" ]; then
    ksu_install
    vmc stop arcvm
elif [ "${1-}" == "uninstall" ]; then
    ksu_uninstall
    vmc stop arcvm
else
    echo "[ERROR] No such option."
    exit 1
fi
supechicken commented 1 year ago

总结下步骤...

補充:真正的 Chromebook 要先關閉rootFS verification,然後再 remount as r/w 才能對系統動手腳:

sudo /usr/share/vboot/bin/make_dev_ssd.sh --remove_rootfs_verification
sudo reboot
sudo mount -o remount,rw /
1457384613gh commented 1 year ago

@natsumerinchan

后面加个 sudo reboot 重启以后,才有超级用户权限。

看来, 要四处打听一下,crosh shell 软重启 ARCVM 的命令。

争取做到,不重启宿主系统,就 KernelSU。

1457384613gh commented 1 year ago

curl -s https://raw.githubusercontent.com/nathanchance/chromeos-adb-fastboot/master/install.sh | sudo bash adb start-server adb reboot

目前我只想到这个借助 adb 重启 ARCVM 的方式。

1457384613gh commented 1 year ago

哦,对,想起来了。 KernelSU 的 App,有重启的按钮。

按下热重启,就好了。

supechicken commented 1 year ago

單單Android重啟是沒用的,一定要整個crosvm進程重啟才行(這樣它才會去重新讀取kernel文件)

1457384613gh commented 1 year ago

KernelSU App,按【重启到 BootLoader】 应该是可以的。 可以试试。 crosvm 重启到 BootLoader,应该会重新加载一遍 vmlinux。

supechicken commented 1 year ago

就算是行的通的話那個 KernelSU 管理應用也需要先提權才能用啊(沒有kernel的配合那應用根本做不了什麼),這不就成死循環了😀

1457384613gh commented 1 year ago

难道非要走 adb 吗?

natsumerinchan commented 1 year ago

还是简单粗暴直接重启ChromeOS好了,我加了个选择是否重启的选项

supechicken commented 1 year ago

adb reboot bootloader可能也不管用,依我看來Android中的所有電源操作都是模擬出來的(就像虛擬機一樣,客體重啟那是你客體的事,關我宿主虛擬機啥事)

As far as I know 唯一能對虛擬機進行控制的就是crosh裡面的vmc,不過它好像只能要求停止:

crosh> vmc stop arcvm
crosh> vmc start arcvm # 這個不管用
1457384613gh commented 1 year ago

vmc stop arcvm

然后,鼠标点击安卓App,应该能够唤醒 ARCVM。

supechicken commented 1 year ago

有喔,剛試了一下能行

1457384613gh commented 1 year ago

exit 退出 crosh shell。 然后 vmc stop arcvm

sudo reboot改成 exit。 看来,一键脚本后面,还要输入一个vmc stop arcvm

natsumerinchan commented 1 year ago

总结下步骤。 下载并解压 zip,把 bzImage 重命名为 vmlinux, 然后,进入 crosh,输入以下命令。 shell cd /opt/google/vms/android ls -l sudo mv vmlinux vmlinux_real ls -l cd ~/Downloads ls -l sudo cp vmlinux /opt/google/vms/android cd /opt/google/vms/android ls -l 然后重启。总结下步骤。 下载并解压 zip,把 bzImage 重命名为 vmlinux , 然后,进入 crosh,输入以下命令。 shell 3 4 sudo mv vmlinux vmlinux_real ls -l cd ~/Downloads 8 9 10 ls -l 然后重启. 感觉可以整理成一个【一键KernelSU.sh】的脚本。 curl -s http://...../...../...../一键KernelSU.sh | sudo bash

把这个脚本整进压缩包里 ./ksu_arcvm.sh install: 安装KernelSU并备份原kernel ./ksu_arcvm.sh uninstall: 卸载并还原 ./ksu_arcvm.sh -h/--help: 显示帮助

#!/bin/sh
set -eu
ANDROID_ROOT=/opt/google/vms/android

ksu_help() {
    printf "Usage: $0 [options]\n"
    printf "\nOptions:\n"
    printf "  install                       Install KernelSU and backup original\n"
    printf "                                kernel for ChromeOS ARCVM\n"
    printf "  uninstall                     Remove KernelSU and restore original\n" 
    printf "                                kernel for ChromeOS ARCVM\n"
    printf "  -h, --help                    Display this help message and exit\n"
}

ksu_install() {
    if [ -d $ANDROID_ROOT ]; then
        ls -l $ANDROID_ROOT
        if [ ! -e $ANDROID_ROOT/vmlinux_bak ]; then
            sudo mv $ANDROID_ROOT/vmlinux $ANDROID_ROOT/vmlinux_bak
        else
            sudo rm $ANDROID_ROOT/vmlinux
        fi
        if [ -e ./bzImage ]; then
            sudo cp ./bzImage $ANDROID_ROOT/vmlinux
            sudo ls -l $ANDROID_ROOT
        else
            echo "[ERROR] bzImage is not exist."
            exit 127
        fi
    else
        echo "[ERROR] $ANDROID_ROOT is not exist."
        exit 127
    fi
}

ksu_uninstall() {
    if [ -d $ANDROID_ROOT ]; then
        if [ ! -d $ANDROID_ROOT/vmlinux_bak ]; then
            echo "$ANDROID_ROOT/vmlinux_bak is not found."
            echo "Maybe you have uninstall or you have not install KernelSU."
            exit 0
        fi
        sudo rm $ANDROID_ROOT/vmlinux
        sudo mv $ANDROID_ROOT/vmlinux_bak $ANDROID_ROOT/vmlinux
    else
        echo "[ERROR] $ANDROID_ROOT is not exist."
        exit 127
    fi
}

if [ -z "${1-}" ] || [ "${1-}" == "-h" ] || [ "${1-}" == "--help" ]; then
    ksu_help
elif [ "${1-}" == "install" ]; then
    ksu_install
    vmc stop arcvm
elif [ "${1-}" == "uninstall" ]; then
    ksu_uninstall
    vmc stop arcvm
else
    echo "[ERROR] No such option."
    exit 1
fi

改了

supechicken commented 1 year ago

不用,剛看了一下 bash shell 下面也有 vmc, 所以可以直接在腳本裡面做

1457384613gh commented 1 year ago

太好了,那就真的可以做到一键脚本咯。

1457384613gh commented 1 year ago

chromeOS 有 两个 ROOT-A 分区。 每次系统升级,就换个系统分区。 所以,每次系统升级,又要升级后开机执行脚本。

很可能,没办法去设计, 【安装到未使用的槽位】的脚本。

supechicken commented 1 year ago

和普通Chromebook不同,Brunch 只用 ROOT-A(3號分區,更新的時候將本應只寫往ROOT-B的映像也寫往ROOT-A,然後強制從ROOT-A啟動,迷之操作)

這造成了另一個問題,就是原本的kernel備份也會因為更新而被刪除,這我們還要想想要怎麼解決

1457384613gh commented 1 year ago

不是吧? 我记得,两个 ROOT-A,已经没有 ROOT-B 了。 我忘了,明天挂载 .img,去看看。