Le brinda una comprensión más profunda del sistema de archivos de Linux (¡súper detallado!) (Solución de problemas de agotamiento del número de inode, recuperación de archivos eliminados accidentalmente y análisis de archivos de registro)


1. Solución de problemas de agotamiento de inodos

  • Hemos aprendido antes que cada archivo e inodo se corresponden entre sí, es decir, cada archivo tendrá un número de inodo, pero de esta manera, puede suceder que el inodo se haya agotado, pero el disco duro no esté lleno.
  • Una vez que esto sucede, ya no podemos crear nuevos archivos en el disco duro. Para que sea más intuitivo para que todos lo entiendan, el siguiente es un caso para simular la falla del número de archivos en el sistema de archivos de Linux.

1. Preparación

  • Cree un nuevo disco duro, cree la partición / dev / sdb1, tamaño de partición + 30M (no demasiado grande, aquí es solo un experimento de simulación, de lo contrario habrá demasiados números de inodo)
  • Formato, formato ext4 (xfs también funciona)
[root@localhost ~]# mkfs.ext4 /dev/sdb1
  • Puede haber una situación: después de que se crea y formatea la partición y se descubre que falta el archivo del disco, ¿qué debo hacer? En este momento, se recomienda reiniciar el sistema o ejecutar el comando "partprobe" para que el sistema operativo detecte la nueva tabla de particiones para evitar formatear la partición. Dañar los datos existentes en el disco duro
  • Crea un nuevo directorio y móntalo
    marca
  • Utilice el comando df con la opción "-i" para confirmar el uso del i-nodo en el sistema de archivos. Se puede ver que hay 7680 inodos
    marca

2. Simular la falla por agotamiento del nodo i

  • Escriba un script para simular el agotamiento de todos los i-nodos disponibles en / dev / sdb1 (7680)
  • Para obtener información detallada sobre el programa de secuencia de comandos más adelante, comprenda aquí
[root@localhost test]# for ((i=1;i<=7680;i++));do touch /test/file$i;done 
touch: 无法创建"/test/file7670": 设备上没有空间
touch: 无法创建"/test/file7671": 设备上没有空间
touch: 无法创建"/test/file7672": 设备上没有空间
touch: 无法创建"/test/file7673": 设备上没有空间
touch: 无法创建"/test/file7674": 设备上没有空间
touch: 无法创建"/test/file7675": 设备上没有空间
touch: 无法创建"/test/file7676": 设备上没有空间
touch: 无法创建"/test/file7677": 设备上没有空间
touch: 无法创建"/test/file7678": 设备上没有空间
touch: 无法创建"/test/file7679": 设备上没有空间
touch: 无法创建"/test/file7680": 设备上没有空间        ##这里开始提示设备上没有空间了

  • En este momento, verifique los inodos disponibles de la partición nuevamente y descubra que está llena, y luego crear un nuevo archivo no puede tener éxito, pero a través del comando df para ver la partición, solo "4%", hay mucho espacio libre; de ​​esto, puede obtener: Disco La cantidad de archivos creados está limitada por el tamaño del disco y la cantidad de números de inodo
[root@localhost test]# df -i /dev/sdb1
文件系统       Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/sdb1       7680    7680       0     100% /test
[root@localhost test]# touch xcf.txt
touch: 无法创建"xcf.txt": 设备上没有空间
[root@localhost test]# df -Th /test/
文件系统       类型  容量  已用  可用 已用% 挂载点
/dev/sdb1      ext4   29M  916K   26M    4% /test

3. Solucione la falla

  • Entendemos el origen de la falla, luego el problema se puede resolver mejor, puede "ls -a" para ver todos los archivos (incluidos los archivos ocultos)
  • Luego, descubra los archivos pequeños que ocupan una gran cantidad de i-nodos en la partición y transfiéralos o elimínelos.
  • Para sistemas de archivos compartidos por muchos usuarios, se recomienda establecer cuotas de disco para usuarios relacionados (incluida la cantidad de archivos y espacio en disco)

