记一次坑爹的grub修复

公司的路由盘存放着共享的数据,年前老板最后离开公司的时候来了把硬关机,直接拔电源的那种硬, 过完年回来就发现路由盘死了,上面的seafile系统瘫痪了。

Tater不在,只好自己硬上,修呗,检查发现每次开机map device table都找不到,起初以为硬盘坏了,烧录了一个USB启动盘,用了个软件叫: https://rufus.ie/

自己下载,然后各种安装添加ppa仓库,安装boot-repair工具,完全不好用。后来同事找到一篇帖子,需要修复EFI。。。

步骤如下:

尝试 EFI shell环境启动

开机总是停留在这里:


一般情况下进入 efi shell 后会显示 Device mapping table, 有时候会出现磁盘的信息,就是fs0,当出现的时候说明识别出了硬盘,但是无法引导。

在shell下面键入:

reconnect -r 

重新连接控制器,出现成功后再执行map看看是否有磁盘列出来。

如果这样列出,就可以确认磁盘没有问题了,问题出现在grub上,由于设备是X86_64架构,而且又是用了EFI的启动模式,初步估计问题出在了grub-efi上。

Ubuntu U盘PE,大白菜修复盘~

利用烧录工具烧录Ubuntu16.04 镜像到U盘,软件已经上面提到,简单粗暴,还很小巧。

选择设备镜像文件然后选择U盘设备信息。

一路默认即可。

 

速度很快,也就几分钟就可以完成了,插到PPC上,按下F7, 这个很坑爹的操作尝试了好几次,才找到相应的启动选项:

   

通过USB启动后尝试检查设备是否有问题,能够挂载和读取设备内容说明没有问题。

检查了/boot分区的启动信息,看不出哪里出问题了,有点儿犹豫问题所在,决定还是重新构建grub信息。

这是检查了/etc/fstab文件系统挂载配置文件,没有啥问题,确认是grub的问题了。


再次重启,进入live CD,选择 Try Ubuntu without installing 进入Live OS。
进入系统后打开终端(快捷键Ctrl+Alt+T)这个是最常用的开终端的方式。

先来查看系统分区情况:

sudo fdisk -l  
sudo blkid  
df -Th  
这个系统2块硬盘 /dev/sda ,两个分区,/dev/sda1 为 EFI 分区,/dev/sda2 为系统分区, /dev/sdb1 是存储数据的分区。

为chroot做准备:

1. 挂载分区

sudo mount /dev/sda2 /mnt  
sudo mount /dev/sda1 /mnt/boot/efi

2. 挂载虚拟文件系统

系统上的/dev   /proc  /sys /run  /dev/pts 这些是常见的虚拟文件系统,可以通过循环直接挂载到目标位置。

for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done

3. chroot 切换系统根目录

sudo chroot /mnt

4. 最关键的部分-修复引导信息

apt-get update
apt-get -y install grub-efi
grub-install --target=x86_64-efi --efi-directory=/boot/efi
update-grub

--target 指定系统结构
--efi-directory 指定 EFI 分区挂载点

update-grub 更新grub信息

Grub重新安装后,重启:

成功登陆,心里就想骂,这个EFI好鸡肋。

帮助参考文献

https://help.ubuntu.com/community/Grub2/Installing#via_ChRoot

转载记得标明出处,你妹的,打字很累的。白了个白。

STM32学习笔记1-操作GPIO

0x01 初始化GPIO

使用HAL库的优点在于不用手动添加初始化的代码了,CubeMX会根据软件设置自动生成。

自动生成的HAL库GPIO初始化代码:


/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  ** This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether 
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * COPYRIGHT(c) 2019 STMicroelectronics
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f0xx_hal.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ---------------------------------------------------------*/
IWDG_HandleTypeDef hiwdg;

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_IWDG_Init(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_IWDG_Init();
  /* USER CODE BEGIN 2 */
    
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
    HAL_Delay(500);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); 
    HAL_Delay(500);
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* IWDG init function */
static void MX_IWDG_Init(void)
{

  hiwdg.Instance = IWDG;
  hiwdg.Init.Prescaler = IWDG_PRESCALER_4;
  hiwdg.Init.Window = 4095;
  hiwdg.Init.Reload = 4095;
  if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOF_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin : LED1_Pin */
  GPIO_InitStruct.Pin = LED1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  file: The file name as string.
  * @param  line: The line in file as a number.
  * @retval None
  */
void _Error_Handler(char *file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)

  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/**
  * @}
  */

/**
  * @}
  */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 

其中在while(1)中的这段:

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
    HAL_Delay(500);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); 
    HAL_Delay(500);

就是类似digitalWrite函数的操作。

这里操作的模块是stm32f051c8t6的小模块,先点个灯测试一下,烧录上传后就看到效果了。

