fj's blog | Done is better than perfect

android 内核编译打包方法

  • 教程 {XDA}{Tutorial}Build your first kernel.
  • bootimg 打包工具

    下载代码 unpackbootimg ,直接 make 编译解包和打包工具。

  • 编译内核
  • 生成 boot.img 内核包
    • 解包得到 ramdisk 根文件系统

      unpackbootimg -i boot.img -o .
    • 解包 ramdisk.gz 方法(一般不用解包,直接使用即可)

      gunzip -k ramdisk.gz 
      apt install cpio
      cpio -i -F ramdisk 
    • 与编译得到的 boot 内核一起打包,得到 boot.img

      vim pack.sh
      ./mkbootimg \
        --kernel build/arch/arm64/boot/Image.gz \
        --ramdisk ramdisk.gz \
        --cmdline "console=null androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x37 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 cma=24M@0-0xffffffff rcupdate.rcu_expedited=1" \
        --base 0x80000000 \
        --pagesize 4096 \
        --dt build/arch/arm64/boot/dtb.img \
        --ramdisk_offset 0x02200000 \
        --tags_offset 0x02000000 \
        --output boot.img
      tar -cvf boot.tar boot.img
      
  • 刷入内核
    • 将 boot.img 打包进 boot.tar

      tar cvf boot.tar boot.img

      AP 中可以包含 boot.img, recovery.img, system.ext 等分区,仅打包部分分区,刷机时不会影响其它分区。

    • 用 Odin 工具刷入 AP,选择 boot.tar 刷入

ubuntu 启动恢复方法

等待网络时间太长

vim /etc/systemd/system/network-online.targets.wants/networking.service
TimeoutStartSec=10sec
systemctl daemon-reload

不显示启动日志

vim /etc/default/grub

删除 quiet splash 参数

update-grub

进入 grub 菜单

开机后,按 escshift 键,可以进入 grub 菜单

grub 命令行修复 ubuntu 引导

grub rescue> ls
(hd0) (hd1) (hd1,gpt8)....

grub rescue> ls (hd1,gpt7)/
./ ../ lost+found/ bin/ boot/ dev/...

grub rescue> set root=(hd1,gpt7)
grub rescue> set prefix=(hd1,gpt7)/boot/grub

grub rescue> insmod normal
grub rescue> normal

##引导进入 ubuntu 后
grub-install /dev/sdb2

win10 安装或升级 docker 失败问题

  • 必须关闭 win10 的实时防毒功能!
  • 如果已经失败,无法安装,无法启动,可以运行的 PowerShell 脚本 remove-docker.ps1 删除。

    $ErrorActionPreference = "SilentlyContinue"
    
    kill -force -processname 'Docker for Windows', com.docker.db, com.docker.slirp, com.docker.proxy, com.docker.9pdb, moby-diag-dl, dockerd
    kill -force -processname com.docker.service
    
    try {
    pushd "C:\Program Files\Docker\Docker\Resources"
    ./MobyLinux.ps1 -Destroy
    popd
    } Catch {}
    
    $service = Get-WmiObject -Class Win32_Service -Filter "Name='com.docker.service'"
    if ($service) { $service.StopService() }
    if ($service) { $service.Delete() }
    Start-Sleep -s 5
    Remove-Item -Recurse -Force "~/AppData/Local/Docker"
    Remove-Item -Recurse -Force "~/AppData/Roaming/Docker"
    if (Test-Path "C:\ProgramData\Docker") { takeown.exe /F "C:\ProgramData\Docker" /R /A /D Y }
    if (Test-Path "C:\ProgramData\Docker") { icacls "C:\ProgramData\Docker" /T /C /grant Administrators:F }
    Remove-Item -Recurse -Force "C:\ProgramData\Docker"
    Remove-Item -Recurse -Force "C:\Program Files\Docker"
    Remove-Item -Recurse -Force "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Docker"
    Remove-Item -Force "C:\Users\Public\Desktop\Docker for Windows.lnk"
    Remove-Item -Recurse -Force "~.docker"
    Remove-Item -Recurse -Force "~\DockerSwarm"
    Get-ChildItem HKLM:\software\microsoft\windows\currentversion\uninstall | ForEach-Object {Get-ItemProperty $_.PSPath} | Where-Object { $_.DisplayName -eq "Docker" } | Remove-Item -Recurse -Force
    Get-ChildItem HKLM:\software\classes\installer\products | ForEach-Object {Get-ItemProperty $_.pspath} | Where-Object { $_.ProductName -eq "Docker" } | Remove-Item -Recurse -Force
    Get-Item 'HKLM:\software\Docker Inc.' | Remove-Item -Recurse -Force
    
    Get-ItemProperty HKCU:\software\microsoft\windows\currentversion\Run -name "Docker for Windows" | Remove-Item -Recurse -Force
    Get-ItemProperty HKCU:\software\microsoft\windows\currentversion\UFH\SHC | ForEach-Object {Get-ItemProperty $_.PSPath} | Where-Object { $_.ToString().Contains("Docker for Windows.exe") } | Remove-Item -Recurse -Force
    
    Get-Item Env:\COMPOSE_CONVERT_WINDOWS_PATHS | Remove-Item
    Get-Item Env:\DOCKER_* | Remove-Item # DOCKER_CERT_PATH, DOCKER_HOST, DOCKER_MACHINE_NAME, DOCKER_TLS_VERIFY
    

双网卡 NAT 配置

配置静态 IP

vim /etc/network/interfaces

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eno1
iface eno1 inet static
        address 192.168.151.111
        netmask 255.255.255.0
        network 192.168.151.0
        broadcast 192.168.151.255
        gateway 192.168.151.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 202.99.192.66 202.99.192.68
        dns-search shanxiunicom

auto eno2
iface eno2 inet static
        address 192.168.199.1
        netmask 255.255.255.0

eno1 连接外网,eno2 连接外网

重启网卡

/etc/init.d/networking restart

配置路由

  • 配置路由转发

    vim /etc/sysctl.conf
    net.ipv4.ip_forward=1
    
    sysctl -p
  • 配置转发表

    vim /etc/rc.local
    iptables -F
    iptables -P INPUT ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -t nat -A POSTROUTING -s 192.168.199.0/24 -o eno1 -j MASQUERADE
    

ubuntu 格式化并挂载硬盘

查看末格式化硬盘

fdisk -l
  • 格式化硬盘
    • 格式化小于 2T 硬盘

      fdisk /dev/vdb
      
    • 格式化大于 2T 硬盘使用 parted 工具

      parted /dev/sdb #进入 parted
      mklabel gpt #硬盘设置为 gpt 格式
      mkpart logical 0 -1 #磁盘所有容量设置为 gpt
      print #显示设置
      
  • 分区格式化为 ext4 格式,有两个方法
    1. mkfs -t ext4 /dev/vdb
    2. mkfs.ext4 -F /dev/sdb

配置分区配置文件

vim /etc/fstab
/dev/sdb /var/data/SpiderCloud/log ext4 defaults 0 0

重新加载分区

mount -a