2. Recuperar archivos borrados por error

  • Cuando muchos de nuestros usuarios comunes eliminan un archivo, en realidad no conocen el nodo de inodo y los datos del bloque, simplemente encuentran el archivo (nombre) y lo eliminan.
  • De hecho, Linux controla la eliminación de archivos a través del número de enlaces. Solo cuando no hay ningún enlace en un archivo, el archivo se eliminará por completo.
  • Para el sistema de archivos EXT en el sistema Linux, puede usar la herramienta de recuperación extundelete para recuperar archivos. Es una herramienta de recuperación de datos de Linux de código abierto que admite sistemas de archivos ext3 y ext4 (ext4 solo se puede recuperar en la versión CentOS6)

1. Preparación (compilar e instalar extundelete)

  • Puede continuar con la partición recién creada en este momento, pero primero desmóntela, luego vuelva a formatearla a "ext3" y luego móntela
[root@localhost test]# cd
[root@localhost ~]# umount /test/
[root@localhost ~]# mkfs.ext3 /dev/sdb1 
...略
[root@localhost ~]# mount /dev/sdb1 /test/
  • Antes de compilar e instalar extundelete, debe instalar dos paquetes de dependencia (primero preste atención a si ha montado un espejo)
[root@localhost ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@localhost ~]# yum -y install e2fsprogs-devel e2fsprogs-libs
...略
  • Después de instalar el paquete de dependencia, puede copiar el paquete o descargarlo directamente (simplemente copie y pegue)
[root@localhost test]# wget http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
--2020-12-03 15:32:50--  http://nchc.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2
正在解析主机 nchc.dl.sourceforge.net (nchc.dl.sourceforge.net)... 140.110.96.69, 2001:e10:ffff:1f02::17
正在连接 nchc.dl.sourceforge.net (nchc.dl.sourceforge.net)|140.110.96.69|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:108472 (106K) [application/octet-stream]
正在保存至: “extundelete-0.2.4.tar.bz2”

100%[==================>] 108,472     40.4KB/s 用时 2.6s   

2020-12-03 15:32:54 (40.4 KB/s) - 已保存 “extundelete-0.2.4.tar.bz2” [108472/108472])

  • Descomprimir, configurar, compilar, instalar
[root@localhost test]# ls
extundelete-0.2.4.tar.bz2  lost+found
[root@localhost test]# tar jxvf extundelete-0.2.4.tar.bz2        ##解压
...略
[root@localhost test]# ls
extundelete-0.2.4  extundelete-0.2.4.tar.bz2  lost+found
[root@localhost test]# cd extundelete-0.2.4/
[root@localhost extundelete-0.2.4]# ls
acinclude.m4  config.h.in   depcomp     Makefile.am  README
aclocal.m4    configure     install-sh  Makefile.in  src
autogen.sh    configure.ac  LICENSE     missing
[root@localhost extundelete-0.2.4]# ./configure --prefix=/usr/local/extundelete        ##进行配置,指定软件安装(工作)目录
Configuring extundelete 0.2.4
Writing generated files to disk
[root@localhost extundelete-0.2.4]# make && make install        ##编译完成后进行安装
...略
[root@localhost extundelete-0.2.4]# cd /usr/local/extundelet
[root@localhost extundelet]# ls
bin
[root@localhost extundelet]# cd bin/
[root@localhost bin]# ls
extundelete
[root@localhost bin]# ln -s /usr/local/extundelet/bin/extundelete /usr/bin/        ##创建软链接,把前者文件放入/usr/bin目录中,让系统能识别extundelete的所有命令

2. Simular eliminar

  • Regrese al directorio / test / y cree un nuevo archivo en el directorio ("echo" significa salida, lo que equivale a crear cuatro archivos con el contenido de a)
[root@localhost bin]# cd /test/
[root@localhost test]# echo a>a
[root@localhost test]# echo a>b
[root@localhost test]# echo a>c
[root@localhost test]# echo a>d
[root@localhost test]# cat a
a
[root@localhost test]# cat b
a
[root@localhost test]# cat c
a
[root@localhost test]# cat d
a
[root@localhost test]# ls
a  c  extundelete-0.2.4          lost+found
b  d  extundelete-0.2.4.tar.bz2
  • Verifique qué archivos existen en el sistema de archivos / dev / sdb1, el i-nodo comienza desde 2 y 2 significa que el archivo es el primer directorio del sistema