这里使用的是HAL库,其实还有更底层的LL库,更加清晰直观。 后面再尝试。

新西兰之行

先来一张我在huka falls 拍的大头照吧!哈哈!适逢当地圣诞节来临之际的大狂欢,蹭了一点儿热度.

这个就是新西兰靠近奥克兰的huka falls,湖卡瀑布.我也不知道是不是这个湖卡,原名给你们了自己查.

出了湖卡瀑布,我们就去了汉密尔顿国家公园,这里终于有机会飞无人机了,但是还是因为我们停留时间太短而放弃飞行...因为新到手的无人机还真tm不太会飞.

路边的随意拍摄的小房子,呸,是小别墅!据说便宜的地方50万纽币就可以买下来了!

一路的蓝天白云让我突然觉得这个资本主义国家的天空也不尽然是全阴霾密布的,乌云过去还是有蓝天的,至少水是纯净的,天空是蓝色的,空气是清新的,通透的感觉,深呼吸都觉得是放纵自己,猛吸一口觉得要醉氧。我突然觉得我爱上了这个世界上偏远的南半球小国,至少爱上了这里的草原,如果未来爱上一匹野马,在这里是真的不怕没有草原,听导游说如果买了房子可以拥有这里999年的居住权,就觉得自己费尽心思在上海买的这套40年商住简直是鸡肋中的鸡肋!

虽然已经旅途过半,而且这次还没看到毛利战舞,没有喝到当地鲜醇爽口的啤酒,但是已经被这里的人文环境深深影响了..

还有美美的老婆陪着我,还是很开心哒!

l路边吃点儿汉堡

也许应该去这家

大家还是去了一家看上去人气稍微旺点儿的地方.随后就是一路颠簸来到霍比屯..

老婆很幸福的拿起了我的单反

被她姐姐抢了先,手机拍出了大片的效果...

这也是..

.

她自己这张是老姨夫的华为荣耀拍摄的...是不是活捉一个精灵?

转眼就踏上飞往皇后镇的飞机了...

说实话,我手机拍摄的照片太少,单反里面的照片还有43Gb,等我整理出来再展示出来吧!

今天又到周末了

讲真的,我有点儿感觉吃力了,太多的开发板要尝试,太多的文档要写,太多的想法要去实现,我还要赚钱,养家, 要为了孩子做准备。。妈蛋,鸭梨山大思密达!
时间如流水,钱财如粪土!
我要继续赚更多的粪土才能养育我播种的这片土地。。。
我的瓦利机器人要继续做起来了,我的烂尾项目都要好好的开始收尾了,不能再拖了~

[DIY 日志]DIY家用Mini 型有机气体检测仪(1)

之前老婆一直说我们的新房子有味道,我也觉得有点儿味道, 装修材料虽然都选择的非常环保的材料,可是全让那个榻榻米的材料毁了, 家里全是榻榻米的木材的味道,味道很大,一直散不掉, 我觉得在家里呆着如果没有风吹过,那么嗓子很快就会难受....为了检测家里是否有甲醛,话说甲醛是无色无味的...检测的难度还是有点儿, 在家曾经用淘宝商家送的甲醛检测药水,但是比色卡看着并不是很直观....

继续阅读[DIY 日志]DIY家用Mini 型有机气体检测仪(1)

Mariadb 的总是运行着就挂了的解决方法

前不久因为之前的 VPS 有问题,所以就在阿里云重建了自己的博客, 满心欢喜的使用的时候发现他很快就挂了...

我检查后台发现mariadb is dead, 又是数据库挂, 很纠结. 查了一下,发现很多人都遇到一样的问题, 看到一篇帖子提到了配置,我检查我的数据库配置,其实咩有做什么特别的,也没有深度优化,就是最基本的,为何还会挂? 检查日志发现...狗日的内存不够了.直接显示 out of memory...

free -m 检查发现果然内容不够用了.

还发现 swap 分区基本都是空的.

所以, 我们需要尝试去创建一个交换文件

继续阅读Mariadb 的总是运行着就挂了的解决方法

这是第三次推倒重来了!!!希望以后不要再出现这种情况~

之前的博客因为阿里云 Centos 镜像的问题,彻底报废了,我在尝试挽救无数次未果的情况下,无奈全盘格式化, 重新来过了,之前的博客因为也咩有什么人看, 只是作为自己的一个个人记事本的平台在积累自己的知识, 后来发现,以前的博客平台各种系统层面的 Bug, 就是请出雍正爷也解决不了的"八阿哥", 于是一怒冲冠为红颜~其实是看着 debian9的系统感觉杠杠滴,所以决定换掉centos, 拥抱 debian~

 

继续阅读这是第三次推倒重来了!!!希望以后不要再出现这种情况~