[root@localhost test]# extundelete /dev/sdb1 --inode 2
...略
Would you like to continue? (y/n) 
y        ##你想继续吗,输入y继续
...略
File name                                       | Inode number | Deleted status
.                                                 2
..                                                2
lost+found                                        11
extundelete-0.2.4.tar.bz2                         12
extundelete-0.2.4                                 1921
a                                                 13
b                                                 14
c                                                 15
d                                                 16
##只列出关键内容,这里可以看到a、b、c、d的inode号都有了
  • Después de eliminar el archivo ay el archivo b, "ls" encontrará que no hay archivos ayb, y cuando ingresemos el comando "extundelete / dev / sdb1 --inode 2", encontraremos que los archivos ayb están en el estado Eliminado.
[root@localhost test]# rm -rf a b
[root@localhost test]# ls
c  extundelete-0.2.4          lost+found
d  extundelete-0.2.4.tar.bz2
[root@localhost test]# extundelete /dev/sdb1 --inode 2
...略

3. Realizar operaciones de recuperación

  • Primero regrese al directorio de inicio, desmonte / test /, y luego use para restaurar todo el contenido en el sistema de archivos / dev / sdb1. Después de ejecutar este comando, aparecerá un nuevo directorio en el directorio actual, que guarda los archivos restaurados
    marca
  • Hay muchos más usos de extundelete, los estudiantes interesados ​​pueden verificar un uso más detallado a través de la ayuda.
  • Después de que el archivo se elimina por error, si se sobrescribe el número de inodo (el directorio se llena o se formatea), no se puede recuperar ni restaurar.

Tres, copia de seguridad y recuperación de archivos de tipo xfs

1. Información general

  • Nota: Es otro tipo, no eliminar y restaurar directamente, sino realizar copias de seguridad y restaurar
  • CentOS7 usa archivos de tipo xfs de forma predeterminada, y los archivos de tipo xfs se pueden respaldar y restaurar con las herramientas xfsdump y xfsrestore
    • Hay dos niveles de respaldo para xfsdump: 0 significa respaldo completo: 1-9 significa respaldo incremental
    • Copia de seguridad incremental: una vez completada la copia de seguridad, si hay contenido nuevo en el disco, solo hará una copia de seguridad del nuevo contenido, en lugar de realizar una copia de seguridad completa nuevamente.
    • El nivel de copia de seguridad predeterminado de xfsdump es 0.

2. Formato de comando

xfsdump -f 指定备份存放位置 要备份的路径或设备文件

3. Opciones comunes

  • -f: especifica el directorio del archivo de respaldo
  • -L: Especifique la etiqueta de la sesión (si no se especifica, se nos pedirá que la ingresemos directamente)
  • -M: especifique la etiqueta del dispositivo
  • -s: copia de seguridad de un solo archivo (la ruta no se puede seguir directamente)

4. Restricciones de uso

  • Solo se puede realizar una copia de seguridad del sistema de archivos montado
  • Debe usar la autoridad de root para operar
  • Solo se puede realizar una copia de seguridad del sistema de archivos XFS
  • Los datos después de la copia de seguridad solo pueden ser analizados por xfsrestore

5. Pasos operativos

  • Cree una nueva partición / dev / sdb2 con un tamaño de + 10G (opcional), formatéela como xfs y móntela en el directorio / data / recién creado
[root@localhost ~]# mkfs.xfs /dev/sdb2
[root@localhost ~]# mkdir /data
[root@localhost ~]# mount /dev/sdb2 /data/
##可以df-Th检查一下
##注:记得之前说过的,若是这里格式化没有出来sdb2,要重启系统或者刷新一下
  • Ingrese el directorio / data /, copie un archivo en él, luego cree un directorio en él y cree un archivo en el directorio
[root@localhost ~]# cd /data/
[root@localhost data]# cp /etc/passwd ./
[root@localhost data]# ls
passwd
[root@localhost data]# mkdir xcf
[root@localhost data]# touch xcf/xcf.txt
[root@localhost data]# ls
passwd  xcf
[root@localhost data]# ls -R
.:
passwd  xcf

./xcf:
xcf.txt        ##创建成功(子目录和他的文件)
  • Utilice "xfsdump" para hacer una copia de seguridad de toda la partición (/ dev / sdb2) en el directorio (/ opt / dump_sdb2)
[root@localhost data]# rpm -q xfsdump        ##首先查询一下“xfsdump”软件包有没有安装,一般都是安装了,没有则安装一下
xfsdump-3.1.4-1.el7.x86_64
[root@localhost data]# xfsdump -f /opt/dump_sdb2 /dev/sdb2
##输入此命令后,会提示输入我的标签,而标签就是这个文件名,我们输入“dump_sdb2”按回车
##之后又会提示让我们输入设备,输入“sdb2”就行了
[root@localhost data]# cd /opt/
[root@localhost opt]# ls
dump_sdb2  rh        ##备份成功
  • Simule la pérdida de datos y restaure archivos con el comando "xfsrestore"
[root@localhost opt]# cd -
/data
[root@localhost data]# ls
passwd  xcf
[root@localhost data]# rm -rf *
[root@localhost data]# ls
[root@localhost data]# xfsrestore -f /opt/dump_sdb2 ./
...略
[root@localhost data]# ls
passwd  xcf        ##检查一下是否成功恢复
[root@localhost data]# cd xcf/
[root@localhost xcf]# ls
xcf.txt        ##OK~

Cuarto, analice los archivos de registro

1. Función de registro

  • El archivo de registro es un archivo que se utiliza para registrar diversa información operativa en el sistema Linux, que es equivalente a un "diario"
  • Los diferentes archivos de registro registran diferentes tipos de información, como la hora de inicio de sesión del usuario, el error del programa, etc.
  • Al leer el registro, es útil diagnosticar y resolver fallas del sistema (documentado)
  • Además, cuando el host es atacado por piratas informáticos, el archivo de registro también puede ayudar a encontrar rastros dejados por el pirata informático (como la fuerza bruta para descifrar múltiples intentos de contraseña para iniciar sesión)

2. Clasificación de troncos

En el sistema Linux, los datos de registro incluyen principalmente los siguientes tres tipos:

  • Registros del kernel y del sistema:
    • Gestión unificada por el servicio del sistema rsyslog, de acuerdo con la configuración en su archivo de configuración principal /etc/rsyslog.conf para determinar dónde registrar los mensajes del kernel y varios mensajes del programa del sistema
    • Muchos programas en el sistema entregarán sus archivos de registro a la administración de registros de rsyslog, por lo que estos formatos son básicamente los mismos
  • Registro de usuario:
    • Registre la información de inicio y cierre de sesión del usuario del sistema
    • Incluyendo nombre de usuario, terminal de inicio de sesión, hora de inicio de sesión, host de origen, proceso que se está utilizando, etc.
  • Registro del programa:
    • Se utiliza para registrar diversa información de eventos durante la ejecución de este programa.
    • Archivos de registro administrados de forma independiente por varias aplicaciones, el formato de registro no es uniforme
  • Los archivos de registro del propio sistema operativo Linux y la mayoría de los programas de servidor se colocan en el directorio / var / log de forma predeterminada

3. Archivos de registro comunes

  • Para los archivos de registro en el sistema Linux, es necesario comprender sus usos respectivos, de modo que el problema se pueda encontrar más rápido y con mayor precisión cuando sea necesario, y se puedan resolver varias fallas a tiempo. Aquí hay algunos archivos de registro comunes
Archivo de registro Introducción
Kernel y registro de mensajes públicos: / var / 1og / messages Registre los mensajes del kernel de Linux y la información de registro público de varias aplicaciones, incluido el inicio, errores de E / S, errores de red, fallas de programas, etc.
Registro de tareas programadas: / var / log / cron Registrar la información de eventos generada por la tarea programada de crond
Registro de inicio del sistema: / var / 1og / dmesg Registre diversa información de eventos del sistema Linux durante el proceso de arranque
# Registro del sistema de correo: / var / log / maillog Registre la actividad de correo electrónico que ingresa o envía al sistema
Registro de inicio de sesión de usuario: / var / 1og / secure Registrar información de eventos de seguridad relacionada con la autenticación de usuarios
/ var / log / lastlog Registre los eventos de inicio de sesión recientes de cada usuario; formato binario
/ var / log / wtmp Registre cada inicio de sesión, cierre de sesión y eventos de inicio y apagado del sistema; formato binario (no puede leerlo de todos modos)
/ var / run / btmp Registrar intentos de inicio de sesión incorrectos o fallidos y eventos de verificación; formato binario
  • Ingrese al directorio, "vim target" para ver el registro

4. Análisis de archivos de registro

  • Después de familiarizarse con los archivos de registro principales del sistema, introduzcamos los métodos de análisis para los archivos de registro.
  • El propósito de analizar el archivo de registro es examinar el registro para encontrar información clave, depurar el servidor y determinar la causa de la falla, etc.
  • Para la mayoría de los archivos de registro en formato de texto (como los registros del kernel y del sistema, la mayoría de los registros del programa), puede ver el contenido del registro siempre que utilice herramientas de procesamiento de texto como tail, more, less, cat, etc.
  • Para algunos archivos de registro en formato binario (como registros de usuario), es necesario utilizar comandos de consulta característicos

5. Registros del kernel y del sistema

  • Gestión unificada por el servicio del sistema rsyslog
    • Paquete: rsyslog-7.4.7-16.el7.x86_ 64
    • Archivo de configuración: /etc/rsyslog.conf
    • Programa principal: / sbin / rsyslogd
  • Ingrese "vim /etc/rsyslog.conf" para ingresar y ver el archivo de configuración
    • "* .info" significa que toda la información del nivel de información y superior se escribe en el archivo de registro correspondiente
    • "Mail.none" significa que la información sobre algo no se escribe en el archivo de registro
      marca
  • Nivel de prioridad de los mensajes de registro del kernel del sistema Linux (cuanto menor es el nivel de número, mayor es la prioridad, más importante es el mensaje):
Prioridad Descripción
0 EMERG (emergencia): una situación que hará que el sistema anfitrión no esté disponible
1 ALERTA: problemas que deben resolverse de inmediato
2 CRIT (grave): una situación más grave
3 ERR (error): se produjo un error durante la operación
4 ADVERTENCIA: Eventos importantes que pueden afectar las funciones del sistema y deben recordar a los usuarios
5 AVISO (Nota): no afectará la función normal, pero debe prestar atención al evento
6 INFO: información general
7 DEBUG (depuración): información de depuración del programa o del sistema, etc.
  • Generalmente, en uso real, puede registrar hasta el nivel ERR (3, error). Es imposible registrar toda la información en el registro. Para mayor eficiencia, solo registre lo importante (es decir, el registro ordinario o el registro de errores, etc. Es el registro de errores, vea qué pasó con la falla)

6. Formato general de los registros cronológicos

  • El kernel y la mayoría de los mensajes del sistema se registran en el archivo de registro público / var / log / messages, mientras que algunos otros mensajes del programa se registran en sus propios archivos de registro independientes. Además, los mensajes de registro también se pueden grabar en un dispositivo de almacenamiento específico, o Enviar directamente al usuario especificado
  • Vea el contenido del archivo / var / log / messages de la siguiente manera
    marca
    ... Omitido
  • Cada línea representa un mensaje de registro y cada mensaje incluye cuatro campos
    • Etiqueta de hora: la fecha y hora en que se envió el mensaje
    • Nombre de host: el nombre de la computadora que generó el mensaje
    • Nombre del subsistema: el nombre de la aplicación que emitió el mensaje.
    • Mensaje: el contenido específico del mensaje.
  • En algunos casos, puede configurar rsyslog para enviar la información del registro a la impresora para imprimir mientras se graba el archivo de registro en el archivo, de modo que no importa cómo el intruso de la red modifique el registro, el rastro de la intrusión no se puede borrar.
  • rsyslog es un objetivo destacado que a menudo es atacado. Si se destruye, será difícil para los administradores encontrar intrusiones y rastros de intrusiones. Por lo tanto, preste especial atención a monitorear su demonio y archivos de configuración.

7. Análisis de registros de usuarios

  • Información de inicio de sesión y cierre de sesión de usuario guardada
    • / varl / log / lastlog: eventos recientes de inicio de sesión de usuario
    • / var / log / wtmp: inicio de sesión de usuario, cierre de sesión y eventos de inicio y apagado del sistema
    • / var / run / utmp: información detallada de cada usuario actualmente conectado
    • / var / log / secure: eventos de seguridad relacionados con la autenticación de usuarios
  • Estos archivos son archivos de datos binarios. No puede usar directamente herramientas de visualización de texto como tail y less para navegar. Debe usar comandos de consulta de usuario como users, who, w, last y lastb para obtener información de registro.
    • El comando de usuario indica que simplemente muestre el nombre del usuario que ha iniciado sesión actualmente, y cada nombre de usuario mostrado corresponde a una sesión de inicio de sesión; si un usuario tiene más de una sesión de inicio de sesión, su nombre de usuario se mostrará el mismo número de veces.
    • El comando who se usa para reportar la información de cada usuario actualmente conectado al sistema; usando este comando, el administrador del sistema puede ver qué usuarios ilegales existen en el sistema actual para auditarlos y procesarlos (el resultado predeterminado de quién incluye el nombre de usuario, Tipo de terminal, fecha de inicio de sesión y host remoto)
    • El comando w se usa para mostrar información sobre cada usuario en el sistema actual y el proceso que están ejecutando, y el contenido de salida será más rico
    • El último comando se utiliza para consultar los registros de los usuarios que han iniciado sesión con éxito en el sistema. El último estado de inicio de sesión se mostrará en la parte superior; si un usuario no autorizado ha iniciado sesión, puede saber que ha sido invadido
    • El comando lastb se usa para consultar los registros de usuario de inicios de sesión fallidos. Puede prestar atención a si alguien está descifrando su contraseña por la fuerza bruta; también puede obtener información relacionada en el registro de seguridad / var / log / secure (tail / var / log / secure)

8. Análisis del registro del programa

  • En los sistemas Linux, bastantes aplicaciones no utilizan el servicio rsylog para administrar los registros, sino que mantienen los registros del mismo por el programa.
    • Programa de servicio del sitio web httpd (servicio web): / var / log / httpd /
    • Grabe a través de los siguientes dos archivos de registro
      • access_ log // Registra los eventos de acceso de los clientes
      • error_ log // Registra los eventos de error
    • Servicio de proxy (equivalente a un mecanismo de servidor de caché para que los usuarios accedan nuevamente, reduciendo la carga concurrente del servidor): / var / log / squid /
      • access.log 、 cache.log
  • Debido a que el formato de registro de los diferentes programas es bastante diferente y no existe un formato uniforme estricto, no lo presentaré en detalle aquí.
  • El archivo de registro se escribirá dinámicamente y usted estará escribiendo constantemente cuando lo esté viendo. El registro seguirá creciendo, lo que afectará nuestra visualización. En este momento, necesita algunas herramientas profesionales de análisis de registros para ver (interesado Los estudiantes pueden aprender más al respecto)

9. Estrategia de gestión de registros (resumen)

  • En general, como administrador de sistemas profesional, siempre debe estar atento, prestar atención a todo tipo de situaciones sospechosas, verificar varios archivos de registro del sistema con regularidad y realizar copias de seguridad y archivos de manera oportuna.
  • Al verificar estos registros, una vez que se encuentran lugares no razonables, haga un registro de inmediato
  • Extienda el tiempo de ahorro de registro (¿conveniente para verlo usted mismo, y también conveniente para otros?), A través de operaciones como la copia de seguridad
  • Controle los derechos de acceso al registro (como cierta información confidencial, como números de cuenta, contraseñas y contraseñas, etc.)
  • Gestión centralizada de registros
    • Envíe el archivo de registro del servidor al servidor de archivos de registro unificado (para que lo encontremos)
    • Esto facilita la recopilación, clasificación y análisis unificados de la información del registro.
    • Evite de forma eficaz la pérdida accidental, la manipulación malintencionada o la eliminación de información de registro
  • Además, los registros a veces no son completamente confiables.Los piratas informáticos veteranos y altamente capacitados limpiarán la escena perfectamente después de la intrusión.
  • Entonces, para resumir, debemos ser capaces de aplicar los comandos del sistema anteriores de manera competente y flexible, y realizar revisiones y pruebas exhaustivas y completas, y recordar sacarlas de contexto.
  • ¡Vamos, estudiantes a los que les encanta aprender!

Supongo que te gusta

Origin blog.csdn.net/weixin_51486343/article/details/110564983
Recomendado
Clasificación